@simplysm/sd-cli 13.0.100 → 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,744 +0,0 @@
|
|
|
1
|
-
import path from "path";
|
|
2
|
-
import { Worker, type WorkerProxy } from "@simplysm/core-node";
|
|
3
|
-
import { err as errNs } from "@simplysm/core-common";
|
|
4
|
-
import type { SdConfig, SdClientPackageConfig, SdServerPackageConfig } from "../sd-config.types";
|
|
5
|
-
import { consola } from "consola";
|
|
6
|
-
import { loadSdConfig } from "../utils/sd-config";
|
|
7
|
-
import { getVersion } from "../utils/build-env";
|
|
8
|
-
import { watchReplaceDeps, type WatchReplaceDepResult } from "../utils/replace-deps";
|
|
9
|
-
import type * as ClientWorkerModule from "../workers/client.worker";
|
|
10
|
-
import type * as ServerWorkerModule from "../workers/server.worker";
|
|
11
|
-
import type * as ServerRuntimeWorkerModule from "../workers/server-runtime.worker";
|
|
12
|
-
import { Capacitor } from "../capacitor/capacitor";
|
|
13
|
-
import { filterPackagesByTargets } from "../utils/package-utils";
|
|
14
|
-
import type { BuildResult } from "../infra/ResultCollector";
|
|
15
|
-
import { formatBuildMessages, printErrors, printServers } from "../utils/output-utils";
|
|
16
|
-
import { RebuildManager } from "../utils/rebuild-manager";
|
|
17
|
-
import {
|
|
18
|
-
registerWorkerEventHandlers,
|
|
19
|
-
type ServerReadyEventData,
|
|
20
|
-
type ServerBuildEventData,
|
|
21
|
-
type ErrorEventData,
|
|
22
|
-
} from "../utils/worker-events";
|
|
23
|
-
import { SignalHandler } from "../infra/SignalHandler";
|
|
24
|
-
|
|
25
|
-
//#region Types
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Dev Orchestrator options
|
|
29
|
-
*/
|
|
30
|
-
export interface DevOrchestratorOptions {
|
|
31
|
-
/** Filter for packages to develop (empty array means all packages) */
|
|
32
|
-
targets: string[];
|
|
33
|
-
options: string[];
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Client Worker info (for Vite dev server)
|
|
38
|
-
*/
|
|
39
|
-
interface ClientWorkerInfo {
|
|
40
|
-
name: string;
|
|
41
|
-
config: SdClientPackageConfig;
|
|
42
|
-
worker: WorkerProxy<typeof ClientWorkerModule>;
|
|
43
|
-
isInitialBuild: boolean;
|
|
44
|
-
buildResolver: (() => void) | undefined;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Options for client worker setup
|
|
49
|
-
*/
|
|
50
|
-
interface ClientSetupOptions {
|
|
51
|
-
workers: ClientWorkerInfo[];
|
|
52
|
-
/** Called on serverReady event. If undefined, completeTask is called with running status. */
|
|
53
|
-
onServerReady?: (workerInfo: ClientWorkerInfo, port: number, completeTask: (result: BuildResult) => void) => void;
|
|
54
|
-
/** Called on error event (in addition to default error handling) */
|
|
55
|
-
onError?: (workerInfo: ClientWorkerInfo) => void;
|
|
56
|
-
/** Create the config to pass to worker.startWatch() */
|
|
57
|
-
createConfig: (workerInfo: ClientWorkerInfo) => SdClientPackageConfig;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
//#endregion
|
|
61
|
-
|
|
62
|
-
//#region DevOrchestrator
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Orchestrator that coordinates dev mode execution
|
|
66
|
-
*
|
|
67
|
-
* Manages development mode execution for Client and Server packages.
|
|
68
|
-
* - `client` target: Start Vite dev server
|
|
69
|
-
* - `server` target: Server Build Worker + Server Runtime Worker
|
|
70
|
-
* - Support for Server-Client proxy connections
|
|
71
|
-
* - Support for Capacitor initialization
|
|
72
|
-
* - Shutdown via SIGINT/SIGTERM signals
|
|
73
|
-
*/
|
|
74
|
-
export class DevOrchestrator {
|
|
75
|
-
private readonly _options: DevOrchestratorOptions;
|
|
76
|
-
private readonly _logger = consola.withTag("sd:cli:dev");
|
|
77
|
-
private readonly _cwd: string;
|
|
78
|
-
|
|
79
|
-
// Config
|
|
80
|
-
private _sdConfig: SdConfig | undefined;
|
|
81
|
-
private _baseEnv: { VER: string; DEV: string } | undefined;
|
|
82
|
-
// Package classification
|
|
83
|
-
private readonly _serverPackages: Array<{ name: string; config: SdServerPackageConfig }> = [];
|
|
84
|
-
private readonly _clientPackages: Array<{ name: string; config: SdClientPackageConfig }> = [];
|
|
85
|
-
private readonly _serverClientsMap = new Map<string, string[]>();
|
|
86
|
-
private _hasPackages = false;
|
|
87
|
-
|
|
88
|
-
// Workers
|
|
89
|
-
private _standaloneClientWorkers: ClientWorkerInfo[] = [];
|
|
90
|
-
private _viteClientWorkers: ClientWorkerInfo[] = [];
|
|
91
|
-
private readonly _serverBuildWorkers = new Map<
|
|
92
|
-
string,
|
|
93
|
-
{
|
|
94
|
-
worker: WorkerProxy<typeof ServerWorkerModule>;
|
|
95
|
-
buildPromise: Promise<void>;
|
|
96
|
-
buildResolver: () => void;
|
|
97
|
-
mainJsPath?: string;
|
|
98
|
-
}
|
|
99
|
-
>();
|
|
100
|
-
private readonly _serverRuntimeWorkers = new Map<
|
|
101
|
-
string,
|
|
102
|
-
WorkerProxy<typeof ServerRuntimeWorkerModule>
|
|
103
|
-
>();
|
|
104
|
-
|
|
105
|
-
// State
|
|
106
|
-
private readonly _results = new Map<string, BuildResult>();
|
|
107
|
-
private _clientPorts: Record<string, number> = {};
|
|
108
|
-
private _rebuildManager!: RebuildManager;
|
|
109
|
-
private _signalHandler!: SignalHandler;
|
|
110
|
-
private _replaceDepWatcher: WatchReplaceDepResult | undefined;
|
|
111
|
-
private _printServersTimer: ReturnType<typeof setTimeout> | undefined;
|
|
112
|
-
|
|
113
|
-
constructor(options: DevOrchestratorOptions) {
|
|
114
|
-
this._cwd = process.cwd();
|
|
115
|
-
this._options = options;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Print server URL (debounce 300ms)
|
|
120
|
-
*
|
|
121
|
-
* Prevents duplicate output when server rebuild and scope rebuild occur simultaneously.
|
|
122
|
-
*/
|
|
123
|
-
private _schedulePrintServers(): void {
|
|
124
|
-
if (this._printServersTimer != null) clearTimeout(this._printServersTimer);
|
|
125
|
-
this._printServersTimer = setTimeout(() => {
|
|
126
|
-
printServers(this._results, this._serverClientsMap);
|
|
127
|
-
}, 300);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Initialize Orchestrator
|
|
132
|
-
* - Load sd.config.ts
|
|
133
|
-
* - Classify packages
|
|
134
|
-
* - Prepare environment variables
|
|
135
|
-
*/
|
|
136
|
-
async initialize(): Promise<void> {
|
|
137
|
-
const { targets } = this._options;
|
|
138
|
-
this._logger.debug("Starting dev mode", { targets });
|
|
139
|
-
|
|
140
|
-
// Load sd.config.ts (required for dev mode to access package build information)
|
|
141
|
-
try {
|
|
142
|
-
this._sdConfig = await loadSdConfig({
|
|
143
|
-
cwd: this._cwd,
|
|
144
|
-
dev: true,
|
|
145
|
-
options: this._options.options,
|
|
146
|
-
});
|
|
147
|
-
this._logger.debug("sd.config.ts loaded successfully");
|
|
148
|
-
} catch (err) {
|
|
149
|
-
this._logger.error(`Failed to load sd.config.ts: ${err instanceof Error ? err.message : err}`);
|
|
150
|
-
process.exitCode = 1;
|
|
151
|
-
throw err;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Start watch for replaceDeps if configured (initial replacement is handled in sd-cli.ts)
|
|
155
|
-
if (this._sdConfig.replaceDeps != null) {
|
|
156
|
-
this._replaceDepWatcher = await watchReplaceDeps(this._cwd, this._sdConfig.replaceDeps);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Prepare VER, DEV environment variables
|
|
160
|
-
const version = await getVersion(this._cwd);
|
|
161
|
-
this._baseEnv = { VER: version, DEV: "true" };
|
|
162
|
-
|
|
163
|
-
// Filter targets
|
|
164
|
-
const allPackages = filterPackagesByTargets(this._sdConfig.packages, targets);
|
|
165
|
-
|
|
166
|
-
// Filter only client/server packages
|
|
167
|
-
for (const [name, config] of Object.entries(allPackages)) {
|
|
168
|
-
if (config.target === "server") {
|
|
169
|
-
this._serverPackages.push({ name, config });
|
|
170
|
-
} else if (config.target === "client") {
|
|
171
|
-
this._clientPackages.push({ name, config });
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
if (this._serverPackages.length === 0 && this._clientPackages.length === 0) {
|
|
176
|
-
process.stdout.write("⚠ No client/server packages to develop.\n");
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
this._hasPackages = true;
|
|
181
|
-
|
|
182
|
-
// Find clients connected to servers (only if server is a dev target)
|
|
183
|
-
const serverNames = new Set(this._serverPackages.map(({ name }) => name));
|
|
184
|
-
for (const { name, config } of this._clientPackages) {
|
|
185
|
-
if (typeof config.server === "string" && serverNames.has(config.server)) {
|
|
186
|
-
const clients = this._serverClientsMap.get(config.server) ?? [];
|
|
187
|
-
clients.push(name);
|
|
188
|
-
this._serverClientsMap.set(config.server, clients);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Initialize infrastructure
|
|
193
|
-
this._rebuildManager = new RebuildManager(this._logger);
|
|
194
|
-
this._signalHandler = new SignalHandler();
|
|
195
|
-
|
|
196
|
-
// Print errors and server URL when batch is complete
|
|
197
|
-
this._rebuildManager.on("batchComplete", () => {
|
|
198
|
-
printErrors(this._results);
|
|
199
|
-
this._schedulePrintServers();
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Start dev mode
|
|
205
|
-
* - Create workers
|
|
206
|
-
* - Register event handlers
|
|
207
|
-
* - Initial build and server startup
|
|
208
|
-
* - Initialize Capacitor
|
|
209
|
-
*/
|
|
210
|
-
async start(): Promise<void> {
|
|
211
|
-
if (!this._hasPackages) {
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
const serverNames = new Set(this._serverPackages.map(({ name }) => name));
|
|
216
|
-
|
|
217
|
-
// Worker paths
|
|
218
|
-
const clientWorkerPath = import.meta.resolve("../workers/client.worker");
|
|
219
|
-
const serverWorkerPath = import.meta.resolve("../workers/server.worker");
|
|
220
|
-
const serverRuntimeWorkerPath = import.meta.resolve("../workers/server-runtime.worker");
|
|
221
|
-
|
|
222
|
-
// Standalone client cases:
|
|
223
|
-
// - server is a number
|
|
224
|
-
// - server is a string but the server is not a dev target
|
|
225
|
-
this._standaloneClientWorkers = this._clientPackages
|
|
226
|
-
.filter(
|
|
227
|
-
({ config }) =>
|
|
228
|
-
typeof config.server === "number" ||
|
|
229
|
-
(typeof config.server === "string" && !serverNames.has(config.server)),
|
|
230
|
-
)
|
|
231
|
-
.map(({ name, config }) => ({
|
|
232
|
-
name,
|
|
233
|
-
config,
|
|
234
|
-
worker: Worker.create<typeof ClientWorkerModule>(clientWorkerPath),
|
|
235
|
-
isInitialBuild: true,
|
|
236
|
-
buildResolver: undefined,
|
|
237
|
-
}));
|
|
238
|
-
|
|
239
|
-
// Vite workers for clients connected to servers (only if server is a dev target)
|
|
240
|
-
this._viteClientWorkers = this._clientPackages
|
|
241
|
-
.filter(({ config }) => typeof config.server === "string" && serverNames.has(config.server))
|
|
242
|
-
.map(({ name, config }) => ({
|
|
243
|
-
name,
|
|
244
|
-
config,
|
|
245
|
-
worker: Worker.create<typeof ClientWorkerModule>(clientWorkerPath),
|
|
246
|
-
isInitialBuild: true,
|
|
247
|
-
buildResolver: undefined,
|
|
248
|
-
}));
|
|
249
|
-
|
|
250
|
-
// Setup and start workers for each section
|
|
251
|
-
const standaloneClientPromises = this._setupClientWorkers({
|
|
252
|
-
workers: this._standaloneClientWorkers,
|
|
253
|
-
createConfig: (workerInfo) => ({
|
|
254
|
-
...workerInfo.config,
|
|
255
|
-
env: { ...this._baseEnv, ...workerInfo.config.env },
|
|
256
|
-
}),
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
// Vite client ready promises (server waits for client ports before starting runtime)
|
|
260
|
-
const viteClientReadyPromises = new Map<string, { promise: Promise<void>; resolver: () => void }>();
|
|
261
|
-
for (const workerInfo of this._viteClientWorkers) {
|
|
262
|
-
let readyResolver!: () => void;
|
|
263
|
-
const readyPromise = new Promise<void>((resolve) => {
|
|
264
|
-
readyResolver = resolve;
|
|
265
|
-
});
|
|
266
|
-
viteClientReadyPromises.set(workerInfo.name, {
|
|
267
|
-
promise: readyPromise,
|
|
268
|
-
resolver: readyResolver,
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
const viteClientPromises = this._setupClientWorkers({
|
|
273
|
-
workers: this._viteClientWorkers,
|
|
274
|
-
onServerReady: (workerInfo, port, completeTask) => {
|
|
275
|
-
this._logger.debug(`[${workerInfo.name}] Vite serverReady (port: ${String(port)})`);
|
|
276
|
-
this._clientPorts[workerInfo.name] = port;
|
|
277
|
-
// Notify Vite server ready (server is waiting for proxy setup)
|
|
278
|
-
viteClientReadyPromises.get(workerInfo.name)?.resolver();
|
|
279
|
-
// Call completeTask for build completion (Vite doesn't emit build event)
|
|
280
|
-
completeTask({
|
|
281
|
-
name: workerInfo.name,
|
|
282
|
-
target: workerInfo.config.target,
|
|
283
|
-
type: "build",
|
|
284
|
-
status: "success",
|
|
285
|
-
});
|
|
286
|
-
},
|
|
287
|
-
onError: (workerInfo) => {
|
|
288
|
-
// Also resolve readyPromises on Vite client error
|
|
289
|
-
// (prevent server from hanging indefinitely in await Promise.all(clientReadyPromises))
|
|
290
|
-
viteClientReadyPromises.get(workerInfo.name)?.resolver();
|
|
291
|
-
},
|
|
292
|
-
createConfig: (workerInfo) => ({
|
|
293
|
-
...workerInfo.config,
|
|
294
|
-
server: 0, // Vite will automatically assign port
|
|
295
|
-
env: { ...this._baseEnv, ...workerInfo.config.env },
|
|
296
|
-
}),
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
const serverPromises = this._setupServers(
|
|
300
|
-
serverWorkerPath,
|
|
301
|
-
serverRuntimeWorkerPath,
|
|
302
|
-
viteClientReadyPromises,
|
|
303
|
-
);
|
|
304
|
-
|
|
305
|
-
// Wait for initial build to complete (parallel execution)
|
|
306
|
-
this._logger.debug("Starting initial build (Promise.allSettled)");
|
|
307
|
-
const initialBuildPromises: Array<{ name: string; promise: Promise<void> }> = [
|
|
308
|
-
...standaloneClientPromises,
|
|
309
|
-
...viteClientPromises,
|
|
310
|
-
...serverPromises,
|
|
311
|
-
];
|
|
312
|
-
|
|
313
|
-
const initialResults = await Promise.allSettled(
|
|
314
|
-
initialBuildPromises.map((item) => item.promise),
|
|
315
|
-
);
|
|
316
|
-
|
|
317
|
-
initialResults.forEach((result, index) => {
|
|
318
|
-
const taskName = initialBuildPromises[index].name;
|
|
319
|
-
if (result.status === "rejected") {
|
|
320
|
-
this._logger.debug(`[${taskName}] Initial build failed:`, result.reason);
|
|
321
|
-
} else {
|
|
322
|
-
this._logger.debug(`[${taskName}] Initial build completed`);
|
|
323
|
-
}
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
// Initialize Capacitor (for packages in client target with capacitor configuration)
|
|
327
|
-
const capacitorPackages: Array<[string, SdClientPackageConfig]> = [];
|
|
328
|
-
for (const { name, config } of this._clientPackages) {
|
|
329
|
-
if (config.capacitor != null) {
|
|
330
|
-
capacitorPackages.push([name, config]);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
if (capacitorPackages.length > 0) {
|
|
335
|
-
for (const [name, config] of capacitorPackages) {
|
|
336
|
-
const taskName = `${name} (capacitor)`;
|
|
337
|
-
this._logger.start(taskName);
|
|
338
|
-
const pkgDir = path.join(this._cwd, "packages", name);
|
|
339
|
-
try {
|
|
340
|
-
const cap = await Capacitor.create(pkgDir, config.capacitor!, config.exclude);
|
|
341
|
-
await cap.initialize();
|
|
342
|
-
this._results.set(`${name}:capacitor`, {
|
|
343
|
-
name,
|
|
344
|
-
target: "client",
|
|
345
|
-
type: "capacitor",
|
|
346
|
-
status: "success",
|
|
347
|
-
});
|
|
348
|
-
this._logger.success(taskName);
|
|
349
|
-
} catch (err) {
|
|
350
|
-
this._results.set(`${name}:capacitor`, {
|
|
351
|
-
name,
|
|
352
|
-
target: "client",
|
|
353
|
-
type: "capacitor",
|
|
354
|
-
status: "error",
|
|
355
|
-
message: errNs.message(err),
|
|
356
|
-
});
|
|
357
|
-
this._logger.fail(taskName);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
// Print initial build results
|
|
363
|
-
printErrors(this._results);
|
|
364
|
-
printServers(this._results, this._serverClientsMap);
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
/**
|
|
368
|
-
* Setup and start client workers (unified for standalone and server-connected clients)
|
|
369
|
-
*/
|
|
370
|
-
private _setupClientWorkers(opts: ClientSetupOptions): Array<{ name: string; promise: Promise<void> }> {
|
|
371
|
-
const buildPromises = new Map<string, Promise<void>>();
|
|
372
|
-
for (const workerInfo of opts.workers) {
|
|
373
|
-
buildPromises.set(
|
|
374
|
-
workerInfo.name,
|
|
375
|
-
new Promise<void>((resolve) => {
|
|
376
|
-
workerInfo.buildResolver = resolve;
|
|
377
|
-
}),
|
|
378
|
-
);
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// Register event handlers
|
|
382
|
-
for (const workerInfo of opts.workers) {
|
|
383
|
-
const completeTask = registerWorkerEventHandlers(
|
|
384
|
-
workerInfo,
|
|
385
|
-
{
|
|
386
|
-
resultKey: `${workerInfo.name}:build`,
|
|
387
|
-
listrTitle: `${workerInfo.name} (client)`,
|
|
388
|
-
resultType: "build",
|
|
389
|
-
},
|
|
390
|
-
this._results,
|
|
391
|
-
this._rebuildManager,
|
|
392
|
-
);
|
|
393
|
-
|
|
394
|
-
// serverReady (Vite dev server)
|
|
395
|
-
workerInfo.worker.on("serverReady", (data) => {
|
|
396
|
-
const event = data as ServerReadyEventData;
|
|
397
|
-
if (opts.onServerReady != null) {
|
|
398
|
-
opts.onServerReady(workerInfo, event.port, completeTask);
|
|
399
|
-
} else {
|
|
400
|
-
completeTask({
|
|
401
|
-
name: workerInfo.name,
|
|
402
|
-
target: workerInfo.config.target,
|
|
403
|
-
type: "server",
|
|
404
|
-
status: "running",
|
|
405
|
-
port: event.port,
|
|
406
|
-
});
|
|
407
|
-
}
|
|
408
|
-
});
|
|
409
|
-
|
|
410
|
-
// Additional error handling (in addition to default from registerWorkerEventHandlers)
|
|
411
|
-
if (opts.onError != null) {
|
|
412
|
-
workerInfo.worker.on("error", () => {
|
|
413
|
-
opts.onError!(workerInfo);
|
|
414
|
-
});
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
// Print server URL when scope package rebuild is detected
|
|
418
|
-
workerInfo.worker.on("scopeRebuild", () => {
|
|
419
|
-
this._schedulePrintServers();
|
|
420
|
-
});
|
|
421
|
-
|
|
422
|
-
// Start worker
|
|
423
|
-
const pkgDir = path.join(this._cwd, "packages", workerInfo.name);
|
|
424
|
-
const clientConfig = opts.createConfig(workerInfo);
|
|
425
|
-
workerInfo.worker
|
|
426
|
-
.startWatch({
|
|
427
|
-
name: workerInfo.name,
|
|
428
|
-
config: clientConfig,
|
|
429
|
-
cwd: this._cwd,
|
|
430
|
-
pkgDir,
|
|
431
|
-
replaceDeps: this._sdConfig!.replaceDeps,
|
|
432
|
-
})
|
|
433
|
-
.catch((err: unknown) => {
|
|
434
|
-
completeTask({
|
|
435
|
-
name: workerInfo.name,
|
|
436
|
-
target: workerInfo.config.target,
|
|
437
|
-
type: "build",
|
|
438
|
-
status: "error",
|
|
439
|
-
message: errNs.message(err),
|
|
440
|
-
});
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
return opts.workers.map((workerInfo) => ({
|
|
445
|
-
name: `${workerInfo.name} (client)`,
|
|
446
|
-
promise: buildPromises.get(workerInfo.name) ?? Promise.resolve(),
|
|
447
|
-
}));
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
/**
|
|
451
|
-
* Setup and start Server Build/Runtime workers
|
|
452
|
-
*/
|
|
453
|
-
private _setupServers(
|
|
454
|
-
serverWorkerPath: string,
|
|
455
|
-
serverRuntimeWorkerPath: string,
|
|
456
|
-
viteClientReadyPromises: Map<string, { promise: Promise<void>; resolver: () => void }>,
|
|
457
|
-
): Array<{ name: string; promise: Promise<void> }> {
|
|
458
|
-
// Create Server Build Worker and promise
|
|
459
|
-
for (const { name } of this._serverPackages) {
|
|
460
|
-
let resolver!: () => void;
|
|
461
|
-
const promise = new Promise<void>((resolve) => {
|
|
462
|
-
resolver = resolve;
|
|
463
|
-
});
|
|
464
|
-
this._serverBuildWorkers.set(name, {
|
|
465
|
-
worker: Worker.create<typeof ServerWorkerModule>(serverWorkerPath),
|
|
466
|
-
buildPromise: promise,
|
|
467
|
-
buildResolver: resolver,
|
|
468
|
-
});
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
// Server Runtime Promise (wait for initial server startup to complete)
|
|
472
|
-
const serverRuntimePromises = new Map<
|
|
473
|
-
string,
|
|
474
|
-
{ promise: Promise<void>; resolver: () => void }
|
|
475
|
-
>();
|
|
476
|
-
for (const { name } of this._serverPackages) {
|
|
477
|
-
let resolver!: () => void;
|
|
478
|
-
const promise = new Promise<void>((resolve) => {
|
|
479
|
-
resolver = resolve;
|
|
480
|
-
});
|
|
481
|
-
serverRuntimePromises.set(name, { promise, resolver });
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
// Track first build state per server
|
|
485
|
-
const isFirstBuild = new Map<string, boolean>(
|
|
486
|
-
this._serverPackages.map(({ name }) => [name, true])
|
|
487
|
-
);
|
|
488
|
-
|
|
489
|
-
// Helper to encapsulate result + promise resolution pattern
|
|
490
|
-
const resolveServerStep = (serverName: string, resultKey: string, result: BuildResult): void => {
|
|
491
|
-
this._results.set(resultKey, result);
|
|
492
|
-
if (isFirstBuild.get(serverName)) {
|
|
493
|
-
isFirstBuild.set(serverName, false);
|
|
494
|
-
serverRuntimePromises.get(serverName)?.resolver();
|
|
495
|
-
}
|
|
496
|
-
const updatedBuild = this._serverBuildWorkers.get(serverName)!;
|
|
497
|
-
updatedBuild.buildResolver();
|
|
498
|
-
};
|
|
499
|
-
|
|
500
|
-
// Register Server Build Worker event handlers
|
|
501
|
-
for (const { name, config } of this._serverPackages) {
|
|
502
|
-
const serverBuild = this._serverBuildWorkers.get(name)!;
|
|
503
|
-
|
|
504
|
-
serverBuild.worker.on("buildStart", () => {
|
|
505
|
-
if (!isFirstBuild.get(name)) {
|
|
506
|
-
// Register with RebuildManager on rebuild
|
|
507
|
-
const resolver = this._rebuildManager.registerBuild(`${name}:server`, `${name} (server)`);
|
|
508
|
-
this._serverBuildWorkers.set(name, {
|
|
509
|
-
...serverBuild,
|
|
510
|
-
buildResolver: resolver,
|
|
511
|
-
});
|
|
512
|
-
}
|
|
513
|
-
});
|
|
514
|
-
|
|
515
|
-
serverBuild.worker.on("build", (data) => {
|
|
516
|
-
const event = data as ServerBuildEventData;
|
|
517
|
-
this._logger.debug(`[${name}] server build: success=${String(event.success)}`);
|
|
518
|
-
|
|
519
|
-
// Print warnings
|
|
520
|
-
if (event.warnings != null && event.warnings.length > 0) {
|
|
521
|
-
this._logger.warn(formatBuildMessages(name, "server", event.warnings));
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
if (!event.success) {
|
|
525
|
-
resolveServerStep(name, `${name}:build`, {
|
|
526
|
-
name,
|
|
527
|
-
target: "server",
|
|
528
|
-
type: "build",
|
|
529
|
-
status: "error",
|
|
530
|
-
message: event.errors?.join("\n"),
|
|
531
|
-
});
|
|
532
|
-
return;
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
// Start runtime worker on build success (separate async function to prevent error propagation)
|
|
536
|
-
void this._startServerRuntime(
|
|
537
|
-
name,
|
|
538
|
-
event.mainJsPath,
|
|
539
|
-
serverRuntimeWorkerPath,
|
|
540
|
-
serverRuntimePromises,
|
|
541
|
-
resolveServerStep,
|
|
542
|
-
viteClientReadyPromises,
|
|
543
|
-
{ ...this._baseEnv, ...config.env },
|
|
544
|
-
).catch((err: unknown) => {
|
|
545
|
-
const message = errNs.message(err);
|
|
546
|
-
this._logger.error(`[${name}] Error starting Server Runtime:`, message);
|
|
547
|
-
|
|
548
|
-
resolveServerStep(name, `${name}:server`, {
|
|
549
|
-
name,
|
|
550
|
-
target: "server",
|
|
551
|
-
type: "server",
|
|
552
|
-
status: "error",
|
|
553
|
-
message,
|
|
554
|
-
});
|
|
555
|
-
});
|
|
556
|
-
});
|
|
557
|
-
|
|
558
|
-
serverBuild.worker.on("error", (data) => {
|
|
559
|
-
const event = data as ErrorEventData;
|
|
560
|
-
resolveServerStep(name, `${name}:build`, {
|
|
561
|
-
name,
|
|
562
|
-
target: "server",
|
|
563
|
-
type: "build",
|
|
564
|
-
status: "error",
|
|
565
|
-
message: event.message,
|
|
566
|
-
});
|
|
567
|
-
});
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
// Start Server Build workers
|
|
571
|
-
for (const { name, config } of this._serverPackages) {
|
|
572
|
-
const pkgDir = path.join(this._cwd, "packages", name);
|
|
573
|
-
const serverBuild = this._serverBuildWorkers.get(name)!;
|
|
574
|
-
serverBuild.worker
|
|
575
|
-
.startWatch({
|
|
576
|
-
name,
|
|
577
|
-
cwd: this._cwd,
|
|
578
|
-
pkgDir,
|
|
579
|
-
replaceDeps: this._sdConfig!.replaceDeps,
|
|
580
|
-
env: { ...this._baseEnv, ...config.env },
|
|
581
|
-
configs: config.configs,
|
|
582
|
-
externals: config.externals,
|
|
583
|
-
})
|
|
584
|
-
.catch((err: unknown) => {
|
|
585
|
-
this._results.set(`${name}:build`, {
|
|
586
|
-
name,
|
|
587
|
-
target: "server",
|
|
588
|
-
type: "build",
|
|
589
|
-
status: "error",
|
|
590
|
-
message: errNs.message(err),
|
|
591
|
-
});
|
|
592
|
-
serverRuntimePromises.get(name)?.resolver();
|
|
593
|
-
serverBuild.buildResolver();
|
|
594
|
-
});
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
return this._serverPackages.map(({ name }) => ({
|
|
598
|
-
name: `${name} (server)`,
|
|
599
|
-
promise: serverRuntimePromises.get(name)?.promise ?? Promise.resolve(),
|
|
600
|
-
}));
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
/**
|
|
604
|
-
* Start server runtime worker.
|
|
605
|
-
* Separated as a dedicated method to catch errors from async event handlers.
|
|
606
|
-
*/
|
|
607
|
-
private async _startServerRuntime(
|
|
608
|
-
serverName: string,
|
|
609
|
-
mainJsPath: string,
|
|
610
|
-
serverRuntimeWorkerPath: string,
|
|
611
|
-
serverRuntimePromises: Map<string, { promise: Promise<void>; resolver: () => void }>,
|
|
612
|
-
resolveServerStep: (serverName: string, resultKey: string, result: BuildResult) => void,
|
|
613
|
-
viteClientReadyPromises: Map<string, { promise: Promise<void>; resolver: () => void }>,
|
|
614
|
-
env?: Record<string, string>,
|
|
615
|
-
): Promise<void> {
|
|
616
|
-
const runtimeStartTime = performance.now();
|
|
617
|
-
this._logger.debug(`[${serverName}] _startServerRuntime: ${mainJsPath}`);
|
|
618
|
-
const updatedBuild = this._serverBuildWorkers.get(serverName)!;
|
|
619
|
-
updatedBuild.mainJsPath = mainJsPath;
|
|
620
|
-
|
|
621
|
-
// Terminate existing Server Runtime Worker
|
|
622
|
-
const existingRuntime = this._serverRuntimeWorkers.get(serverName);
|
|
623
|
-
if (existingRuntime != null) {
|
|
624
|
-
this._logger.info(`[${serverName}] Restarting server...`);
|
|
625
|
-
const terminateStart = performance.now();
|
|
626
|
-
await existingRuntime.terminate();
|
|
627
|
-
this._logger.debug(
|
|
628
|
-
`[${serverName}] Previous runtime terminated (${Math.round(performance.now() - terminateStart)}ms)`,
|
|
629
|
-
);
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
// Create and start new Server Runtime Worker
|
|
633
|
-
this._logger.debug(`[${serverName}] Creating runtime worker...`);
|
|
634
|
-
const runtimeWorker = Worker.create<typeof ServerRuntimeWorkerModule>(serverRuntimeWorkerPath);
|
|
635
|
-
this._serverRuntimeWorkers.set(serverName, runtimeWorker);
|
|
636
|
-
|
|
637
|
-
// Wait for Vite servers of clients connected to this server to be ready
|
|
638
|
-
const connectedClients = this._serverClientsMap.get(serverName) ?? [];
|
|
639
|
-
const clientReadyPromises = connectedClients
|
|
640
|
-
.map((clientName) => viteClientReadyPromises.get(clientName)?.promise)
|
|
641
|
-
.filter((p): p is Promise<void> => p != null);
|
|
642
|
-
this._logger.debug(
|
|
643
|
-
`[${serverName}] Waiting for clients: ${String(clientReadyPromises.length)} total`,
|
|
644
|
-
);
|
|
645
|
-
if (clientReadyPromises.length > 0) {
|
|
646
|
-
const waitStart = performance.now();
|
|
647
|
-
await Promise.all(clientReadyPromises);
|
|
648
|
-
this._logger.debug(
|
|
649
|
-
`[${serverName}] Clients ready (${Math.round(performance.now() - waitStart)}ms)`,
|
|
650
|
-
);
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
// Collect client ports for this server
|
|
654
|
-
const serverClientPorts: Record<string, number> = {};
|
|
655
|
-
for (const clientName of connectedClients) {
|
|
656
|
-
if (clientName in this._clientPorts) {
|
|
657
|
-
serverClientPorts[clientName] = this._clientPorts[clientName];
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
|
-
this._logger.debug(
|
|
661
|
-
`[${serverName}] Client ports: ${JSON.stringify(serverClientPorts)}`,
|
|
662
|
-
);
|
|
663
|
-
|
|
664
|
-
// Server Runtime event handlers
|
|
665
|
-
runtimeWorker.on("serverReady", (readyData) => {
|
|
666
|
-
const readyEvent = readyData as ServerReadyEventData;
|
|
667
|
-
resolveServerStep(serverName, `${serverName}:server`, {
|
|
668
|
-
name: serverName,
|
|
669
|
-
target: "server",
|
|
670
|
-
type: "server",
|
|
671
|
-
status: "running",
|
|
672
|
-
port: readyEvent.port,
|
|
673
|
-
});
|
|
674
|
-
});
|
|
675
|
-
|
|
676
|
-
runtimeWorker.on("error", (errorData) => {
|
|
677
|
-
const errorEvent = errorData as ErrorEventData;
|
|
678
|
-
resolveServerStep(serverName, `${serverName}:server`, {
|
|
679
|
-
name: serverName,
|
|
680
|
-
target: "server",
|
|
681
|
-
type: "server",
|
|
682
|
-
status: "error",
|
|
683
|
-
message: errorEvent.message,
|
|
684
|
-
});
|
|
685
|
-
});
|
|
686
|
-
|
|
687
|
-
// Start Server Runtime
|
|
688
|
-
// If worker crashes, it terminates without emitting "serverReady"/"error" events,
|
|
689
|
-
// so catch promise rejection to prevent hanging
|
|
690
|
-
this._logger.debug(
|
|
691
|
-
`[${serverName}] Starting runtime worker... (setup took ${Math.round(performance.now() - runtimeStartTime)}ms)`,
|
|
692
|
-
);
|
|
693
|
-
runtimeWorker
|
|
694
|
-
.start({
|
|
695
|
-
mainJsPath,
|
|
696
|
-
clientPorts: serverClientPorts,
|
|
697
|
-
env,
|
|
698
|
-
})
|
|
699
|
-
.catch((err: unknown) => {
|
|
700
|
-
const message = errNs.message(err);
|
|
701
|
-
this._logger.error(`[${serverName}] Server Runtime Worker crashed:`, message);
|
|
702
|
-
|
|
703
|
-
resolveServerStep(serverName, `${serverName}:server`, {
|
|
704
|
-
name: serverName,
|
|
705
|
-
target: "server",
|
|
706
|
-
type: "server",
|
|
707
|
-
status: "error",
|
|
708
|
-
message,
|
|
709
|
-
});
|
|
710
|
-
});
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
/**
|
|
714
|
-
* Wait for termination signal
|
|
715
|
-
*/
|
|
716
|
-
async awaitTermination(): Promise<void> {
|
|
717
|
-
if (!this._hasPackages) {
|
|
718
|
-
return;
|
|
719
|
-
}
|
|
720
|
-
await this._signalHandler.waitForTermination();
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
/**
|
|
724
|
-
* Shutdown orchestrator
|
|
725
|
-
*/
|
|
726
|
-
async shutdown(): Promise<void> {
|
|
727
|
-
if (!this._hasPackages) {
|
|
728
|
-
return;
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
// Terminate workers (all workers)
|
|
732
|
-
process.stdout.write("⏳ Shutting down...\n");
|
|
733
|
-
await Promise.all([
|
|
734
|
-
...this._standaloneClientWorkers.map(({ worker }) => worker.terminate()),
|
|
735
|
-
...this._viteClientWorkers.map(({ worker }) => worker.terminate()),
|
|
736
|
-
...[...this._serverBuildWorkers.values()].map(({ worker }) => worker.terminate()),
|
|
737
|
-
...[...this._serverRuntimeWorkers.values()].map((worker) => worker.terminate()),
|
|
738
|
-
]);
|
|
739
|
-
this._replaceDepWatcher?.dispose();
|
|
740
|
-
process.stdout.write("✔ Done\n");
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
//#endregion
|