@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,146 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { createWorker, FsWatcher } from "@simplysm/core-node";
|
|
3
|
+
import { err as errNs } from "@simplysm/core-common";
|
|
4
|
+
import { consola } from "consola";
|
|
5
|
+
import { registerCleanupHandlers, createOnceGuard, applyDebugLevel } from "../utils/worker-utils";
|
|
6
|
+
import {
|
|
7
|
+
runNgtscBuild,
|
|
8
|
+
runNgtscRebuild,
|
|
9
|
+
type NgtscBuildInfo,
|
|
10
|
+
type NgtscBuildResult,
|
|
11
|
+
type NgtscCombinedBuildEvent,
|
|
12
|
+
} from "../utils/ngtsc-build-core";
|
|
13
|
+
import type { NgtscProgram } from "../utils/angular-build";
|
|
14
|
+
import { collectDeps } from "../utils/package-utils";
|
|
15
|
+
|
|
16
|
+
applyDebugLevel();
|
|
17
|
+
|
|
18
|
+
//#region Types (re-export for worker interface)
|
|
19
|
+
|
|
20
|
+
export type { NgtscBuildInfo, NgtscBuildResult, NgtscCombinedBuildEvent };
|
|
21
|
+
|
|
22
|
+
export interface NgtscBuildWorkerEvents extends Record<string, unknown> {
|
|
23
|
+
buildStart: Record<string, never>;
|
|
24
|
+
build: NgtscCombinedBuildEvent;
|
|
25
|
+
error: { message: string };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
|
|
30
|
+
//#region Resource Management
|
|
31
|
+
|
|
32
|
+
const logger = consola.withTag("sd:cli:ngtsc-build:worker");
|
|
33
|
+
|
|
34
|
+
let fsWatcher: FsWatcher | undefined;
|
|
35
|
+
|
|
36
|
+
async function cleanup(): Promise<void> {
|
|
37
|
+
const watcherToClose = fsWatcher;
|
|
38
|
+
fsWatcher = undefined;
|
|
39
|
+
|
|
40
|
+
if (watcherToClose != null) {
|
|
41
|
+
await watcherToClose.close();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
registerCleanupHandlers(cleanup, logger);
|
|
46
|
+
|
|
47
|
+
//#endregion
|
|
48
|
+
|
|
49
|
+
//#region build (one-time build)
|
|
50
|
+
|
|
51
|
+
async function build(info: NgtscBuildInfo): Promise<NgtscBuildResult> {
|
|
52
|
+
return runNgtscBuild(info);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
//#endregion
|
|
56
|
+
|
|
57
|
+
//#region startWatch (watch mode)
|
|
58
|
+
|
|
59
|
+
const guardStartWatch = createOnceGuard("startWatch");
|
|
60
|
+
|
|
61
|
+
let watchInfo: NgtscBuildInfo | undefined;
|
|
62
|
+
let oldProgram: NgtscProgram | undefined;
|
|
63
|
+
let currentScssDependencies: Map<string, Set<string>> | undefined;
|
|
64
|
+
|
|
65
|
+
async function startWatch(info: NgtscBuildInfo): Promise<void> {
|
|
66
|
+
guardStartWatch();
|
|
67
|
+
watchInfo = info;
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
// Initial build
|
|
71
|
+
const { result: initialResult, program, scssDependencies: initialDeps } =
|
|
72
|
+
await runNgtscRebuild(info);
|
|
73
|
+
oldProgram = program;
|
|
74
|
+
currentScssDependencies = initialDeps;
|
|
75
|
+
sender.send("build", initialResult);
|
|
76
|
+
|
|
77
|
+
// Collect workspace dependency paths
|
|
78
|
+
const { workspaceDeps } = collectDeps(info.pkgDir, info.cwd);
|
|
79
|
+
|
|
80
|
+
// Start FsWatcher — own src/ + scss/ + workspace deps' src/ + scss/
|
|
81
|
+
const watchPaths = [
|
|
82
|
+
path.join(info.pkgDir, "src", "**", "*.{ts,tsx,scss,css}"),
|
|
83
|
+
path.join(info.pkgDir, "scss", "**", "*.{scss,css}"),
|
|
84
|
+
...workspaceDeps.flatMap((d) => {
|
|
85
|
+
const depDir = path.join(info.cwd, "packages", d);
|
|
86
|
+
return [
|
|
87
|
+
path.join(depDir, "src", "**", "*.{ts,tsx,scss,css}"),
|
|
88
|
+
path.join(depDir, "scss", "**", "*.{scss,css}"),
|
|
89
|
+
];
|
|
90
|
+
}),
|
|
91
|
+
];
|
|
92
|
+
fsWatcher = await FsWatcher.watch(watchPaths);
|
|
93
|
+
|
|
94
|
+
fsWatcher.onChange({ delay: 300 }, async (changedFiles) => {
|
|
95
|
+
try {
|
|
96
|
+
sender.send("buildStart", {});
|
|
97
|
+
|
|
98
|
+
// Collect modified resource files (.scss/.css)
|
|
99
|
+
const modifiedResourceFiles = new Set<string>();
|
|
100
|
+
for (const f of changedFiles) {
|
|
101
|
+
if (f.path.endsWith(".scss") || f.path.endsWith(".css")) {
|
|
102
|
+
modifiedResourceFiles.add(f.path);
|
|
103
|
+
// Also add files that depend on this changed file
|
|
104
|
+
if (currentScssDependencies != null) {
|
|
105
|
+
for (const [containingFile, deps] of currentScssDependencies) {
|
|
106
|
+
if (deps.has(f.path)) {
|
|
107
|
+
modifiedResourceFiles.add(containingFile);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const { result, program: newProgram, scssDependencies: newDeps } = await runNgtscRebuild(
|
|
115
|
+
watchInfo!,
|
|
116
|
+
oldProgram,
|
|
117
|
+
modifiedResourceFiles.size > 0 ? modifiedResourceFiles : undefined,
|
|
118
|
+
);
|
|
119
|
+
oldProgram = newProgram;
|
|
120
|
+
currentScssDependencies = newDeps;
|
|
121
|
+
sender.send("build", result);
|
|
122
|
+
} catch (err) {
|
|
123
|
+
sender.send("error", { message: errNs.message(err) });
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
} catch (err) {
|
|
127
|
+
sender.send("error", { message: errNs.message(err) });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async function stopWatch(): Promise<void> {
|
|
132
|
+
await cleanup();
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
//#endregion
|
|
136
|
+
|
|
137
|
+
const sender = createWorker<
|
|
138
|
+
{ build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },
|
|
139
|
+
NgtscBuildWorkerEvents
|
|
140
|
+
>({
|
|
141
|
+
build,
|
|
142
|
+
startWatch,
|
|
143
|
+
stopWatch,
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
export default sender;
|
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import { execaSync } from "execa";
|
|
4
|
+
import esbuild from "esbuild";
|
|
5
|
+
import { createWorker, FsWatcher, pathx } from "@simplysm/core-node";
|
|
6
|
+
import { err as errNs } from "@simplysm/core-common";
|
|
7
|
+
import { consola } from "consola";
|
|
8
|
+
import type { BuildOutput } from "../engines/types";
|
|
9
|
+
import type { SerializedDiagnostic } from "../utils/typecheck-serialization";
|
|
10
|
+
import {
|
|
11
|
+
parseTsconfig,
|
|
12
|
+
getPackageSourceFiles,
|
|
13
|
+
} from "../utils/tsconfig";
|
|
14
|
+
import {
|
|
15
|
+
createServerEsbuildOptions,
|
|
16
|
+
collectUninstalledOptionalPeerDeps,
|
|
17
|
+
collectNativeModuleExternals,
|
|
18
|
+
writeChangedOutputFiles,
|
|
19
|
+
} from "../utils/esbuild-config";
|
|
20
|
+
import { runTscPackageBuild } from "../utils/tsc-build";
|
|
21
|
+
import { registerCleanupHandlers, createOnceGuard, applyDebugLevel } from "../utils/worker-utils";
|
|
22
|
+
import { collectDeps } from "../utils/package-utils";
|
|
23
|
+
import { copyPublicFiles, watchPublicFiles } from "../utils/copy-public";
|
|
24
|
+
|
|
25
|
+
//#region Types
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Server build information (one-time build)
|
|
29
|
+
*/
|
|
30
|
+
export interface ServerBuildInfo {
|
|
31
|
+
name: string;
|
|
32
|
+
cwd: string;
|
|
33
|
+
pkgDir: string;
|
|
34
|
+
output: BuildOutput;
|
|
35
|
+
/** Environment variables to substitute during build */
|
|
36
|
+
env?: Record<string, string>;
|
|
37
|
+
/** Runtime configuration (recorded in dist/.config.json) */
|
|
38
|
+
configs?: Record<string, unknown>;
|
|
39
|
+
/** External modules manually specified in sd.config.ts */
|
|
40
|
+
externals?: string[];
|
|
41
|
+
/** PM2 configuration (generates dist/pm2.config.cjs when specified) */
|
|
42
|
+
pm2?: {
|
|
43
|
+
name?: string;
|
|
44
|
+
ignoreWatchPaths?: string[];
|
|
45
|
+
};
|
|
46
|
+
/** Package manager to use (affects mise.toml or volta settings generation) */
|
|
47
|
+
packageManager?: "volta" | "mise";
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Server watch information
|
|
52
|
+
*/
|
|
53
|
+
export interface ServerWatchInfo {
|
|
54
|
+
name: string;
|
|
55
|
+
cwd: string;
|
|
56
|
+
pkgDir: string;
|
|
57
|
+
output: BuildOutput;
|
|
58
|
+
/** Environment variables to substitute during build */
|
|
59
|
+
env?: Record<string, string>;
|
|
60
|
+
/** Runtime configuration (recorded in dist/.config.json) */
|
|
61
|
+
configs?: Record<string, unknown>;
|
|
62
|
+
/** External modules manually specified in sd.config.ts */
|
|
63
|
+
externals?: string[];
|
|
64
|
+
/** replaceDeps configuration from sd.config.ts */
|
|
65
|
+
replaceDeps?: Record<string, string>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Server build result (aligned with LibraryBuildResult + mainJsPath)
|
|
70
|
+
*/
|
|
71
|
+
export interface ServerBuildResult {
|
|
72
|
+
js: { success: boolean; errors?: string[]; warnings?: string[] };
|
|
73
|
+
dts: { success: boolean; errors?: string[]; diagnostics: SerializedDiagnostic[] };
|
|
74
|
+
mainJsPath: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Combined build event for watch mode
|
|
79
|
+
*/
|
|
80
|
+
export interface ServerCombinedBuildEvent {
|
|
81
|
+
js: { success: boolean; errors?: string[]; warnings?: string[] };
|
|
82
|
+
dts: { success: boolean; errors?: string[] };
|
|
83
|
+
mainJsPath: string;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Worker event types
|
|
88
|
+
*/
|
|
89
|
+
export interface ServerBuildWorkerEvents extends Record<string, unknown> {
|
|
90
|
+
buildStart: Record<string, never>;
|
|
91
|
+
build: ServerCombinedBuildEvent;
|
|
92
|
+
error: { message: string };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
//#endregion
|
|
96
|
+
|
|
97
|
+
//#region Resource Management
|
|
98
|
+
|
|
99
|
+
applyDebugLevel();
|
|
100
|
+
|
|
101
|
+
const logger = consola.withTag("sd:cli:server-build:worker");
|
|
102
|
+
|
|
103
|
+
/** esbuild build context (to be cleaned up) */
|
|
104
|
+
let esbuildContext: esbuild.BuildContext | undefined;
|
|
105
|
+
|
|
106
|
+
/** Last build metafile (for filtering changed files on rebuild) */
|
|
107
|
+
let lastMetafile: esbuild.Metafile | undefined;
|
|
108
|
+
|
|
109
|
+
/** Public files watcher (to be cleaned up) */
|
|
110
|
+
let publicWatcher: FsWatcher | undefined;
|
|
111
|
+
|
|
112
|
+
/** Source + scope packages watcher (to be cleaned up) */
|
|
113
|
+
let srcWatcher: FsWatcher | undefined;
|
|
114
|
+
|
|
115
|
+
async function cleanup(): Promise<void> {
|
|
116
|
+
const contextToDispose = esbuildContext;
|
|
117
|
+
esbuildContext = undefined;
|
|
118
|
+
lastMetafile = undefined;
|
|
119
|
+
|
|
120
|
+
const watcherToClose = publicWatcher;
|
|
121
|
+
publicWatcher = undefined;
|
|
122
|
+
|
|
123
|
+
const srcWatcherToClose = srcWatcher;
|
|
124
|
+
srcWatcher = undefined;
|
|
125
|
+
|
|
126
|
+
if (contextToDispose != null) {
|
|
127
|
+
await contextToDispose.dispose();
|
|
128
|
+
}
|
|
129
|
+
if (watcherToClose != null) {
|
|
130
|
+
await watcherToClose.close();
|
|
131
|
+
}
|
|
132
|
+
if (srcWatcherToClose != null) {
|
|
133
|
+
await srcWatcherToClose.close();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Collect external modules from three sources and merge them.
|
|
139
|
+
*/
|
|
140
|
+
function collectAllExternals(pkgDir: string, manualExternals?: string[]): string[] {
|
|
141
|
+
logger.debug("[externals] Scanning optional peer deps...");
|
|
142
|
+
const optionalPeerDeps = collectUninstalledOptionalPeerDeps(pkgDir);
|
|
143
|
+
|
|
144
|
+
logger.debug("[externals] Scanning native modules...");
|
|
145
|
+
const nativeModules = collectNativeModuleExternals(pkgDir);
|
|
146
|
+
|
|
147
|
+
const manual = manualExternals ?? [];
|
|
148
|
+
return [...new Set([...optionalPeerDeps, ...nativeModules, ...manual])];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Generate files for production deployment
|
|
153
|
+
*/
|
|
154
|
+
function generateProductionFiles(
|
|
155
|
+
info: ServerBuildInfo,
|
|
156
|
+
externals: string[],
|
|
157
|
+
): void {
|
|
158
|
+
const distDir = path.join(info.pkgDir, "dist");
|
|
159
|
+
const pkgJson = JSON.parse(fs.readFileSync(path.join(info.pkgDir, "package.json"), "utf-8"));
|
|
160
|
+
|
|
161
|
+
// dist/package.json
|
|
162
|
+
const distPkgJson: Record<string, unknown> = {
|
|
163
|
+
name: pkgJson.name,
|
|
164
|
+
version: pkgJson.version,
|
|
165
|
+
type: pkgJson.type,
|
|
166
|
+
};
|
|
167
|
+
if (externals.length > 0) {
|
|
168
|
+
const deps: Record<string, string> = {};
|
|
169
|
+
for (const ext of externals) {
|
|
170
|
+
deps[ext] = "*";
|
|
171
|
+
}
|
|
172
|
+
distPkgJson["dependencies"] = deps;
|
|
173
|
+
}
|
|
174
|
+
if (info.packageManager === "volta") {
|
|
175
|
+
const nodeVersion = execaSync("node", ["-v"]).stdout.trim();
|
|
176
|
+
distPkgJson["volta"] = { node: nodeVersion };
|
|
177
|
+
}
|
|
178
|
+
fs.writeFileSync(path.join(distDir, "package.json"), JSON.stringify(distPkgJson, undefined, 2));
|
|
179
|
+
|
|
180
|
+
// dist/mise.toml
|
|
181
|
+
if (info.packageManager === "mise") {
|
|
182
|
+
const rootMiseTomlPath = path.join(info.cwd, "mise.toml");
|
|
183
|
+
let nodeVersion = "20";
|
|
184
|
+
if (fs.existsSync(rootMiseTomlPath)) {
|
|
185
|
+
const miseContent = fs.readFileSync(rootMiseTomlPath, "utf-8");
|
|
186
|
+
const match = /node\s*=\s*"([^"]+)"/.exec(miseContent);
|
|
187
|
+
if (match != null) {
|
|
188
|
+
nodeVersion = match[1];
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
fs.writeFileSync(path.join(distDir, "mise.toml"), `[tools]\nnode = "${nodeVersion}"\n`);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// dist/openssl.cnf
|
|
195
|
+
fs.writeFileSync(
|
|
196
|
+
path.join(distDir, "openssl.cnf"),
|
|
197
|
+
[
|
|
198
|
+
"nodejs_conf = openssl_init",
|
|
199
|
+
"",
|
|
200
|
+
"[openssl_init]",
|
|
201
|
+
"providers = provider_sect",
|
|
202
|
+
"ssl_conf = ssl_sect",
|
|
203
|
+
"",
|
|
204
|
+
"[provider_sect]",
|
|
205
|
+
"default = default_sect",
|
|
206
|
+
"legacy = legacy_sect",
|
|
207
|
+
"",
|
|
208
|
+
"[default_sect]",
|
|
209
|
+
"activate = 1",
|
|
210
|
+
"",
|
|
211
|
+
"[legacy_sect]",
|
|
212
|
+
"activate = 1",
|
|
213
|
+
"",
|
|
214
|
+
"[ssl_sect]",
|
|
215
|
+
"system_default = system_default_sect",
|
|
216
|
+
"",
|
|
217
|
+
"[system_default_sect]",
|
|
218
|
+
"Options = UnsafeLegacyRenegotiation",
|
|
219
|
+
].join("\n"),
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
// dist/pm2.config.cjs
|
|
223
|
+
if (info.pm2 != null) {
|
|
224
|
+
const pm2Name = info.pm2.name ?? pkgJson.name.replace(/@/g, "").replace(/[/\\]/g, "-");
|
|
225
|
+
const ignoreWatch = JSON.stringify([
|
|
226
|
+
"node_modules",
|
|
227
|
+
"www",
|
|
228
|
+
...(info.pm2.ignoreWatchPaths ?? []),
|
|
229
|
+
]);
|
|
230
|
+
const envObj: Record<string, string> = {
|
|
231
|
+
NODE_ENV: "production",
|
|
232
|
+
TZ: "Asia/Seoul",
|
|
233
|
+
...(info.env ?? {}),
|
|
234
|
+
};
|
|
235
|
+
const envStr = JSON.stringify(envObj, undefined, 4);
|
|
236
|
+
|
|
237
|
+
const useInterpreter = info.packageManager !== "volta";
|
|
238
|
+
|
|
239
|
+
const pm2Config = [
|
|
240
|
+
...(useInterpreter ? [`const cp = require("child_process");`, ``] : []),
|
|
241
|
+
`module.exports = {`,
|
|
242
|
+
` name: ${JSON.stringify(pm2Name)},`,
|
|
243
|
+
` script: "main.js",`,
|
|
244
|
+
` watch: true,`,
|
|
245
|
+
` watch_delay: 2000,`,
|
|
246
|
+
` ignore_watch: ${ignoreWatch},`,
|
|
247
|
+
...(useInterpreter ? [` interpreter: cp.execSync("mise which node").toString().trim(),`] : []),
|
|
248
|
+
` interpreter_args: "--openssl-config=openssl.cnf",`,
|
|
249
|
+
` env: ${envStr.replace(/\n/g, "\n ")},`,
|
|
250
|
+
` arrayProcess: "concat",`,
|
|
251
|
+
` useDelTargetNull: true,`,
|
|
252
|
+
`};`,
|
|
253
|
+
].join("\n");
|
|
254
|
+
|
|
255
|
+
fs.writeFileSync(path.join(distDir, "pm2.config.cjs"), pm2Config);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
registerCleanupHandlers(cleanup, logger);
|
|
260
|
+
|
|
261
|
+
//#endregion
|
|
262
|
+
|
|
263
|
+
//#region Worker
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* One-time build (production)
|
|
267
|
+
*/
|
|
268
|
+
async function build(info: ServerBuildInfo): Promise<ServerBuildResult> {
|
|
269
|
+
const mainJsPath = path.join(info.pkgDir, "dist", "main.js");
|
|
270
|
+
|
|
271
|
+
try {
|
|
272
|
+
// Parse tsconfig
|
|
273
|
+
const parsedConfig = parseTsconfig(info.pkgDir);
|
|
274
|
+
const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);
|
|
275
|
+
|
|
276
|
+
// Collect externals
|
|
277
|
+
const external = collectAllExternals(info.pkgDir, info.externals);
|
|
278
|
+
|
|
279
|
+
// esbuild (async) ‖ tsc (sync) in parallel
|
|
280
|
+
const esbuildOptions = createServerEsbuildOptions({
|
|
281
|
+
pkgDir: info.pkgDir,
|
|
282
|
+
entryPoints,
|
|
283
|
+
env: info.env,
|
|
284
|
+
external,
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
const esbuildPromise = info.output.js
|
|
288
|
+
? esbuild.build(esbuildOptions).then(async (result) => {
|
|
289
|
+
if (result.outputFiles) {
|
|
290
|
+
await writeChangedOutputFiles(result.outputFiles);
|
|
291
|
+
}
|
|
292
|
+
const errors = result.errors.map((e) => e.text);
|
|
293
|
+
const warnings = result.warnings.map((w) => w.text);
|
|
294
|
+
return {
|
|
295
|
+
success: result.errors.length === 0,
|
|
296
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
297
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
298
|
+
};
|
|
299
|
+
}).catch((err) => ({
|
|
300
|
+
success: false,
|
|
301
|
+
errors: [errNs.message(err)],
|
|
302
|
+
warnings: undefined,
|
|
303
|
+
}))
|
|
304
|
+
: null;
|
|
305
|
+
|
|
306
|
+
// tsc typecheck (always runs, emit controlled by output.dts)
|
|
307
|
+
const tscResult = runTscPackageBuild({
|
|
308
|
+
pkgDir: info.pkgDir,
|
|
309
|
+
cwd: info.cwd,
|
|
310
|
+
output: { js: false, dts: info.output.dts },
|
|
311
|
+
parsedConfig,
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
const jsResult = esbuildPromise
|
|
315
|
+
? await esbuildPromise
|
|
316
|
+
: { success: true, errors: undefined, warnings: undefined };
|
|
317
|
+
|
|
318
|
+
// Generate production artifacts only when JS output is requested
|
|
319
|
+
if (info.output.js) {
|
|
320
|
+
const confDistPath = path.join(info.pkgDir, "dist", ".config.json");
|
|
321
|
+
fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));
|
|
322
|
+
|
|
323
|
+
await copyPublicFiles(info.pkgDir, false);
|
|
324
|
+
|
|
325
|
+
generateProductionFiles(info, external);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return {
|
|
329
|
+
js: {
|
|
330
|
+
success: jsResult.success,
|
|
331
|
+
errors: jsResult.errors,
|
|
332
|
+
warnings: jsResult.warnings,
|
|
333
|
+
},
|
|
334
|
+
dts: {
|
|
335
|
+
success: tscResult.success,
|
|
336
|
+
errors: tscResult.errors,
|
|
337
|
+
diagnostics: tscResult.diagnostics,
|
|
338
|
+
},
|
|
339
|
+
mainJsPath,
|
|
340
|
+
};
|
|
341
|
+
} catch (err) {
|
|
342
|
+
return {
|
|
343
|
+
js: { success: false, errors: [errNs.message(err)] },
|
|
344
|
+
dts: { success: false, errors: [errNs.message(err)], diagnostics: [] },
|
|
345
|
+
mainJsPath,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
const guardStartWatch = createOnceGuard("startWatch");
|
|
351
|
+
|
|
352
|
+
// Mutable state for watch mode
|
|
353
|
+
let watchInfo: ServerWatchInfo | undefined;
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Rebuild esbuild + tsc in parallel (watch mode)
|
|
357
|
+
*/
|
|
358
|
+
async function rebuildAll(): Promise<ServerCombinedBuildEvent> {
|
|
359
|
+
const info = watchInfo!;
|
|
360
|
+
const mainJsPath = path.join(info.pkgDir, "dist", "main.js");
|
|
361
|
+
const parsedConfig = parseTsconfig(info.pkgDir);
|
|
362
|
+
|
|
363
|
+
// esbuild rebuild (async)
|
|
364
|
+
let esbuildPromise: Promise<{ success: boolean; errors?: string[]; warnings?: string[] }> | null = null;
|
|
365
|
+
if (info.output.js && esbuildContext != null) {
|
|
366
|
+
esbuildPromise = esbuildContext.rebuild().then(async (result) => {
|
|
367
|
+
// Save metafile
|
|
368
|
+
if (result.metafile != null) {
|
|
369
|
+
lastMetafile = result.metafile;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (result.outputFiles) {
|
|
373
|
+
await writeChangedOutputFiles(result.outputFiles);
|
|
374
|
+
}
|
|
375
|
+
const errors = result.errors.map((e) => e.text);
|
|
376
|
+
const warnings = result.warnings.map((w) => w.text);
|
|
377
|
+
return {
|
|
378
|
+
success: result.errors.length === 0,
|
|
379
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
380
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
381
|
+
};
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// tsc rebuild (sync, incremental)
|
|
386
|
+
const tscResult = runTscPackageBuild({
|
|
387
|
+
pkgDir: info.pkgDir,
|
|
388
|
+
cwd: info.cwd,
|
|
389
|
+
output: { js: false, dts: info.output.dts },
|
|
390
|
+
parsedConfig,
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
const jsResult = esbuildPromise
|
|
394
|
+
? await esbuildPromise
|
|
395
|
+
: { success: true, errors: undefined, warnings: undefined };
|
|
396
|
+
|
|
397
|
+
return {
|
|
398
|
+
js: { success: jsResult.success, errors: jsResult.errors, warnings: jsResult.warnings },
|
|
399
|
+
dts: { success: tscResult.success, errors: tscResult.errors },
|
|
400
|
+
mainJsPath,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Create esbuild context for watch mode
|
|
406
|
+
*/
|
|
407
|
+
async function createEsbuildWatchContext(
|
|
408
|
+
info: ServerWatchInfo,
|
|
409
|
+
entryPoints: string[],
|
|
410
|
+
external: string[],
|
|
411
|
+
): Promise<esbuild.BuildContext> {
|
|
412
|
+
const baseOptions = createServerEsbuildOptions({
|
|
413
|
+
pkgDir: info.pkgDir,
|
|
414
|
+
entryPoints,
|
|
415
|
+
env: info.env,
|
|
416
|
+
external,
|
|
417
|
+
dev: true,
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
return esbuild.context({
|
|
421
|
+
...baseOptions,
|
|
422
|
+
metafile: true,
|
|
423
|
+
write: false,
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Start watch mode
|
|
429
|
+
*/
|
|
430
|
+
async function startWatch(info: ServerWatchInfo): Promise<void> {
|
|
431
|
+
guardStartWatch();
|
|
432
|
+
watchInfo = info;
|
|
433
|
+
|
|
434
|
+
try {
|
|
435
|
+
const parsedConfig = parseTsconfig(info.pkgDir);
|
|
436
|
+
const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);
|
|
437
|
+
|
|
438
|
+
// Collect externals
|
|
439
|
+
const external = collectAllExternals(info.pkgDir, info.externals);
|
|
440
|
+
|
|
441
|
+
// Create esbuild context (if JS output needed)
|
|
442
|
+
if (info.output.js) {
|
|
443
|
+
esbuildContext = await createEsbuildWatchContext(info, entryPoints, external);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// Initial build: esbuild + tsc parallel
|
|
447
|
+
const initialResult = await rebuildAll();
|
|
448
|
+
|
|
449
|
+
// Write .config.json on first build
|
|
450
|
+
const confDistPath = path.join(info.pkgDir, "dist", ".config.json");
|
|
451
|
+
fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));
|
|
452
|
+
|
|
453
|
+
sender.send("build", initialResult);
|
|
454
|
+
|
|
455
|
+
// Watch public/ + public-dev/
|
|
456
|
+
publicWatcher = await watchPublicFiles(info.pkgDir, true);
|
|
457
|
+
|
|
458
|
+
// Collect watch paths based on dependencies
|
|
459
|
+
const { workspaceDeps, replaceDeps } = collectDeps(info.pkgDir, info.cwd, info.replaceDeps);
|
|
460
|
+
|
|
461
|
+
const watchPaths: string[] = [];
|
|
462
|
+
|
|
463
|
+
// Server package itself + workspace dependency packages source
|
|
464
|
+
const watchDirs = [
|
|
465
|
+
info.pkgDir,
|
|
466
|
+
...workspaceDeps.map((d) => path.join(info.cwd, "packages", d)),
|
|
467
|
+
];
|
|
468
|
+
for (const dir of watchDirs) {
|
|
469
|
+
watchPaths.push(path.join(dir, "src", "**", "*"));
|
|
470
|
+
watchPaths.push(path.join(dir, "*.{ts,js,css}"));
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// ReplaceDeps dependency packages dist
|
|
474
|
+
for (const pkg of replaceDeps) {
|
|
475
|
+
watchPaths.push(path.join(info.cwd, "node_modules", ...pkg.split("/"), "dist", "**", "*.js"));
|
|
476
|
+
watchPaths.push(
|
|
477
|
+
path.join(info.pkgDir, "node_modules", ...pkg.split("/"), "dist", "**", "*.js"),
|
|
478
|
+
);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
// Start FsWatcher
|
|
482
|
+
srcWatcher = await FsWatcher.watch(watchPaths);
|
|
483
|
+
|
|
484
|
+
srcWatcher.onChange({ delay: 300 }, async (changes) => {
|
|
485
|
+
try {
|
|
486
|
+
const hasFileAddOrRemove = changes.some((c) => c.event === "add" || c.event === "unlink");
|
|
487
|
+
|
|
488
|
+
if (hasFileAddOrRemove) {
|
|
489
|
+
sender.send("buildStart", {});
|
|
490
|
+
|
|
491
|
+
// Recreate context on file add/remove
|
|
492
|
+
const newParsedConfig = parseTsconfig(info.pkgDir);
|
|
493
|
+
const newEntryPoints = getPackageSourceFiles(info.pkgDir, newParsedConfig);
|
|
494
|
+
const newExternal = collectAllExternals(info.pkgDir, info.externals);
|
|
495
|
+
|
|
496
|
+
const oldContext = esbuildContext;
|
|
497
|
+
if (info.output.js) {
|
|
498
|
+
esbuildContext = await createEsbuildWatchContext(info, newEntryPoints, newExternal);
|
|
499
|
+
}
|
|
500
|
+
if (oldContext != null) {
|
|
501
|
+
await oldContext.dispose();
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
const result = await rebuildAll();
|
|
505
|
+
sender.send("build", result);
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// Only file changes: filter by metafile
|
|
510
|
+
if (esbuildContext == null) {
|
|
511
|
+
sender.send("buildStart", {});
|
|
512
|
+
const result = await rebuildAll();
|
|
513
|
+
sender.send("build", result);
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
if (lastMetafile == null) {
|
|
518
|
+
sender.send("buildStart", {});
|
|
519
|
+
const result = await rebuildAll();
|
|
520
|
+
sender.send("build", result);
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// Filter by metafile inputs
|
|
525
|
+
const metafileAbsPaths = new Set(
|
|
526
|
+
Object.keys(lastMetafile.inputs).map((key) => pathx.norm(info.cwd, key)),
|
|
527
|
+
);
|
|
528
|
+
|
|
529
|
+
const hasRelevantChange = changes.some((c) => metafileAbsPaths.has(c.path));
|
|
530
|
+
|
|
531
|
+
if (hasRelevantChange) {
|
|
532
|
+
sender.send("buildStart", {});
|
|
533
|
+
const result = await rebuildAll();
|
|
534
|
+
sender.send("build", result);
|
|
535
|
+
} else {
|
|
536
|
+
logger.debug("Changed files not included in build, skipping rebuild");
|
|
537
|
+
}
|
|
538
|
+
} catch (err) {
|
|
539
|
+
sender.send("error", { message: errNs.message(err) });
|
|
540
|
+
}
|
|
541
|
+
});
|
|
542
|
+
} catch (err) {
|
|
543
|
+
sender.send("error", { message: errNs.message(err) });
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* Stop watch
|
|
549
|
+
*/
|
|
550
|
+
async function stopWatch(): Promise<void> {
|
|
551
|
+
await cleanup();
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
const sender = createWorker<
|
|
555
|
+
{ build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },
|
|
556
|
+
ServerBuildWorkerEvents
|
|
557
|
+
>({
|
|
558
|
+
build,
|
|
559
|
+
startWatch,
|
|
560
|
+
stopWatch,
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
export default sender;
|
|
564
|
+
|
|
565
|
+
//#endregion
|