@simplysm/sd-cli 13.0.99 → 14.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/build.js +29 -19
- package/dist/commands/build.js.map +1 -6
- package/dist/commands/check.d.ts +1 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +130 -115
- package/dist/commands/check.js.map +1 -6
- package/dist/commands/dev.d.ts +6 -7
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +24 -14
- package/dist/commands/dev.js.map +1 -6
- package/dist/commands/lint.d.ts +1 -1
- package/dist/commands/lint.js +158 -116
- package/dist/commands/lint.js.map +1 -6
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +637 -510
- package/dist/commands/publish.js.map +1 -6
- package/dist/commands/replace-deps.js +12 -12
- package/dist/commands/replace-deps.js.map +1 -6
- package/dist/commands/typecheck.d.ts +5 -30
- package/dist/commands/typecheck.d.ts.map +1 -1
- package/dist/commands/typecheck.js +144 -207
- package/dist/commands/typecheck.js.map +1 -6
- package/dist/commands/watch.d.ts +6 -4
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +25 -16
- package/dist/commands/watch.js.map +1 -6
- package/dist/engines/NgtscEngine.d.ts +47 -0
- package/dist/engines/NgtscEngine.d.ts.map +1 -0
- package/dist/engines/NgtscEngine.js +151 -0
- package/dist/engines/NgtscEngine.js.map +1 -0
- package/dist/engines/ServerEsbuildEngine.d.ts +47 -0
- package/dist/engines/ServerEsbuildEngine.d.ts.map +1 -0
- package/dist/engines/ServerEsbuildEngine.js +159 -0
- package/dist/engines/ServerEsbuildEngine.js.map +1 -0
- package/dist/engines/TscEngine.d.ts +47 -0
- package/dist/engines/TscEngine.d.ts.map +1 -0
- package/dist/engines/TscEngine.js +153 -0
- package/dist/engines/TscEngine.js.map +1 -0
- package/dist/engines/ViteEngine.d.ts +49 -0
- package/dist/engines/ViteEngine.d.ts.map +1 -0
- package/dist/engines/ViteEngine.js +161 -0
- package/dist/engines/ViteEngine.js.map +1 -0
- package/dist/engines/index.d.ts +26 -0
- package/dist/engines/index.d.ts.map +1 -0
- package/dist/engines/index.js +30 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/types.d.ts +77 -0
- package/dist/engines/types.d.ts.map +1 -0
- package/dist/engines/types.js +2 -0
- package/dist/engines/types.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -6
- package/dist/infra/ResultCollector.d.ts +1 -1
- package/dist/infra/ResultCollector.d.ts.map +1 -1
- package/dist/infra/ResultCollector.js +30 -27
- package/dist/infra/ResultCollector.js.map +1 -6
- package/dist/infra/SignalHandler.js +45 -42
- package/dist/infra/SignalHandler.js.map +1 -6
- package/dist/infra/WorkerManager.js +56 -53
- package/dist/infra/WorkerManager.js.map +1 -6
- package/dist/orchestrators/BuildOrchestrator.d.ts +33 -1
- package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
- package/dist/orchestrators/BuildOrchestrator.js +314 -309
- package/dist/orchestrators/BuildOrchestrator.js.map +1 -6
- package/dist/orchestrators/DevWatchOrchestrator.d.ts +60 -0
- package/dist/orchestrators/DevWatchOrchestrator.d.ts.map +1 -0
- package/dist/orchestrators/DevWatchOrchestrator.js +465 -0
- package/dist/orchestrators/DevWatchOrchestrator.js.map +1 -0
- package/dist/sd-cli-entry.d.ts.map +1 -1
- package/dist/sd-cli-entry.js +190 -266
- package/dist/sd-cli-entry.js.map +1 -6
- package/dist/sd-cli.js +77 -49
- package/dist/sd-cli.js.map +1 -6
- package/dist/sd-config.types.d.ts +2 -0
- package/dist/sd-config.types.d.ts.map +1 -1
- package/dist/sd-config.types.js +2 -1
- package/dist/sd-config.types.js.map +1 -6
- package/dist/utils/angular-build.d.ts +77 -0
- package/dist/utils/angular-build.d.ts.map +1 -0
- package/dist/utils/angular-build.js +84 -0
- package/dist/utils/angular-build.js.map +1 -0
- package/dist/utils/build-env.js +9 -9
- package/dist/utils/build-env.js.map +1 -6
- package/dist/utils/concurrency.d.ts +15 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +38 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/copy-public.js +104 -87
- package/dist/utils/copy-public.js.map +1 -6
- package/dist/utils/copy-src.js +49 -35
- package/dist/utils/copy-src.js.map +1 -6
- package/dist/utils/esbuild-config.d.ts +0 -29
- package/dist/utils/esbuild-config.d.ts.map +1 -1
- package/dist/utils/esbuild-config.js +151 -218
- package/dist/utils/esbuild-config.js.map +1 -6
- package/dist/utils/ngtsc-build-core.d.ts +49 -0
- package/dist/utils/ngtsc-build-core.d.ts.map +1 -0
- package/dist/utils/ngtsc-build-core.js +250 -0
- package/dist/utils/ngtsc-build-core.js.map +1 -0
- package/dist/utils/output-path-rewriter.d.ts +23 -0
- package/dist/utils/output-path-rewriter.d.ts.map +1 -0
- package/dist/utils/output-path-rewriter.js +74 -0
- package/dist/utils/output-path-rewriter.js.map +1 -0
- package/dist/utils/output-utils.js +55 -40
- package/dist/utils/output-utils.js.map +1 -6
- package/dist/utils/package-utils.d.ts +8 -0
- package/dist/utils/package-utils.d.ts.map +1 -1
- package/dist/utils/package-utils.js +103 -73
- package/dist/utils/package-utils.js.map +1 -6
- package/dist/utils/rebuild-manager.js +41 -44
- package/dist/utils/rebuild-manager.js.map +1 -6
- package/dist/utils/replace-deps.js +283 -184
- package/dist/utils/replace-deps.js.map +1 -6
- package/dist/utils/scss-compiler.d.ts +10 -0
- package/dist/utils/scss-compiler.d.ts.map +1 -0
- package/dist/utils/scss-compiler.js +36 -0
- package/dist/utils/scss-compiler.js.map +1 -0
- package/dist/utils/sd-config.js +29 -19
- package/dist/utils/sd-config.js.map +1 -6
- package/dist/utils/tsc-build.d.ts +36 -0
- package/dist/utils/tsc-build.d.ts.map +1 -0
- package/dist/utils/tsc-build.js +130 -0
- package/dist/utils/tsc-build.js.map +1 -0
- package/dist/utils/tsconfig.d.ts +7 -26
- package/dist/utils/tsconfig.d.ts.map +1 -1
- package/dist/utils/tsconfig.js +39 -64
- package/dist/utils/tsconfig.js.map +1 -6
- package/dist/utils/typecheck-non-package.d.ts +18 -0
- package/dist/utils/typecheck-non-package.d.ts.map +1 -0
- package/dist/utils/typecheck-non-package.js +64 -0
- package/dist/utils/typecheck-non-package.js.map +1 -0
- package/dist/utils/typecheck-serialization.js +58 -40
- package/dist/utils/typecheck-serialization.js.map +1 -6
- package/dist/utils/worker-events.js +48 -40
- package/dist/utils/worker-events.js.map +1 -6
- package/dist/utils/worker-utils.js +48 -28
- package/dist/utils/worker-utils.js.map +1 -6
- package/dist/vitest-plugin.d.ts +9 -0
- package/dist/vitest-plugin.d.ts.map +1 -0
- package/dist/vitest-plugin.js +85 -0
- package/dist/vitest-plugin.js.map +1 -0
- package/dist/workers/library-build.worker.d.ts +54 -0
- package/dist/workers/library-build.worker.d.ts.map +1 -0
- package/dist/workers/library-build.worker.js +97 -0
- package/dist/workers/library-build.worker.js.map +1 -0
- package/dist/workers/lint.worker.js +9 -6
- package/dist/workers/lint.worker.js.map +1 -6
- package/dist/workers/ngtsc-build.worker.d.ts +23 -0
- package/dist/workers/ngtsc-build.worker.d.ts.map +1 -0
- package/dist/workers/ngtsc-build.worker.js +98 -0
- package/dist/workers/ngtsc-build.worker.js.map +1 -0
- package/dist/workers/{server.worker.d.ts → server-build.worker.d.ts} +39 -29
- package/dist/workers/server-build.worker.d.ts.map +1 -0
- package/dist/workers/server-build.worker.js +399 -0
- package/dist/workers/server-build.worker.js.map +1 -0
- package/dist/workers/server-runtime.worker.d.ts +3 -2
- package/dist/workers/server-runtime.worker.d.ts.map +1 -1
- package/dist/workers/server-runtime.worker.js +100 -95
- package/dist/workers/server-runtime.worker.js.map +1 -6
- package/dist/workers/vite-build.worker.d.ts +56 -0
- package/dist/workers/vite-build.worker.d.ts.map +1 -0
- package/dist/workers/vite-build.worker.js +167 -0
- package/dist/workers/vite-build.worker.js.map +1 -0
- package/package.json +10 -16
- package/src/commands/check.ts +21 -3
- package/src/commands/dev.ts +10 -8
- package/src/commands/lint.ts +1 -1
- package/src/commands/publish.ts +4 -0
- package/src/commands/typecheck.ts +89 -256
- package/src/commands/watch.ts +9 -8
- package/src/engines/NgtscEngine.ts +190 -0
- package/src/engines/ServerEsbuildEngine.ts +195 -0
- package/src/engines/TscEngine.ts +189 -0
- package/src/engines/ViteEngine.ts +203 -0
- package/src/engines/index.ts +49 -0
- package/src/engines/types.ts +79 -0
- package/src/index.ts +0 -3
- package/src/infra/ResultCollector.ts +1 -1
- package/src/orchestrators/BuildOrchestrator.ts +87 -157
- package/src/orchestrators/DevWatchOrchestrator.ts +573 -0
- package/src/sd-cli-entry.ts +13 -116
- package/src/sd-config.types.ts +2 -0
- package/src/utils/angular-build.ts +157 -0
- package/src/utils/concurrency.ts +43 -0
- package/src/utils/esbuild-config.ts +1 -122
- package/src/utils/ngtsc-build-core.ts +379 -0
- package/src/utils/output-path-rewriter.ts +82 -0
- package/src/utils/package-utils.ts +20 -0
- package/src/utils/scss-compiler.ts +58 -0
- package/src/utils/tsc-build.ts +175 -0
- package/src/utils/tsconfig.ts +27 -95
- package/src/utils/typecheck-non-package.ts +87 -0
- package/src/vitest-plugin.ts +118 -0
- package/src/workers/library-build.worker.ts +153 -0
- package/src/workers/ngtsc-build.worker.ts +146 -0
- package/src/workers/server-build.worker.ts +565 -0
- package/src/workers/server-runtime.worker.ts +17 -26
- package/src/workers/vite-build.worker.ts +252 -0
- package/tests/commands/check.spec.ts +276 -0
- package/tests/commands/dev.spec.ts +53 -0
- package/tests/commands/lint.spec.ts +243 -0
- package/tests/commands/publish.spec.ts +1159 -0
- package/tests/commands/typecheck.spec.ts +294 -0
- package/tests/commands/watch.spec.ts +53 -0
- package/tests/engines/engine-selection.spec.ts +247 -0
- package/tests/engines/ngtsc-engine.spec.ts +274 -0
- package/tests/engines/server-esbuild-engine.spec.ts +256 -0
- package/tests/engines/tsc-engine.spec.ts +213 -0
- package/tests/engines/vite-engine.spec.ts +358 -0
- package/tests/infra/result-collector.spec.ts +46 -0
- package/tests/infra/signal-handler.spec.ts +32 -0
- package/tests/infra/worker-manager.spec.ts +63 -0
- package/tests/orchestrators/build-orchestrator.spec.ts +772 -0
- package/tests/orchestrators/dev-watch-orchestrator.spec.ts +1173 -0
- package/tests/sd-cli-entry.spec.ts +49 -0
- package/tests/utils/angular-build.spec.ts +251 -0
- package/tests/utils/build-env.spec.ts +33 -0
- package/tests/utils/concurrency.spec.ts +65 -0
- package/tests/utils/copy-src.spec.ts +144 -0
- package/tests/utils/esbuild-config.spec.ts +186 -0
- package/tests/utils/external-modules.spec.ts +161 -0
- package/tests/utils/ngtsc-scss-refactor.spec.ts +66 -0
- package/tests/utils/output-path-rewriter.spec.ts +165 -0
- package/tests/utils/output-utils.spec.ts +104 -0
- package/tests/utils/package-utils.spec.ts +52 -0
- package/tests/utils/rebuild-manager.spec.ts +30 -27
- package/tests/utils/replace-deps.spec.ts +69 -0
- package/tests/utils/scss-compiler.spec.ts +131 -0
- package/tests/utils/sd-config.spec.ts +77 -0
- package/tests/utils/tsc-build.spec.ts +358 -0
- package/tests/utils/tsconfig-angular.spec.ts +71 -0
- package/tests/utils/typecheck-non-package.spec.ts +120 -0
- package/tests/utils/worker-events.spec.ts +155 -0
- package/tests/utils/worker-utils.spec.ts +43 -0
- package/tests/vitest-plugin-cwd.spec.ts +68 -0
- package/tests/vitest-plugin.spec.ts +103 -0
- package/tests/workers/library-build-worker.spec.ts +258 -0
- package/tests/workers/ngtsc-build-worker.spec.ts +187 -0
- package/tests/workers/server-build-worker.spec.ts +566 -0
- package/tests/workers/server-runtime-worker.spec.ts +251 -0
- package/README.md +0 -295
- package/dist/builders/BaseBuilder.d.ts +0 -88
- package/dist/builders/BaseBuilder.d.ts.map +0 -1
- package/dist/builders/BaseBuilder.js +0 -142
- package/dist/builders/BaseBuilder.js.map +0 -6
- package/dist/builders/DtsBuilder.d.ts +0 -22
- package/dist/builders/DtsBuilder.d.ts.map +0 -1
- package/dist/builders/DtsBuilder.js +0 -72
- package/dist/builders/DtsBuilder.js.map +0 -6
- package/dist/builders/LibraryBuilder.d.ts +0 -22
- package/dist/builders/LibraryBuilder.d.ts.map +0 -1
- package/dist/builders/LibraryBuilder.js +0 -85
- package/dist/builders/LibraryBuilder.js.map +0 -6
- package/dist/builders/types.d.ts +0 -55
- package/dist/builders/types.d.ts.map +0 -1
- package/dist/builders/types.js +0 -1
- package/dist/builders/types.js.map +0 -6
- package/dist/capacitor/capacitor.d.ts +0 -151
- package/dist/capacitor/capacitor.d.ts.map +0 -1
- package/dist/capacitor/capacitor.js +0 -694
- package/dist/capacitor/capacitor.js.map +0 -6
- package/dist/commands/device.d.ts +0 -22
- package/dist/commands/device.d.ts.map +0 -1
- package/dist/commands/device.js +0 -98
- package/dist/commands/device.js.map +0 -6
- package/dist/commands/init.d.ts +0 -14
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -72
- package/dist/commands/init.js.map +0 -6
- package/dist/electron/electron.d.ts +0 -84
- package/dist/electron/electron.d.ts.map +0 -1
- package/dist/electron/electron.js +0 -263
- package/dist/electron/electron.js.map +0 -6
- package/dist/orchestrators/DevOrchestrator.d.ts +0 -83
- package/dist/orchestrators/DevOrchestrator.d.ts.map +0 -1
- package/dist/orchestrators/DevOrchestrator.js +0 -540
- package/dist/orchestrators/DevOrchestrator.js.map +0 -6
- package/dist/orchestrators/WatchOrchestrator.d.ts +0 -57
- package/dist/orchestrators/WatchOrchestrator.d.ts.map +0 -1
- package/dist/orchestrators/WatchOrchestrator.js +0 -199
- package/dist/orchestrators/WatchOrchestrator.js.map +0 -6
- package/dist/utils/tailwind-config-deps.d.ts +0 -8
- package/dist/utils/tailwind-config-deps.d.ts.map +0 -1
- package/dist/utils/tailwind-config-deps.js +0 -82
- package/dist/utils/tailwind-config-deps.js.map +0 -6
- package/dist/utils/template.d.ts +0 -14
- package/dist/utils/template.d.ts.map +0 -1
- package/dist/utils/template.js +0 -33
- package/dist/utils/template.js.map +0 -6
- package/dist/utils/vite-config.d.ts +0 -35
- package/dist/utils/vite-config.d.ts.map +0 -1
- package/dist/utils/vite-config.js +0 -259
- package/dist/utils/vite-config.js.map +0 -6
- package/dist/workers/client.worker.d.ts +0 -83
- package/dist/workers/client.worker.d.ts.map +0 -1
- package/dist/workers/client.worker.js +0 -111
- package/dist/workers/client.worker.js.map +0 -6
- package/dist/workers/dts.worker.d.ts +0 -75
- package/dist/workers/dts.worker.d.ts.map +0 -1
- package/dist/workers/dts.worker.js +0 -270
- package/dist/workers/dts.worker.js.map +0 -6
- package/dist/workers/library.worker.d.ts +0 -75
- package/dist/workers/library.worker.d.ts.map +0 -1
- package/dist/workers/library.worker.js +0 -166
- package/dist/workers/library.worker.js.map +0 -6
- package/dist/workers/server.worker.d.ts.map +0 -1
- package/dist/workers/server.worker.js +0 -482
- package/dist/workers/server.worker.js.map +0 -6
- package/src/builders/BaseBuilder.ts +0 -218
- package/src/builders/DtsBuilder.ts +0 -92
- package/src/builders/LibraryBuilder.ts +0 -110
- package/src/builders/types.ts +0 -60
- package/src/capacitor/capacitor.ts +0 -931
- package/src/commands/device.ts +0 -140
- package/src/commands/init.ts +0 -113
- package/src/electron/electron.ts +0 -362
- package/src/orchestrators/DevOrchestrator.ts +0 -744
- package/src/orchestrators/WatchOrchestrator.ts +0 -277
- package/src/utils/tailwind-config-deps.ts +0 -98
- package/src/utils/template.ts +0 -56
- package/src/utils/vite-config.ts +0 -390
- package/src/workers/client.worker.ts +0 -250
- package/src/workers/dts.worker.ts +0 -453
- package/src/workers/library.worker.ts +0 -316
- package/src/workers/server.worker.ts +0 -734
- package/templates/init/.gitignore.hbs +0 -34
- package/templates/init/.npmrc.hbs +0 -1
- package/templates/init/.prettierignore +0 -1
- package/templates/init/.prettierrc.yaml +0 -12
- package/templates/init/eslint.config.ts +0 -15
- package/templates/init/mise.toml +0 -3
- package/templates/init/package.json.hbs +0 -32
- package/templates/init/packages/client-admin/index.html.hbs +0 -144
- package/templates/init/packages/client-admin/package.json.hbs +0 -27
- package/templates/init/packages/client-admin/public/assets/logo-landscape.png +0 -0
- package/templates/init/packages/client-admin/public/assets/logo.png +0 -0
- package/templates/init/packages/client-admin/public/favicon.ico +0 -0
- package/templates/init/packages/client-admin/src/App.tsx +0 -42
- package/templates/init/packages/client-admin/src/dev/DevDialog.tsx +0 -34
- package/templates/init/packages/client-admin/src/events/AuthChangeEvent.ts +0 -3
- package/templates/init/packages/client-admin/src/main.css +0 -4
- package/templates/init/packages/client-admin/src/main.tsx.hbs +0 -146
- package/templates/init/packages/client-admin/src/providers/AppServiceProvider.tsx.hbs +0 -103
- package/templates/init/packages/client-admin/src/providers/AppStructureProvider.tsx +0 -84
- package/templates/init/packages/client-admin/src/providers/AuthProvider.tsx.hbs +0 -96
- package/templates/init/packages/client-admin/src/providers/configureSharedData.ts.hbs +0 -67
- package/templates/init/packages/client-admin/src/views/auth/LoginView.tsx +0 -132
- package/templates/init/packages/client-admin/src/views/home/HomeView.tsx +0 -108
- package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeDetail.tsx.hbs +0 -243
- package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeSheet.tsx.hbs +0 -271
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleDetail.tsx.hbs +0 -146
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionDetail.tsx.hbs +0 -121
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionView.tsx +0 -52
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleSheet.tsx.hbs +0 -125
- package/templates/init/packages/client-admin/src/views/home/main/MainView.tsx.hbs +0 -13
- package/templates/init/packages/client-admin/src/views/home/my-info/MyInfoDetail.tsx.hbs +0 -241
- package/templates/init/packages/client-admin/src/views/home/system/system-log/SystemLogSheet.tsx.hbs +0 -169
- package/templates/init/packages/client-admin/src/views/not-found/NotFoundView.tsx +0 -15
- package/templates/init/packages/client-admin/tailwind.config.ts +0 -10
- package/templates/init/packages/db-main/package.json.hbs +0 -13
- package/templates/init/packages/db-main/src/MainDbContext.ts +0 -22
- package/templates/init/packages/db-main/src/dataLogExt.ts +0 -127
- package/templates/init/packages/db-main/src/index.ts +0 -14
- package/templates/init/packages/db-main/src/tables/base/Employee.ts +0 -24
- package/templates/init/packages/db-main/src/tables/base/EmployeeConfig.ts +0 -13
- package/templates/init/packages/db-main/src/tables/base/Role.ts +0 -9
- package/templates/init/packages/db-main/src/tables/base/RolePermission.ts +0 -13
- package/templates/init/packages/db-main/src/tables/system/_DataLog.ts +0 -19
- package/templates/init/packages/db-main/src/tables/system/_Log.ts +0 -16
- package/templates/init/packages/server/package.json.hbs +0 -20
- package/templates/init/packages/server/public-dev/dev//354/264/210/352/270/260/355/231/224.xlsx +0 -0
- package/templates/init/packages/server/src/index.ts +0 -4
- package/templates/init/packages/server/src/main.ts.hbs +0 -34
- package/templates/init/packages/server/src/services/AuthService.ts.hbs +0 -171
- package/templates/init/packages/server/src/services/DevService.ts.hbs +0 -94
- package/templates/init/packages/server/src/services/EmployeeService.ts.hbs +0 -122
- package/templates/init/packages/server/src/services/RoleService.ts.hbs +0 -59
- package/templates/init/pnpm-workspace.yaml +0 -15
- package/templates/init/sd.config.ts.hbs +0 -48
- package/templates/init/tsconfig.json.hbs +0 -39
- package/templates/init/vitest.config.ts +0 -36
- package/tests/capacitor-exclude.spec.ts +0 -78
- package/tests/capacitor.spec.ts +0 -49
- package/tests/copy-src.spec.ts +0 -50
- package/tests/electron-exclude.spec.ts +0 -61
- package/tests/get-compiler-options-for-package.spec.ts +0 -80
- package/tests/get-package-source-files.spec.ts +0 -139
- package/tests/get-types-from-package-json.spec.ts +0 -92
- package/tests/infra/ResultCollector.spec.ts +0 -30
- package/tests/infra/SignalHandler.spec.ts +0 -38
- package/tests/infra/WorkerManager.spec.ts +0 -63
- package/tests/load-ignore-patterns.spec.ts +0 -163
- package/tests/load-sd-config.spec.ts +0 -100
- package/tests/package-utils.spec.ts +0 -188
- package/tests/parse-root-tsconfig.spec.ts +0 -89
- package/tests/publish-config-narrowing.spec.ts +0 -20
- package/tests/replace-deps.spec.ts +0 -308
- package/tests/run-lint.spec.ts +0 -366
- package/tests/run-typecheck.spec.ts +0 -544
- package/tests/run-watch.spec.ts +0 -76
- package/tests/sd-cli.spec.ts +0 -265
- package/tests/sd-public-dev-plugin-mime.spec.ts +0 -19
- package/tests/tailwind-config-deps.spec.ts +0 -30
- package/tests/template.spec.ts +0 -70
- package/tests/vite-config-exclude.spec.ts +0 -35
- package/tests/vite-config-outdir.spec.ts +0 -38
- package/tests/write-changed-output-files.spec.ts +0 -97
|
@@ -1,734 +0,0 @@
|
|
|
1
|
-
import path from "path";
|
|
2
|
-
import fs from "fs";
|
|
3
|
-
import { execaSync } from "execa";
|
|
4
|
-
import esbuild from "esbuild";
|
|
5
|
-
import { createWorker, FsWatcher, pathx } from "@simplysm/core-node";
|
|
6
|
-
import { err as errNs } from "@simplysm/core-common";
|
|
7
|
-
import { consola } from "consola";
|
|
8
|
-
import {
|
|
9
|
-
parseRootTsconfig,
|
|
10
|
-
getPackageSourceFiles,
|
|
11
|
-
getCompilerOptionsForPackage,
|
|
12
|
-
} from "../utils/tsconfig";
|
|
13
|
-
import {
|
|
14
|
-
createServerEsbuildOptions,
|
|
15
|
-
collectUninstalledOptionalPeerDeps,
|
|
16
|
-
collectNativeModuleExternals,
|
|
17
|
-
writeChangedOutputFiles,
|
|
18
|
-
} from "../utils/esbuild-config";
|
|
19
|
-
import { registerCleanupHandlers, createOnceGuard, applyDebugLevel } from "../utils/worker-utils";
|
|
20
|
-
import { collectDeps } from "../utils/package-utils";
|
|
21
|
-
import { copyPublicFiles, watchPublicFiles } from "../utils/copy-public";
|
|
22
|
-
|
|
23
|
-
//#region Types
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Server build information (for one-time build)
|
|
27
|
-
*/
|
|
28
|
-
export interface ServerBuildInfo {
|
|
29
|
-
name: string;
|
|
30
|
-
cwd: string;
|
|
31
|
-
pkgDir: string;
|
|
32
|
-
/** Environment variables to substitute during build */
|
|
33
|
-
env?: Record<string, string>;
|
|
34
|
-
/** Runtime configuration (recorded in dist/.config.json) */
|
|
35
|
-
configs?: Record<string, unknown>;
|
|
36
|
-
/** External modules manually specified in sd.config.ts */
|
|
37
|
-
externals?: string[];
|
|
38
|
-
/** PM2 configuration (generates dist/pm2.config.cjs when specified) */
|
|
39
|
-
pm2?: {
|
|
40
|
-
name?: string;
|
|
41
|
-
ignoreWatchPaths?: string[];
|
|
42
|
-
};
|
|
43
|
-
/** Package manager to use (affects mise.toml or volta settings generation) */
|
|
44
|
-
packageManager?: "volta" | "mise";
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Server build result
|
|
49
|
-
*/
|
|
50
|
-
export interface ServerBuildResult {
|
|
51
|
-
success: boolean;
|
|
52
|
-
mainJsPath: string;
|
|
53
|
-
errors?: string[];
|
|
54
|
-
warnings?: string[];
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Server watch information
|
|
59
|
-
*/
|
|
60
|
-
export interface ServerWatchInfo {
|
|
61
|
-
name: string;
|
|
62
|
-
cwd: string;
|
|
63
|
-
pkgDir: string;
|
|
64
|
-
/** Environment variables to substitute during build */
|
|
65
|
-
env?: Record<string, string>;
|
|
66
|
-
/** Runtime configuration (recorded in dist/.config.json) */
|
|
67
|
-
configs?: Record<string, unknown>;
|
|
68
|
-
/** External modules manually specified in sd.config.ts */
|
|
69
|
-
externals?: string[];
|
|
70
|
-
/** replaceDeps configuration from sd.config.ts */
|
|
71
|
-
replaceDeps?: Record<string, string>;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Build event
|
|
76
|
-
*/
|
|
77
|
-
export interface ServerBuildEvent {
|
|
78
|
-
success: boolean;
|
|
79
|
-
mainJsPath: string;
|
|
80
|
-
errors?: string[];
|
|
81
|
-
warnings?: string[];
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Error event
|
|
86
|
-
*/
|
|
87
|
-
export interface ServerErrorEvent {
|
|
88
|
-
message: string;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Worker event types
|
|
93
|
-
*/
|
|
94
|
-
export interface ServerWorkerEvents extends Record<string, unknown> {
|
|
95
|
-
buildStart: Record<string, never>;
|
|
96
|
-
build: ServerBuildEvent;
|
|
97
|
-
error: ServerErrorEvent;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
//#endregion
|
|
101
|
-
|
|
102
|
-
//#region Resource Management
|
|
103
|
-
|
|
104
|
-
applyDebugLevel();
|
|
105
|
-
|
|
106
|
-
const logger = consola.withTag("sd:cli:server:worker");
|
|
107
|
-
|
|
108
|
-
/** esbuild build context (to be cleaned up) */
|
|
109
|
-
let esbuildContext: esbuild.BuildContext | undefined;
|
|
110
|
-
|
|
111
|
-
/** Last build metafile (for filtering changed files on rebuild) */
|
|
112
|
-
let lastMetafile: esbuild.Metafile | undefined;
|
|
113
|
-
|
|
114
|
-
/** Public files watcher (to be cleaned up) */
|
|
115
|
-
let publicWatcher: FsWatcher | undefined;
|
|
116
|
-
|
|
117
|
-
/** Source + scope packages watcher (to be cleaned up) */
|
|
118
|
-
let srcWatcher: FsWatcher | undefined;
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Clean up resources
|
|
122
|
-
*/
|
|
123
|
-
async function cleanup(): Promise<void> {
|
|
124
|
-
// Capture global variables to temporary variables and initialize
|
|
125
|
-
// (other calls can modify global variables while Promise.all is waiting)
|
|
126
|
-
const contextToDispose = esbuildContext;
|
|
127
|
-
esbuildContext = undefined;
|
|
128
|
-
lastMetafile = undefined;
|
|
129
|
-
|
|
130
|
-
const watcherToClose = publicWatcher;
|
|
131
|
-
publicWatcher = undefined;
|
|
132
|
-
|
|
133
|
-
const srcWatcherToClose = srcWatcher;
|
|
134
|
-
srcWatcher = undefined;
|
|
135
|
-
|
|
136
|
-
if (contextToDispose != null) {
|
|
137
|
-
await contextToDispose.dispose();
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (watcherToClose != null) {
|
|
141
|
-
await watcherToClose.close();
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
if (srcWatcherToClose != null) {
|
|
145
|
-
await srcWatcherToClose.close();
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Collect external modules from three sources and merge them.
|
|
151
|
-
* 1. Uninstalled optional peer dependencies
|
|
152
|
-
* 2. Native modules from binding.gyp
|
|
153
|
-
* 3. Manually specified in sd.config.ts
|
|
154
|
-
*/
|
|
155
|
-
function collectAllExternals(pkgDir: string, manualExternals?: string[]): string[] {
|
|
156
|
-
logger.debug("[externals] Scanning optional peer deps...");
|
|
157
|
-
let stepStart = performance.now();
|
|
158
|
-
const optionalPeerDeps = collectUninstalledOptionalPeerDeps(pkgDir);
|
|
159
|
-
logger.debug(
|
|
160
|
-
`[externals] Optional peer deps done: ${String(optionalPeerDeps.length)} found (${Math.round(performance.now() - stepStart)}ms)`,
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
logger.debug("[externals] Scanning native modules...");
|
|
164
|
-
stepStart = performance.now();
|
|
165
|
-
const nativeModules = collectNativeModuleExternals(pkgDir);
|
|
166
|
-
logger.debug(
|
|
167
|
-
`[externals] Native modules done: ${String(nativeModules.length)} found (${Math.round(performance.now() - stepStart)}ms)`,
|
|
168
|
-
);
|
|
169
|
-
|
|
170
|
-
const manual = manualExternals ?? [];
|
|
171
|
-
|
|
172
|
-
const merged = [...new Set([...optionalPeerDeps, ...nativeModules, ...manual])];
|
|
173
|
-
|
|
174
|
-
if (optionalPeerDeps.length > 0) {
|
|
175
|
-
logger.debug("Uninstalled optional peer deps (external):", optionalPeerDeps);
|
|
176
|
-
}
|
|
177
|
-
if (nativeModules.length > 0) {
|
|
178
|
-
logger.debug("Native modules (external):", nativeModules);
|
|
179
|
-
}
|
|
180
|
-
if (manual.length > 0) {
|
|
181
|
-
logger.debug("Manually specified (external):", manual);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
return merged;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Generate files for production deployment (called only in one-time build)
|
|
189
|
-
*
|
|
190
|
-
* - dist/package.json: include external modules as dependencies (add volta field if volta is used)
|
|
191
|
-
* - dist/mise.toml: specify Node version (only when packageManager === "mise")
|
|
192
|
-
* - dist/openssl.cnf: enable legacy OpenSSL provider
|
|
193
|
-
* - dist/pm2.config.cjs: PM2 process configuration (only when pm2 option is present)
|
|
194
|
-
*/
|
|
195
|
-
function generateProductionFiles(info: ServerBuildInfo, externals: string[]): void {
|
|
196
|
-
const distDir = path.join(info.pkgDir, "dist");
|
|
197
|
-
const pkgJson = JSON.parse(fs.readFileSync(path.join(info.pkgDir, "package.json"), "utf-8"));
|
|
198
|
-
|
|
199
|
-
// dist/package.json
|
|
200
|
-
logger.debug("GEN package.json...");
|
|
201
|
-
const distPkgJson: Record<string, unknown> = {
|
|
202
|
-
name: pkgJson.name,
|
|
203
|
-
version: pkgJson.version,
|
|
204
|
-
type: pkgJson.type,
|
|
205
|
-
};
|
|
206
|
-
if (externals.length > 0) {
|
|
207
|
-
const deps: Record<string, string> = {};
|
|
208
|
-
for (const ext of externals) {
|
|
209
|
-
deps[ext] = "*";
|
|
210
|
-
}
|
|
211
|
-
distPkgJson["dependencies"] = deps;
|
|
212
|
-
}
|
|
213
|
-
if (info.packageManager === "volta") {
|
|
214
|
-
const nodeVersion = execaSync("node", ["-v"]).stdout.trim();
|
|
215
|
-
distPkgJson["volta"] = { node: nodeVersion };
|
|
216
|
-
}
|
|
217
|
-
fs.writeFileSync(path.join(distDir, "package.json"), JSON.stringify(distPkgJson, undefined, 2));
|
|
218
|
-
|
|
219
|
-
// dist/mise.toml (only when packageManager === "mise")
|
|
220
|
-
if (info.packageManager === "mise") {
|
|
221
|
-
logger.debug("GEN mise.toml...");
|
|
222
|
-
const rootMiseTomlPath = path.join(info.cwd, "mise.toml");
|
|
223
|
-
let nodeVersion = "20";
|
|
224
|
-
if (fs.existsSync(rootMiseTomlPath)) {
|
|
225
|
-
const miseContent = fs.readFileSync(rootMiseTomlPath, "utf-8");
|
|
226
|
-
const match = /node\s*=\s*"([^"]+)"/.exec(miseContent);
|
|
227
|
-
if (match != null) {
|
|
228
|
-
nodeVersion = match[1];
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
fs.writeFileSync(path.join(distDir, "mise.toml"), `[tools]\nnode = "${nodeVersion}"\n`);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// dist/openssl.cnf
|
|
235
|
-
logger.debug("GEN openssl.cnf...");
|
|
236
|
-
fs.writeFileSync(
|
|
237
|
-
path.join(distDir, "openssl.cnf"),
|
|
238
|
-
[
|
|
239
|
-
"nodejs_conf = openssl_init",
|
|
240
|
-
"",
|
|
241
|
-
"[openssl_init]",
|
|
242
|
-
"providers = provider_sect",
|
|
243
|
-
"ssl_conf = ssl_sect",
|
|
244
|
-
"",
|
|
245
|
-
"[provider_sect]",
|
|
246
|
-
"default = default_sect",
|
|
247
|
-
"legacy = legacy_sect",
|
|
248
|
-
"",
|
|
249
|
-
"[default_sect]",
|
|
250
|
-
"activate = 1",
|
|
251
|
-
"",
|
|
252
|
-
"[legacy_sect]",
|
|
253
|
-
"activate = 1",
|
|
254
|
-
"",
|
|
255
|
-
"[ssl_sect]",
|
|
256
|
-
"system_default = system_default_sect",
|
|
257
|
-
"",
|
|
258
|
-
"[system_default_sect]",
|
|
259
|
-
"Options = UnsafeLegacyRenegotiation",
|
|
260
|
-
].join("\n"),
|
|
261
|
-
);
|
|
262
|
-
|
|
263
|
-
// dist/pm2.config.cjs (only when pm2 option is present)
|
|
264
|
-
if (info.pm2 != null) {
|
|
265
|
-
logger.debug("GEN pm2.config.cjs...");
|
|
266
|
-
|
|
267
|
-
const pm2Name = info.pm2.name ?? pkgJson.name.replace(/@/g, "").replace(/[/\\]/g, "-");
|
|
268
|
-
const ignoreWatch = JSON.stringify([
|
|
269
|
-
"node_modules",
|
|
270
|
-
"www",
|
|
271
|
-
...(info.pm2.ignoreWatchPaths ?? []),
|
|
272
|
-
]);
|
|
273
|
-
const envObj: Record<string, string> = {
|
|
274
|
-
NODE_ENV: "production",
|
|
275
|
-
TZ: "Asia/Seoul",
|
|
276
|
-
...(info.env ?? {}),
|
|
277
|
-
};
|
|
278
|
-
const envStr = JSON.stringify(envObj, undefined, 4);
|
|
279
|
-
|
|
280
|
-
const interpreterLine =
|
|
281
|
-
info.packageManager === "volta"
|
|
282
|
-
? ""
|
|
283
|
-
: ` interpreter: cp.execSync("mise which node").toString().trim(),\n`;
|
|
284
|
-
|
|
285
|
-
const pm2Config = [
|
|
286
|
-
...(info.packageManager !== "volta" ? [`const cp = require("child_process");`, ``] : []),
|
|
287
|
-
`module.exports = {`,
|
|
288
|
-
` name: ${JSON.stringify(pm2Name)},`,
|
|
289
|
-
` script: "main.js",`,
|
|
290
|
-
` watch: true,`,
|
|
291
|
-
` watch_delay: 2000,`,
|
|
292
|
-
` ignore_watch: ${ignoreWatch},`,
|
|
293
|
-
interpreterLine.trimEnd(),
|
|
294
|
-
` interpreter_args: "--openssl-config=openssl.cnf",`,
|
|
295
|
-
` env: ${envStr.replace(/\n/g, "\n ")},`,
|
|
296
|
-
` arrayProcess: "concat",`,
|
|
297
|
-
` useDelTargetNull: true,`,
|
|
298
|
-
`};`,
|
|
299
|
-
]
|
|
300
|
-
.filter((line) => line !== "")
|
|
301
|
-
.join("\n");
|
|
302
|
-
|
|
303
|
-
fs.writeFileSync(path.join(distDir, "pm2.config.cjs"), pm2Config);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
// Clean up resources before process termination (SIGTERM/SIGINT)
|
|
308
|
-
// Note: worker.terminate() does not call these handlers and terminates immediately.
|
|
309
|
-
// However, normal shutdown in watch mode is handled via SIGINT/SIGTERM from the main process, so this is fine.
|
|
310
|
-
registerCleanupHandlers(cleanup, logger);
|
|
311
|
-
|
|
312
|
-
//#endregion
|
|
313
|
-
|
|
314
|
-
//#region Worker
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* One-time build
|
|
318
|
-
*/
|
|
319
|
-
async function build(info: ServerBuildInfo): Promise<ServerBuildResult> {
|
|
320
|
-
const mainJsPath = path.join(info.pkgDir, "dist", "main.js");
|
|
321
|
-
|
|
322
|
-
try {
|
|
323
|
-
// Parse tsconfig
|
|
324
|
-
logger.debug("[build] Parsing tsconfig...");
|
|
325
|
-
let stepStart = performance.now();
|
|
326
|
-
const parsedConfig = parseRootTsconfig(info.cwd);
|
|
327
|
-
logger.debug(`[build] tsconfig parsed (${Math.round(performance.now() - stepStart)}ms)`);
|
|
328
|
-
|
|
329
|
-
stepStart = performance.now();
|
|
330
|
-
const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);
|
|
331
|
-
logger.debug(
|
|
332
|
-
`[build] Found ${String(entryPoints.length)} source files (${Math.round(performance.now() - stepStart)}ms)`,
|
|
333
|
-
);
|
|
334
|
-
|
|
335
|
-
// Server target is node environment
|
|
336
|
-
logger.debug("[build] Getting compiler options...");
|
|
337
|
-
stepStart = performance.now();
|
|
338
|
-
const compilerOptions = await getCompilerOptionsForPackage(
|
|
339
|
-
parsedConfig.options,
|
|
340
|
-
"node",
|
|
341
|
-
info.pkgDir,
|
|
342
|
-
);
|
|
343
|
-
logger.debug(
|
|
344
|
-
`[build] Compiler options ready (${Math.round(performance.now() - stepStart)}ms)`,
|
|
345
|
-
);
|
|
346
|
-
|
|
347
|
-
// Collect all externals (optional peer deps + native modules + manual)
|
|
348
|
-
logger.debug("[build] Collecting externals...");
|
|
349
|
-
stepStart = performance.now();
|
|
350
|
-
const external = collectAllExternals(info.pkgDir, info.externals);
|
|
351
|
-
logger.debug(
|
|
352
|
-
`[build] Collected ${String(external.length)} externals (${Math.round(performance.now() - stepStart)}ms)`,
|
|
353
|
-
);
|
|
354
|
-
|
|
355
|
-
// One-time esbuild
|
|
356
|
-
logger.debug("[build] Creating esbuild options...");
|
|
357
|
-
const esbuildOptions = createServerEsbuildOptions({
|
|
358
|
-
pkgDir: info.pkgDir,
|
|
359
|
-
entryPoints,
|
|
360
|
-
compilerOptions,
|
|
361
|
-
env: info.env,
|
|
362
|
-
external,
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
logger.debug("[build] Running esbuild...");
|
|
366
|
-
stepStart = performance.now();
|
|
367
|
-
const result = await esbuild.build(esbuildOptions);
|
|
368
|
-
logger.debug(`[build] esbuild done (${Math.round(performance.now() - stepStart)}ms)`);
|
|
369
|
-
|
|
370
|
-
// Generate .config.json
|
|
371
|
-
const confDistPath = path.join(info.pkgDir, "dist", ".config.json");
|
|
372
|
-
fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));
|
|
373
|
-
|
|
374
|
-
// Copy public/ to dist/ (production build: no public-dev)
|
|
375
|
-
logger.debug("[build] Copying public files...");
|
|
376
|
-
stepStart = performance.now();
|
|
377
|
-
await copyPublicFiles(info.pkgDir, false);
|
|
378
|
-
logger.debug(
|
|
379
|
-
`[build] Public files copied (${Math.round(performance.now() - stepStart)}ms)`,
|
|
380
|
-
);
|
|
381
|
-
|
|
382
|
-
// Generate production files (package.json, mise.toml, openssl.cnf, pm2.config.cjs)
|
|
383
|
-
logger.debug("[build] Generating production files...");
|
|
384
|
-
stepStart = performance.now();
|
|
385
|
-
generateProductionFiles(info, external);
|
|
386
|
-
logger.debug(
|
|
387
|
-
`[build] Production files generated (${Math.round(performance.now() - stepStart)}ms)`,
|
|
388
|
-
);
|
|
389
|
-
|
|
390
|
-
const errors = result.errors.map((e) => e.text);
|
|
391
|
-
const warnings = result.warnings.map((w) => w.text);
|
|
392
|
-
return {
|
|
393
|
-
success: result.errors.length === 0,
|
|
394
|
-
mainJsPath,
|
|
395
|
-
errors: errors.length > 0 ? errors : undefined,
|
|
396
|
-
warnings: warnings.length > 0 ? warnings : undefined,
|
|
397
|
-
};
|
|
398
|
-
} catch (err) {
|
|
399
|
-
return {
|
|
400
|
-
success: false,
|
|
401
|
-
mainJsPath,
|
|
402
|
-
errors: [errNs.message(err)],
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
const guardStartWatch = createOnceGuard("startWatch");
|
|
408
|
-
|
|
409
|
-
/**
|
|
410
|
-
* Create esbuild context and perform initial build
|
|
411
|
-
*/
|
|
412
|
-
async function createAndBuildContext(
|
|
413
|
-
info: ServerWatchInfo,
|
|
414
|
-
isFirstBuild: boolean,
|
|
415
|
-
resolveFirstBuild?: () => void,
|
|
416
|
-
): Promise<esbuild.BuildContext> {
|
|
417
|
-
const contextStart = performance.now();
|
|
418
|
-
|
|
419
|
-
logger.debug("[context] Parsing tsconfig...");
|
|
420
|
-
let stepStart = performance.now();
|
|
421
|
-
const parsedConfig = parseRootTsconfig(info.cwd);
|
|
422
|
-
logger.debug(`[context] tsconfig parsed (${Math.round(performance.now() - stepStart)}ms)`);
|
|
423
|
-
|
|
424
|
-
stepStart = performance.now();
|
|
425
|
-
const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);
|
|
426
|
-
logger.debug(
|
|
427
|
-
`[context] Found ${String(entryPoints.length)} source files (${Math.round(performance.now() - stepStart)}ms)`,
|
|
428
|
-
);
|
|
429
|
-
|
|
430
|
-
logger.debug("[context] Getting compiler options...");
|
|
431
|
-
stepStart = performance.now();
|
|
432
|
-
const compilerOptions = await getCompilerOptionsForPackage(
|
|
433
|
-
parsedConfig.options,
|
|
434
|
-
"node",
|
|
435
|
-
info.pkgDir,
|
|
436
|
-
);
|
|
437
|
-
logger.debug(
|
|
438
|
-
`[context] Compiler options ready (${Math.round(performance.now() - stepStart)}ms)`,
|
|
439
|
-
);
|
|
440
|
-
|
|
441
|
-
const mainJsPath = path.join(info.pkgDir, "dist", "main.js");
|
|
442
|
-
|
|
443
|
-
logger.debug("[context] Collecting externals...");
|
|
444
|
-
stepStart = performance.now();
|
|
445
|
-
const external = collectAllExternals(info.pkgDir, info.externals);
|
|
446
|
-
logger.debug(
|
|
447
|
-
`[context] Collected ${String(external.length)} externals (${Math.round(performance.now() - stepStart)}ms)`,
|
|
448
|
-
);
|
|
449
|
-
|
|
450
|
-
logger.debug("[context] Creating esbuild options (dev mode, minify disabled)...");
|
|
451
|
-
const baseOptions = createServerEsbuildOptions({
|
|
452
|
-
pkgDir: info.pkgDir,
|
|
453
|
-
entryPoints,
|
|
454
|
-
compilerOptions,
|
|
455
|
-
env: info.env,
|
|
456
|
-
external,
|
|
457
|
-
dev: true,
|
|
458
|
-
});
|
|
459
|
-
|
|
460
|
-
let isBuildFirstTime = isFirstBuild;
|
|
461
|
-
|
|
462
|
-
logger.debug("[context] Creating esbuild context...");
|
|
463
|
-
stepStart = performance.now();
|
|
464
|
-
const context = await esbuild.context({
|
|
465
|
-
...baseOptions,
|
|
466
|
-
metafile: true,
|
|
467
|
-
write: false,
|
|
468
|
-
plugins: [
|
|
469
|
-
{
|
|
470
|
-
name: "watch-notify",
|
|
471
|
-
setup(pluginBuild) {
|
|
472
|
-
let consecutiveStarts = 0;
|
|
473
|
-
|
|
474
|
-
pluginBuild.onStart(() => {
|
|
475
|
-
consecutiveStarts++;
|
|
476
|
-
logger.debug(`[esbuild] onStart (#${String(consecutiveStarts)})`);
|
|
477
|
-
|
|
478
|
-
if (consecutiveStarts > 3) {
|
|
479
|
-
// esbuild context.rebuild() silently retries on build errors (esbuild bug).
|
|
480
|
-
// Stop the retry loop and diagnose via esbuild.build().
|
|
481
|
-
void context.dispose().catch(() => {});
|
|
482
|
-
|
|
483
|
-
void esbuild
|
|
484
|
-
.build(baseOptions)
|
|
485
|
-
.catch((err: unknown) => {
|
|
486
|
-
sender.send("build", {
|
|
487
|
-
success: false,
|
|
488
|
-
mainJsPath,
|
|
489
|
-
errors: [errNs.message(err)],
|
|
490
|
-
});
|
|
491
|
-
})
|
|
492
|
-
.finally(() => {
|
|
493
|
-
resolveFirstBuild?.();
|
|
494
|
-
});
|
|
495
|
-
} else {
|
|
496
|
-
sender.send("buildStart", {});
|
|
497
|
-
}
|
|
498
|
-
});
|
|
499
|
-
|
|
500
|
-
pluginBuild.onEnd(async (result) => {
|
|
501
|
-
consecutiveStarts = 0;
|
|
502
|
-
|
|
503
|
-
// Save metafile
|
|
504
|
-
if (result.metafile != null) {
|
|
505
|
-
lastMetafile = result.metafile;
|
|
506
|
-
logger.debug(
|
|
507
|
-
`[esbuild] Metafile: ${String(Object.keys(result.metafile.inputs).length)} inputs, ${String(Object.keys(result.metafile.outputs).length)} outputs`,
|
|
508
|
-
);
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
const errors = result.errors.map((e) => e.text);
|
|
512
|
-
const warnings = result.warnings.map((w) => w.text);
|
|
513
|
-
const success = result.errors.length === 0;
|
|
514
|
-
|
|
515
|
-
// Write output files and check for changes
|
|
516
|
-
let hasOutputChange = false;
|
|
517
|
-
if (success && result.outputFiles != null) {
|
|
518
|
-
const writeStart = performance.now();
|
|
519
|
-
hasOutputChange = await writeChangedOutputFiles(result.outputFiles);
|
|
520
|
-
logger.debug(
|
|
521
|
-
`[esbuild] Output files written: changed=${String(hasOutputChange)}, count=${String(result.outputFiles.length)} (${Math.round(performance.now() - writeStart)}ms)`,
|
|
522
|
-
);
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
if (isBuildFirstTime && success) {
|
|
526
|
-
const confDistPath = path.join(info.pkgDir, "dist", ".config.json");
|
|
527
|
-
fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
// Only emit build event on first build, output change, or error
|
|
531
|
-
if (isBuildFirstTime || hasOutputChange || !success) {
|
|
532
|
-
sender.send("build", {
|
|
533
|
-
success,
|
|
534
|
-
mainJsPath,
|
|
535
|
-
errors: errors.length > 0 ? errors : undefined,
|
|
536
|
-
warnings: warnings.length > 0 ? warnings : undefined,
|
|
537
|
-
});
|
|
538
|
-
} else {
|
|
539
|
-
logger.debug("No output changes, skipping server restart");
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
if (isBuildFirstTime) {
|
|
543
|
-
isBuildFirstTime = false;
|
|
544
|
-
resolveFirstBuild?.();
|
|
545
|
-
}
|
|
546
|
-
});
|
|
547
|
-
},
|
|
548
|
-
},
|
|
549
|
-
],
|
|
550
|
-
});
|
|
551
|
-
logger.debug(
|
|
552
|
-
`[context] esbuild context created (${Math.round(performance.now() - stepStart)}ms)`,
|
|
553
|
-
);
|
|
554
|
-
|
|
555
|
-
logger.debug("[context] Running initial rebuild...");
|
|
556
|
-
stepStart = performance.now();
|
|
557
|
-
const progressTimer = setInterval(() => {
|
|
558
|
-
logger.debug(
|
|
559
|
-
`[esbuild] Still building... (${Math.round((performance.now() - stepStart) / 1000)}s elapsed)`,
|
|
560
|
-
);
|
|
561
|
-
}, 5000);
|
|
562
|
-
try {
|
|
563
|
-
await context.rebuild();
|
|
564
|
-
} catch {
|
|
565
|
-
// context.rebuild() may reject with "Cannot rebuild" when disposed
|
|
566
|
-
// from onStart guard. The real error is reported via esbuild.build()
|
|
567
|
-
// fallback in onStart, so we suppress this rejection.
|
|
568
|
-
} finally {
|
|
569
|
-
clearInterval(progressTimer);
|
|
570
|
-
}
|
|
571
|
-
logger.debug(
|
|
572
|
-
`[context] Initial rebuild done (${Math.round(performance.now() - stepStart)}ms)`,
|
|
573
|
-
);
|
|
574
|
-
|
|
575
|
-
logger.debug(
|
|
576
|
-
`[context] Total context setup: ${Math.round(performance.now() - contextStart)}ms`,
|
|
577
|
-
);
|
|
578
|
-
|
|
579
|
-
return context;
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
/**
|
|
583
|
-
* Start watch
|
|
584
|
-
* @remarks This function should be called only once per Worker.
|
|
585
|
-
* @throws If watch has already been started
|
|
586
|
-
*/
|
|
587
|
-
async function startWatch(info: ServerWatchInfo): Promise<void> {
|
|
588
|
-
guardStartWatch();
|
|
589
|
-
|
|
590
|
-
try {
|
|
591
|
-
const watchStart = performance.now();
|
|
592
|
-
logger.debug("[startWatch] Starting watch setup...");
|
|
593
|
-
|
|
594
|
-
// Promise to wait for first build completion
|
|
595
|
-
let resolveFirstBuild!: () => void;
|
|
596
|
-
const firstBuildPromise = new Promise<void>((resolve) => {
|
|
597
|
-
resolveFirstBuild = resolve;
|
|
598
|
-
});
|
|
599
|
-
|
|
600
|
-
// Create initial esbuild context and build
|
|
601
|
-
logger.debug("[startWatch] Creating initial esbuild context...");
|
|
602
|
-
let stepStart = performance.now();
|
|
603
|
-
esbuildContext = await createAndBuildContext(info, true, resolveFirstBuild);
|
|
604
|
-
logger.debug(
|
|
605
|
-
`[startWatch] Initial context created (${Math.round(performance.now() - stepStart)}ms)`,
|
|
606
|
-
);
|
|
607
|
-
|
|
608
|
-
// Wait for first build completion
|
|
609
|
-
logger.debug("[startWatch] Waiting for first build completion...");
|
|
610
|
-
stepStart = performance.now();
|
|
611
|
-
await firstBuildPromise;
|
|
612
|
-
logger.debug(
|
|
613
|
-
`[startWatch] First build completed (${Math.round(performance.now() - stepStart)}ms)`,
|
|
614
|
-
);
|
|
615
|
-
|
|
616
|
-
// Watch public/ and public-dev/ (dev mode includes public-dev)
|
|
617
|
-
logger.debug("[startWatch] Setting up public file watcher...");
|
|
618
|
-
stepStart = performance.now();
|
|
619
|
-
publicWatcher = await watchPublicFiles(info.pkgDir, true);
|
|
620
|
-
logger.debug(
|
|
621
|
-
`[startWatch] Public watcher ready (${Math.round(performance.now() - stepStart)}ms)`,
|
|
622
|
-
);
|
|
623
|
-
|
|
624
|
-
// Collect watch paths based on dependencies
|
|
625
|
-
logger.debug("[startWatch] Collecting dependencies for watch paths...");
|
|
626
|
-
stepStart = performance.now();
|
|
627
|
-
const { workspaceDeps, replaceDeps } = collectDeps(info.pkgDir, info.cwd, info.replaceDeps);
|
|
628
|
-
logger.debug(
|
|
629
|
-
`[startWatch] Deps collected: workspace=${String(workspaceDeps.length)}, replace=${String(replaceDeps.length)} (${Math.round(performance.now() - stepStart)}ms)`,
|
|
630
|
-
);
|
|
631
|
-
|
|
632
|
-
const watchPaths: string[] = [];
|
|
633
|
-
|
|
634
|
-
// 1) Server package itself + workspace dependency packages source
|
|
635
|
-
const watchDirs = [
|
|
636
|
-
info.pkgDir,
|
|
637
|
-
...workspaceDeps.map((d) => path.join(info.cwd, "packages", d)),
|
|
638
|
-
];
|
|
639
|
-
for (const dir of watchDirs) {
|
|
640
|
-
watchPaths.push(path.join(dir, "src", "**", "*"));
|
|
641
|
-
watchPaths.push(path.join(dir, "*.{ts,js,css}"));
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
// 2) ReplaceDeps dependency packages dist (root + package node_modules)
|
|
645
|
-
for (const pkg of replaceDeps) {
|
|
646
|
-
watchPaths.push(path.join(info.cwd, "node_modules", ...pkg.split("/"), "dist", "**", "*.js"));
|
|
647
|
-
watchPaths.push(
|
|
648
|
-
path.join(info.pkgDir, "node_modules", ...pkg.split("/"), "dist", "**", "*.js"),
|
|
649
|
-
);
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
// Start FsWatcher
|
|
653
|
-
logger.debug(`[startWatch] Starting FsWatcher with ${String(watchPaths.length)} paths...`);
|
|
654
|
-
stepStart = performance.now();
|
|
655
|
-
srcWatcher = await FsWatcher.watch(watchPaths);
|
|
656
|
-
logger.debug(
|
|
657
|
-
`[startWatch] FsWatcher ready (${Math.round(performance.now() - stepStart)}ms)`,
|
|
658
|
-
);
|
|
659
|
-
logger.debug(
|
|
660
|
-
`[startWatch] Total watch setup: ${Math.round(performance.now() - watchStart)}ms`,
|
|
661
|
-
);
|
|
662
|
-
|
|
663
|
-
// Handle file changes
|
|
664
|
-
srcWatcher.onChange({ delay: 300 }, async (changes) => {
|
|
665
|
-
try {
|
|
666
|
-
// If files are added/removed, recreate context (import graph may change)
|
|
667
|
-
const hasFileAddOrRemove = changes.some((c) => c.event === "add" || c.event === "unlink");
|
|
668
|
-
|
|
669
|
-
if (hasFileAddOrRemove) {
|
|
670
|
-
logger.debug("File add/remove detected, recreating context");
|
|
671
|
-
|
|
672
|
-
const oldContext = esbuildContext;
|
|
673
|
-
esbuildContext = await createAndBuildContext(info, false);
|
|
674
|
-
|
|
675
|
-
if (oldContext != null) {
|
|
676
|
-
await oldContext.dispose();
|
|
677
|
-
}
|
|
678
|
-
return;
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
// Only file changes: filter by metafile
|
|
682
|
-
if (esbuildContext == null) return;
|
|
683
|
-
|
|
684
|
-
// If no metafile (before first build), always rebuild
|
|
685
|
-
if (lastMetafile == null) {
|
|
686
|
-
await esbuildContext.rebuild();
|
|
687
|
-
return;
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
// Convert metafile.inputs keys to absolute paths (NormPath) for comparison
|
|
691
|
-
const metafileAbsPaths = new Set(
|
|
692
|
-
Object.keys(lastMetafile.inputs).map((key) => pathx.norm(info.cwd, key)),
|
|
693
|
-
);
|
|
694
|
-
|
|
695
|
-
const hasRelevantChange = changes.some((c) => metafileAbsPaths.has(c.path));
|
|
696
|
-
|
|
697
|
-
if (hasRelevantChange) {
|
|
698
|
-
await esbuildContext.rebuild();
|
|
699
|
-
} else {
|
|
700
|
-
logger.debug("Changed files not included in build, skipping rebuild");
|
|
701
|
-
}
|
|
702
|
-
} catch (err) {
|
|
703
|
-
sender.send("error", {
|
|
704
|
-
message: errNs.message(err),
|
|
705
|
-
});
|
|
706
|
-
}
|
|
707
|
-
});
|
|
708
|
-
} catch (err) {
|
|
709
|
-
sender.send("error", {
|
|
710
|
-
message: errNs.message(err),
|
|
711
|
-
});
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
/**
|
|
716
|
-
* Stop watch
|
|
717
|
-
* @remarks Cleans up esbuild context.
|
|
718
|
-
*/
|
|
719
|
-
async function stopWatch(): Promise<void> {
|
|
720
|
-
await cleanup();
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
const sender = createWorker<
|
|
724
|
-
{ build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },
|
|
725
|
-
ServerWorkerEvents
|
|
726
|
-
>({
|
|
727
|
-
build,
|
|
728
|
-
startWatch,
|
|
729
|
-
stopWatch,
|
|
730
|
-
});
|
|
731
|
-
|
|
732
|
-
export default sender;
|
|
733
|
-
|
|
734
|
-
//#endregion
|