diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce3e3b61..21f467b4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1340,6 +1340,9 @@ importers: '@types/bluebird': specifier: ^3.5.36 version: 3.5.36 + '@types/glob': + specifier: ^8.1.0 + version: 8.1.0 accepts: specifier: ^1.3.8 version: 1.3.8 @@ -1367,6 +1370,9 @@ importers: execa: specifier: '5' version: 5.1.1 + glob: + specifier: ^10.3.3 + version: 10.3.3 got: specifier: 11.8.3 version: 11.8.3 @@ -6838,6 +6844,18 @@ packages: react: 18.2.0 dev: false + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.0.1 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -7970,6 +7988,13 @@ packages: - supports-color dev: true + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + /@pmmmwh/react-refresh-webpack-plugin@0.5.7(react-refresh@0.11.0)(webpack@5.75.0): resolution: {integrity: sha512-bcKCAzF0DV2IIROp9ZHkRJa6O4jy7NlnHdWL3GmcUxYWNjLXkK5kfELELwEfSP5hXPfVL/qOGMAROuMQb9GG8Q==} engines: {node: '>= 10.13'} @@ -12042,7 +12067,6 @@ packages: dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.11.9 - dev: true /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} @@ -12293,7 +12317,6 @@ packages: /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true /@types/minimist@1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} @@ -19206,6 +19229,14 @@ packages: signal-exit: 3.0.7 dev: true + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.0.2 + dev: false + /forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true @@ -19699,6 +19730,18 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + /glob@10.3.3: + resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.2.2 + minimatch: 9.0.3 + minipass: 7.0.2 + path-scurry: 1.10.1 + dev: false + /glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} dependencies: @@ -21765,6 +21808,15 @@ packages: iterate-iterator: 1.0.2 dev: true + /jackspeak@2.2.2: + resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + /jake@10.8.5: resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} engines: {node: '>=10'} @@ -23287,6 +23339,11 @@ packages: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} + /lru-cache@10.0.0: + resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} + engines: {node: 14 || >=16.14} + dev: false + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -24175,6 +24232,13 @@ packages: dependencies: brace-expansion: 2.0.1 + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -24248,6 +24312,11 @@ packages: engines: {node: '>=8'} dev: true + /minipass@7.0.2: + resolution: {integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -25912,6 +25981,14 @@ packages: path-root-regex: 0.1.2 dev: false + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.0.0 + minipass: 7.0.2 + dev: false + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -30349,6 +30426,11 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + dev: false + /simple-git@3.16.1: resolution: {integrity: sha512-xzRxMKiy1zEYeHGXgAzvuXffDS0xgsq07Oi4LWEEcVH29vLpcZ2tyQRWyK0NLLlCVaKysZeem5tC1qHEOxsKwA==} dependencies: diff --git a/server/package.json b/server/package.json index f16231a6..7c0fe35b 100644 --- a/server/package.json +++ b/server/package.json @@ -42,6 +42,7 @@ "@typegoose/typegoose": "9.3.1", "@types/blessed": "^0.1.19", "@types/bluebird": "^3.5.36", + "@types/glob": "^8.1.0", "accepts": "^1.3.8", "bcryptjs": "^2.4.3", "bluebird": "^3.7.2", @@ -51,6 +52,7 @@ "ejs": "^3.1.6", "es6-error": "^4.1.1", "execa": "5", + "glob": "^10.3.3", "got": "11.8.3", "i18next": "^20.3.5", "ioredis": "^4.27.6", diff --git a/server/scripts/build.ts b/server/scripts/build.ts index 8e3c501e..cb33b6a7 100644 --- a/server/scripts/build.ts +++ b/server/scripts/build.ts @@ -1,6 +1,9 @@ import ts from 'typescript'; import fs from 'fs-extra'; import ora from 'ora'; +import { glob } from 'glob'; +import path from 'path'; +import execa from 'execa'; async function buildTailchatServer() { const spinner = ora({ @@ -8,11 +11,11 @@ async function buildTailchatServer() { }); try { - spinner.start('开始编译'); + spinner.start('Start compiling'); await fs.remove('./dist'); - spinner.info('正在编译TS代码'); + spinner.info('Compiling TS code'); await compileTsCode(); - spinner.info('正在移动静态资源文件'); + spinner.info('Moving static resource files'); await Promise.all([ fs.copy('./public', './dist/public', { recursive: true }), fs.copy('./locales', './dist/locales', { recursive: true }), @@ -24,10 +27,27 @@ async function buildTailchatServer() { ), ]); - spinner.succeed('编译完成'); + if (process.platform !== 'win32' || (await isAdmin())) { + spinner.info('Building plugin dependent symlink'); + const nodeModulesList = await glob('./plugins/*/node_modules/*'); + for (const item of nodeModulesList) { + const src = path.resolve(__dirname, '../', item); + const dest = path.resolve(__dirname, '../dist', item); + + spinner.text = `Building Symlink: ${src} -> ${dest}`; + + await fs.createSymlink(src, dest, 'dir'); + } + } else { + spinner.warn( + 'You are run command in windows without admin permit, create symlink will be skip' + ); + } + + spinner.succeed('Compiled!'); } catch (e) { console.error(e); - spinner.fail('编译失败'); + spinner.fail('Compilation failed!'); } } @@ -96,3 +116,33 @@ function compileTsCode(): Promise { return compile(fileNames, options); } + +/** + * check is window admin + */ +async function isAdmin() { + if (process.platform !== 'win32') { + return false; + } + + try { + // https://stackoverflow.com/a/21295806/1641422 + await execa('fsutil', ['dirty', 'query', process.env.systemdrive]); + return true; + } catch (error) { + if (error.code === 'ENOENT') { + return testFltmc(); + } + + return false; + } +} + +async function testFltmc() { + try { + await execa('fltmc'); + return true; + } catch { + return false; + } +}