@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
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { spawn, type ChildProcess } from "child_process";
|
|
3
|
+
import { consola } from "consola";
|
|
4
|
+
import { Worker, type WorkerProxy } from "@simplysm/core-node";
|
|
5
|
+
import { FsWatcher } from "@simplysm/core-node";
|
|
6
|
+
import { err as errNs } from "@simplysm/core-common";
|
|
7
|
+
import type {
|
|
8
|
+
BuildTarget,
|
|
9
|
+
SdBuildPackageConfig,
|
|
10
|
+
SdClientPackageConfig,
|
|
11
|
+
SdConfig,
|
|
12
|
+
SdScriptsPackageConfig,
|
|
13
|
+
SdServerPackageConfig,
|
|
14
|
+
} from "../sd-config.types";
|
|
15
|
+
import { loadSdConfig } from "../utils/sd-config";
|
|
16
|
+
import { filterPackagesByTargets, validateTargets } from "../utils/package-utils";
|
|
17
|
+
import { getVersion } from "../utils/build-env";
|
|
18
|
+
import { watchReplaceDeps, type WatchReplaceDepResult } from "../utils/replace-deps";
|
|
19
|
+
import { printErrors, printServers } from "../utils/output-utils";
|
|
20
|
+
import { RebuildManager } from "../utils/rebuild-manager";
|
|
21
|
+
import { ResultCollector } from "../infra/ResultCollector";
|
|
22
|
+
import { SignalHandler } from "../infra/SignalHandler";
|
|
23
|
+
import { createBuildEngine, type BuildEngine, type BuildPackageInfo, type ClientPackageInfo, type ServerPackageInfo } from "../engines/index";
|
|
24
|
+
import { watchCopySrcFiles } from "../utils/copy-src";
|
|
25
|
+
import type * as ServerRuntimeWorkerModule from "../workers/server-runtime.worker";
|
|
26
|
+
import type { ServerReadyEventData, ErrorEventData } from "../utils/worker-events";
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Orchestrator mode
|
|
30
|
+
*/
|
|
31
|
+
export type OrchestratorMode = "watch" | "dev";
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* DevWatchOrchestrator options
|
|
35
|
+
*/
|
|
36
|
+
export interface DevWatchOrchestratorOptions {
|
|
37
|
+
mode: OrchestratorMode;
|
|
38
|
+
targets: string[];
|
|
39
|
+
options: string[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Unified Orchestrator for watch and dev modes.
|
|
44
|
+
*
|
|
45
|
+
* - watch: Library(js+dts) + Scripts(watch hook) + copySrc + replaceDeps
|
|
46
|
+
* - dev: Server(js+runtime) + client-ready(skip) + replaceDeps
|
|
47
|
+
*/
|
|
48
|
+
export class DevWatchOrchestrator {
|
|
49
|
+
private readonly _cwd: string;
|
|
50
|
+
private readonly _options: DevWatchOrchestratorOptions;
|
|
51
|
+
private readonly _logger;
|
|
52
|
+
|
|
53
|
+
// Infrastructure
|
|
54
|
+
private _resultCollector!: ResultCollector;
|
|
55
|
+
private _signalHandler!: SignalHandler;
|
|
56
|
+
private _rebuildManager!: RebuildManager;
|
|
57
|
+
|
|
58
|
+
// Engines
|
|
59
|
+
private readonly _libraryEngines: BuildEngine[] = [];
|
|
60
|
+
private readonly _serverEngines = new Map<string, BuildEngine>();
|
|
61
|
+
|
|
62
|
+
// Package info
|
|
63
|
+
private readonly _libraryPackages: BuildPackageInfo[] = [];
|
|
64
|
+
private readonly _serverPackages: Array<{ name: string; dir: string; config: SdServerPackageConfig }> = [];
|
|
65
|
+
private readonly _watchHookPackages: Array<{ name: string; dir: string; config: SdScriptsPackageConfig | SdBuildPackageConfig }> = [];
|
|
66
|
+
private readonly _clientPackages: Array<{ name: string; dir: string; config: SdClientPackageConfig }> = [];
|
|
67
|
+
private readonly _clientEngines = new Map<string, BuildEngine>();
|
|
68
|
+
private readonly _serverClientsMap = new Map<string, string[]>();
|
|
69
|
+
|
|
70
|
+
// Dev mode: runtime workers
|
|
71
|
+
private _baseEnv: { VER: string; DEV: string } | undefined;
|
|
72
|
+
private readonly _serverRuntimeWorkers = new Map<string, WorkerProxy<typeof ServerRuntimeWorkerModule>>();
|
|
73
|
+
private _printServersTimer: ReturnType<typeof setTimeout> | undefined;
|
|
74
|
+
|
|
75
|
+
// Watchers
|
|
76
|
+
private _copySrcWatchers: FsWatcher[] = [];
|
|
77
|
+
private readonly _watchHookWatchers: FsWatcher[] = [];
|
|
78
|
+
private readonly _watchHookChildren = new Map<string, ChildProcess>();
|
|
79
|
+
private _replaceDepWatcher: WatchReplaceDepResult | undefined;
|
|
80
|
+
|
|
81
|
+
private _hasPackages = false;
|
|
82
|
+
|
|
83
|
+
constructor(options: DevWatchOrchestratorOptions) {
|
|
84
|
+
this._cwd = process.cwd();
|
|
85
|
+
this._options = options;
|
|
86
|
+
this._logger = consola.withTag(`sd:cli:${options.mode}`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async initialize(): Promise<void> {
|
|
90
|
+
this._logger.debug(`${this._options.mode} start`, { targets: this._options.targets });
|
|
91
|
+
|
|
92
|
+
// Load sd.config.ts
|
|
93
|
+
let sdConfig: SdConfig;
|
|
94
|
+
try {
|
|
95
|
+
sdConfig = await loadSdConfig({
|
|
96
|
+
cwd: this._cwd,
|
|
97
|
+
dev: true,
|
|
98
|
+
options: this._options.options,
|
|
99
|
+
});
|
|
100
|
+
this._logger.debug("sd.config.ts loaded");
|
|
101
|
+
} catch (err) {
|
|
102
|
+
this._logger.error(`Failed to load sd.config.ts: ${err instanceof Error ? err.message : err}`);
|
|
103
|
+
process.exitCode = 1;
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Validate targets
|
|
108
|
+
validateTargets(this._options.targets, sdConfig.packages);
|
|
109
|
+
|
|
110
|
+
// Start watch if replaceDeps config exists
|
|
111
|
+
if (sdConfig.replaceDeps != null) {
|
|
112
|
+
this._replaceDepWatcher = await watchReplaceDeps(this._cwd, sdConfig.replaceDeps);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Prepare VER, DEV environment variables for dev mode
|
|
116
|
+
if (this._options.mode === "dev") {
|
|
117
|
+
const version = await getVersion(this._cwd);
|
|
118
|
+
this._baseEnv = { VER: version, DEV: "true" };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Filter by targets
|
|
122
|
+
const allPackages = filterPackagesByTargets(sdConfig.packages, this._options.targets);
|
|
123
|
+
|
|
124
|
+
// Classify packages based on mode
|
|
125
|
+
const isLibraryTarget = (target: string): target is BuildTarget =>
|
|
126
|
+
target === "node" || target === "browser" || target === "neutral";
|
|
127
|
+
|
|
128
|
+
if (this._options.mode === "watch") {
|
|
129
|
+
this._classifyWatchPackages(allPackages, isLibraryTarget);
|
|
130
|
+
} else {
|
|
131
|
+
this._classifyDevPackages(allPackages);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Check if there are packages to process
|
|
135
|
+
const totalPackages = this._libraryPackages.length + this._serverPackages.length + this._watchHookPackages.length + this._clientPackages.length;
|
|
136
|
+
if (totalPackages === 0) {
|
|
137
|
+
const modeLabel = this._options.mode === "watch" ? "watch" : "develop";
|
|
138
|
+
process.stdout.write(`⚠ No packages to ${modeLabel}.\n`);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
this._hasPackages = true;
|
|
143
|
+
|
|
144
|
+
// Initialize infrastructure
|
|
145
|
+
this._signalHandler = new SignalHandler();
|
|
146
|
+
this._resultCollector = new ResultCollector();
|
|
147
|
+
this._rebuildManager = new RebuildManager(this._logger);
|
|
148
|
+
|
|
149
|
+
// Batch complete handler
|
|
150
|
+
if (this._options.mode === "watch") {
|
|
151
|
+
this._rebuildManager.on("batchComplete", () => {
|
|
152
|
+
printErrors(this._resultCollector.toMap());
|
|
153
|
+
});
|
|
154
|
+
} else {
|
|
155
|
+
this._rebuildManager.on("batchComplete", () => {
|
|
156
|
+
this._onDevBatchComplete();
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Create BuildEngines for library packages (watch mode only)
|
|
161
|
+
for (const pkg of this._libraryPackages) {
|
|
162
|
+
const engine = createBuildEngine(pkg, {
|
|
163
|
+
cwd: this._cwd,
|
|
164
|
+
resultCollector: this._resultCollector,
|
|
165
|
+
rebuildManager: this._rebuildManager,
|
|
166
|
+
});
|
|
167
|
+
this._libraryEngines.push(engine);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Create BuildEngines for server packages
|
|
171
|
+
for (const { name, dir, config } of this._serverPackages) {
|
|
172
|
+
const engineConfig = this._options.mode === "dev"
|
|
173
|
+
? { ...config, env: { ...this._baseEnv, ...config.env } }
|
|
174
|
+
: config;
|
|
175
|
+
|
|
176
|
+
const engine = createBuildEngine(
|
|
177
|
+
{ name, dir, config: engineConfig } as ServerPackageInfo,
|
|
178
|
+
{
|
|
179
|
+
cwd: this._cwd,
|
|
180
|
+
resultCollector: this._resultCollector,
|
|
181
|
+
rebuildManager: this._rebuildManager,
|
|
182
|
+
},
|
|
183
|
+
);
|
|
184
|
+
this._serverEngines.set(name, engine);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Create BuildEngines for client packages (dev mode only, no env)
|
|
188
|
+
for (const { name, dir, config } of this._clientPackages) {
|
|
189
|
+
const engine = createBuildEngine(
|
|
190
|
+
{ name, dir, config } as ClientPackageInfo,
|
|
191
|
+
{
|
|
192
|
+
cwd: this._cwd,
|
|
193
|
+
resultCollector: this._resultCollector,
|
|
194
|
+
rebuildManager: this._rebuildManager,
|
|
195
|
+
},
|
|
196
|
+
);
|
|
197
|
+
this._clientEngines.set(name, engine);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async start(): Promise<void> {
|
|
202
|
+
if (!this._hasPackages) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (this._options.mode === "watch") {
|
|
207
|
+
await this._startWatchMode();
|
|
208
|
+
} else {
|
|
209
|
+
await this._startDevMode();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
async awaitTermination(): Promise<void> {
|
|
214
|
+
if (!this._hasPackages) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
await this._signalHandler.waitForTermination();
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async shutdown(): Promise<void> {
|
|
221
|
+
if (!this._hasPackages) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
process.stdout.write("⏳ Shutting down...\n");
|
|
226
|
+
|
|
227
|
+
const shutdownTasks: Array<Promise<void>> = [];
|
|
228
|
+
|
|
229
|
+
// Stop all engines
|
|
230
|
+
shutdownTasks.push(...this._libraryEngines.map((e) => e.stop()));
|
|
231
|
+
shutdownTasks.push(...[...this._serverEngines.values()].map((e) => e.stop()));
|
|
232
|
+
shutdownTasks.push(...[...this._clientEngines.values()].map((e) => e.stop()));
|
|
233
|
+
|
|
234
|
+
// Close watchers (watch mode)
|
|
235
|
+
shutdownTasks.push(...this._copySrcWatchers.map((w) => w.close()));
|
|
236
|
+
shutdownTasks.push(...this._watchHookWatchers.map((w) => w.close()));
|
|
237
|
+
|
|
238
|
+
// Kill hook child processes
|
|
239
|
+
for (const child of this._watchHookChildren.values()) {
|
|
240
|
+
if (child.exitCode == null) {
|
|
241
|
+
child.kill();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
this._watchHookChildren.clear();
|
|
245
|
+
|
|
246
|
+
// Terminate runtime workers (dev mode)
|
|
247
|
+
shutdownTasks.push(...[...this._serverRuntimeWorkers.values()].map((w) => w.terminate()));
|
|
248
|
+
|
|
249
|
+
await Promise.all(shutdownTasks);
|
|
250
|
+
this._copySrcWatchers = [];
|
|
251
|
+
this._watchHookWatchers.length = 0;
|
|
252
|
+
this._replaceDepWatcher?.dispose();
|
|
253
|
+
|
|
254
|
+
process.stdout.write("✔ Done\n");
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// --- Package classification ---
|
|
258
|
+
|
|
259
|
+
private _classifyWatchPackages(
|
|
260
|
+
allPackages: Record<string, any>,
|
|
261
|
+
isLibraryTarget: (target: string) => target is BuildTarget,
|
|
262
|
+
): void {
|
|
263
|
+
for (const [name, config] of Object.entries(allPackages)) {
|
|
264
|
+
if (isLibraryTarget(config.target)) {
|
|
265
|
+
const pkgDir = path.join(this._cwd, "packages", name);
|
|
266
|
+
const buildConfig = config as SdBuildPackageConfig;
|
|
267
|
+
this._libraryPackages.push({ name, dir: pkgDir, config: buildConfig });
|
|
268
|
+
if (buildConfig.watch != null) {
|
|
269
|
+
this._watchHookPackages.push({ name, dir: pkgDir, config: buildConfig });
|
|
270
|
+
}
|
|
271
|
+
} else if (config.target === "scripts" && config.watch != null) {
|
|
272
|
+
this._watchHookPackages.push({
|
|
273
|
+
name,
|
|
274
|
+
dir: path.join(this._cwd, "packages", name),
|
|
275
|
+
config: config as SdScriptsPackageConfig,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
private _classifyDevPackages(allPackages: Record<string, any>): void {
|
|
282
|
+
// First pass: collect server names
|
|
283
|
+
const serverNames = new Set<string>();
|
|
284
|
+
for (const [name, config] of Object.entries(allPackages)) {
|
|
285
|
+
if (config.target === "server") {
|
|
286
|
+
serverNames.add(name);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Second pass: classify all packages
|
|
291
|
+
for (const [name, config] of Object.entries(allPackages)) {
|
|
292
|
+
if (config.target === "server") {
|
|
293
|
+
this._serverPackages.push({
|
|
294
|
+
name,
|
|
295
|
+
dir: path.join(this._cwd, "packages", name),
|
|
296
|
+
config: config as SdServerPackageConfig,
|
|
297
|
+
});
|
|
298
|
+
} else if (config.target === "client") {
|
|
299
|
+
this._clientPackages.push({
|
|
300
|
+
name,
|
|
301
|
+
dir: path.join(this._cwd, "packages", name),
|
|
302
|
+
config: config as SdClientPackageConfig,
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
// Build server-client mapping
|
|
306
|
+
if (typeof config.server === "string") {
|
|
307
|
+
if (serverNames.has(config.server)) {
|
|
308
|
+
const clients = this._serverClientsMap.get(config.server) ?? [];
|
|
309
|
+
clients.push(name);
|
|
310
|
+
this._serverClientsMap.set(config.server, clients);
|
|
311
|
+
} else {
|
|
312
|
+
process.stdout.write(
|
|
313
|
+
`⚠ Client "${name}" server "${config.server}" not in dev targets — running as standalone.\n`,
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// Library and scripts packages are excluded from dev mode
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// --- Watch mode ---
|
|
323
|
+
|
|
324
|
+
private async _startWatchMode(): Promise<void> {
|
|
325
|
+
// Start copySrc watchers for library packages
|
|
326
|
+
for (const pkg of this._libraryPackages) {
|
|
327
|
+
if (pkg.config.copySrc != null && pkg.config.copySrc.length > 0) {
|
|
328
|
+
const watcher = await watchCopySrcFiles(pkg.dir, pkg.config.copySrc);
|
|
329
|
+
this._copySrcWatchers.push(watcher);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Start all engines
|
|
334
|
+
this._logger.start("Running initial build...");
|
|
335
|
+
const watchPromises: Array<Promise<void>> = [];
|
|
336
|
+
watchPromises.push(...this._libraryEngines.map((e) => e.startWatch({ js: true, dts: true })));
|
|
337
|
+
|
|
338
|
+
await Promise.allSettled(watchPromises);
|
|
339
|
+
this._logger.success("Initial build completed");
|
|
340
|
+
|
|
341
|
+
// Print initial build results
|
|
342
|
+
printErrors(this._resultCollector.toMap());
|
|
343
|
+
|
|
344
|
+
// Start watch hook watchers for scripts+watch packages
|
|
345
|
+
for (const pkg of this._watchHookPackages) {
|
|
346
|
+
const watchConfig = pkg.config.watch!;
|
|
347
|
+
const watchTargets = watchConfig.target.map((t) => path.resolve(pkg.dir, t));
|
|
348
|
+
|
|
349
|
+
// Run initial hook
|
|
350
|
+
this._runWatchHookCmd(pkg.name, pkg.dir, watchConfig.cmd, watchConfig.args);
|
|
351
|
+
|
|
352
|
+
// Start watching
|
|
353
|
+
const watcher = await FsWatcher.watch(watchTargets);
|
|
354
|
+
watcher.onChange({ delay: 300 }, () => {
|
|
355
|
+
this._runWatchHookCmd(pkg.name, pkg.dir, watchConfig.cmd, watchConfig.args);
|
|
356
|
+
});
|
|
357
|
+
this._watchHookWatchers.push(watcher);
|
|
358
|
+
|
|
359
|
+
this._logger.success(`Watch hook started: ${pkg.name}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
private _runWatchHookCmd(pkgName: string, cwd: string, cmd: string, args?: string[]): void {
|
|
364
|
+
// Kill previous hook process if still running
|
|
365
|
+
const prev = this._watchHookChildren.get(pkgName);
|
|
366
|
+
if (prev != null && prev.exitCode == null) {
|
|
367
|
+
prev.kill();
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const child = spawn(cmd, args ?? [], { cwd, stdio: "inherit", shell: true });
|
|
371
|
+
this._watchHookChildren.set(pkgName, child);
|
|
372
|
+
|
|
373
|
+
child.on("error", (err) => {
|
|
374
|
+
this._logger.error(`Watch hook error (${pkgName}): ${err.message}`);
|
|
375
|
+
});
|
|
376
|
+
child.on("close", (code) => {
|
|
377
|
+
if (code !== 0 && code !== null) {
|
|
378
|
+
this._logger.warn(`Watch hook (${pkgName}) exited with code ${String(code)}`);
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// --- Dev mode ---
|
|
384
|
+
|
|
385
|
+
private async _startDevMode(): Promise<void> {
|
|
386
|
+
// Start client and server engines in parallel
|
|
387
|
+
this._logger.debug("Starting initial build (Promise.allSettled)");
|
|
388
|
+
const initialBuildPromises: Array<{ name: string; promise: Promise<void> }> = [];
|
|
389
|
+
|
|
390
|
+
for (const [name, engine] of this._clientEngines) {
|
|
391
|
+
initialBuildPromises.push({
|
|
392
|
+
name: `${name} (client)`,
|
|
393
|
+
promise: engine.startWatch({ js: true, dts: false }),
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
for (const [name, engine] of this._serverEngines) {
|
|
398
|
+
initialBuildPromises.push({
|
|
399
|
+
name: `${name} (server)`,
|
|
400
|
+
promise: engine.startWatch({ js: true, dts: false }),
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const initialResults = await Promise.allSettled(
|
|
405
|
+
initialBuildPromises.map((item) => item.promise),
|
|
406
|
+
);
|
|
407
|
+
|
|
408
|
+
initialResults.forEach((result, index) => {
|
|
409
|
+
const taskName = initialBuildPromises[index].name;
|
|
410
|
+
if (result.status === "rejected") {
|
|
411
|
+
this._logger.debug(`[${taskName}] Initial build failed:`, result.reason);
|
|
412
|
+
} else {
|
|
413
|
+
this._logger.debug(`[${taskName}] Initial build completed`);
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
// Register standalone client results in ResultCollector
|
|
418
|
+
for (const { name } of this._clientPackages) {
|
|
419
|
+
const isServerConnected = [...this._serverClientsMap.values()].some(
|
|
420
|
+
(clients) => clients.includes(name),
|
|
421
|
+
);
|
|
422
|
+
if (!isServerConnected) {
|
|
423
|
+
const port = this._getClientPort(name);
|
|
424
|
+
if (port != null) {
|
|
425
|
+
this._resultCollector.add({
|
|
426
|
+
name,
|
|
427
|
+
target: "client",
|
|
428
|
+
type: "server",
|
|
429
|
+
status: "running",
|
|
430
|
+
port,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// Start runtimes for successful initial builds
|
|
437
|
+
for (const { name, config } of this._serverPackages) {
|
|
438
|
+
const buildResult = this._resultCollector.get(`${name}:build`);
|
|
439
|
+
if (buildResult?.status === "success") {
|
|
440
|
+
const mainJsPath = path.join(this._cwd, "packages", name, "dist", "main.js");
|
|
441
|
+
const clientPorts = this._collectClientPorts(name);
|
|
442
|
+
try {
|
|
443
|
+
await this._startServerRuntime(name, mainJsPath, { ...this._baseEnv, ...config.env }, clientPorts);
|
|
444
|
+
} catch (err) {
|
|
445
|
+
this._logger.error(`[${name}] Error starting Server Runtime:`, errNs.message(err));
|
|
446
|
+
this._resultCollector.add({
|
|
447
|
+
name,
|
|
448
|
+
target: "server",
|
|
449
|
+
type: "server",
|
|
450
|
+
status: "error",
|
|
451
|
+
message: errNs.message(err),
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Print initial results
|
|
458
|
+
printErrors(this._resultCollector.toMap());
|
|
459
|
+
printServers(this._resultCollector.toMap(), this._serverClientsMap);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
private _onDevBatchComplete(): void {
|
|
463
|
+
const restartPromises: Array<Promise<void>> = [];
|
|
464
|
+
for (const { name, config } of this._serverPackages) {
|
|
465
|
+
const buildResult = this._resultCollector.get(`${name}:build`);
|
|
466
|
+
if (buildResult?.status === "success") {
|
|
467
|
+
const mainJsPath = path.join(this._cwd, "packages", name, "dist", "main.js");
|
|
468
|
+
const clientPorts = this._collectClientPorts(name);
|
|
469
|
+
restartPromises.push(
|
|
470
|
+
this._startServerRuntime(name, mainJsPath, { ...this._baseEnv, ...config.env }, clientPorts)
|
|
471
|
+
.catch((err: unknown) => {
|
|
472
|
+
this._logger.error(`[${name}] Error starting Server Runtime:`, errNs.message(err));
|
|
473
|
+
this._resultCollector.add({
|
|
474
|
+
name,
|
|
475
|
+
target: "server",
|
|
476
|
+
type: "server",
|
|
477
|
+
status: "error",
|
|
478
|
+
message: errNs.message(err),
|
|
479
|
+
});
|
|
480
|
+
}),
|
|
481
|
+
);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
void Promise.all(restartPromises).then(() => {
|
|
485
|
+
printErrors(this._resultCollector.toMap());
|
|
486
|
+
this._schedulePrintServers();
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
private _schedulePrintServers(): void {
|
|
491
|
+
if (this._printServersTimer != null) clearTimeout(this._printServersTimer);
|
|
492
|
+
this._printServersTimer = setTimeout(() => {
|
|
493
|
+
printServers(this._resultCollector.toMap(), this._serverClientsMap);
|
|
494
|
+
}, 300);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/** Get port from a client engine (duck-typing for ViteEngine.port) */
|
|
498
|
+
private _getClientPort(name: string): number | undefined {
|
|
499
|
+
const engine = this._clientEngines.get(name) as { port?: number } | undefined;
|
|
500
|
+
return engine?.port;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/** Collect client ports for a server's connected clients */
|
|
504
|
+
private _collectClientPorts(serverName: string): Record<string, number> {
|
|
505
|
+
const clientPorts: Record<string, number> = {};
|
|
506
|
+
const connectedClients = this._serverClientsMap.get(serverName) ?? [];
|
|
507
|
+
for (const clientName of connectedClients) {
|
|
508
|
+
const port = this._getClientPort(clientName);
|
|
509
|
+
if (port != null) {
|
|
510
|
+
clientPorts[clientName] = port;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
return clientPorts;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
private async _startServerRuntime(
|
|
517
|
+
serverName: string,
|
|
518
|
+
mainJsPath: string,
|
|
519
|
+
env?: Record<string, string>,
|
|
520
|
+
clientPorts?: Record<string, number>,
|
|
521
|
+
): Promise<void> {
|
|
522
|
+
this._logger.debug(`[${serverName}] _startServerRuntime: ${mainJsPath}`);
|
|
523
|
+
|
|
524
|
+
// Terminate existing runtime
|
|
525
|
+
const existingRuntime = this._serverRuntimeWorkers.get(serverName);
|
|
526
|
+
if (existingRuntime != null) {
|
|
527
|
+
this._logger.info(`[${serverName}] Restarting server...`);
|
|
528
|
+
await existingRuntime.terminate();
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// Create and start new runtime worker
|
|
532
|
+
const runtimeWorkerPath = import.meta.resolve("../workers/server-runtime.worker");
|
|
533
|
+
const runtimeWorker = Worker.create<typeof ServerRuntimeWorkerModule>(runtimeWorkerPath);
|
|
534
|
+
this._serverRuntimeWorkers.set(serverName, runtimeWorker);
|
|
535
|
+
|
|
536
|
+
// Runtime event handlers
|
|
537
|
+
runtimeWorker.on("serverReady", (readyData) => {
|
|
538
|
+
const readyEvent = readyData as ServerReadyEventData;
|
|
539
|
+
this._resultCollector.add({
|
|
540
|
+
name: serverName,
|
|
541
|
+
target: "server",
|
|
542
|
+
type: "server",
|
|
543
|
+
status: "running",
|
|
544
|
+
port: readyEvent.port,
|
|
545
|
+
});
|
|
546
|
+
this._schedulePrintServers();
|
|
547
|
+
});
|
|
548
|
+
|
|
549
|
+
runtimeWorker.on("error", (errorData) => {
|
|
550
|
+
const errorEvent = errorData as ErrorEventData;
|
|
551
|
+
this._resultCollector.add({
|
|
552
|
+
name: serverName,
|
|
553
|
+
target: "server",
|
|
554
|
+
type: "server",
|
|
555
|
+
status: "error",
|
|
556
|
+
message: errorEvent.message,
|
|
557
|
+
});
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
runtimeWorker
|
|
561
|
+
.start({ mainJsPath, clientPorts, env })
|
|
562
|
+
.catch((err: unknown) => {
|
|
563
|
+
this._logger.error(`[${serverName}] Server Runtime Worker crashed:`, errNs.message(err));
|
|
564
|
+
this._resultCollector.add({
|
|
565
|
+
name: serverName,
|
|
566
|
+
target: "server",
|
|
567
|
+
type: "server",
|
|
568
|
+
status: "error",
|
|
569
|
+
message: errNs.message(err),
|
|
570
|
+
});
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
}
|