@simplysm/sd-cli 13.0.68 → 13.0.70
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/README.md +10 -957
- package/dist/builders/BaseBuilder.d.ts +23 -23
- package/dist/builders/BaseBuilder.d.ts.map +1 -1
- package/dist/builders/BaseBuilder.js +15 -15
- package/dist/builders/DtsBuilder.d.ts +4 -4
- package/dist/builders/DtsBuilder.js +1 -1
- package/dist/builders/LibraryBuilder.d.ts +3 -3
- package/dist/builders/types.d.ts +10 -10
- package/dist/capacitor/capacitor.d.ts +36 -36
- package/dist/capacitor/capacitor.js +63 -63
- package/dist/capacitor/capacitor.js.map +1 -1
- package/dist/commands/add-client.d.ts +8 -8
- package/dist/commands/add-client.js +15 -15
- package/dist/commands/add-client.js.map +1 -1
- package/dist/commands/add-server.d.ts +9 -9
- package/dist/commands/add-server.js +13 -13
- package/dist/commands/add-server.js.map +1 -1
- package/dist/commands/build.d.ts +9 -9
- package/dist/commands/check.js +3 -3
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/dev.d.ts +9 -9
- package/dist/commands/device.d.ts +9 -9
- package/dist/commands/device.d.ts.map +1 -1
- package/dist/commands/device.js +17 -17
- package/dist/commands/device.js.map +1 -1
- package/dist/commands/init.d.ts +6 -6
- package/dist/commands/init.js +12 -12
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/lint.d.ts +23 -23
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +25 -25
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/publish.d.ts +13 -13
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +61 -61
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/replace-deps.d.ts +3 -3
- package/dist/commands/replace-deps.d.ts.map +1 -1
- package/dist/commands/replace-deps.js +1 -1
- package/dist/commands/replace-deps.js.map +1 -1
- package/dist/commands/typecheck.d.ts +20 -20
- package/dist/commands/typecheck.d.ts.map +1 -1
- package/dist/commands/typecheck.js +20 -20
- package/dist/commands/typecheck.js.map +1 -1
- package/dist/commands/watch.d.ts +7 -7
- package/dist/electron/electron.d.ts +27 -27
- package/dist/electron/electron.js +32 -32
- package/dist/electron/electron.js.map +1 -1
- package/dist/infra/ResultCollector.d.ts +9 -9
- package/dist/infra/ResultCollector.js +5 -5
- package/dist/infra/SignalHandler.d.ts +7 -7
- package/dist/infra/SignalHandler.js +4 -4
- package/dist/infra/WorkerManager.d.ts +14 -14
- package/dist/infra/WorkerManager.js +11 -11
- package/dist/orchestrators/BuildOrchestrator.d.ts +19 -19
- package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
- package/dist/orchestrators/BuildOrchestrator.js +26 -26
- package/dist/orchestrators/BuildOrchestrator.js.map +1 -1
- package/dist/orchestrators/DevOrchestrator.d.ts +25 -25
- package/dist/orchestrators/DevOrchestrator.d.ts.map +1 -1
- package/dist/orchestrators/DevOrchestrator.js +30 -30
- package/dist/orchestrators/DevOrchestrator.js.map +1 -1
- package/dist/orchestrators/WatchOrchestrator.d.ts +13 -13
- package/dist/orchestrators/WatchOrchestrator.js +17 -17
- package/dist/orchestrators/WatchOrchestrator.js.map +1 -1
- package/dist/sd-cli-entry.d.ts +2 -2
- package/dist/sd-cli-entry.js +38 -38
- package/dist/sd-cli-entry.js.map +1 -1
- package/dist/sd-cli.d.ts +2 -2
- package/dist/sd-cli.js +1 -1
- package/dist/sd-cli.js.map +1 -1
- package/dist/sd-config.types.d.ts +84 -84
- package/dist/sd-config.types.d.ts.map +1 -1
- package/dist/utils/build-env.d.ts +1 -1
- package/dist/utils/config-editor.d.ts +5 -5
- package/dist/utils/config-editor.js +2 -2
- package/dist/utils/config-editor.js.map +1 -1
- package/dist/utils/copy-public.d.ts +9 -9
- package/dist/utils/copy-src.d.ts +9 -9
- package/dist/utils/esbuild-config.d.ts +30 -30
- package/dist/utils/esbuild-config.d.ts.map +1 -1
- package/dist/utils/output-utils.d.ts +6 -6
- package/dist/utils/package-utils.d.ts +6 -6
- package/dist/utils/package-utils.js +1 -1
- package/dist/utils/package-utils.js.map +1 -1
- package/dist/utils/rebuild-manager.js +3 -3
- package/dist/utils/rebuild-manager.js.map +1 -1
- package/dist/utils/replace-deps.d.ts +25 -25
- package/dist/utils/replace-deps.js +3 -3
- package/dist/utils/replace-deps.js.map +1 -1
- package/dist/utils/sd-config.d.ts +3 -3
- package/dist/utils/sd-config.js +3 -3
- package/dist/utils/sd-config.js.map +1 -1
- package/dist/utils/tailwind-config-deps.d.ts +3 -3
- package/dist/utils/template.d.ts +8 -8
- package/dist/utils/tsconfig.d.ts +16 -16
- package/dist/utils/tsconfig.js +2 -2
- package/dist/utils/tsconfig.js.map +1 -1
- package/dist/utils/typecheck-serialization.d.ts +8 -8
- package/dist/utils/vite-config.d.ts +8 -8
- package/dist/utils/vite-config.d.ts.map +1 -1
- package/dist/utils/vite-config.js +3 -3
- package/dist/utils/worker-events.d.ts +12 -12
- package/dist/utils/worker-events.d.ts.map +1 -1
- package/dist/utils/worker-utils.d.ts +3 -3
- package/dist/utils/worker-utils.js +2 -2
- package/dist/utils/worker-utils.js.map +1 -1
- package/dist/workers/client.worker.d.ts +14 -14
- package/dist/workers/client.worker.d.ts.map +1 -1
- package/dist/workers/client.worker.js +1 -1
- package/dist/workers/client.worker.js.map +1 -1
- package/dist/workers/dts.worker.d.ts +13 -13
- package/dist/workers/dts.worker.d.ts.map +1 -1
- package/dist/workers/dts.worker.js +3 -3
- package/dist/workers/dts.worker.js.map +1 -1
- package/dist/workers/library.worker.d.ts +12 -12
- package/dist/workers/library.worker.js +1 -1
- package/dist/workers/library.worker.js.map +1 -1
- package/dist/workers/lint.worker.d.ts +1 -1
- package/dist/workers/server-runtime.worker.d.ts +6 -6
- package/dist/workers/server-runtime.worker.js +6 -6
- package/dist/workers/server-runtime.worker.js.map +1 -1
- package/dist/workers/server.worker.d.ts +20 -20
- package/dist/workers/server.worker.d.ts.map +1 -1
- package/dist/workers/server.worker.js +6 -6
- package/dist/workers/server.worker.js.map +1 -1
- package/package.json +8 -7
- package/src/builders/BaseBuilder.ts +33 -33
- package/src/builders/DtsBuilder.ts +5 -5
- package/src/builders/LibraryBuilder.ts +9 -9
- package/src/builders/types.ts +10 -10
- package/src/capacitor/capacitor.ts +119 -119
- package/src/commands/add-client.ts +31 -31
- package/src/commands/add-server.ts +34 -34
- package/src/commands/build.ts +9 -9
- package/src/commands/check.ts +5 -5
- package/src/commands/dev.ts +9 -9
- package/src/commands/device.ts +30 -30
- package/src/commands/init.ts +25 -25
- package/src/commands/lint.ts +64 -64
- package/src/commands/publish.ts +139 -139
- package/src/commands/replace-deps.ts +4 -4
- package/src/commands/typecheck.ts +74 -74
- package/src/commands/watch.ts +7 -7
- package/src/electron/electron.ts +51 -51
- package/src/infra/ResultCollector.ts +9 -9
- package/src/infra/SignalHandler.ts +7 -7
- package/src/infra/WorkerManager.ts +14 -14
- package/src/orchestrators/BuildOrchestrator.ts +76 -76
- package/src/orchestrators/DevOrchestrator.ts +88 -88
- package/src/orchestrators/WatchOrchestrator.ts +39 -39
- package/src/sd-cli-entry.ts +43 -43
- package/src/sd-cli.ts +15 -15
- package/src/sd-config.types.ts +85 -85
- package/src/utils/build-env.ts +1 -1
- package/src/utils/config-editor.ts +19 -19
- package/src/utils/copy-public.ts +17 -17
- package/src/utils/copy-src.ts +11 -11
- package/src/utils/esbuild-config.ts +33 -33
- package/src/utils/output-utils.ts +11 -11
- package/src/utils/package-utils.ts +12 -12
- package/src/utils/rebuild-manager.ts +3 -3
- package/src/utils/replace-deps.ts +361 -361
- package/src/utils/sd-config.ts +44 -44
- package/src/utils/tailwind-config-deps.ts +98 -98
- package/src/utils/template.ts +56 -56
- package/src/utils/tsconfig.ts +127 -127
- package/src/utils/typecheck-serialization.ts +86 -86
- package/src/utils/vite-config.ts +341 -341
- package/src/utils/worker-events.ts +16 -16
- package/src/utils/worker-utils.ts +45 -45
- package/src/workers/client.worker.ts +34 -34
- package/src/workers/dts.worker.ts +467 -467
- package/src/workers/library.worker.ts +314 -314
- package/src/workers/lint.worker.ts +16 -16
- package/src/workers/server-runtime.worker.ts +157 -157
- package/src/workers/server.worker.ts +572 -572
- package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
- package/templates/add-server/__SERVER__/package.json.hbs +2 -2
- package/templates/init/package.json.hbs +3 -3
- package/tests/config-editor.spec.ts +160 -0
- package/tests/copy-src.spec.ts +50 -0
- package/tests/get-compiler-options-for-package.spec.ts +139 -0
- package/tests/get-package-source-files.spec.ts +181 -0
- package/tests/get-types-from-package-json.spec.ts +107 -0
- package/tests/infra/ResultCollector.spec.ts +39 -0
- package/tests/infra/SignalHandler.spec.ts +38 -0
- package/tests/infra/WorkerManager.spec.ts +97 -0
- package/tests/load-ignore-patterns.spec.ts +188 -0
- package/tests/load-sd-config.spec.ts +137 -0
- package/tests/package-utils.spec.ts +188 -0
- package/tests/parse-root-tsconfig.spec.ts +89 -0
- package/tests/replace-deps.spec.ts +308 -0
- package/tests/run-lint.spec.ts +415 -0
- package/tests/run-typecheck.spec.ts +653 -0
- package/tests/run-watch.spec.ts +75 -0
- package/tests/sd-cli.spec.ts +330 -0
- package/tests/tailwind-config-deps.spec.ts +30 -0
- package/tests/template.spec.ts +70 -0
- package/tests/utils/rebuild-manager.spec.ts +43 -0
- package/tests/write-changed-output-files.spec.ts +97 -0
|
@@ -26,16 +26,16 @@ import { SignalHandler } from "../infra/SignalHandler";
|
|
|
26
26
|
//#region Types
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
|
-
* Dev Orchestrator
|
|
29
|
+
* Dev Orchestrator options
|
|
30
30
|
*/
|
|
31
31
|
export interface DevOrchestratorOptions {
|
|
32
|
-
/**
|
|
32
|
+
/** Filter for packages to develop (empty array means all packages) */
|
|
33
33
|
targets: string[];
|
|
34
34
|
options: string[];
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
|
-
* Client Worker
|
|
38
|
+
* Client Worker info (for Vite dev server)
|
|
39
39
|
*/
|
|
40
40
|
interface ClientWorkerInfo {
|
|
41
41
|
name: string;
|
|
@@ -50,14 +50,14 @@ interface ClientWorkerInfo {
|
|
|
50
50
|
//#region DevOrchestrator
|
|
51
51
|
|
|
52
52
|
/**
|
|
53
|
-
*
|
|
53
|
+
* Orchestrator that coordinates dev mode execution
|
|
54
54
|
*
|
|
55
|
-
*
|
|
56
|
-
* - `client`
|
|
57
|
-
* - `server`
|
|
58
|
-
* - Server-Client
|
|
59
|
-
* - Capacitor
|
|
60
|
-
* - SIGINT/SIGTERM
|
|
55
|
+
* Manages development mode execution for Client and Server packages.
|
|
56
|
+
* - `client` target: Start Vite dev server
|
|
57
|
+
* - `server` target: Server Build Worker + Server Runtime Worker
|
|
58
|
+
* - Support for Server-Client proxy connections
|
|
59
|
+
* - Support for Capacitor initialization
|
|
60
|
+
* - Shutdown via SIGINT/SIGTERM signals
|
|
61
61
|
*/
|
|
62
62
|
export class DevOrchestrator {
|
|
63
63
|
private readonly _options: DevOrchestratorOptions;
|
|
@@ -104,9 +104,9 @@ export class DevOrchestrator {
|
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
/**
|
|
107
|
-
*
|
|
107
|
+
* Print server URL (debounce 300ms)
|
|
108
108
|
*
|
|
109
|
-
*
|
|
109
|
+
* Prevents duplicate output when server rebuild and scope rebuild occur simultaneously.
|
|
110
110
|
*/
|
|
111
111
|
private _schedulePrintServers(): void {
|
|
112
112
|
if (this._printServersTimer != null) clearTimeout(this._printServersTimer);
|
|
@@ -116,42 +116,42 @@ export class DevOrchestrator {
|
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
/**
|
|
119
|
-
* Orchestrator
|
|
120
|
-
* - sd.config.ts
|
|
121
|
-
* -
|
|
122
|
-
* -
|
|
119
|
+
* Initialize Orchestrator
|
|
120
|
+
* - Load sd.config.ts
|
|
121
|
+
* - Classify packages
|
|
122
|
+
* - Prepare environment variables
|
|
123
123
|
*/
|
|
124
124
|
async initialize(): Promise<void> {
|
|
125
125
|
const { targets } = this._options;
|
|
126
|
-
this._logger.debug("dev
|
|
126
|
+
this._logger.debug("Starting dev mode", { targets });
|
|
127
127
|
|
|
128
|
-
// sd.config.ts
|
|
128
|
+
// Load sd.config.ts (required for dev mode to access package build information)
|
|
129
129
|
try {
|
|
130
130
|
this._sdConfig = await loadSdConfig({
|
|
131
131
|
cwd: this._cwd,
|
|
132
132
|
dev: true,
|
|
133
133
|
opt: this._options.options,
|
|
134
134
|
});
|
|
135
|
-
this._logger.debug("sd.config.ts
|
|
135
|
+
this._logger.debug("sd.config.ts loaded successfully");
|
|
136
136
|
} catch (err) {
|
|
137
|
-
this._logger.error(`sd.config.ts
|
|
137
|
+
this._logger.error(`Failed to load sd.config.ts: ${err instanceof Error ? err.message : err}`);
|
|
138
138
|
process.exitCode = 1;
|
|
139
139
|
throw err;
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
-
//
|
|
142
|
+
// Start watch for replaceDeps if configured (initial replacement is handled in sd-cli.ts)
|
|
143
143
|
if (this._sdConfig.replaceDeps != null) {
|
|
144
144
|
this._replaceDepWatcher = await watchReplaceDeps(this._cwd, this._sdConfig.replaceDeps);
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
// VER, DEV
|
|
147
|
+
// Prepare VER, DEV environment variables
|
|
148
148
|
const version = await getVersion(this._cwd);
|
|
149
149
|
this._baseEnv = { VER: version, DEV: "true" };
|
|
150
150
|
|
|
151
|
-
// targets
|
|
151
|
+
// Filter targets
|
|
152
152
|
const allPackages = filterPackagesByTargets(this._sdConfig.packages, targets);
|
|
153
153
|
|
|
154
|
-
// client/server
|
|
154
|
+
// Filter only client/server packages
|
|
155
155
|
for (const [name, config] of Object.entries(allPackages)) {
|
|
156
156
|
if (config.target === "server") {
|
|
157
157
|
this._serverPackages.push({ name, config });
|
|
@@ -161,13 +161,13 @@ export class DevOrchestrator {
|
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
if (this._serverPackages.length === 0 && this._clientPackages.length === 0) {
|
|
164
|
-
process.stdout.write("⚠
|
|
164
|
+
process.stdout.write("⚠ No client/server packages to develop.\n");
|
|
165
165
|
return;
|
|
166
166
|
}
|
|
167
167
|
|
|
168
168
|
this._hasPackages = true;
|
|
169
169
|
|
|
170
|
-
//
|
|
170
|
+
// Find clients connected to servers (only if server is a dev target)
|
|
171
171
|
const serverNames = new Set(this._serverPackages.map(({ name }) => name));
|
|
172
172
|
for (const { name, config } of this._clientPackages) {
|
|
173
173
|
if (typeof config.server === "string" && serverNames.has(config.server)) {
|
|
@@ -177,11 +177,11 @@ export class DevOrchestrator {
|
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
179
|
|
|
180
|
-
//
|
|
180
|
+
// Initialize infrastructure
|
|
181
181
|
this._rebuildManager = new RebuildManager(this._logger);
|
|
182
182
|
this._signalHandler = new SignalHandler();
|
|
183
183
|
|
|
184
|
-
//
|
|
184
|
+
// Print errors and server URL when batch is complete
|
|
185
185
|
this._rebuildManager.on("batchComplete", () => {
|
|
186
186
|
printErrors(this._results);
|
|
187
187
|
this._schedulePrintServers();
|
|
@@ -189,11 +189,11 @@ export class DevOrchestrator {
|
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
/**
|
|
192
|
-
*
|
|
193
|
-
* -
|
|
194
|
-
* -
|
|
195
|
-
* -
|
|
196
|
-
* - Capacitor
|
|
192
|
+
* Start dev mode
|
|
193
|
+
* - Create workers
|
|
194
|
+
* - Register event handlers
|
|
195
|
+
* - Initial build and server startup
|
|
196
|
+
* - Initialize Capacitor
|
|
197
197
|
*/
|
|
198
198
|
async start(): Promise<void> {
|
|
199
199
|
if (!this._hasPackages) {
|
|
@@ -202,14 +202,14 @@ export class DevOrchestrator {
|
|
|
202
202
|
|
|
203
203
|
const serverNames = new Set(this._serverPackages.map(({ name }) => name));
|
|
204
204
|
|
|
205
|
-
// Worker
|
|
205
|
+
// Worker paths
|
|
206
206
|
const clientWorkerPath = import.meta.resolve("../workers/client.worker");
|
|
207
207
|
const serverWorkerPath = import.meta.resolve("../workers/server.worker");
|
|
208
208
|
const serverRuntimeWorkerPath = import.meta.resolve("../workers/server-runtime.worker");
|
|
209
209
|
|
|
210
|
-
//
|
|
211
|
-
// - server
|
|
212
|
-
// - server
|
|
210
|
+
// Standalone client cases:
|
|
211
|
+
// - server is a number
|
|
212
|
+
// - server is a string but the server is not a dev target
|
|
213
213
|
this._standaloneClientWorkers = this._clientPackages
|
|
214
214
|
.filter(
|
|
215
215
|
({ config }) =>
|
|
@@ -224,7 +224,7 @@ export class DevOrchestrator {
|
|
|
224
224
|
buildResolver: undefined,
|
|
225
225
|
}));
|
|
226
226
|
|
|
227
|
-
//
|
|
227
|
+
// Vite workers for clients connected to servers (only if server is a dev target)
|
|
228
228
|
this._viteClientWorkers = this._clientPackages
|
|
229
229
|
.filter(({ config }) => typeof config.server === "string" && serverNames.has(config.server))
|
|
230
230
|
.map(({ name, config }) => ({
|
|
@@ -235,7 +235,7 @@ export class DevOrchestrator {
|
|
|
235
235
|
buildResolver: undefined,
|
|
236
236
|
}));
|
|
237
237
|
|
|
238
|
-
//
|
|
238
|
+
// Setup and start workers for each section
|
|
239
239
|
const standaloneClientPromises = this._setupStandaloneClients();
|
|
240
240
|
const { buildPromises: viteClientPromises, readyPromises: viteClientReadyPromises } =
|
|
241
241
|
this._setupViteClients();
|
|
@@ -245,8 +245,8 @@ export class DevOrchestrator {
|
|
|
245
245
|
viteClientReadyPromises,
|
|
246
246
|
);
|
|
247
247
|
|
|
248
|
-
//
|
|
249
|
-
this._logger.debug("
|
|
248
|
+
// Wait for initial build to complete (parallel execution)
|
|
249
|
+
this._logger.debug("Starting initial build (Promise.allSettled)");
|
|
250
250
|
const initialBuildPromises: Array<{ name: string; promise: Promise<void> }> = [
|
|
251
251
|
...standaloneClientPromises,
|
|
252
252
|
...viteClientPromises,
|
|
@@ -260,13 +260,13 @@ export class DevOrchestrator {
|
|
|
260
260
|
initialResults.forEach((result, index) => {
|
|
261
261
|
const taskName = initialBuildPromises[index].name;
|
|
262
262
|
if (result.status === "rejected") {
|
|
263
|
-
this._logger.debug(`[${taskName}]
|
|
263
|
+
this._logger.debug(`[${taskName}] Initial build failed:`, result.reason);
|
|
264
264
|
} else {
|
|
265
|
-
this._logger.debug(`[${taskName}]
|
|
265
|
+
this._logger.debug(`[${taskName}] Initial build completed`);
|
|
266
266
|
}
|
|
267
267
|
});
|
|
268
268
|
|
|
269
|
-
// Capacitor
|
|
269
|
+
// Initialize Capacitor (for packages in client target with capacitor configuration)
|
|
270
270
|
const capacitorPackages: Array<[string, SdClientPackageConfig]> = [];
|
|
271
271
|
for (const { name, config } of this._clientPackages) {
|
|
272
272
|
if (config.capacitor != null) {
|
|
@@ -302,13 +302,13 @@ export class DevOrchestrator {
|
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
304
|
|
|
305
|
-
//
|
|
305
|
+
// Print initial build results
|
|
306
306
|
printErrors(this._results);
|
|
307
307
|
printServers(this._results, this._serverClientsMap);
|
|
308
308
|
}
|
|
309
309
|
|
|
310
310
|
/**
|
|
311
|
-
*
|
|
311
|
+
* Setup and start standalone client workers
|
|
312
312
|
*/
|
|
313
313
|
private _setupStandaloneClients(): Array<{ name: string; promise: Promise<void> }> {
|
|
314
314
|
const buildPromises = new Map<string, Promise<void>>();
|
|
@@ -321,7 +321,7 @@ export class DevOrchestrator {
|
|
|
321
321
|
);
|
|
322
322
|
}
|
|
323
323
|
|
|
324
|
-
//
|
|
324
|
+
// Register event handlers
|
|
325
325
|
for (const workerInfo of this._standaloneClientWorkers) {
|
|
326
326
|
const completeTask = registerWorkerEventHandlers(
|
|
327
327
|
workerInfo as unknown as BaseWorkerInfo,
|
|
@@ -346,12 +346,12 @@ export class DevOrchestrator {
|
|
|
346
346
|
});
|
|
347
347
|
});
|
|
348
348
|
|
|
349
|
-
//
|
|
349
|
+
// Print server URL when scope package rebuild is detected
|
|
350
350
|
workerInfo.worker.on("scopeRebuild", () => {
|
|
351
351
|
this._schedulePrintServers();
|
|
352
352
|
});
|
|
353
353
|
|
|
354
|
-
//
|
|
354
|
+
// Start worker
|
|
355
355
|
const pkgDir = path.join(this._cwd, "packages", workerInfo.name);
|
|
356
356
|
const clientConfig: SdClientPackageConfig = {
|
|
357
357
|
...workerInfo.config,
|
|
@@ -383,7 +383,7 @@ export class DevOrchestrator {
|
|
|
383
383
|
}
|
|
384
384
|
|
|
385
385
|
/**
|
|
386
|
-
* Vite client (
|
|
386
|
+
* Setup and start Vite client (server-connected) workers
|
|
387
387
|
*/
|
|
388
388
|
private _setupViteClients(): {
|
|
389
389
|
buildPromises: Array<{ name: string; promise: Promise<void> }>;
|
|
@@ -398,7 +398,7 @@ export class DevOrchestrator {
|
|
|
398
398
|
workerInfo.buildResolver = resolve;
|
|
399
399
|
}),
|
|
400
400
|
);
|
|
401
|
-
// Vite
|
|
401
|
+
// Vite server ready promise (wait until server knows client port)
|
|
402
402
|
let readyResolver!: () => void;
|
|
403
403
|
const readyPromise = new Promise<void>((resolve) => {
|
|
404
404
|
readyResolver = resolve;
|
|
@@ -409,7 +409,7 @@ export class DevOrchestrator {
|
|
|
409
409
|
});
|
|
410
410
|
}
|
|
411
411
|
|
|
412
|
-
//
|
|
412
|
+
// Register event handlers
|
|
413
413
|
for (const workerInfo of this._viteClientWorkers) {
|
|
414
414
|
const completeTask = registerWorkerEventHandlers(
|
|
415
415
|
workerInfo as unknown as BaseWorkerInfo,
|
|
@@ -422,14 +422,14 @@ export class DevOrchestrator {
|
|
|
422
422
|
this._rebuildManager,
|
|
423
423
|
);
|
|
424
424
|
|
|
425
|
-
// serverReady - Vite
|
|
425
|
+
// serverReady - Store Vite port in clientPorts (URL is printed via server)
|
|
426
426
|
workerInfo.worker.on("serverReady", (data) => {
|
|
427
427
|
const event = data as ServerReadyEventData;
|
|
428
428
|
this._logger.debug(`[${workerInfo.name}] Vite serverReady (port: ${String(event.port)})`);
|
|
429
429
|
this._clientPorts[workerInfo.name] = event.port;
|
|
430
|
-
// Vite
|
|
430
|
+
// Notify Vite server ready (server is waiting for proxy setup)
|
|
431
431
|
readyPromises.get(workerInfo.name)?.resolver();
|
|
432
|
-
//
|
|
432
|
+
// Call completeTask for build completion (Vite doesn't emit build event)
|
|
433
433
|
completeTask({
|
|
434
434
|
name: workerInfo.name,
|
|
435
435
|
target: workerInfo.config.target,
|
|
@@ -438,23 +438,23 @@ export class DevOrchestrator {
|
|
|
438
438
|
});
|
|
439
439
|
});
|
|
440
440
|
|
|
441
|
-
// Vite client error
|
|
442
|
-
// (
|
|
441
|
+
// Also resolve readyPromises on Vite client error
|
|
442
|
+
// (prevent server from hanging indefinitely in await Promise.all(clientReadyPromises))
|
|
443
443
|
workerInfo.worker.on("error", () => {
|
|
444
444
|
readyPromises.get(workerInfo.name)?.resolver();
|
|
445
445
|
});
|
|
446
446
|
|
|
447
|
-
//
|
|
447
|
+
// Print server URL when scope package rebuild is detected
|
|
448
448
|
workerInfo.worker.on("scopeRebuild", () => {
|
|
449
449
|
this._schedulePrintServers();
|
|
450
450
|
});
|
|
451
451
|
|
|
452
|
-
//
|
|
452
|
+
// Start worker
|
|
453
453
|
const pkgDir = path.join(this._cwd, "packages", workerInfo.name);
|
|
454
|
-
// Vite
|
|
454
|
+
// Allow Vite to automatically assign port
|
|
455
455
|
const viteConfig: SdClientPackageConfig = {
|
|
456
456
|
...workerInfo.config,
|
|
457
|
-
server: 0, // Vite
|
|
457
|
+
server: 0, // Vite will automatically assign port
|
|
458
458
|
env: { ...this._baseEnv, ...workerInfo.config.env },
|
|
459
459
|
};
|
|
460
460
|
workerInfo.worker
|
|
@@ -486,14 +486,14 @@ export class DevOrchestrator {
|
|
|
486
486
|
}
|
|
487
487
|
|
|
488
488
|
/**
|
|
489
|
-
* Server Build/Runtime
|
|
489
|
+
* Setup and start Server Build/Runtime workers
|
|
490
490
|
*/
|
|
491
491
|
private _setupServers(
|
|
492
492
|
serverWorkerPath: string,
|
|
493
493
|
serverRuntimeWorkerPath: string,
|
|
494
494
|
viteClientReadyPromises: Map<string, { promise: Promise<void>; resolver: () => void }>,
|
|
495
495
|
): Array<{ name: string; promise: Promise<void> }> {
|
|
496
|
-
// Server Build Worker
|
|
496
|
+
// Create Server Build Worker and promise
|
|
497
497
|
for (const { name } of this._serverPackages) {
|
|
498
498
|
let resolver!: () => void;
|
|
499
499
|
const promise = new Promise<void>((resolve) => {
|
|
@@ -506,7 +506,7 @@ export class DevOrchestrator {
|
|
|
506
506
|
});
|
|
507
507
|
}
|
|
508
508
|
|
|
509
|
-
// Server Runtime Promise (
|
|
509
|
+
// Server Runtime Promise (wait for initial server startup to complete)
|
|
510
510
|
const serverRuntimePromises = new Map<
|
|
511
511
|
string,
|
|
512
512
|
{ promise: Promise<void>; resolver: () => void }
|
|
@@ -519,14 +519,14 @@ export class DevOrchestrator {
|
|
|
519
519
|
serverRuntimePromises.set(name, { promise, resolver });
|
|
520
520
|
}
|
|
521
521
|
|
|
522
|
-
// Server Build Worker
|
|
522
|
+
// Register Server Build Worker event handlers
|
|
523
523
|
for (const { name } of this._serverPackages) {
|
|
524
524
|
const serverBuild = this._serverBuildWorkers.get(name)!;
|
|
525
525
|
let isFirstBuild = true;
|
|
526
526
|
|
|
527
527
|
serverBuild.worker.on("buildStart", () => {
|
|
528
528
|
if (!isFirstBuild) {
|
|
529
|
-
//
|
|
529
|
+
// Register with RebuildManager on rebuild
|
|
530
530
|
const resolver = this._rebuildManager.registerBuild(`${name}:server`, `${name} (server)`);
|
|
531
531
|
this._serverBuildWorkers.set(name, {
|
|
532
532
|
...serverBuild,
|
|
@@ -539,7 +539,7 @@ export class DevOrchestrator {
|
|
|
539
539
|
const event = data as ServerBuildEventData;
|
|
540
540
|
this._logger.debug(`[${name}] server build: success=${String(event.success)}`);
|
|
541
541
|
|
|
542
|
-
// warnings
|
|
542
|
+
// Print warnings
|
|
543
543
|
if (event.warnings != null && event.warnings.length > 0) {
|
|
544
544
|
this._logger.warn(formatBuildMessages(name, "server", event.warnings));
|
|
545
545
|
}
|
|
@@ -561,10 +561,10 @@ export class DevOrchestrator {
|
|
|
561
561
|
return;
|
|
562
562
|
}
|
|
563
563
|
|
|
564
|
-
//
|
|
564
|
+
// Start runtime worker on build success (separate async function to prevent error propagation)
|
|
565
565
|
void startServerRuntime(name, event.mainJsPath).catch((err: unknown) => {
|
|
566
566
|
const message = errorMessage(err);
|
|
567
|
-
this._logger.error(`[${name}] Server Runtime
|
|
567
|
+
this._logger.error(`[${name}] Error starting Server Runtime:`, message);
|
|
568
568
|
|
|
569
569
|
this._results.set(`${name}:server`, {
|
|
570
570
|
name,
|
|
@@ -584,39 +584,39 @@ export class DevOrchestrator {
|
|
|
584
584
|
});
|
|
585
585
|
|
|
586
586
|
/**
|
|
587
|
-
*
|
|
588
|
-
*
|
|
587
|
+
* Start server runtime worker.
|
|
588
|
+
* Separated as a dedicated function to catch errors from async event handlers.
|
|
589
589
|
*/
|
|
590
590
|
const startServerRuntime = async (serverName: string, mainJsPath: string): Promise<void> => {
|
|
591
591
|
this._logger.debug(`[${serverName}] startServerRuntime: ${mainJsPath}`);
|
|
592
592
|
const updatedBuild = this._serverBuildWorkers.get(serverName)!;
|
|
593
593
|
updatedBuild.mainJsPath = mainJsPath;
|
|
594
594
|
|
|
595
|
-
//
|
|
595
|
+
// Terminate existing Server Runtime Worker
|
|
596
596
|
const existingRuntime = this._serverRuntimeWorkers.get(serverName);
|
|
597
597
|
if (existingRuntime != null) {
|
|
598
|
-
this._logger.info(`[${serverName}]
|
|
598
|
+
this._logger.info(`[${serverName}] Restarting server...`);
|
|
599
599
|
await existingRuntime.terminate();
|
|
600
600
|
}
|
|
601
601
|
|
|
602
|
-
//
|
|
602
|
+
// Create and start new Server Runtime Worker
|
|
603
603
|
const runtimeWorker =
|
|
604
604
|
Worker.create<typeof ServerRuntimeWorkerModule>(serverRuntimeWorkerPath);
|
|
605
605
|
this._serverRuntimeWorkers.set(serverName, runtimeWorker);
|
|
606
606
|
|
|
607
|
-
//
|
|
607
|
+
// Wait for Vite servers of clients connected to this server to be ready
|
|
608
608
|
const connectedClients = this._serverClientsMap.get(serverName) ?? [];
|
|
609
609
|
const clientReadyPromises = connectedClients
|
|
610
610
|
.map((clientName) => viteClientReadyPromises.get(clientName)?.promise)
|
|
611
611
|
.filter((p): p is Promise<void> => p != null);
|
|
612
612
|
this._logger.debug(
|
|
613
|
-
`[${serverName}]
|
|
613
|
+
`[${serverName}] Waiting for clients: ${String(clientReadyPromises.length)} total`,
|
|
614
614
|
);
|
|
615
615
|
if (clientReadyPromises.length > 0) {
|
|
616
616
|
await Promise.all(clientReadyPromises);
|
|
617
617
|
}
|
|
618
618
|
|
|
619
|
-
//
|
|
619
|
+
// Collect client ports for this server
|
|
620
620
|
const serverClientPorts: Record<string, number> = {};
|
|
621
621
|
for (const clientName of connectedClients) {
|
|
622
622
|
if (clientName in this._clientPorts) {
|
|
@@ -624,7 +624,7 @@ export class DevOrchestrator {
|
|
|
624
624
|
}
|
|
625
625
|
}
|
|
626
626
|
|
|
627
|
-
// Server Runtime
|
|
627
|
+
// Server Runtime event handlers
|
|
628
628
|
runtimeWorker.on("serverReady", (readyData) => {
|
|
629
629
|
const readyEvent = readyData as ServerReadyEventData;
|
|
630
630
|
this._results.set(`${serverName}:server`, {
|
|
@@ -659,9 +659,9 @@ export class DevOrchestrator {
|
|
|
659
659
|
updatedBuild.buildResolver();
|
|
660
660
|
});
|
|
661
661
|
|
|
662
|
-
// Server Runtime
|
|
663
|
-
//
|
|
664
|
-
// promise rejection
|
|
662
|
+
// Start Server Runtime
|
|
663
|
+
// If worker crashes, it terminates without emitting "serverReady"/"error" events,
|
|
664
|
+
// so catch promise rejection to prevent hanging
|
|
665
665
|
runtimeWorker
|
|
666
666
|
.start({
|
|
667
667
|
mainJsPath,
|
|
@@ -669,7 +669,7 @@ export class DevOrchestrator {
|
|
|
669
669
|
})
|
|
670
670
|
.catch((err: unknown) => {
|
|
671
671
|
const message = errorMessage(err);
|
|
672
|
-
this._logger.error(`[${serverName}] Server Runtime Worker
|
|
672
|
+
this._logger.error(`[${serverName}] Server Runtime Worker crashed:`, message);
|
|
673
673
|
|
|
674
674
|
this._results.set(`${serverName}:server`, {
|
|
675
675
|
name: serverName,
|
|
@@ -704,7 +704,7 @@ export class DevOrchestrator {
|
|
|
704
704
|
});
|
|
705
705
|
}
|
|
706
706
|
|
|
707
|
-
// Server Build
|
|
707
|
+
// Start Server Build workers
|
|
708
708
|
for (const { name, config } of this._serverPackages) {
|
|
709
709
|
const pkgDir = path.join(this._cwd, "packages", name);
|
|
710
710
|
const serverBuild = this._serverBuildWorkers.get(name)!;
|
|
@@ -738,7 +738,7 @@ export class DevOrchestrator {
|
|
|
738
738
|
}
|
|
739
739
|
|
|
740
740
|
/**
|
|
741
|
-
*
|
|
741
|
+
* Wait for termination signal
|
|
742
742
|
*/
|
|
743
743
|
async awaitTermination(): Promise<void> {
|
|
744
744
|
if (!this._hasPackages) {
|
|
@@ -748,15 +748,15 @@ export class DevOrchestrator {
|
|
|
748
748
|
}
|
|
749
749
|
|
|
750
750
|
/**
|
|
751
|
-
*
|
|
751
|
+
* Shutdown orchestrator
|
|
752
752
|
*/
|
|
753
753
|
async shutdown(): Promise<void> {
|
|
754
754
|
if (!this._hasPackages) {
|
|
755
755
|
return;
|
|
756
756
|
}
|
|
757
757
|
|
|
758
|
-
//
|
|
759
|
-
process.stdout.write("⏳
|
|
758
|
+
// Terminate workers (all workers)
|
|
759
|
+
process.stdout.write("⏳ Shutting down...\n");
|
|
760
760
|
await Promise.all([
|
|
761
761
|
...this._standaloneClientWorkers.map(({ worker }) => worker.terminate()),
|
|
762
762
|
...this._viteClientWorkers.map(({ worker }) => worker.terminate()),
|
|
@@ -764,7 +764,7 @@ export class DevOrchestrator {
|
|
|
764
764
|
...[...this._serverRuntimeWorkers.values()].map((worker) => worker.terminate()),
|
|
765
765
|
]);
|
|
766
766
|
this._replaceDepWatcher?.dispose();
|
|
767
|
-
process.stdout.write("✔
|
|
767
|
+
process.stdout.write("✔ Done\n");
|
|
768
768
|
}
|
|
769
769
|
}
|
|
770
770
|
|