@simplysm/sd-cli 13.0.100 → 14.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/build.js +29 -19
- package/dist/commands/build.js.map +1 -6
- package/dist/commands/check.d.ts +1 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +130 -115
- package/dist/commands/check.js.map +1 -6
- package/dist/commands/dev.d.ts +6 -7
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +24 -14
- package/dist/commands/dev.js.map +1 -6
- package/dist/commands/lint.d.ts +1 -1
- package/dist/commands/lint.js +158 -116
- package/dist/commands/lint.js.map +1 -6
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +637 -510
- package/dist/commands/publish.js.map +1 -6
- package/dist/commands/replace-deps.js +12 -12
- package/dist/commands/replace-deps.js.map +1 -6
- package/dist/commands/typecheck.d.ts +5 -30
- package/dist/commands/typecheck.d.ts.map +1 -1
- package/dist/commands/typecheck.js +144 -207
- package/dist/commands/typecheck.js.map +1 -6
- package/dist/commands/watch.d.ts +6 -4
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +25 -16
- package/dist/commands/watch.js.map +1 -6
- package/dist/engines/NgtscEngine.d.ts +47 -0
- package/dist/engines/NgtscEngine.d.ts.map +1 -0
- package/dist/engines/NgtscEngine.js +151 -0
- package/dist/engines/NgtscEngine.js.map +1 -0
- package/dist/engines/ServerEsbuildEngine.d.ts +47 -0
- package/dist/engines/ServerEsbuildEngine.d.ts.map +1 -0
- package/dist/engines/ServerEsbuildEngine.js +159 -0
- package/dist/engines/ServerEsbuildEngine.js.map +1 -0
- package/dist/engines/TscEngine.d.ts +47 -0
- package/dist/engines/TscEngine.d.ts.map +1 -0
- package/dist/engines/TscEngine.js +153 -0
- package/dist/engines/TscEngine.js.map +1 -0
- package/dist/engines/ViteEngine.d.ts +49 -0
- package/dist/engines/ViteEngine.d.ts.map +1 -0
- package/dist/engines/ViteEngine.js +161 -0
- package/dist/engines/ViteEngine.js.map +1 -0
- package/dist/engines/index.d.ts +26 -0
- package/dist/engines/index.d.ts.map +1 -0
- package/dist/engines/index.js +30 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/types.d.ts +77 -0
- package/dist/engines/types.d.ts.map +1 -0
- package/dist/engines/types.js +2 -0
- package/dist/engines/types.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -6
- package/dist/infra/ResultCollector.d.ts +1 -1
- package/dist/infra/ResultCollector.d.ts.map +1 -1
- package/dist/infra/ResultCollector.js +30 -27
- package/dist/infra/ResultCollector.js.map +1 -6
- package/dist/infra/SignalHandler.js +45 -42
- package/dist/infra/SignalHandler.js.map +1 -6
- package/dist/infra/WorkerManager.js +56 -53
- package/dist/infra/WorkerManager.js.map +1 -6
- package/dist/orchestrators/BuildOrchestrator.d.ts +33 -1
- package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
- package/dist/orchestrators/BuildOrchestrator.js +314 -309
- package/dist/orchestrators/BuildOrchestrator.js.map +1 -6
- package/dist/orchestrators/DevWatchOrchestrator.d.ts +60 -0
- package/dist/orchestrators/DevWatchOrchestrator.d.ts.map +1 -0
- package/dist/orchestrators/DevWatchOrchestrator.js +465 -0
- package/dist/orchestrators/DevWatchOrchestrator.js.map +1 -0
- package/dist/sd-cli-entry.d.ts.map +1 -1
- package/dist/sd-cli-entry.js +190 -266
- package/dist/sd-cli-entry.js.map +1 -6
- package/dist/sd-cli.js +77 -49
- package/dist/sd-cli.js.map +1 -6
- package/dist/sd-config.types.d.ts +2 -0
- package/dist/sd-config.types.d.ts.map +1 -1
- package/dist/sd-config.types.js +2 -1
- package/dist/sd-config.types.js.map +1 -6
- package/dist/utils/angular-build.d.ts +77 -0
- package/dist/utils/angular-build.d.ts.map +1 -0
- package/dist/utils/angular-build.js +84 -0
- package/dist/utils/angular-build.js.map +1 -0
- package/dist/utils/build-env.js +9 -9
- package/dist/utils/build-env.js.map +1 -6
- package/dist/utils/concurrency.d.ts +15 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +38 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/copy-public.js +104 -87
- package/dist/utils/copy-public.js.map +1 -6
- package/dist/utils/copy-src.js +49 -35
- package/dist/utils/copy-src.js.map +1 -6
- package/dist/utils/esbuild-config.d.ts +0 -29
- package/dist/utils/esbuild-config.d.ts.map +1 -1
- package/dist/utils/esbuild-config.js +151 -218
- package/dist/utils/esbuild-config.js.map +1 -6
- package/dist/utils/ngtsc-build-core.d.ts +49 -0
- package/dist/utils/ngtsc-build-core.d.ts.map +1 -0
- package/dist/utils/ngtsc-build-core.js +250 -0
- package/dist/utils/ngtsc-build-core.js.map +1 -0
- package/dist/utils/output-path-rewriter.d.ts +23 -0
- package/dist/utils/output-path-rewriter.d.ts.map +1 -0
- package/dist/utils/output-path-rewriter.js +74 -0
- package/dist/utils/output-path-rewriter.js.map +1 -0
- package/dist/utils/output-utils.js +55 -40
- package/dist/utils/output-utils.js.map +1 -6
- package/dist/utils/package-utils.d.ts +8 -0
- package/dist/utils/package-utils.d.ts.map +1 -1
- package/dist/utils/package-utils.js +103 -73
- package/dist/utils/package-utils.js.map +1 -6
- package/dist/utils/rebuild-manager.js +41 -44
- package/dist/utils/rebuild-manager.js.map +1 -6
- package/dist/utils/replace-deps.js +283 -184
- package/dist/utils/replace-deps.js.map +1 -6
- package/dist/utils/scss-compiler.d.ts +10 -0
- package/dist/utils/scss-compiler.d.ts.map +1 -0
- package/dist/utils/scss-compiler.js +36 -0
- package/dist/utils/scss-compiler.js.map +1 -0
- package/dist/utils/sd-config.js +29 -19
- package/dist/utils/sd-config.js.map +1 -6
- package/dist/utils/tsc-build.d.ts +36 -0
- package/dist/utils/tsc-build.d.ts.map +1 -0
- package/dist/utils/tsc-build.js +130 -0
- package/dist/utils/tsc-build.js.map +1 -0
- package/dist/utils/tsconfig.d.ts +7 -26
- package/dist/utils/tsconfig.d.ts.map +1 -1
- package/dist/utils/tsconfig.js +39 -64
- package/dist/utils/tsconfig.js.map +1 -6
- package/dist/utils/typecheck-non-package.d.ts +18 -0
- package/dist/utils/typecheck-non-package.d.ts.map +1 -0
- package/dist/utils/typecheck-non-package.js +64 -0
- package/dist/utils/typecheck-non-package.js.map +1 -0
- package/dist/utils/typecheck-serialization.js +58 -40
- package/dist/utils/typecheck-serialization.js.map +1 -6
- package/dist/utils/worker-events.js +48 -40
- package/dist/utils/worker-events.js.map +1 -6
- package/dist/utils/worker-utils.js +48 -28
- package/dist/utils/worker-utils.js.map +1 -6
- package/dist/vitest-plugin.d.ts +9 -0
- package/dist/vitest-plugin.d.ts.map +1 -0
- package/dist/vitest-plugin.js +85 -0
- package/dist/vitest-plugin.js.map +1 -0
- package/dist/workers/library-build.worker.d.ts +54 -0
- package/dist/workers/library-build.worker.d.ts.map +1 -0
- package/dist/workers/library-build.worker.js +97 -0
- package/dist/workers/library-build.worker.js.map +1 -0
- package/dist/workers/lint.worker.js +9 -6
- package/dist/workers/lint.worker.js.map +1 -6
- package/dist/workers/ngtsc-build.worker.d.ts +23 -0
- package/dist/workers/ngtsc-build.worker.d.ts.map +1 -0
- package/dist/workers/ngtsc-build.worker.js +98 -0
- package/dist/workers/ngtsc-build.worker.js.map +1 -0
- package/dist/workers/{server.worker.d.ts → server-build.worker.d.ts} +39 -29
- package/dist/workers/server-build.worker.d.ts.map +1 -0
- package/dist/workers/server-build.worker.js +399 -0
- package/dist/workers/server-build.worker.js.map +1 -0
- package/dist/workers/server-runtime.worker.d.ts +3 -2
- package/dist/workers/server-runtime.worker.d.ts.map +1 -1
- package/dist/workers/server-runtime.worker.js +100 -95
- package/dist/workers/server-runtime.worker.js.map +1 -6
- package/dist/workers/vite-build.worker.d.ts +56 -0
- package/dist/workers/vite-build.worker.d.ts.map +1 -0
- package/dist/workers/vite-build.worker.js +167 -0
- package/dist/workers/vite-build.worker.js.map +1 -0
- package/package.json +10 -16
- package/src/commands/check.ts +21 -3
- package/src/commands/dev.ts +10 -8
- package/src/commands/lint.ts +1 -1
- package/src/commands/publish.ts +4 -0
- package/src/commands/typecheck.ts +89 -256
- package/src/commands/watch.ts +9 -8
- package/src/engines/NgtscEngine.ts +190 -0
- package/src/engines/ServerEsbuildEngine.ts +195 -0
- package/src/engines/TscEngine.ts +189 -0
- package/src/engines/ViteEngine.ts +203 -0
- package/src/engines/index.ts +49 -0
- package/src/engines/types.ts +79 -0
- package/src/index.ts +0 -3
- package/src/infra/ResultCollector.ts +1 -1
- package/src/orchestrators/BuildOrchestrator.ts +87 -157
- package/src/orchestrators/DevWatchOrchestrator.ts +573 -0
- package/src/sd-cli-entry.ts +13 -116
- package/src/sd-config.types.ts +2 -0
- package/src/utils/angular-build.ts +157 -0
- package/src/utils/concurrency.ts +43 -0
- package/src/utils/esbuild-config.ts +1 -122
- package/src/utils/ngtsc-build-core.ts +379 -0
- package/src/utils/output-path-rewriter.ts +82 -0
- package/src/utils/package-utils.ts +20 -0
- package/src/utils/scss-compiler.ts +58 -0
- package/src/utils/tsc-build.ts +175 -0
- package/src/utils/tsconfig.ts +27 -95
- package/src/utils/typecheck-non-package.ts +87 -0
- package/src/vitest-plugin.ts +118 -0
- package/src/workers/library-build.worker.ts +153 -0
- package/src/workers/ngtsc-build.worker.ts +146 -0
- package/src/workers/server-build.worker.ts +565 -0
- package/src/workers/server-runtime.worker.ts +17 -26
- package/src/workers/vite-build.worker.ts +252 -0
- package/tests/commands/check.spec.ts +276 -0
- package/tests/commands/dev.spec.ts +53 -0
- package/tests/commands/lint.spec.ts +243 -0
- package/tests/commands/publish.spec.ts +1159 -0
- package/tests/commands/typecheck.spec.ts +294 -0
- package/tests/commands/watch.spec.ts +53 -0
- package/tests/engines/engine-selection.spec.ts +247 -0
- package/tests/engines/ngtsc-engine.spec.ts +274 -0
- package/tests/engines/server-esbuild-engine.spec.ts +256 -0
- package/tests/engines/tsc-engine.spec.ts +213 -0
- package/tests/engines/vite-engine.spec.ts +358 -0
- package/tests/infra/result-collector.spec.ts +46 -0
- package/tests/infra/signal-handler.spec.ts +32 -0
- package/tests/infra/worker-manager.spec.ts +63 -0
- package/tests/orchestrators/build-orchestrator.spec.ts +772 -0
- package/tests/orchestrators/dev-watch-orchestrator.spec.ts +1173 -0
- package/tests/sd-cli-entry.spec.ts +49 -0
- package/tests/utils/angular-build.spec.ts +251 -0
- package/tests/utils/build-env.spec.ts +33 -0
- package/tests/utils/concurrency.spec.ts +65 -0
- package/tests/utils/copy-src.spec.ts +144 -0
- package/tests/utils/esbuild-config.spec.ts +186 -0
- package/tests/utils/external-modules.spec.ts +161 -0
- package/tests/utils/ngtsc-scss-refactor.spec.ts +66 -0
- package/tests/utils/output-path-rewriter.spec.ts +165 -0
- package/tests/utils/output-utils.spec.ts +104 -0
- package/tests/utils/package-utils.spec.ts +52 -0
- package/tests/utils/rebuild-manager.spec.ts +30 -27
- package/tests/utils/replace-deps.spec.ts +69 -0
- package/tests/utils/scss-compiler.spec.ts +131 -0
- package/tests/utils/sd-config.spec.ts +77 -0
- package/tests/utils/tsc-build.spec.ts +358 -0
- package/tests/utils/tsconfig-angular.spec.ts +71 -0
- package/tests/utils/typecheck-non-package.spec.ts +120 -0
- package/tests/utils/worker-events.spec.ts +155 -0
- package/tests/utils/worker-utils.spec.ts +43 -0
- package/tests/vitest-plugin-cwd.spec.ts +68 -0
- package/tests/vitest-plugin.spec.ts +103 -0
- package/tests/workers/library-build-worker.spec.ts +258 -0
- package/tests/workers/ngtsc-build-worker.spec.ts +187 -0
- package/tests/workers/server-build-worker.spec.ts +566 -0
- package/tests/workers/server-runtime-worker.spec.ts +251 -0
- package/README.md +0 -295
- package/dist/builders/BaseBuilder.d.ts +0 -88
- package/dist/builders/BaseBuilder.d.ts.map +0 -1
- package/dist/builders/BaseBuilder.js +0 -142
- package/dist/builders/BaseBuilder.js.map +0 -6
- package/dist/builders/DtsBuilder.d.ts +0 -22
- package/dist/builders/DtsBuilder.d.ts.map +0 -1
- package/dist/builders/DtsBuilder.js +0 -72
- package/dist/builders/DtsBuilder.js.map +0 -6
- package/dist/builders/LibraryBuilder.d.ts +0 -22
- package/dist/builders/LibraryBuilder.d.ts.map +0 -1
- package/dist/builders/LibraryBuilder.js +0 -85
- package/dist/builders/LibraryBuilder.js.map +0 -6
- package/dist/builders/types.d.ts +0 -55
- package/dist/builders/types.d.ts.map +0 -1
- package/dist/builders/types.js +0 -1
- package/dist/builders/types.js.map +0 -6
- package/dist/capacitor/capacitor.d.ts +0 -151
- package/dist/capacitor/capacitor.d.ts.map +0 -1
- package/dist/capacitor/capacitor.js +0 -694
- package/dist/capacitor/capacitor.js.map +0 -6
- package/dist/commands/device.d.ts +0 -22
- package/dist/commands/device.d.ts.map +0 -1
- package/dist/commands/device.js +0 -98
- package/dist/commands/device.js.map +0 -6
- package/dist/commands/init.d.ts +0 -14
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -72
- package/dist/commands/init.js.map +0 -6
- package/dist/electron/electron.d.ts +0 -84
- package/dist/electron/electron.d.ts.map +0 -1
- package/dist/electron/electron.js +0 -263
- package/dist/electron/electron.js.map +0 -6
- package/dist/orchestrators/DevOrchestrator.d.ts +0 -83
- package/dist/orchestrators/DevOrchestrator.d.ts.map +0 -1
- package/dist/orchestrators/DevOrchestrator.js +0 -540
- package/dist/orchestrators/DevOrchestrator.js.map +0 -6
- package/dist/orchestrators/WatchOrchestrator.d.ts +0 -57
- package/dist/orchestrators/WatchOrchestrator.d.ts.map +0 -1
- package/dist/orchestrators/WatchOrchestrator.js +0 -199
- package/dist/orchestrators/WatchOrchestrator.js.map +0 -6
- package/dist/utils/tailwind-config-deps.d.ts +0 -8
- package/dist/utils/tailwind-config-deps.d.ts.map +0 -1
- package/dist/utils/tailwind-config-deps.js +0 -82
- package/dist/utils/tailwind-config-deps.js.map +0 -6
- package/dist/utils/template.d.ts +0 -14
- package/dist/utils/template.d.ts.map +0 -1
- package/dist/utils/template.js +0 -33
- package/dist/utils/template.js.map +0 -6
- package/dist/utils/vite-config.d.ts +0 -35
- package/dist/utils/vite-config.d.ts.map +0 -1
- package/dist/utils/vite-config.js +0 -259
- package/dist/utils/vite-config.js.map +0 -6
- package/dist/workers/client.worker.d.ts +0 -83
- package/dist/workers/client.worker.d.ts.map +0 -1
- package/dist/workers/client.worker.js +0 -111
- package/dist/workers/client.worker.js.map +0 -6
- package/dist/workers/dts.worker.d.ts +0 -75
- package/dist/workers/dts.worker.d.ts.map +0 -1
- package/dist/workers/dts.worker.js +0 -270
- package/dist/workers/dts.worker.js.map +0 -6
- package/dist/workers/library.worker.d.ts +0 -75
- package/dist/workers/library.worker.d.ts.map +0 -1
- package/dist/workers/library.worker.js +0 -166
- package/dist/workers/library.worker.js.map +0 -6
- package/dist/workers/server.worker.d.ts.map +0 -1
- package/dist/workers/server.worker.js +0 -482
- package/dist/workers/server.worker.js.map +0 -6
- package/src/builders/BaseBuilder.ts +0 -218
- package/src/builders/DtsBuilder.ts +0 -92
- package/src/builders/LibraryBuilder.ts +0 -110
- package/src/builders/types.ts +0 -60
- package/src/capacitor/capacitor.ts +0 -931
- package/src/commands/device.ts +0 -140
- package/src/commands/init.ts +0 -113
- package/src/electron/electron.ts +0 -362
- package/src/orchestrators/DevOrchestrator.ts +0 -744
- package/src/orchestrators/WatchOrchestrator.ts +0 -277
- package/src/utils/tailwind-config-deps.ts +0 -98
- package/src/utils/template.ts +0 -56
- package/src/utils/vite-config.ts +0 -390
- package/src/workers/client.worker.ts +0 -250
- package/src/workers/dts.worker.ts +0 -453
- package/src/workers/library.worker.ts +0 -316
- package/src/workers/server.worker.ts +0 -734
- package/templates/init/.gitignore.hbs +0 -34
- package/templates/init/.npmrc.hbs +0 -1
- package/templates/init/.prettierignore +0 -1
- package/templates/init/.prettierrc.yaml +0 -12
- package/templates/init/eslint.config.ts +0 -15
- package/templates/init/mise.toml +0 -3
- package/templates/init/package.json.hbs +0 -32
- package/templates/init/packages/client-admin/index.html.hbs +0 -144
- package/templates/init/packages/client-admin/package.json.hbs +0 -27
- package/templates/init/packages/client-admin/public/assets/logo-landscape.png +0 -0
- package/templates/init/packages/client-admin/public/assets/logo.png +0 -0
- package/templates/init/packages/client-admin/public/favicon.ico +0 -0
- package/templates/init/packages/client-admin/src/App.tsx +0 -42
- package/templates/init/packages/client-admin/src/dev/DevDialog.tsx +0 -34
- package/templates/init/packages/client-admin/src/events/AuthChangeEvent.ts +0 -3
- package/templates/init/packages/client-admin/src/main.css +0 -4
- package/templates/init/packages/client-admin/src/main.tsx.hbs +0 -146
- package/templates/init/packages/client-admin/src/providers/AppServiceProvider.tsx.hbs +0 -103
- package/templates/init/packages/client-admin/src/providers/AppStructureProvider.tsx +0 -84
- package/templates/init/packages/client-admin/src/providers/AuthProvider.tsx.hbs +0 -96
- package/templates/init/packages/client-admin/src/providers/configureSharedData.ts.hbs +0 -67
- package/templates/init/packages/client-admin/src/views/auth/LoginView.tsx +0 -132
- package/templates/init/packages/client-admin/src/views/home/HomeView.tsx +0 -108
- package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeDetail.tsx.hbs +0 -243
- package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeSheet.tsx.hbs +0 -271
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleDetail.tsx.hbs +0 -146
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionDetail.tsx.hbs +0 -121
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionView.tsx +0 -52
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleSheet.tsx.hbs +0 -125
- package/templates/init/packages/client-admin/src/views/home/main/MainView.tsx.hbs +0 -13
- package/templates/init/packages/client-admin/src/views/home/my-info/MyInfoDetail.tsx.hbs +0 -241
- package/templates/init/packages/client-admin/src/views/home/system/system-log/SystemLogSheet.tsx.hbs +0 -169
- package/templates/init/packages/client-admin/src/views/not-found/NotFoundView.tsx +0 -15
- package/templates/init/packages/client-admin/tailwind.config.ts +0 -10
- package/templates/init/packages/db-main/package.json.hbs +0 -13
- package/templates/init/packages/db-main/src/MainDbContext.ts +0 -22
- package/templates/init/packages/db-main/src/dataLogExt.ts +0 -127
- package/templates/init/packages/db-main/src/index.ts +0 -14
- package/templates/init/packages/db-main/src/tables/base/Employee.ts +0 -24
- package/templates/init/packages/db-main/src/tables/base/EmployeeConfig.ts +0 -13
- package/templates/init/packages/db-main/src/tables/base/Role.ts +0 -9
- package/templates/init/packages/db-main/src/tables/base/RolePermission.ts +0 -13
- package/templates/init/packages/db-main/src/tables/system/_DataLog.ts +0 -19
- package/templates/init/packages/db-main/src/tables/system/_Log.ts +0 -16
- package/templates/init/packages/server/package.json.hbs +0 -20
- package/templates/init/packages/server/public-dev/dev//354/264/210/352/270/260/355/231/224.xlsx +0 -0
- package/templates/init/packages/server/src/index.ts +0 -4
- package/templates/init/packages/server/src/main.ts.hbs +0 -34
- package/templates/init/packages/server/src/services/AuthService.ts.hbs +0 -171
- package/templates/init/packages/server/src/services/DevService.ts.hbs +0 -94
- package/templates/init/packages/server/src/services/EmployeeService.ts.hbs +0 -122
- package/templates/init/packages/server/src/services/RoleService.ts.hbs +0 -59
- package/templates/init/pnpm-workspace.yaml +0 -15
- package/templates/init/sd.config.ts.hbs +0 -48
- package/templates/init/tsconfig.json.hbs +0 -39
- package/templates/init/vitest.config.ts +0 -36
- package/tests/capacitor-exclude.spec.ts +0 -78
- package/tests/capacitor.spec.ts +0 -49
- package/tests/copy-src.spec.ts +0 -50
- package/tests/electron-exclude.spec.ts +0 -61
- package/tests/get-compiler-options-for-package.spec.ts +0 -80
- package/tests/get-package-source-files.spec.ts +0 -139
- package/tests/get-types-from-package-json.spec.ts +0 -92
- package/tests/infra/ResultCollector.spec.ts +0 -30
- package/tests/infra/SignalHandler.spec.ts +0 -38
- package/tests/infra/WorkerManager.spec.ts +0 -63
- package/tests/load-ignore-patterns.spec.ts +0 -163
- package/tests/load-sd-config.spec.ts +0 -100
- package/tests/package-utils.spec.ts +0 -188
- package/tests/parse-root-tsconfig.spec.ts +0 -89
- package/tests/publish-config-narrowing.spec.ts +0 -20
- package/tests/replace-deps.spec.ts +0 -308
- package/tests/run-lint.spec.ts +0 -366
- package/tests/run-typecheck.spec.ts +0 -544
- package/tests/run-watch.spec.ts +0 -76
- package/tests/sd-cli.spec.ts +0 -265
- package/tests/sd-public-dev-plugin-mime.spec.ts +0 -19
- package/tests/tailwind-config-deps.spec.ts +0 -30
- package/tests/template.spec.ts +0 -70
- package/tests/vite-config-exclude.spec.ts +0 -35
- package/tests/vite-config-outdir.spec.ts +0 -38
- package/tests/write-changed-output-files.spec.ts +0 -97
package/src/commands/device.ts
DELETED
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import path from "path";
|
|
2
|
-
import { fsx } from "@simplysm/core-node";
|
|
3
|
-
import { consola } from "consola";
|
|
4
|
-
import type { SdConfig, SdClientPackageConfig } from "../sd-config.types";
|
|
5
|
-
import { loadSdConfig } from "../utils/sd-config";
|
|
6
|
-
import { Capacitor } from "../capacitor/capacitor";
|
|
7
|
-
import { Electron } from "../electron/electron";
|
|
8
|
-
|
|
9
|
-
//#region Types
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Device command options
|
|
13
|
-
*/
|
|
14
|
-
export interface DeviceOptions {
|
|
15
|
-
/** Package name (required) */
|
|
16
|
-
package: string;
|
|
17
|
-
/** Development server URL (optional, uses server config from sd.config.ts if not specified) */
|
|
18
|
-
url?: string;
|
|
19
|
-
/** Additional options to pass to sd.config.ts */
|
|
20
|
-
options: string[];
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
//#endregion
|
|
24
|
-
|
|
25
|
-
//#region Main
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Runs an app on an Android device.
|
|
29
|
-
*
|
|
30
|
-
* - Runs app on connected Android device
|
|
31
|
-
* - Connects development server URL to WebView to support Hot Reload
|
|
32
|
-
*
|
|
33
|
-
* @param options - device execution options
|
|
34
|
-
* @returns resolves when complete
|
|
35
|
-
*/
|
|
36
|
-
export async function runDevice(options: DeviceOptions): Promise<void> {
|
|
37
|
-
const { package: packageName, url } = options;
|
|
38
|
-
const cwd = process.cwd();
|
|
39
|
-
const logger = consola.withTag("sd:cli:device");
|
|
40
|
-
|
|
41
|
-
logger.debug("device start", { package: packageName, url });
|
|
42
|
-
|
|
43
|
-
// Load sd.config.ts
|
|
44
|
-
let sdConfig: SdConfig;
|
|
45
|
-
try {
|
|
46
|
-
sdConfig = await loadSdConfig({ cwd, dev: true, options: options.options });
|
|
47
|
-
logger.debug("sd.config.ts loaded");
|
|
48
|
-
} catch (err) {
|
|
49
|
-
logger.error(`Failed to load sd.config.ts: ${err instanceof Error ? err.message : err}`);
|
|
50
|
-
process.exitCode = 1;
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Verify package config
|
|
55
|
-
const pkgConfig = sdConfig.packages[packageName];
|
|
56
|
-
if (pkgConfig == null) {
|
|
57
|
-
logger.error(`Package not found: ${packageName}`);
|
|
58
|
-
process.exitCode = 1;
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (pkgConfig.target !== "client") {
|
|
63
|
-
logger.error(`Only client target packages are supported: ${packageName} (current: ${pkgConfig.target})`);
|
|
64
|
-
process.exitCode = 1;
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const clientConfig: SdClientPackageConfig = pkgConfig;
|
|
69
|
-
const pkgDir = path.join(cwd, "packages", packageName);
|
|
70
|
-
|
|
71
|
-
if (clientConfig.electron != null) {
|
|
72
|
-
// Run Electron development
|
|
73
|
-
let serverUrl = url;
|
|
74
|
-
if (serverUrl == null) {
|
|
75
|
-
if (typeof clientConfig.server === "number") {
|
|
76
|
-
serverUrl = `http://localhost:${clientConfig.server}/${packageName}/`;
|
|
77
|
-
} else {
|
|
78
|
-
logger.error(
|
|
79
|
-
`--url option is required. server is set to package name: ${clientConfig.server}`,
|
|
80
|
-
);
|
|
81
|
-
process.exitCode = 1;
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
logger.debug("development server URL", { serverUrl });
|
|
87
|
-
|
|
88
|
-
logger.start(`Running ${packageName} (electron)...`);
|
|
89
|
-
try {
|
|
90
|
-
const electron = await Electron.create(pkgDir, clientConfig.electron, clientConfig.exclude);
|
|
91
|
-
await electron.run(serverUrl);
|
|
92
|
-
logger.success("Electron execution completed");
|
|
93
|
-
} catch (err) {
|
|
94
|
-
logger.error(`Failed to run Electron: ${err instanceof Error ? err.message : err}`);
|
|
95
|
-
process.exitCode = 1;
|
|
96
|
-
}
|
|
97
|
-
} else if (clientConfig.capacitor != null) {
|
|
98
|
-
// Run Capacitor device (existing logic)
|
|
99
|
-
let serverUrl = url;
|
|
100
|
-
if (serverUrl == null) {
|
|
101
|
-
if (typeof clientConfig.server === "number") {
|
|
102
|
-
serverUrl = `http://localhost:${clientConfig.server}/${packageName}/capacitor/`;
|
|
103
|
-
} else {
|
|
104
|
-
logger.error(
|
|
105
|
-
`--url option is required. server is set to package name: ${clientConfig.server}`,
|
|
106
|
-
);
|
|
107
|
-
process.exitCode = 1;
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
} else if (!serverUrl.endsWith("/")) {
|
|
111
|
-
serverUrl = `${serverUrl}/${packageName}/capacitor/`;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
logger.debug("development server URL", { serverUrl });
|
|
115
|
-
|
|
116
|
-
const capPath = path.join(pkgDir, ".capacitor");
|
|
117
|
-
if (!(await fsx.exists(capPath))) {
|
|
118
|
-
logger.error(
|
|
119
|
-
`Capacitor project is not initialized. First run 'pnpm watch ${packageName}'.`,
|
|
120
|
-
);
|
|
121
|
-
process.exitCode = 1;
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
logger.start(`Running ${packageName} (device)...`);
|
|
126
|
-
try {
|
|
127
|
-
const cap = await Capacitor.create(pkgDir, clientConfig.capacitor, clientConfig.exclude);
|
|
128
|
-
await cap.runOnDevice(serverUrl);
|
|
129
|
-
logger.success("Device execution completed");
|
|
130
|
-
} catch (err) {
|
|
131
|
-
logger.error(`Failed to run device: ${err instanceof Error ? err.message : err}`);
|
|
132
|
-
process.exitCode = 1;
|
|
133
|
-
}
|
|
134
|
-
} else {
|
|
135
|
-
logger.error(`No electron or capacitor config found: ${packageName}`);
|
|
136
|
-
process.exitCode = 1;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
//#endregion
|
package/src/commands/init.ts
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import path from "path";
|
|
2
|
-
import fs from "fs";
|
|
3
|
-
import crypto from "crypto";
|
|
4
|
-
import readline from "readline";
|
|
5
|
-
import { consola } from "consola";
|
|
6
|
-
import { renderTemplateDir } from "../utils/template";
|
|
7
|
-
import { execa } from "execa";
|
|
8
|
-
import { findPackageRoot } from "../utils/package-utils";
|
|
9
|
-
|
|
10
|
-
//#region Types
|
|
11
|
-
|
|
12
|
-
export interface InitOptions {}
|
|
13
|
-
|
|
14
|
-
//#endregion
|
|
15
|
-
|
|
16
|
-
//#region Utilities
|
|
17
|
-
|
|
18
|
-
function isValidScopeName(name: string): boolean {
|
|
19
|
-
return /^[a-z][a-z0-9-]*$/.test(name);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function prompt(question: string): Promise<string> {
|
|
23
|
-
const rl = readline.createInterface({
|
|
24
|
-
input: process.stdin,
|
|
25
|
-
output: process.stdout,
|
|
26
|
-
});
|
|
27
|
-
return new Promise((resolve) => {
|
|
28
|
-
rl.question(question, (answer) => {
|
|
29
|
-
rl.close();
|
|
30
|
-
resolve(answer.trim());
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
//#endregion
|
|
36
|
-
|
|
37
|
-
//#region Main
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Initializes a new Simplysm project in the current directory.
|
|
41
|
-
*
|
|
42
|
-
* 1. Check if directory is empty
|
|
43
|
-
* 2. Validate project name (folder name)
|
|
44
|
-
* 3. Prompt for description, port
|
|
45
|
-
* 4. Generate jwtSecret
|
|
46
|
-
* 5. Render Handlebars template
|
|
47
|
-
* 6. Run pnpm install
|
|
48
|
-
*/
|
|
49
|
-
export async function runInit(_options: InitOptions): Promise<void> {
|
|
50
|
-
const cwd = process.cwd();
|
|
51
|
-
const logger = consola.withTag("sd:cli:init");
|
|
52
|
-
|
|
53
|
-
// 1. Check if directory is empty (exclude dotfiles/dotfolders)
|
|
54
|
-
const entries = fs.readdirSync(cwd).filter((e) => !e.startsWith("."));
|
|
55
|
-
if (entries.length > 0) {
|
|
56
|
-
consola.error("Directory is not empty. Please run this from an empty directory.");
|
|
57
|
-
process.exitCode = 1;
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// 2. Validate project name
|
|
62
|
-
const projectName = path.basename(cwd);
|
|
63
|
-
if (!isValidScopeName(projectName)) {
|
|
64
|
-
consola.error(
|
|
65
|
-
`Project name "${projectName}" is not valid. Only lowercase letters, numbers, and hyphens are allowed.`,
|
|
66
|
-
);
|
|
67
|
-
process.exitCode = 1;
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// 3. Prompt for description
|
|
72
|
-
const description = await prompt("Project description: ");
|
|
73
|
-
|
|
74
|
-
// 4. Prompt for port
|
|
75
|
-
const portInput = await prompt("Server port (default: 40080): ");
|
|
76
|
-
const port = portInput !== "" ? Number(portInput) : 40080;
|
|
77
|
-
if (Number.isNaN(port) || !Number.isInteger(port) || port < 1 || port > 65535) {
|
|
78
|
-
consola.error("Invalid port number.");
|
|
79
|
-
process.exitCode = 1;
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// 5. Generate jwtSecret
|
|
84
|
-
const jwtSecret = `${projectName}-${crypto.randomUUID().slice(0, 8)}`;
|
|
85
|
-
|
|
86
|
-
// 6. Render template
|
|
87
|
-
const pkgRoot = findPackageRoot(import.meta.dirname);
|
|
88
|
-
const templateDir = path.join(pkgRoot, "templates", "init");
|
|
89
|
-
|
|
90
|
-
const context = { projectName, description, port, jwtSecret };
|
|
91
|
-
|
|
92
|
-
logger.info("Creating project files...");
|
|
93
|
-
await renderTemplateDir(templateDir, cwd, context);
|
|
94
|
-
logger.success("Project files created successfully");
|
|
95
|
-
|
|
96
|
-
// 7. Run pnpm install
|
|
97
|
-
logger.info("Running pnpm install...");
|
|
98
|
-
await execa("pnpm", ["install"], { cwd });
|
|
99
|
-
logger.success("pnpm install completed");
|
|
100
|
-
|
|
101
|
-
// 8. Completion message
|
|
102
|
-
consola.box(
|
|
103
|
-
[
|
|
104
|
-
"Project created!",
|
|
105
|
-
"",
|
|
106
|
-
"Next steps:",
|
|
107
|
-
" pnpm dev Start dev server",
|
|
108
|
-
" pnpm build Production build",
|
|
109
|
-
].join("\n"),
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
//#endregion
|
package/src/electron/electron.ts
DELETED
|
@@ -1,362 +0,0 @@
|
|
|
1
|
-
import path from "path";
|
|
2
|
-
import os from "os";
|
|
3
|
-
import fs from "fs";
|
|
4
|
-
import module from "module";
|
|
5
|
-
import { fsx } from "@simplysm/core-node";
|
|
6
|
-
import { consola } from "consola";
|
|
7
|
-
import type { SdElectronConfig } from "../sd-config.types";
|
|
8
|
-
import { execa } from "execa";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* package.json type
|
|
12
|
-
*/
|
|
13
|
-
interface NpmConfig {
|
|
14
|
-
name: string;
|
|
15
|
-
version: string;
|
|
16
|
-
description?: string;
|
|
17
|
-
dependencies?: Record<string, string>;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Electron project management class
|
|
22
|
-
*
|
|
23
|
-
* - Initialize Electron project (create package.json, install dependencies, rebuild native modules)
|
|
24
|
-
* - Build Windows executable (electron-builder)
|
|
25
|
-
* - Run in development mode (load Vite dev server URL)
|
|
26
|
-
*/
|
|
27
|
-
export class Electron {
|
|
28
|
-
private static readonly _logger = consola.withTag("sd:cli:electron");
|
|
29
|
-
|
|
30
|
-
private readonly _electronPath: string;
|
|
31
|
-
private readonly _npmConfig: NpmConfig;
|
|
32
|
-
|
|
33
|
-
private constructor(
|
|
34
|
-
private readonly _pkgPath: string,
|
|
35
|
-
private readonly _config: SdElectronConfig,
|
|
36
|
-
npmConfig: NpmConfig,
|
|
37
|
-
private readonly _exclude: string[],
|
|
38
|
-
) {
|
|
39
|
-
this._npmConfig = npmConfig;
|
|
40
|
-
this._electronPath = path.resolve(this._pkgPath, ".electron");
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Create Electron instance (with configuration validation)
|
|
45
|
-
*/
|
|
46
|
-
static async create(
|
|
47
|
-
pkgPath: string,
|
|
48
|
-
config: SdElectronConfig,
|
|
49
|
-
exclude?: string[],
|
|
50
|
-
): Promise<Electron> {
|
|
51
|
-
Electron._validateConfig(config);
|
|
52
|
-
|
|
53
|
-
const npmConfig = await fsx.readJson<NpmConfig>(path.resolve(pkgPath, "package.json"));
|
|
54
|
-
return new Electron(pkgPath, config, npmConfig, exclude ?? []);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Validate configuration
|
|
59
|
-
*/
|
|
60
|
-
private static _validateConfig(config: SdElectronConfig): void {
|
|
61
|
-
if (typeof config.appId !== "string" || config.appId.trim() === "") {
|
|
62
|
-
throw new Error("electron.appId is required.");
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Resolve binary path from {pkgPath}/node_modules/.bin/
|
|
68
|
-
*/
|
|
69
|
-
private _localBin(name: string): string {
|
|
70
|
-
return path.resolve(this._pkgPath, "node_modules/.bin", name);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Execute command (with logging)
|
|
75
|
-
*/
|
|
76
|
-
private async _exec(
|
|
77
|
-
cmd: string,
|
|
78
|
-
args: string[],
|
|
79
|
-
cwd: string,
|
|
80
|
-
env?: Record<string, string>,
|
|
81
|
-
): Promise<string> {
|
|
82
|
-
Electron._logger.debug(`executed command: ${cmd} ${args.join(" ")}`);
|
|
83
|
-
const { stdout: result } = await execa(cmd, args, { cwd, env: { ...process.env, ...env } });
|
|
84
|
-
Electron._logger.debug(`execution result: ${result}`);
|
|
85
|
-
return result;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
//#region Public Methods
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Initialize Electron project
|
|
92
|
-
*
|
|
93
|
-
* 1. Create .electron/src/package.json
|
|
94
|
-
* 2. Run pnpm install
|
|
95
|
-
* 3. Run electron-rebuild (rebuild native modules)
|
|
96
|
-
*/
|
|
97
|
-
async initialize(): Promise<void> {
|
|
98
|
-
const srcPath = path.resolve(this._electronPath, "src");
|
|
99
|
-
|
|
100
|
-
// 1. Create package.json
|
|
101
|
-
await this._setupPackageJson(srcPath);
|
|
102
|
-
|
|
103
|
-
// 2. npm install
|
|
104
|
-
await this._exec("npm", ["install"], srcPath);
|
|
105
|
-
|
|
106
|
-
// 3. Rebuild native modules
|
|
107
|
-
const reinstallDeps = this._config.reinstallDependencies ?? [];
|
|
108
|
-
if (reinstallDeps.length > 0) {
|
|
109
|
-
await this._exec(this._localBin("electron-rebuild"), [], srcPath);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Production build
|
|
115
|
-
*
|
|
116
|
-
* 1. Bundle electron-main.ts with esbuild
|
|
117
|
-
* 2. Copy web assets
|
|
118
|
-
* 3. Create electron-builder configuration
|
|
119
|
-
* 4. Run electron-builder
|
|
120
|
-
* 5. Copy build output
|
|
121
|
-
*/
|
|
122
|
-
async build(outPath: string): Promise<void> {
|
|
123
|
-
const srcPath = path.resolve(this._electronPath, "src");
|
|
124
|
-
|
|
125
|
-
// 1. Bundle electron-main.ts
|
|
126
|
-
await this._bundleMainProcess(srcPath);
|
|
127
|
-
|
|
128
|
-
// 2. Copy web assets (outPath → .electron/src/)
|
|
129
|
-
await this._copyWebAssets(outPath, srcPath);
|
|
130
|
-
|
|
131
|
-
// 3. Create electron-builder configuration and run
|
|
132
|
-
await this._runElectronBuilder(srcPath);
|
|
133
|
-
|
|
134
|
-
// 4. Copy build output
|
|
135
|
-
await this._copyBuildOutput(outPath);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Run in development mode
|
|
140
|
-
*
|
|
141
|
-
* 1. Bundle electron-main.ts with esbuild
|
|
142
|
-
* 2. Create dist/electron/package.json
|
|
143
|
-
* 3. Run electron .
|
|
144
|
-
*/
|
|
145
|
-
async run(url?: string): Promise<void> {
|
|
146
|
-
const electronRunPath = path.resolve(this._pkgPath, "dist/electron");
|
|
147
|
-
|
|
148
|
-
// 1. Bundle electron-main.ts
|
|
149
|
-
await this._bundleMainProcess(electronRunPath);
|
|
150
|
-
|
|
151
|
-
// 2. Create package.json
|
|
152
|
-
await fsx.mkdir(electronRunPath);
|
|
153
|
-
await fsx.writeJson(
|
|
154
|
-
path.resolve(electronRunPath, "package.json"),
|
|
155
|
-
{ name: this._npmConfig.name, version: this._npmConfig.version, main: "electron-main.js" },
|
|
156
|
-
{ space: 2 },
|
|
157
|
-
);
|
|
158
|
-
|
|
159
|
-
// 3. Run Electron
|
|
160
|
-
const runEnv: Record<string, string> = {
|
|
161
|
-
NODE_ENV: "development",
|
|
162
|
-
...this._config.env,
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
if (url != null) {
|
|
166
|
-
runEnv["ELECTRON_DEV_URL"] = url;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
await this._exec(this._localBin("electron"), ["."], electronRunPath, runEnv);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
//#endregion
|
|
173
|
-
|
|
174
|
-
//#region Private - Initialization
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Create .electron/src/package.json
|
|
178
|
-
*/
|
|
179
|
-
private async _setupPackageJson(srcPath: string): Promise<void> {
|
|
180
|
-
await fsx.mkdir(srcPath);
|
|
181
|
-
|
|
182
|
-
const reinstallDeps = this._config.reinstallDependencies ?? [];
|
|
183
|
-
|
|
184
|
-
// Extract versions from main package.json that match reinstallDependencies
|
|
185
|
-
const dependencies: Record<string, string> = {};
|
|
186
|
-
for (const dep of reinstallDeps) {
|
|
187
|
-
const version = this._npmConfig.dependencies?.[dep];
|
|
188
|
-
if (version != null) {
|
|
189
|
-
dependencies[dep] = version;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Add exclude packages
|
|
194
|
-
for (const excludePkg of this._exclude) {
|
|
195
|
-
if (!(excludePkg in dependencies)) {
|
|
196
|
-
const version = this._npmConfig.dependencies?.[excludePkg];
|
|
197
|
-
if (version != null) {
|
|
198
|
-
dependencies[excludePkg] = version;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
const packageJson: Record<string, unknown> = {
|
|
204
|
-
name: this._npmConfig.name.replace(/^@/, "").replace(/\//, "-"),
|
|
205
|
-
version: this._npmConfig.version,
|
|
206
|
-
description: this._npmConfig.description,
|
|
207
|
-
main: "electron-main.js",
|
|
208
|
-
dependencies,
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
if (this._config.postInstallScript != null) {
|
|
212
|
-
packageJson["scripts"] = { postinstall: this._config.postInstallScript };
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
await fsx.writeJson(path.resolve(srcPath, "package.json"), packageJson, { space: 2 });
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
//#endregion
|
|
219
|
-
|
|
220
|
-
//#region Private - Bundling
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Bundle electron-main.ts with esbuild
|
|
224
|
-
*/
|
|
225
|
-
private async _bundleMainProcess(outDir: string): Promise<void> {
|
|
226
|
-
const esbuild = await import("esbuild");
|
|
227
|
-
const entryPoint = path.resolve(this._pkgPath, "src/electron-main.ts");
|
|
228
|
-
|
|
229
|
-
if (!(await fsx.exists(entryPoint))) {
|
|
230
|
-
throw new Error(`electron-main.ts file not found: ${entryPoint}`);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
const builtinModules = module.builtinModules.flatMap((m) => [m, `node:${m}`]);
|
|
234
|
-
const reinstallDeps = this._config.reinstallDependencies ?? [];
|
|
235
|
-
|
|
236
|
-
await fsx.mkdir(outDir);
|
|
237
|
-
|
|
238
|
-
await esbuild.build({
|
|
239
|
-
entryPoints: [entryPoint],
|
|
240
|
-
outfile: path.resolve(outDir, "electron-main.js"),
|
|
241
|
-
platform: "node",
|
|
242
|
-
target: "node20",
|
|
243
|
-
format: "cjs",
|
|
244
|
-
bundle: true,
|
|
245
|
-
external: ["electron", ...builtinModules, ...reinstallDeps],
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
//#endregion
|
|
250
|
-
|
|
251
|
-
//#region Private - Build
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* Copy web assets (build output → .electron/src/)
|
|
255
|
-
*/
|
|
256
|
-
private async _copyWebAssets(outPath: string, srcPath: string): Promise<void> {
|
|
257
|
-
const items = await fsx.readdir(outPath);
|
|
258
|
-
for (const item of items) {
|
|
259
|
-
// Exclude electron/ subdirectory (prevent self-copying)
|
|
260
|
-
if (item === "electron") continue;
|
|
261
|
-
|
|
262
|
-
const source = path.resolve(outPath, item);
|
|
263
|
-
const dest = path.resolve(srcPath, item);
|
|
264
|
-
await fsx.copy(source, dest);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* Check if symlink creation is possible (Windows build requirement)
|
|
270
|
-
*/
|
|
271
|
-
private static _canCreateSymlink(): boolean {
|
|
272
|
-
const tmpDir = os.tmpdir();
|
|
273
|
-
const testTarget = path.join(tmpDir, "sd-electron-symlink-test-target.txt");
|
|
274
|
-
const testLink = path.join(tmpDir, "sd-electron-symlink-test-link.txt");
|
|
275
|
-
|
|
276
|
-
try {
|
|
277
|
-
fs.writeFileSync(testTarget, "test");
|
|
278
|
-
fs.symlinkSync(testTarget, testLink, "file");
|
|
279
|
-
const isSymlink = fs.lstatSync(testLink).isSymbolicLink();
|
|
280
|
-
fs.unlinkSync(testLink);
|
|
281
|
-
fs.unlinkSync(testTarget);
|
|
282
|
-
return isSymlink;
|
|
283
|
-
} catch {
|
|
284
|
-
return false;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Run electron-builder
|
|
290
|
-
*/
|
|
291
|
-
private async _runElectronBuilder(srcPath: string): Promise<void> {
|
|
292
|
-
if (!Electron._canCreateSymlink()) {
|
|
293
|
-
throw new Error(
|
|
294
|
-
"Symlink creation permission is required to build Electron. Enable Developer mode on Windows.",
|
|
295
|
-
);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
const distPath = path.resolve(this._electronPath, "dist");
|
|
299
|
-
|
|
300
|
-
const builderConfig: Record<string, unknown> = {
|
|
301
|
-
appId: this._config.appId,
|
|
302
|
-
productName: this._npmConfig.description,
|
|
303
|
-
asar: false,
|
|
304
|
-
win: {
|
|
305
|
-
target: this._config.portable ? "portable" : "nsis",
|
|
306
|
-
},
|
|
307
|
-
nsis: this._config.nsisOptions ?? {},
|
|
308
|
-
directories: {
|
|
309
|
-
app: srcPath,
|
|
310
|
-
output: distPath,
|
|
311
|
-
},
|
|
312
|
-
removePackageScripts: false,
|
|
313
|
-
npmRebuild: false,
|
|
314
|
-
forceCodeSigning: false,
|
|
315
|
-
};
|
|
316
|
-
|
|
317
|
-
if (this._config.installerIcon != null) {
|
|
318
|
-
builderConfig["icon"] = path.resolve(this._pkgPath, this._config.installerIcon);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const configFilePath = path.resolve(this._electronPath, "builder-config.json");
|
|
322
|
-
await fsx.writeJson(configFilePath, builderConfig, { space: 2 });
|
|
323
|
-
|
|
324
|
-
await this._exec(
|
|
325
|
-
this._localBin("electron-builder"),
|
|
326
|
-
["--win", "--config", configFilePath],
|
|
327
|
-
this._pkgPath,
|
|
328
|
-
);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Copy build output (.electron/dist/ → dist/electron/)
|
|
333
|
-
*/
|
|
334
|
-
private async _copyBuildOutput(outPath: string): Promise<void> {
|
|
335
|
-
const distPath = path.resolve(this._electronPath, "dist");
|
|
336
|
-
const electronOutPath = path.resolve(outPath, "electron");
|
|
337
|
-
await fsx.mkdir(electronOutPath);
|
|
338
|
-
|
|
339
|
-
const description = this._npmConfig.description ?? this._npmConfig.name;
|
|
340
|
-
const version = this._npmConfig.version;
|
|
341
|
-
const isPortable = this._config.portable === true;
|
|
342
|
-
|
|
343
|
-
// electron-builder output filename
|
|
344
|
-
const builderFileName = `${description} ${isPortable ? "" : "Setup "}${version}.exe`;
|
|
345
|
-
const sourcePath = path.resolve(distPath, builderFileName);
|
|
346
|
-
|
|
347
|
-
if (await fsx.exists(sourcePath)) {
|
|
348
|
-
// Copy latest file
|
|
349
|
-
const latestFileName = `${description}${isPortable ? "-portable" : ""}-latest.exe`;
|
|
350
|
-
await fsx.copy(sourcePath, path.resolve(electronOutPath, latestFileName));
|
|
351
|
-
|
|
352
|
-
// Copy per-version file to updates/
|
|
353
|
-
const updatesPath = path.resolve(electronOutPath, "updates");
|
|
354
|
-
await fsx.mkdir(updatesPath);
|
|
355
|
-
await fsx.copy(sourcePath, path.resolve(updatesPath, `${version}.exe`));
|
|
356
|
-
} else {
|
|
357
|
-
Electron._logger.warn(`build output not found: ${sourcePath}`);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
//#endregion
|
|
362
|
-
}
|