@simplysm/sd-cli 13.0.0-beta.28 → 13.0.0-beta.30

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 CHANGED
@@ -163,6 +163,25 @@ sd-cli build solid core-common
163
163
 
164
164
  If a `server` or `client` package defines a `configs` field in `sd.config.ts`, the build automatically generates `dist/.config.json` containing that configuration. This is useful for storing environment-specific settings (database config, API endpoints, etc.) that are read at runtime via `ServiceBase.getConfig()` in `service-server`.
165
165
 
166
+ **Server Build: Externals & Production Deployment Files:**
167
+
168
+ Server builds (`target: "server"`) automatically detect modules that cannot be bundled by esbuild and mark them as external. Three sources of externals are combined:
169
+
170
+ 1. **Uninstalled optional peer dependencies** — automatically detected via `peerDependenciesMeta`
171
+ 2. **Native modules (node-gyp)** — automatically detected by scanning for `binding.gyp` files in the dependency tree
172
+ 3. **Manual externals** — specified via `externals` in `sd.config.ts`
173
+
174
+ During production build (`sd-cli build`), the following deployment files are generated in `dist/`:
175
+
176
+ | File | Description |
177
+ |------|-------------|
178
+ | `package.json` | Minimal package.json with externalized dependencies (version `"*"`) for `npm install` on the deployment server |
179
+ | `mise.toml` | Node.js version specification (read from root `mise.toml`) |
180
+ | `openssl.cnf` | Legacy OpenSSL provider activation (required for MSSQL and other legacy TLS connections) |
181
+ | `pm2.config.cjs` | PM2 process manager config (only generated when `pm2` is configured) |
182
+
183
+ > **Note**: Production deployment files are only generated during `sd-cli build`, not during `sd-cli dev` (watch mode).
184
+
166
185
  ### publish
167
186
 
168
187
  Publishes packages. For safety, proceeds in the following order:
@@ -311,7 +330,7 @@ import type {
311
330
  | `BuildTarget` | Library build target: `"node" \| "browser" \| "neutral"` |
312
331
  | `SdBuildPackageConfig` | Config for library packages (`node`/`browser`/`neutral` targets) |
313
332
  | `SdClientPackageConfig` | Config for client packages (`client` target) |
314
- | `SdServerPackageConfig` | Config for server packages (`server` target) |
333
+ | `SdServerPackageConfig` | Config for server packages (`server` target, with `externals` and `pm2` options) |
315
334
  | `SdScriptsPackageConfig` | Config for scripts-only packages (`scripts` target) |
316
335
  | `SdPublishConfig` | Deployment config: `"npm" \| SdLocalDirectoryPublishConfig \| SdStoragePublishConfig` |
317
336
  | `SdLocalDirectoryPublishConfig` | Local directory deployment config (`type: "local-directory"`, `path`) |
@@ -394,9 +413,28 @@ export default config;
394
413
  {
395
414
  target: "node" | "browser" | "neutral";
396
415
  publish?: SdPublishConfig; // Deployment config (optional)
416
+ copySrc?: string[]; // Glob patterns for copying assets from src/ to dist/ (optional)
397
417
  }
398
418
  ```
399
419
 
420
+ **Asset Copying (copySrc)**
421
+
422
+ The `copySrc` option allows copying non-TypeScript files (CSS, images, etc.) from `src/` to `dist/` during build and watch mode:
423
+
424
+ ```typescript
425
+ "my-lib": {
426
+ target: "browser",
427
+ publish: "npm",
428
+ copySrc: ["**/*.css", "**/*.png"], // Copy all CSS and PNG files
429
+ }
430
+ ```
431
+
432
+ **How it works:**
433
+ - Glob patterns are relative to `src/` directory
434
+ - File directory structure is preserved during copy (e.g., `src/styles/theme.css` → `dist/styles/theme.css`)
435
+ - Applied during both production build (`sd-cli build`) and watch mode (`sd-cli watch`)
436
+ - Useful for including CSS files with component libraries when consuming apps may not bundle them automatically
437
+
400
438
  #### Client Package (SdClientPackageConfig)
401
439
 
402
440
  ```typescript
@@ -436,9 +474,15 @@ Users can install the app on their home screen on supported browsers and devices
436
474
  ```typescript
437
475
  {
438
476
  target: "server";
439
- env?: Record<string, string>; // Environment variables to replace during build
440
- publish?: SdPublishConfig; // Deployment config (optional)
477
+ env?: Record<string, string>; // Environment variables to replace during build
478
+ publish?: SdPublishConfig; // Deployment config (optional)
441
479
  configs?: Record<string, unknown>; // Runtime config (written to dist/.config.json during build)
480
+ externals?: string[]; // Additional modules to exclude from bundle (optional)
481
+ pm2?: { // PM2 config — generates dist/pm2.config.cjs (optional)
482
+ name?: string; // PM2 process name (defaults to package name)
483
+ ignoreWatchPaths?: string[]; // Paths to ignore in PM2 watch
484
+ noInterpreter?: boolean; // Skip interpreter path (use system PATH node)
485
+ };
442
486
  }
443
487
  ```
444
488
 
@@ -669,6 +713,61 @@ Electron configuration for Windows desktop app builds in `client` target package
669
713
  - **Build**: Bundles `electron-main.ts` with esbuild, copies web assets, runs `electron-builder` for Windows
670
714
  - **Dev mode**: Bundles `electron-main.ts`, launches Electron pointing to Vite dev server URL
671
715
 
716
+ ### Server Externals & PM2 Configuration
717
+
718
+ Server packages can configure external modules and PM2 deployment settings.
719
+
720
+ #### Externals
721
+
722
+ Native modules (with `binding.gyp`) are automatically detected and externalized. You can also manually specify additional modules to exclude from the bundle:
723
+
724
+ ```typescript
725
+ "my-server": {
726
+ target: "server",
727
+ externals: ["cpu-features", "ssh2"], // Manually externalize these modules
728
+ },
729
+ ```
730
+
731
+ #### PM2 Configuration
732
+
733
+ When `pm2` is configured, `dist/pm2.config.cjs` is generated during production build for use with [PM2](https://pm2.keymetrics.io/) process manager:
734
+
735
+ ```typescript
736
+ "my-server": {
737
+ target: "server",
738
+ env: {
739
+ CUSTOM_VAR: "value",
740
+ },
741
+ pm2: {
742
+ name: "my-app-server", // PM2 process name (optional)
743
+ ignoreWatchPaths: ["uploads"], // Additional paths to ignore in PM2 watch (optional)
744
+ noInterpreter: false, // Set true to skip mise-managed node path (optional)
745
+ },
746
+ },
747
+ ```
748
+
749
+ **Generated `pm2.config.cjs` includes:**
750
+
751
+ - Process name (from `pm2.name` or derived from package name)
752
+ - Watch mode enabled with configurable ignore paths (`node_modules`, `www` + custom paths)
753
+ - Node.js interpreter path via `mise which node` (unless `noInterpreter: true`)
754
+ - `--openssl-config=openssl.cnf` interpreter argument for legacy TLS support
755
+ - Environment variables: `NODE_ENV=production`, `TZ=Asia/Seoul`, `SD_VERSION`, plus custom `env` values
756
+
757
+ **Deployment workflow:**
758
+
759
+ ```bash
760
+ # 1. Build the server
761
+ sd-cli build my-server
762
+
763
+ # 2. Copy dist/ to deployment server
764
+
765
+ # 3. On the deployment server:
766
+ cd /path/to/my-server/dist
767
+ npm install # Install externalized dependencies
768
+ pm2 start pm2.config.cjs # Start with PM2
769
+ ```
770
+
672
771
  ## Cache
673
772
 
674
773
  | Command | Cache Path | Description |
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAIA,OAAO,uBAAuB,CAAC;AAkB/B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA8ED;;;;;;;;;;;;GAYG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsVnE"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAIA,OAAO,uBAAuB,CAAC;AAmB/B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA8ED;;;;;;;;;;;;GAYG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6VnE"}
@@ -11,6 +11,7 @@ import { deserializeDiagnostic } from "../utils/typecheck-serialization.js";
11
11
  import { runLint } from "./lint.js";
12
12
  import { Capacitor } from "../capacitor/capacitor.js";
13
13
  import { Electron } from "../electron/electron.js";
14
+ import { copySrcFiles } from "../utils/copy-src.js";
14
15
  function classifyPackages(packages, targets) {
15
16
  const buildPackages = [];
16
17
  const clientPackages = [];
@@ -140,6 +141,9 @@ async function runBuild(options) {
140
141
  } finally {
141
142
  await Promise.all([libraryWorker.terminate(), dtsWorker.terminate()]);
142
143
  }
144
+ if (config.copySrc != null && config.copySrc.length > 0) {
145
+ await copySrcFiles(pkgDir, config.copySrc);
146
+ }
143
147
  }
144
148
  });
145
149
  }
@@ -249,7 +253,9 @@ async function runBuild(options) {
249
253
  cwd,
250
254
  pkgDir,
251
255
  env: { ...baseEnv, ...config.env },
252
- configs: config.configs
256
+ configs: config.configs,
257
+ externals: config.externals,
258
+ pm2: config.pm2
253
259
  });
254
260
  results.push({
255
261
  name,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/build.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport ts from \"typescript\";\nimport { Listr, type ListrTask } from \"listr2\";\nimport { Worker, type WorkerProxy, fsRm } from \"@simplysm/core-node\";\nimport \"@simplysm/core-common\";\nimport { consola, LogLevels } from \"consola\";\nimport type { SdConfig, SdBuildPackageConfig, SdClientPackageConfig, SdServerPackageConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { getVersion } from \"../utils/build-env\";\nimport { setupReplaceDeps } from \"../utils/replace-deps\";\nimport type { TypecheckEnv } from \"../utils/tsconfig\";\nimport { deserializeDiagnostic } from \"../utils/typecheck-serialization\";\nimport { runLint, type LintOptions } from \"./lint\";\nimport type * as LibraryWorkerModule from \"../workers/library.worker\";\nimport type * as ServerWorkerModule from \"../workers/server.worker\";\nimport type * as ClientWorkerModule from \"../workers/client.worker\";\nimport type * as DtsWorkerModule from \"../workers/dts.worker\";\nimport { Capacitor } from \"../capacitor/capacitor\";\nimport { Electron } from \"../electron/electron\";\n\n//#region Types\n\n/**\n * Build \uBA85\uB839 \uC635\uC158\n */\nexport interface BuildOptions {\n /** \uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n/**\n * \uBE4C\uB4DC \uACB0\uACFC\n */\ninterface BuildResult {\n name: string;\n target: string;\n type: \"js\" | \"dts\" | \"vite\" | \"capacitor\" | \"electron\";\n success: boolean;\n errors?: string[];\n diagnostics?: ts.Diagnostic[];\n}\n\n/**\n * \uD328\uD0A4\uC9C0 \uBD84\uB958 \uACB0\uACFC\n */\ninterface ClassifiedPackages {\n /** node/browser/neutral \uD0C0\uAC9F (JS + dts) */\n buildPackages: Array<{ name: string; config: SdBuildPackageConfig }>;\n /** client \uD0C0\uAC9F (Vite build + typecheck) */\n clientPackages: Array<{ name: string; config: SdClientPackageConfig }>;\n /** server \uD0C0\uAC9F (JS \uBE4C\uB4DC, dts \uC81C\uC678) */\n serverPackages: Array<{ name: string; config: SdServerPackageConfig }>;\n}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * \uD328\uD0A4\uC9C0\uB97C \uD0C0\uAC9F\uBCC4\uB85C \uBD84\uB958\n * - node/browser/neutral: buildPackages (JS + dts)\n * - client: clientPackages (Vite build + typecheck)\n * - server: serverPackages (JS \uBE4C\uB4DC, dts \uC81C\uC678)\n * - scripts: \uC81C\uC678\n */\nfunction classifyPackages(\n packages: Record<\n string,\n SdBuildPackageConfig | SdClientPackageConfig | SdServerPackageConfig | { target: \"scripts\" } | undefined\n >,\n targets: string[],\n): ClassifiedPackages {\n const buildPackages: ClassifiedPackages[\"buildPackages\"] = [];\n const clientPackages: ClassifiedPackages[\"clientPackages\"] = [];\n const serverPackages: ClassifiedPackages[\"serverPackages\"] = [];\n\n for (const [name, config] of Object.entries(packages)) {\n if (config == null) continue;\n if (config.target === \"scripts\") continue;\n\n // targets\uAC00 \uC9C0\uC815\uB418\uBA74 \uD574\uB2F9 \uD328\uD0A4\uC9C0\uB9CC \uD3EC\uD568\n if (targets.length > 0 && !targets.includes(name)) continue;\n\n if (config.target === \"client\") {\n clientPackages.push({ name, config });\n } else if (config.target === \"server\") {\n serverPackages.push({ name, config });\n } else {\n buildPackages.push({ name, config });\n }\n }\n\n return { buildPackages, clientPackages, serverPackages };\n}\n\n/**\n * dist \uD3F4\uB354 \uC0AD\uC81C\n */\nasync function cleanDistFolders(cwd: string, packageNames: string[]): Promise<void> {\n await Promise.all(packageNames.map((name) => fsRm(path.join(cwd, \"packages\", name, \"dist\"))));\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\uB97C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `sd.config.ts`\uB97C \uB85C\uB4DC\uD558\uC5EC \uD328\uD0A4\uC9C0\uBCC4 \uBE4C\uB4DC \uD0C0\uAC9F \uC815\uBCF4 \uD655\uC778 (\uD544\uC218)\n * - lint \uC2E4\uD589\n * - dist \uD3F4\uB354 \uC815\uB9AC (clean build)\n * - `node`/`browser`/`neutral` \uD0C0\uAC9F: esbuild JS \uBE4C\uB4DC + dts \uC0DD\uC131 (\uD0C0\uC785\uCCB4\uD06C \uD3EC\uD568)\n * - `client` \uD0C0\uAC9F: Vite production \uBE4C\uB4DC + typecheck (dts \uBD88\uD544\uC694)\n * - \uD558\uB098\uB77C\uB3C4 \uC2E4\uD328\uD558\uBA74 `process.exitCode = 1` \uC124\uC815\n *\n * @param options - build \uC2E4\uD589 \uC635\uC158\n * @returns \uC644\uB8CC \uC2DC resolve\n */\nexport async function runBuild(options: BuildOptions): Promise<void> {\n const { targets } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:build\");\n\n logger.debug(\"\uBE4C\uB4DC \uC2DC\uC791\", { targets });\n\n // sd.config.ts \uB85C\uB4DC\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({ cwd, dev: false, opt: options.options });\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // replaceDeps \uC124\uC815\uC774 \uC788\uC73C\uBA74 symlink \uAD50\uCCB4\n if (sdConfig.replaceDeps != null) {\n await setupReplaceDeps(cwd, sdConfig.replaceDeps);\n }\n\n // VER, DEV \uD658\uACBD\uBCC0\uC218 \uC900\uBE44\n const version = await getVersion(cwd);\n const baseEnv = { VER: version, DEV: \"false\" };\n\n // \uD328\uD0A4\uC9C0 \uBD84\uB958\n const { buildPackages, clientPackages, serverPackages } = classifyPackages(sdConfig.packages, targets);\n const allPackageNames = [\n ...buildPackages.map((p) => p.name),\n ...clientPackages.map((p) => p.name),\n ...serverPackages.map((p) => p.name),\n ];\n\n if (allPackageNames.length === 0) {\n process.stdout.write(\"\u2714 \uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n logger.debug(\"\uD328\uD0A4\uC9C0 \uBD84\uB958 \uC644\uB8CC\", {\n buildPackages: buildPackages.map((p) => p.name),\n clientPackages: clientPackages.map((p) => p.name),\n serverPackages: serverPackages.map((p) => p.name),\n });\n\n // \uACB0\uACFC \uC218\uC9D1\n const results: BuildResult[] = [];\n // \uC5D0\uB7EC \uCD94\uC801 (\uAC1D\uCCB4\uB85C \uB798\uD551\uD558\uC5EC \uCF5C\uBC31 \uB0B4 \uC218\uC815 \uCD94\uC801 \uAC00\uB2A5\uD558\uAC8C \uD568)\n const state = { hasError: false };\n\n // Worker \uACBD\uB85C\n const libraryWorkerPath = import.meta.resolve(\"../workers/library.worker\");\n const serverWorkerPath = import.meta.resolve(\"../workers/server.worker\");\n const clientWorkerPath = import.meta.resolve(\"../workers/client.worker\");\n const dtsWorkerPath = import.meta.resolve(\"../workers/dts.worker\");\n\n // \uD30C\uC77C \uCE90\uC2DC (diagnostics \uCD9C\uB825\uC6A9)\n const fileCache = new Map<string, string>();\n\n // formatHost (diagnostics \uCD9C\uB825\uC6A9)\n const formatHost: ts.FormatDiagnosticsHost = {\n getCanonicalFileName: (f) => f,\n getCurrentDirectory: () => cwd,\n getNewLine: () => ts.sys.newLine,\n };\n\n // Lint \uC635\uC158 (\uC804\uCCB4 \uD328\uD0A4\uC9C0 \uB300\uC0C1)\n const lintOptions: LintOptions = {\n targets: allPackageNames.map((name) => `packages/${name}`),\n fix: false,\n timing: false,\n };\n\n // Listr \uAD6C\uC870: Lint \u2192 Clean \u2192 Build (\uC21C\uCC28)\n const mainListr = new Listr(\n [\n {\n title: \"Lint\",\n task: async () => {\n await runLint(lintOptions);\n // lint \uC5D0\uB7EC\uAC00 \uC788\uC73C\uBA74 process.exitCode\uAC00 1\uB85C \uC124\uC815\uB428\n if (process.exitCode === 1) {\n state.hasError = true;\n }\n },\n },\n {\n title: \"Clean\",\n task: async () => {\n await cleanDistFolders(cwd, allPackageNames);\n },\n },\n {\n title: \"Build\",\n task: (_, task) => {\n const buildTasks: ListrTask[] = [];\n\n // buildPackages: JS \uBE4C\uB4DC + dts \uC0DD\uC131\n for (const { name, config } of buildPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n const env: TypecheckEnv = config.target === \"node\" ? \"node\" : \"browser\";\n\n buildTasks.push({\n title: `${name} (${config.target})`,\n task: async () => {\n // JS \uBE4C\uB4DC\uC640 DTS \uC0DD\uC131\uC744 \uBCD1\uB82C \uC2E4\uD589\n const libraryWorker: WorkerProxy<typeof LibraryWorkerModule> =\n Worker.create<typeof LibraryWorkerModule>(libraryWorkerPath);\n const dtsWorker: WorkerProxy<typeof DtsWorkerModule> =\n Worker.create<typeof DtsWorkerModule>(dtsWorkerPath);\n\n try {\n const [buildResult, dtsResult] = await Promise.all([\n // JS \uBE4C\uB4DC\n libraryWorker.build({ name, config, cwd, pkgDir }),\n // DTS \uC0DD\uC131\n dtsWorker.buildDts({ name, cwd, pkgDir, env, emit: true }),\n ]);\n\n // JS \uBE4C\uB4DC \uACB0\uACFC \uCC98\uB9AC\n results.push({\n name,\n target: config.target,\n type: \"js\",\n success: buildResult.success,\n errors: buildResult.errors,\n });\n if (!buildResult.success) state.hasError = true;\n\n // DTS \uACB0\uACFC \uCC98\uB9AC\n const diagnostics = dtsResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));\n results.push({\n name,\n target: config.target,\n type: \"dts\",\n success: dtsResult.success,\n errors: dtsResult.errors,\n diagnostics,\n });\n if (!dtsResult.success) state.hasError = true;\n } finally {\n await Promise.all([libraryWorker.terminate(), dtsWorker.terminate()]);\n }\n },\n });\n }\n\n // clientPackages: Vite \uBE4C\uB4DC + typecheck + Capacitor \uBE4C\uB4DC\n for (const { name, config } of clientPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n\n buildTasks.push({\n title: `${name} (client)`,\n task: async () => {\n // Vite \uBE4C\uB4DC\uC640 \uD0C0\uC785\uCCB4\uD06C\uB97C \uBCD1\uB82C \uC2E4\uD589\n const clientWorker: WorkerProxy<typeof ClientWorkerModule> =\n Worker.create<typeof ClientWorkerModule>(clientWorkerPath);\n const dtsWorker: WorkerProxy<typeof DtsWorkerModule> =\n Worker.create<typeof DtsWorkerModule>(dtsWorkerPath);\n\n try {\n const clientConfig: SdClientPackageConfig = {\n ...config,\n env: { ...baseEnv, ...config.env },\n };\n const [clientResult, dtsResult] = await Promise.all([\n // Vite production \uBE4C\uB4DC\n clientWorker.build({ name, config: clientConfig, cwd, pkgDir }),\n // typecheck (dts \uC5C6\uC774)\n dtsWorker.buildDts({\n name,\n cwd,\n pkgDir,\n env: \"browser\",\n emit: false,\n }),\n ]);\n\n // Vite \uBE4C\uB4DC \uACB0\uACFC \uCC98\uB9AC\n results.push({\n name,\n target: \"client\",\n type: \"vite\",\n success: clientResult.success,\n errors: clientResult.errors,\n });\n if (!clientResult.success) state.hasError = true;\n\n // \uD0C0\uC785\uCCB4\uD06C \uACB0\uACFC \uCC98\uB9AC\n const diagnostics = dtsResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));\n results.push({\n name,\n target: \"client\",\n type: \"dts\",\n success: dtsResult.success,\n errors: dtsResult.errors,\n diagnostics,\n });\n if (!dtsResult.success) state.hasError = true;\n } finally {\n await Promise.all([clientWorker.terminate(), dtsWorker.terminate()]);\n }\n\n // Capacitor \uBE4C\uB4DC (\uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n if (config.capacitor != null) {\n const outPath = path.join(pkgDir, \"dist\");\n try {\n const cap = await Capacitor.create(pkgDir, config.capacitor);\n await cap.initialize();\n await cap.build(outPath);\n results.push({\n name,\n target: \"client\",\n type: \"capacitor\",\n success: true,\n });\n } catch (err) {\n results.push({\n name,\n target: \"client\",\n type: \"capacitor\",\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n });\n state.hasError = true;\n }\n }\n\n // Electron \uBE4C\uB4DC (\uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n if (config.electron != null) {\n const outPath = path.join(pkgDir, \"dist\");\n try {\n const electron = await Electron.create(pkgDir, config.electron);\n await electron.initialize();\n await electron.build(outPath);\n results.push({\n name,\n target: \"client\",\n type: \"electron\",\n success: true,\n });\n } catch (err) {\n results.push({\n name,\n target: \"client\",\n type: \"electron\",\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n });\n state.hasError = true;\n }\n }\n },\n });\n }\n\n // serverPackages: JS \uBE4C\uB4DC\uB9CC (dts \uC0DD\uC131 \uC81C\uC678)\n for (const { name, config } of serverPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n\n buildTasks.push({\n title: `${name} (server)`,\n task: async () => {\n const serverWorker: WorkerProxy<typeof ServerWorkerModule> =\n Worker.create<typeof ServerWorkerModule>(serverWorkerPath);\n\n try {\n const buildResult = await serverWorker.build({\n name,\n cwd,\n pkgDir,\n env: { ...baseEnv, ...config.env },\n configs: config.configs,\n });\n\n results.push({\n name,\n target: \"server\",\n type: \"js\",\n success: buildResult.success,\n errors: buildResult.errors,\n });\n if (!buildResult.success) state.hasError = true;\n } finally {\n await serverWorker.terminate();\n }\n },\n });\n }\n\n return task.newListr(buildTasks, { concurrent: true, exitOnError: false });\n },\n },\n ],\n {\n concurrent: false,\n exitOnError: false,\n renderer: consola.level >= LogLevels.debug ? \"verbose\" : \"default\",\n },\n );\n\n try {\n await mainListr.run();\n } catch {\n // Listr \uB0B4\uBD80 \uC5D0\uB7EC\uB294 results\uC5D0 \uC774\uBBF8 \uC218\uC9D1\uB428\n }\n\n // \uACB0\uACFC \uCD9C\uB825\n const allDiagnostics: ts.Diagnostic[] = [];\n for (const result of results) {\n if (!result.success) {\n const typeLabel = result.type === \"dts\" ? \"dts\" : result.target;\n const errorLines: string[] = [`${result.name} (${typeLabel})`];\n if (result.errors != null) {\n for (const error of result.errors) {\n for (const line of error.split(\"\\n\")) {\n errorLines.push(` \u2192 ${line}`);\n }\n }\n }\n consola.error(errorLines.join(\"\\n\"));\n }\n if (result.diagnostics != null) {\n allDiagnostics.push(...result.diagnostics);\n }\n }\n\n // diagnostics \uCD9C\uB825 (\uC911\uBCF5 \uC81C\uAC70)\n if (allDiagnostics.length > 0) {\n const uniqueDiagnostics = ts.sortAndDeduplicateDiagnostics(allDiagnostics);\n const message = ts.formatDiagnosticsWithColorAndContext(uniqueDiagnostics, formatHost);\n process.stdout.write(message);\n }\n\n // \uACB0\uACFC \uB85C\uADF8 \uCD9C\uB825\n if (state.hasError) {\n logger.error(\"\uBE4C\uB4DC \uC2E4\uD328\");\n process.exitCode = 1;\n } else {\n logger.info(\"\uBE4C\uB4DC \uC644\uB8CC\");\n }\n}\n\n//#endregion\n"],
5
- "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,aAA6B;AACtC,SAAS,QAA0B,YAAY;AAC/C,OAAO;AACP,SAAS,SAAS,iBAAiB;AAEnC,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,wBAAwB;AAEjC,SAAS,6BAA6B;AACtC,SAAS,eAAiC;AAK1C,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AAiDzB,SAAS,iBACP,UAIA,SACoB;AACpB,QAAM,gBAAqD,CAAC;AAC5D,QAAM,iBAAuD,CAAC;AAC9D,QAAM,iBAAuD,CAAC;AAE9D,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACrD,QAAI,UAAU,KAAM;AACpB,QAAI,OAAO,WAAW,UAAW;AAGjC,QAAI,QAAQ,SAAS,KAAK,CAAC,QAAQ,SAAS,IAAI,EAAG;AAEnD,QAAI,OAAO,WAAW,UAAU;AAC9B,qBAAe,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,IACtC,WAAW,OAAO,WAAW,UAAU;AACrC,qBAAe,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,IACtC,OAAO;AACL,oBAAc,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,IACrC;AAAA,EACF;AAEA,SAAO,EAAE,eAAe,gBAAgB,eAAe;AACzD;AAKA,eAAe,iBAAiB,KAAa,cAAuC;AAClF,QAAM,QAAQ,IAAI,aAAa,IAAI,CAAC,SAAS,KAAK,KAAK,KAAK,KAAK,YAAY,MAAM,MAAM,CAAC,CAAC,CAAC;AAC9F;AAmBA,eAAsB,SAAS,SAAsC;AACnE,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,cAAc;AAE7C,SAAO,MAAM,6BAAS,EAAE,QAAQ,CAAC;AAGjC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,aAAa,EAAE,KAAK,KAAK,OAAO,KAAK,QAAQ,QAAQ,CAAC;AACvE,WAAO,MAAM,wCAAoB;AAAA,EACnC,SAAS,KAAK;AACZ,YAAQ,MAAM,2CAAuB,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE;AAC/E,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,MAAI,SAAS,eAAe,MAAM;AAChC,UAAM,iBAAiB,KAAK,SAAS,WAAW;AAAA,EAClD;AAGA,QAAM,UAAU,MAAM,WAAW,GAAG;AACpC,QAAM,UAAU,EAAE,KAAK,SAAS,KAAK,QAAQ;AAG7C,QAAM,EAAE,eAAe,gBAAgB,eAAe,IAAI,iBAAiB,SAAS,UAAU,OAAO;AACrG,QAAM,kBAAkB;AAAA,IACtB,GAAG,cAAc,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAClC,GAAG,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IACnC,GAAG,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EACrC;AAEA,MAAI,gBAAgB,WAAW,GAAG;AAChC,YAAQ,OAAO,MAAM,gFAAoB;AACzC;AAAA,EACF;AAEA,SAAO,MAAM,gDAAa;AAAA,IACxB,eAAe,cAAc,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC9C,gBAAgB,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAChD,gBAAgB,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAClD,CAAC;AAGD,QAAM,UAAyB,CAAC;AAEhC,QAAM,QAAQ,EAAE,UAAU,MAAM;AAGhC,QAAM,oBAAoB,YAAY,QAAQ,2BAA2B;AACzE,QAAM,mBAAmB,YAAY,QAAQ,0BAA0B;AACvE,QAAM,mBAAmB,YAAY,QAAQ,0BAA0B;AACvE,QAAM,gBAAgB,YAAY,QAAQ,uBAAuB;AAGjE,QAAM,YAAY,oBAAI,IAAoB;AAG1C,QAAM,aAAuC;AAAA,IAC3C,sBAAsB,CAAC,MAAM;AAAA,IAC7B,qBAAqB,MAAM;AAAA,IAC3B,YAAY,MAAM,GAAG,IAAI;AAAA,EAC3B;AAGA,QAAM,cAA2B;AAAA,IAC/B,SAAS,gBAAgB,IAAI,CAAC,SAAS,YAAY,IAAI,EAAE;AAAA,IACzD,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AAGA,QAAM,YAAY,IAAI;AAAA,IACpB;AAAA,MACE;AAAA,QACE,OAAO;AAAA,QACP,MAAM,YAAY;AAChB,gBAAM,QAAQ,WAAW;AAEzB,cAAI,QAAQ,aAAa,GAAG;AAC1B,kBAAM,WAAW;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM,YAAY;AAChB,gBAAM,iBAAiB,KAAK,eAAe;AAAA,QAC7C;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM,CAAC,GAAG,SAAS;AACjB,gBAAM,aAA0B,CAAC;AAGjC,qBAAW,EAAE,MAAM,OAAO,KAAK,eAAe;AAC5C,kBAAM,SAAS,KAAK,KAAK,KAAK,YAAY,IAAI;AAC9C,kBAAM,MAAoB,OAAO,WAAW,SAAS,SAAS;AAE9D,uBAAW,KAAK;AAAA,cACd,OAAO,GAAG,IAAI,KAAK,OAAO,MAAM;AAAA,cAChC,MAAM,YAAY;AAEhB,sBAAM,gBACJ,OAAO,OAAmC,iBAAiB;AAC7D,sBAAM,YACJ,OAAO,OAA+B,aAAa;AAErD,oBAAI;AACF,wBAAM,CAAC,aAAa,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA;AAAA,oBAEjD,cAAc,MAAM,EAAE,MAAM,QAAQ,KAAK,OAAO,CAAC;AAAA;AAAA,oBAEjD,UAAU,SAAS,EAAE,MAAM,KAAK,QAAQ,KAAK,MAAM,KAAK,CAAC;AAAA,kBAC3D,CAAC;AAGD,0BAAQ,KAAK;AAAA,oBACX;AAAA,oBACA,QAAQ,OAAO;AAAA,oBACf,MAAM;AAAA,oBACN,SAAS,YAAY;AAAA,oBACrB,QAAQ,YAAY;AAAA,kBACtB,CAAC;AACD,sBAAI,CAAC,YAAY,QAAS,OAAM,WAAW;AAG3C,wBAAM,cAAc,UAAU,YAAY,IAAI,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AACxF,0BAAQ,KAAK;AAAA,oBACX;AAAA,oBACA,QAAQ,OAAO;AAAA,oBACf,MAAM;AAAA,oBACN,SAAS,UAAU;AAAA,oBACnB,QAAQ,UAAU;AAAA,oBAClB;AAAA,kBACF,CAAC;AACD,sBAAI,CAAC,UAAU,QAAS,OAAM,WAAW;AAAA,gBAC3C,UAAE;AACA,wBAAM,QAAQ,IAAI,CAAC,cAAc,UAAU,GAAG,UAAU,UAAU,CAAC,CAAC;AAAA,gBACtE;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAGA,qBAAW,EAAE,MAAM,OAAO,KAAK,gBAAgB;AAC7C,kBAAM,SAAS,KAAK,KAAK,KAAK,YAAY,IAAI;AAE9C,uBAAW,KAAK;AAAA,cACd,OAAO,GAAG,IAAI;AAAA,cACd,MAAM,YAAY;AAEhB,sBAAM,eACJ,OAAO,OAAkC,gBAAgB;AAC3D,sBAAM,YACJ,OAAO,OAA+B,aAAa;AAErD,oBAAI;AACF,wBAAM,eAAsC;AAAA,oBAC1C,GAAG;AAAA,oBACH,KAAK,EAAE,GAAG,SAAS,GAAG,OAAO,IAAI;AAAA,kBACnC;AACA,wBAAM,CAAC,cAAc,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA;AAAA,oBAElD,aAAa,MAAM,EAAE,MAAM,QAAQ,cAAc,KAAK,OAAO,CAAC;AAAA;AAAA,oBAE9D,UAAU,SAAS;AAAA,sBACjB;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA,KAAK;AAAA,sBACL,MAAM;AAAA,oBACR,CAAC;AAAA,kBACH,CAAC;AAGD,0BAAQ,KAAK;AAAA,oBACX;AAAA,oBACA,QAAQ;AAAA,oBACR,MAAM;AAAA,oBACN,SAAS,aAAa;AAAA,oBACtB,QAAQ,aAAa;AAAA,kBACvB,CAAC;AACD,sBAAI,CAAC,aAAa,QAAS,OAAM,WAAW;AAG5C,wBAAM,cAAc,UAAU,YAAY,IAAI,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AACxF,0BAAQ,KAAK;AAAA,oBACX;AAAA,oBACA,QAAQ;AAAA,oBACR,MAAM;AAAA,oBACN,SAAS,UAAU;AAAA,oBACnB,QAAQ,UAAU;AAAA,oBAClB;AAAA,kBACF,CAAC;AACD,sBAAI,CAAC,UAAU,QAAS,OAAM,WAAW;AAAA,gBAC3C,UAAE;AACA,wBAAM,QAAQ,IAAI,CAAC,aAAa,UAAU,GAAG,UAAU,UAAU,CAAC,CAAC;AAAA,gBACrE;AAGA,oBAAI,OAAO,aAAa,MAAM;AAC5B,wBAAM,UAAU,KAAK,KAAK,QAAQ,MAAM;AACxC,sBAAI;AACF,0BAAM,MAAM,MAAM,UAAU,OAAO,QAAQ,OAAO,SAAS;AAC3D,0BAAM,IAAI,WAAW;AACrB,0BAAM,IAAI,MAAM,OAAO;AACvB,4BAAQ,KAAK;AAAA,sBACX;AAAA,sBACA,QAAQ;AAAA,sBACR,MAAM;AAAA,sBACN,SAAS;AAAA,oBACX,CAAC;AAAA,kBACH,SAAS,KAAK;AACZ,4BAAQ,KAAK;AAAA,sBACX;AAAA,sBACA,QAAQ;AAAA,sBACR,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,QAAQ,CAAC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,oBAC3D,CAAC;AACD,0BAAM,WAAW;AAAA,kBACnB;AAAA,gBACF;AAGA,oBAAI,OAAO,YAAY,MAAM;AAC3B,wBAAM,UAAU,KAAK,KAAK,QAAQ,MAAM;AACxC,sBAAI;AACF,0BAAM,WAAW,MAAM,SAAS,OAAO,QAAQ,OAAO,QAAQ;AAC9D,0BAAM,SAAS,WAAW;AAC1B,0BAAM,SAAS,MAAM,OAAO;AAC5B,4BAAQ,KAAK;AAAA,sBACX;AAAA,sBACA,QAAQ;AAAA,sBACR,MAAM;AAAA,sBACN,SAAS;AAAA,oBACX,CAAC;AAAA,kBACH,SAAS,KAAK;AACZ,4BAAQ,KAAK;AAAA,sBACX;AAAA,sBACA,QAAQ;AAAA,sBACR,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,QAAQ,CAAC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,oBAC3D,CAAC;AACD,0BAAM,WAAW;AAAA,kBACnB;AAAA,gBACF;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAGA,qBAAW,EAAE,MAAM,OAAO,KAAK,gBAAgB;AAC7C,kBAAM,SAAS,KAAK,KAAK,KAAK,YAAY,IAAI;AAE9C,uBAAW,KAAK;AAAA,cACd,OAAO,GAAG,IAAI;AAAA,cACd,MAAM,YAAY;AAChB,sBAAM,eACJ,OAAO,OAAkC,gBAAgB;AAE3D,oBAAI;AACF,wBAAM,cAAc,MAAM,aAAa,MAAM;AAAA,oBAC3C;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,KAAK,EAAE,GAAG,SAAS,GAAG,OAAO,IAAI;AAAA,oBACjC,SAAS,OAAO;AAAA,kBAClB,CAAC;AAED,0BAAQ,KAAK;AAAA,oBACX;AAAA,oBACA,QAAQ;AAAA,oBACR,MAAM;AAAA,oBACN,SAAS,YAAY;AAAA,oBACrB,QAAQ,YAAY;AAAA,kBACtB,CAAC;AACD,sBAAI,CAAC,YAAY,QAAS,OAAM,WAAW;AAAA,gBAC7C,UAAE;AACA,wBAAM,aAAa,UAAU;AAAA,gBAC/B;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAEA,iBAAO,KAAK,SAAS,YAAY,EAAE,YAAY,MAAM,aAAa,MAAM,CAAC;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,UAAU,QAAQ,SAAS,UAAU,QAAQ,YAAY;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,IAAI;AAAA,EACtB,QAAQ;AAAA,EAER;AAGA,QAAM,iBAAkC,CAAC;AACzC,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,YAAY,OAAO,SAAS,QAAQ,QAAQ,OAAO;AACzD,YAAM,aAAuB,CAAC,GAAG,OAAO,IAAI,KAAK,SAAS,GAAG;AAC7D,UAAI,OAAO,UAAU,MAAM;AACzB,mBAAW,SAAS,OAAO,QAAQ;AACjC,qBAAW,QAAQ,MAAM,MAAM,IAAI,GAAG;AACpC,uBAAW,KAAK,YAAO,IAAI,EAAE;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AACA,cAAQ,MAAM,WAAW,KAAK,IAAI,CAAC;AAAA,IACrC;AACA,QAAI,OAAO,eAAe,MAAM;AAC9B,qBAAe,KAAK,GAAG,OAAO,WAAW;AAAA,IAC3C;AAAA,EACF;AAGA,MAAI,eAAe,SAAS,GAAG;AAC7B,UAAM,oBAAoB,GAAG,8BAA8B,cAAc;AACzE,UAAM,UAAU,GAAG,qCAAqC,mBAAmB,UAAU;AACrF,YAAQ,OAAO,MAAM,OAAO;AAAA,EAC9B;AAGA,MAAI,MAAM,UAAU;AAClB,WAAO,MAAM,2BAAO;AACpB,YAAQ,WAAW;AAAA,EACrB,OAAO;AACL,WAAO,KAAK,2BAAO;AAAA,EACrB;AACF;",
4
+ "sourcesContent": ["import path from \"path\";\nimport ts from \"typescript\";\nimport { Listr, type ListrTask } from \"listr2\";\nimport { Worker, type WorkerProxy, fsRm } from \"@simplysm/core-node\";\nimport \"@simplysm/core-common\";\nimport { consola, LogLevels } from \"consola\";\nimport type { SdConfig, SdBuildPackageConfig, SdClientPackageConfig, SdServerPackageConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { getVersion } from \"../utils/build-env\";\nimport { setupReplaceDeps } from \"../utils/replace-deps\";\nimport type { TypecheckEnv } from \"../utils/tsconfig\";\nimport { deserializeDiagnostic } from \"../utils/typecheck-serialization\";\nimport { runLint, type LintOptions } from \"./lint\";\nimport type * as LibraryWorkerModule from \"../workers/library.worker\";\nimport type * as ServerWorkerModule from \"../workers/server.worker\";\nimport type * as ClientWorkerModule from \"../workers/client.worker\";\nimport type * as DtsWorkerModule from \"../workers/dts.worker\";\nimport { Capacitor } from \"../capacitor/capacitor\";\nimport { Electron } from \"../electron/electron\";\nimport { copySrcFiles } from \"../utils/copy-src\";\n\n//#region Types\n\n/**\n * Build \uBA85\uB839 \uC635\uC158\n */\nexport interface BuildOptions {\n /** \uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n/**\n * \uBE4C\uB4DC \uACB0\uACFC\n */\ninterface BuildResult {\n name: string;\n target: string;\n type: \"js\" | \"dts\" | \"vite\" | \"capacitor\" | \"electron\";\n success: boolean;\n errors?: string[];\n diagnostics?: ts.Diagnostic[];\n}\n\n/**\n * \uD328\uD0A4\uC9C0 \uBD84\uB958 \uACB0\uACFC\n */\ninterface ClassifiedPackages {\n /** node/browser/neutral \uD0C0\uAC9F (JS + dts) */\n buildPackages: Array<{ name: string; config: SdBuildPackageConfig }>;\n /** client \uD0C0\uAC9F (Vite build + typecheck) */\n clientPackages: Array<{ name: string; config: SdClientPackageConfig }>;\n /** server \uD0C0\uAC9F (JS \uBE4C\uB4DC, dts \uC81C\uC678) */\n serverPackages: Array<{ name: string; config: SdServerPackageConfig }>;\n}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * \uD328\uD0A4\uC9C0\uB97C \uD0C0\uAC9F\uBCC4\uB85C \uBD84\uB958\n * - node/browser/neutral: buildPackages (JS + dts)\n * - client: clientPackages (Vite build + typecheck)\n * - server: serverPackages (JS \uBE4C\uB4DC, dts \uC81C\uC678)\n * - scripts: \uC81C\uC678\n */\nfunction classifyPackages(\n packages: Record<\n string,\n SdBuildPackageConfig | SdClientPackageConfig | SdServerPackageConfig | { target: \"scripts\" } | undefined\n >,\n targets: string[],\n): ClassifiedPackages {\n const buildPackages: ClassifiedPackages[\"buildPackages\"] = [];\n const clientPackages: ClassifiedPackages[\"clientPackages\"] = [];\n const serverPackages: ClassifiedPackages[\"serverPackages\"] = [];\n\n for (const [name, config] of Object.entries(packages)) {\n if (config == null) continue;\n if (config.target === \"scripts\") continue;\n\n // targets\uAC00 \uC9C0\uC815\uB418\uBA74 \uD574\uB2F9 \uD328\uD0A4\uC9C0\uB9CC \uD3EC\uD568\n if (targets.length > 0 && !targets.includes(name)) continue;\n\n if (config.target === \"client\") {\n clientPackages.push({ name, config });\n } else if (config.target === \"server\") {\n serverPackages.push({ name, config });\n } else {\n buildPackages.push({ name, config });\n }\n }\n\n return { buildPackages, clientPackages, serverPackages };\n}\n\n/**\n * dist \uD3F4\uB354 \uC0AD\uC81C\n */\nasync function cleanDistFolders(cwd: string, packageNames: string[]): Promise<void> {\n await Promise.all(packageNames.map((name) => fsRm(path.join(cwd, \"packages\", name, \"dist\"))));\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\uB97C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `sd.config.ts`\uB97C \uB85C\uB4DC\uD558\uC5EC \uD328\uD0A4\uC9C0\uBCC4 \uBE4C\uB4DC \uD0C0\uAC9F \uC815\uBCF4 \uD655\uC778 (\uD544\uC218)\n * - lint \uC2E4\uD589\n * - dist \uD3F4\uB354 \uC815\uB9AC (clean build)\n * - `node`/`browser`/`neutral` \uD0C0\uAC9F: esbuild JS \uBE4C\uB4DC + dts \uC0DD\uC131 (\uD0C0\uC785\uCCB4\uD06C \uD3EC\uD568)\n * - `client` \uD0C0\uAC9F: Vite production \uBE4C\uB4DC + typecheck (dts \uBD88\uD544\uC694)\n * - \uD558\uB098\uB77C\uB3C4 \uC2E4\uD328\uD558\uBA74 `process.exitCode = 1` \uC124\uC815\n *\n * @param options - build \uC2E4\uD589 \uC635\uC158\n * @returns \uC644\uB8CC \uC2DC resolve\n */\nexport async function runBuild(options: BuildOptions): Promise<void> {\n const { targets } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:build\");\n\n logger.debug(\"\uBE4C\uB4DC \uC2DC\uC791\", { targets });\n\n // sd.config.ts \uB85C\uB4DC\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({ cwd, dev: false, opt: options.options });\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // replaceDeps \uC124\uC815\uC774 \uC788\uC73C\uBA74 symlink \uAD50\uCCB4\n if (sdConfig.replaceDeps != null) {\n await setupReplaceDeps(cwd, sdConfig.replaceDeps);\n }\n\n // VER, DEV \uD658\uACBD\uBCC0\uC218 \uC900\uBE44\n const version = await getVersion(cwd);\n const baseEnv = { VER: version, DEV: \"false\" };\n\n // \uD328\uD0A4\uC9C0 \uBD84\uB958\n const { buildPackages, clientPackages, serverPackages } = classifyPackages(sdConfig.packages, targets);\n const allPackageNames = [\n ...buildPackages.map((p) => p.name),\n ...clientPackages.map((p) => p.name),\n ...serverPackages.map((p) => p.name),\n ];\n\n if (allPackageNames.length === 0) {\n process.stdout.write(\"\u2714 \uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n logger.debug(\"\uD328\uD0A4\uC9C0 \uBD84\uB958 \uC644\uB8CC\", {\n buildPackages: buildPackages.map((p) => p.name),\n clientPackages: clientPackages.map((p) => p.name),\n serverPackages: serverPackages.map((p) => p.name),\n });\n\n // \uACB0\uACFC \uC218\uC9D1\n const results: BuildResult[] = [];\n // \uC5D0\uB7EC \uCD94\uC801 (\uAC1D\uCCB4\uB85C \uB798\uD551\uD558\uC5EC \uCF5C\uBC31 \uB0B4 \uC218\uC815 \uCD94\uC801 \uAC00\uB2A5\uD558\uAC8C \uD568)\n const state = { hasError: false };\n\n // Worker \uACBD\uB85C\n const libraryWorkerPath = import.meta.resolve(\"../workers/library.worker\");\n const serverWorkerPath = import.meta.resolve(\"../workers/server.worker\");\n const clientWorkerPath = import.meta.resolve(\"../workers/client.worker\");\n const dtsWorkerPath = import.meta.resolve(\"../workers/dts.worker\");\n\n // \uD30C\uC77C \uCE90\uC2DC (diagnostics \uCD9C\uB825\uC6A9)\n const fileCache = new Map<string, string>();\n\n // formatHost (diagnostics \uCD9C\uB825\uC6A9)\n const formatHost: ts.FormatDiagnosticsHost = {\n getCanonicalFileName: (f) => f,\n getCurrentDirectory: () => cwd,\n getNewLine: () => ts.sys.newLine,\n };\n\n // Lint \uC635\uC158 (\uC804\uCCB4 \uD328\uD0A4\uC9C0 \uB300\uC0C1)\n const lintOptions: LintOptions = {\n targets: allPackageNames.map((name) => `packages/${name}`),\n fix: false,\n timing: false,\n };\n\n // Listr \uAD6C\uC870: Lint \u2192 Clean \u2192 Build (\uC21C\uCC28)\n const mainListr = new Listr(\n [\n {\n title: \"Lint\",\n task: async () => {\n await runLint(lintOptions);\n // lint \uC5D0\uB7EC\uAC00 \uC788\uC73C\uBA74 process.exitCode\uAC00 1\uB85C \uC124\uC815\uB428\n if (process.exitCode === 1) {\n state.hasError = true;\n }\n },\n },\n {\n title: \"Clean\",\n task: async () => {\n await cleanDistFolders(cwd, allPackageNames);\n },\n },\n {\n title: \"Build\",\n task: (_, task) => {\n const buildTasks: ListrTask[] = [];\n\n // buildPackages: JS \uBE4C\uB4DC + dts \uC0DD\uC131\n for (const { name, config } of buildPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n const env: TypecheckEnv = config.target === \"node\" ? \"node\" : \"browser\";\n\n buildTasks.push({\n title: `${name} (${config.target})`,\n task: async () => {\n // JS \uBE4C\uB4DC\uC640 DTS \uC0DD\uC131\uC744 \uBCD1\uB82C \uC2E4\uD589\n const libraryWorker: WorkerProxy<typeof LibraryWorkerModule> =\n Worker.create<typeof LibraryWorkerModule>(libraryWorkerPath);\n const dtsWorker: WorkerProxy<typeof DtsWorkerModule> =\n Worker.create<typeof DtsWorkerModule>(dtsWorkerPath);\n\n try {\n const [buildResult, dtsResult] = await Promise.all([\n // JS \uBE4C\uB4DC\n libraryWorker.build({ name, config, cwd, pkgDir }),\n // DTS \uC0DD\uC131\n dtsWorker.buildDts({ name, cwd, pkgDir, env, emit: true }),\n ]);\n\n // JS \uBE4C\uB4DC \uACB0\uACFC \uCC98\uB9AC\n results.push({\n name,\n target: config.target,\n type: \"js\",\n success: buildResult.success,\n errors: buildResult.errors,\n });\n if (!buildResult.success) state.hasError = true;\n\n // DTS \uACB0\uACFC \uCC98\uB9AC\n const diagnostics = dtsResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));\n results.push({\n name,\n target: config.target,\n type: \"dts\",\n success: dtsResult.success,\n errors: dtsResult.errors,\n diagnostics,\n });\n if (!dtsResult.success) state.hasError = true;\n } finally {\n await Promise.all([libraryWorker.terminate(), dtsWorker.terminate()]);\n }\n\n // copySrc \uD30C\uC77C \uBCF5\uC0AC\n if (config.copySrc != null && config.copySrc.length > 0) {\n await copySrcFiles(pkgDir, config.copySrc);\n }\n },\n });\n }\n\n // clientPackages: Vite \uBE4C\uB4DC + typecheck + Capacitor \uBE4C\uB4DC\n for (const { name, config } of clientPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n\n buildTasks.push({\n title: `${name} (client)`,\n task: async () => {\n // Vite \uBE4C\uB4DC\uC640 \uD0C0\uC785\uCCB4\uD06C\uB97C \uBCD1\uB82C \uC2E4\uD589\n const clientWorker: WorkerProxy<typeof ClientWorkerModule> =\n Worker.create<typeof ClientWorkerModule>(clientWorkerPath);\n const dtsWorker: WorkerProxy<typeof DtsWorkerModule> =\n Worker.create<typeof DtsWorkerModule>(dtsWorkerPath);\n\n try {\n const clientConfig: SdClientPackageConfig = {\n ...config,\n env: { ...baseEnv, ...config.env },\n };\n const [clientResult, dtsResult] = await Promise.all([\n // Vite production \uBE4C\uB4DC\n clientWorker.build({ name, config: clientConfig, cwd, pkgDir }),\n // typecheck (dts \uC5C6\uC774)\n dtsWorker.buildDts({\n name,\n cwd,\n pkgDir,\n env: \"browser\",\n emit: false,\n }),\n ]);\n\n // Vite \uBE4C\uB4DC \uACB0\uACFC \uCC98\uB9AC\n results.push({\n name,\n target: \"client\",\n type: \"vite\",\n success: clientResult.success,\n errors: clientResult.errors,\n });\n if (!clientResult.success) state.hasError = true;\n\n // \uD0C0\uC785\uCCB4\uD06C \uACB0\uACFC \uCC98\uB9AC\n const diagnostics = dtsResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));\n results.push({\n name,\n target: \"client\",\n type: \"dts\",\n success: dtsResult.success,\n errors: dtsResult.errors,\n diagnostics,\n });\n if (!dtsResult.success) state.hasError = true;\n } finally {\n await Promise.all([clientWorker.terminate(), dtsWorker.terminate()]);\n }\n\n // Capacitor \uBE4C\uB4DC (\uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n if (config.capacitor != null) {\n const outPath = path.join(pkgDir, \"dist\");\n try {\n const cap = await Capacitor.create(pkgDir, config.capacitor);\n await cap.initialize();\n await cap.build(outPath);\n results.push({\n name,\n target: \"client\",\n type: \"capacitor\",\n success: true,\n });\n } catch (err) {\n results.push({\n name,\n target: \"client\",\n type: \"capacitor\",\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n });\n state.hasError = true;\n }\n }\n\n // Electron \uBE4C\uB4DC (\uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n if (config.electron != null) {\n const outPath = path.join(pkgDir, \"dist\");\n try {\n const electron = await Electron.create(pkgDir, config.electron);\n await electron.initialize();\n await electron.build(outPath);\n results.push({\n name,\n target: \"client\",\n type: \"electron\",\n success: true,\n });\n } catch (err) {\n results.push({\n name,\n target: \"client\",\n type: \"electron\",\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n });\n state.hasError = true;\n }\n }\n },\n });\n }\n\n // serverPackages: JS \uBE4C\uB4DC\uB9CC (dts \uC0DD\uC131 \uC81C\uC678)\n for (const { name, config } of serverPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n\n buildTasks.push({\n title: `${name} (server)`,\n task: async () => {\n const serverWorker: WorkerProxy<typeof ServerWorkerModule> =\n Worker.create<typeof ServerWorkerModule>(serverWorkerPath);\n\n try {\n const buildResult = await serverWorker.build({\n name,\n cwd,\n pkgDir,\n env: { ...baseEnv, ...config.env },\n configs: config.configs,\n externals: config.externals,\n pm2: config.pm2,\n });\n\n results.push({\n name,\n target: \"server\",\n type: \"js\",\n success: buildResult.success,\n errors: buildResult.errors,\n });\n if (!buildResult.success) state.hasError = true;\n } finally {\n await serverWorker.terminate();\n }\n },\n });\n }\n\n return task.newListr(buildTasks, { concurrent: true, exitOnError: false });\n },\n },\n ],\n {\n concurrent: false,\n exitOnError: false,\n renderer: consola.level >= LogLevels.debug ? \"verbose\" : \"default\",\n },\n );\n\n try {\n await mainListr.run();\n } catch {\n // Listr \uB0B4\uBD80 \uC5D0\uB7EC\uB294 results\uC5D0 \uC774\uBBF8 \uC218\uC9D1\uB428\n }\n\n // \uACB0\uACFC \uCD9C\uB825\n const allDiagnostics: ts.Diagnostic[] = [];\n for (const result of results) {\n if (!result.success) {\n const typeLabel = result.type === \"dts\" ? \"dts\" : result.target;\n const errorLines: string[] = [`${result.name} (${typeLabel})`];\n if (result.errors != null) {\n for (const error of result.errors) {\n for (const line of error.split(\"\\n\")) {\n errorLines.push(` \u2192 ${line}`);\n }\n }\n }\n consola.error(errorLines.join(\"\\n\"));\n }\n if (result.diagnostics != null) {\n allDiagnostics.push(...result.diagnostics);\n }\n }\n\n // diagnostics \uCD9C\uB825 (\uC911\uBCF5 \uC81C\uAC70)\n if (allDiagnostics.length > 0) {\n const uniqueDiagnostics = ts.sortAndDeduplicateDiagnostics(allDiagnostics);\n const message = ts.formatDiagnosticsWithColorAndContext(uniqueDiagnostics, formatHost);\n process.stdout.write(message);\n }\n\n // \uACB0\uACFC \uB85C\uADF8 \uCD9C\uB825\n if (state.hasError) {\n logger.error(\"\uBE4C\uB4DC \uC2E4\uD328\");\n process.exitCode = 1;\n } else {\n logger.info(\"\uBE4C\uB4DC \uC644\uB8CC\");\n }\n}\n\n//#endregion\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAyBA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAwhB/D"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAyBA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyhB/D"}
@@ -360,7 +360,8 @@ async function runDev(options) {
360
360
  cwd,
361
361
  pkgDir,
362
362
  env: { ...baseEnv, ...config.env },
363
- configs: config.configs
363
+ configs: config.configs,
364
+ externals: config.externals
364
365
  }).catch((err) => {
365
366
  results.set(`${name}:build`, {
366
367
  name,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/dev.ts"],
4
- "sourcesContent": ["import fs from \"fs\";\nimport path from \"path\";\nimport { Listr } from \"listr2\";\nimport { Worker, type WorkerProxy } from \"@simplysm/core-node\";\nimport type { SdConfig, SdClientPackageConfig, SdServerPackageConfig } from \"../sd-config.types\";\nimport { consola } from \"consola\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { getVersion } from \"../utils/build-env\";\nimport { setupReplaceDeps } from \"../utils/replace-deps\";\nimport type * as ClientWorkerModule from \"../workers/client.worker\";\nimport type * as ServerWorkerModule from \"../workers/server.worker\";\nimport type * as ServerRuntimeWorkerModule from \"../workers/server-runtime.worker\";\nimport { Capacitor } from \"../capacitor/capacitor\";\nimport { filterPackagesByTargets, getWatchScopes, type PackageResult } from \"../utils/package-utils\";\nimport { printErrors, printServers } from \"../utils/output-utils\";\nimport { RebuildListrManager } from \"../utils/listr-manager\";\nimport {\n registerWorkerEventHandlers,\n type ServerReadyEventData,\n type ServerBuildEventData,\n type ErrorEventData,\n} from \"../utils/worker-events\";\n\n//#region Types\n\n/**\n * Dev \uBA85\uB839 \uC635\uC158\n */\nexport interface DevOptions {\n /** dev\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n options: string[];\n}\n\n/**\n * Client Worker \uC815\uBCF4 (Vite dev server\uC6A9)\n */\ninterface ClientWorkerInfo {\n name: string;\n config: SdClientPackageConfig;\n worker: WorkerProxy<typeof ClientWorkerModule>;\n isInitialBuild: boolean;\n buildResolver: (() => void) | undefined;\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * Client \uBC0F Server \uD328\uD0A4\uC9C0\uB97C \uAC1C\uBC1C \uBAA8\uB4DC\uB85C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `sd.config.ts`\uB97C \uB85C\uB4DC\uD558\uC5EC \uD328\uD0A4\uC9C0\uBCC4 \uBE4C\uB4DC \uD0C0\uAC9F \uC815\uBCF4 \uD655\uC778 (\uD544\uC218)\n * - `client` \uD0C0\uAC9F: Vite dev server \uC2DC\uC791\n * - `server` \uD0C0\uAC9F: Server Build Worker + Server Runtime Worker\n * - Server-Client \uD504\uB85D\uC2DC \uC5F0\uACB0 \uC9C0\uC6D0\n * - Capacitor \uCD08\uAE30\uD654 \uC9C0\uC6D0\n * - SIGINT/SIGTERM \uC2DC\uADF8\uB110\uB85C \uC885\uB8CC\n *\n * @param options - dev \uC2E4\uD589 \uC635\uC158\n * @returns \uC885\uB8CC \uC2DC\uADF8\uB110 \uC218\uC2E0 \uC2DC resolve\n */\nexport async function runDev(options: DevOptions): Promise<void> {\n const { targets } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:dev\");\n\n logger.debug(\"dev \uC2DC\uC791\", { targets });\n\n // sd.config.ts \uB85C\uB4DC (dev\uB294 \uD328\uD0A4\uC9C0 \uBE4C\uB4DC \uC815\uBCF4\uAC00 \uD544\uC694\uD558\uBBC0\uB85C \uD544\uC218)\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({ cwd, dev: true, opt: options.options });\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // replaceDeps \uC124\uC815\uC774 \uC788\uC73C\uBA74 symlink \uAD50\uCCB4\n if (sdConfig.replaceDeps != null) {\n await setupReplaceDeps(cwd, sdConfig.replaceDeps);\n }\n\n // VER, DEV \uD658\uACBD\uBCC0\uC218 \uC900\uBE44\n const version = await getVersion(cwd);\n const baseEnv = { VER: version, DEV: \"true\" };\n\n // watchScopes \uC0DD\uC131 (\uB8E8\uD2B8 package.json\uC5D0\uC11C scope \uCD94\uCD9C)\n const rootPkgJsonPath = path.join(cwd, \"package.json\");\n const rootPkgName = JSON.parse(fs.readFileSync(rootPkgJsonPath, \"utf-8\")).name as string;\n const watchScopes = getWatchScopes(rootPkgName);\n\n // targets \uD544\uD130\uB9C1\n const allPackages = filterPackagesByTargets(sdConfig.packages, targets);\n\n // client/server \uD328\uD0A4\uC9C0\uB9CC \uD544\uD130\uB9C1\n const serverPackages: Array<{ name: string; config: SdServerPackageConfig }> = [];\n const clientPackages: Array<{ name: string; config: SdClientPackageConfig }> = [];\n\n for (const [name, config] of Object.entries(allPackages)) {\n if (config.target === \"server\") {\n serverPackages.push({ name, config });\n } else if (config.target === \"client\") {\n clientPackages.push({ name, config });\n }\n }\n\n if (serverPackages.length === 0 && clientPackages.length === 0) {\n process.stdout.write(\"\u26A0 dev\uD560 client/server \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n // \uC11C\uBC84\uC640 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8 \uCC3E\uAE30 (\uC11C\uBC84\uAC00 dev \uB300\uC0C1\uC778 \uACBD\uC6B0\uB9CC)\n const serverNames = new Set(serverPackages.map(({ name }) => name));\n const serverClientsMap = new Map<string, string[]>();\n for (const { name, config } of clientPackages) {\n if (typeof config.server === \"string\" && serverNames.has(config.server)) {\n const clients = serverClientsMap.get(config.server) ?? [];\n clients.push(name);\n serverClientsMap.set(config.server, clients);\n }\n }\n\n // Worker \uACBD\uB85C\n const clientWorkerPath = import.meta.resolve(\"../workers/client.worker\");\n const serverWorkerPath = import.meta.resolve(\"../workers/server.worker\");\n const serverRuntimeWorkerPath = import.meta.resolve(\"../workers/server-runtime.worker\");\n\n // \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uB2E8\uB3C5 \uC2E4\uD589\uC778 \uACBD\uC6B0:\n // - server\uAC00 \uC22B\uC790\uC778 \uACBD\uC6B0\n // - server\uAC00 \uBB38\uC790\uC5F4\uC774\uC9C0\uB9CC \uD574\uB2F9 \uC11C\uBC84\uAC00 dev \uB300\uC0C1\uC774 \uC544\uB2CC \uACBD\uC6B0\n const standaloneClientWorkers: ClientWorkerInfo[] = clientPackages\n .filter(\n ({ config }) =>\n typeof config.server === \"number\" || (typeof config.server === \"string\" && !serverNames.has(config.server)),\n )\n .map(({ name, config }) => ({\n name,\n config,\n worker: Worker.create<typeof ClientWorkerModule>(clientWorkerPath),\n isInitialBuild: true,\n buildResolver: undefined,\n }));\n\n // \uC11C\uBC84\uC5D0 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8\uC758 Vite Worker (\uC11C\uBC84\uAC00 dev \uB300\uC0C1\uC778 \uACBD\uC6B0\uB9CC)\n const viteClientWorkers: ClientWorkerInfo[] = clientPackages\n .filter(({ config }) => typeof config.server === \"string\" && serverNames.has(config.server))\n .map(({ name, config }) => ({\n name,\n config,\n worker: Worker.create<typeof ClientWorkerModule>(clientWorkerPath),\n isInitialBuild: true,\n buildResolver: undefined,\n }));\n\n // \uACB0\uACFC \uC0C1\uD0DC \uAD00\uB9AC\n const results = new Map<string, PackageResult>();\n\n // RebuildListrManager \uC0DD\uC131\n const rebuildManager = new RebuildListrManager(logger);\n\n // \uBC30\uCE58 \uC644\uB8CC \uC2DC \uC5D0\uB7EC\uC640 \uC11C\uBC84 URL \uCD9C\uB825\n rebuildManager.on(\"batchComplete\", () => {\n printErrors(results);\n printServers(results, serverClientsMap);\n });\n\n // \uC885\uB8CC Promise \uC0DD\uC131\n let resolveTerminate!: () => void;\n const terminatePromise = new Promise<void>((resolve) => {\n resolveTerminate = resolve;\n });\n\n // \uC885\uB8CC \uC2DC\uADF8\uB110 \uD578\uB4E4\uB7EC \uB4F1\uB85D\n const signalHandler = () => {\n process.off(\"SIGINT\", signalHandler);\n process.off(\"SIGTERM\", signalHandler);\n resolveTerminate();\n };\n process.on(\"SIGINT\", signalHandler);\n process.on(\"SIGTERM\", signalHandler);\n\n // Standalone client \uBE4C\uB4DC Promise \uBBF8\uB9AC \uC0DD\uC131\n const standaloneClientBuildPromises = new Map<string, Promise<void>>();\n for (const workerInfo of standaloneClientWorkers) {\n standaloneClientBuildPromises.set(\n workerInfo.name,\n new Promise<void>((resolve) => {\n workerInfo.buildResolver = resolve;\n }),\n );\n }\n\n // Vite client \uBE4C\uB4DC Promise \uBBF8\uB9AC \uC0DD\uC131 (\uC11C\uBC84 \uC5F0\uACB0 \uD074\uB77C\uC774\uC5B8\uD2B8)\n const viteClientBuildPromises = new Map<string, Promise<void>>();\n const viteClientReadyPromises = new Map<string, { promise: Promise<void>; resolver: () => void }>();\n for (const workerInfo of viteClientWorkers) {\n viteClientBuildPromises.set(\n workerInfo.name,\n new Promise<void>((resolve) => {\n workerInfo.buildResolver = resolve;\n }),\n );\n // Vite \uC11C\uBC84 \uC900\uBE44 \uC644\uB8CC Promise (\uC11C\uBC84\uAC00 \uD074\uB77C\uC774\uC5B8\uD2B8 \uD3EC\uD2B8\uB97C \uC54C \uB54C\uAE4C\uC9C0 \uB300\uAE30)\n let readyResolver!: () => void;\n const readyPromise = new Promise<void>((resolve) => {\n readyResolver = resolve;\n });\n viteClientReadyPromises.set(workerInfo.name, { promise: readyPromise, resolver: readyResolver });\n }\n\n // Server Build Worker \uBC0F Promise \uC0DD\uC131\n const serverBuildWorkers = new Map<\n string,\n {\n worker: WorkerProxy<typeof ServerWorkerModule>;\n buildPromise: Promise<void>;\n buildResolver: () => void;\n mainJsPath?: string;\n }\n >();\n for (const { name } of serverPackages) {\n let resolver!: () => void;\n const promise = new Promise<void>((resolve) => {\n resolver = resolve;\n });\n serverBuildWorkers.set(name, {\n worker: Worker.create<typeof ServerWorkerModule>(serverWorkerPath),\n buildPromise: promise,\n buildResolver: resolver,\n });\n }\n\n // clientPorts \uCE90\uC2DC (\uC11C\uBC84 \uC7AC\uC2DC\uC791 \uC2DC \uC7AC\uC0AC\uC6A9)\n const clientPorts: Record<string, number> = {};\n\n // Server Runtime Worker (\uC11C\uBC84\uB2F9 \uD558\uB098, \uC7AC\uC2DC\uC791 \uC2DC \uAD50\uCCB4)\n const serverRuntimeWorkers = new Map<string, WorkerProxy<typeof ServerRuntimeWorkerModule>>();\n\n // Server Runtime Promise (\uCD08\uAE30 \uC11C\uBC84 \uC2DC\uC791 \uC644\uB8CC \uB300\uAE30\uC6A9)\n const serverRuntimePromises = new Map<string, { promise: Promise<void>; resolver: () => void }>();\n for (const { name } of serverPackages) {\n let resolver!: () => void;\n const promise = new Promise<void>((resolve) => {\n resolver = resolve;\n });\n serverRuntimePromises.set(name, { promise, resolver });\n }\n\n // Standalone client \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uB4F1\uB85D \uBC0F completeTask \uD568\uC218 \uC800\uC7A5\n const clientCompleteTasks = new Map<string, (result: PackageResult) => void>();\n for (const workerInfo of standaloneClientWorkers) {\n const completeTask = registerWorkerEventHandlers(\n workerInfo,\n {\n resultKey: `${workerInfo.name}:build`,\n listrTitle: `${workerInfo.name} (client)`,\n resultType: \"build\",\n },\n results,\n rebuildManager,\n );\n clientCompleteTasks.set(workerInfo.name, completeTask);\n\n // serverReady (Vite dev server)\n workerInfo.worker.on(\"serverReady\", (data) => {\n const event = data as ServerReadyEventData;\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: \"server\",\n status: \"server\",\n port: event.port,\n });\n });\n }\n\n // Vite client (\uC11C\uBC84 \uC5F0\uACB0) \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uB4F1\uB85D\n for (const workerInfo of viteClientWorkers) {\n const completeTask = registerWorkerEventHandlers(\n workerInfo,\n {\n resultKey: `${workerInfo.name}:build`,\n listrTitle: `${workerInfo.name} (client)`,\n resultType: \"build\",\n },\n results,\n rebuildManager,\n );\n clientCompleteTasks.set(workerInfo.name, completeTask);\n\n // serverReady - Vite \uD3EC\uD2B8\uB97C clientPorts\uC5D0 \uC800\uC7A5 (URL\uC740 \uC11C\uBC84\uB97C \uD1B5\uD574 \uCD9C\uB825)\n workerInfo.worker.on(\"serverReady\", (data) => {\n const event = data as ServerReadyEventData;\n clientPorts[workerInfo.name] = event.port;\n // Vite \uC11C\uBC84 \uC900\uBE44 \uC644\uB8CC \uC54C\uB9BC (\uC11C\uBC84\uAC00 \uD504\uB85D\uC2DC \uC124\uC815\uC744 \uC704\uD574 \uB300\uAE30 \uC911)\n viteClientReadyPromises.get(workerInfo.name)?.resolver();\n // listr \uC644\uB8CC\uB97C \uC704\uD574 completeTask \uD638\uCD9C (Vite\uB294 build \uC774\uBCA4\uD2B8\uB97C \uBC1C\uC0DD\uC2DC\uD0A4\uC9C0 \uC54A\uC74C)\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: \"build\",\n status: \"success\",\n });\n });\n }\n\n // Server Build Worker \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uB4F1\uB85D\n for (const { name } of serverPackages) {\n const serverBuild = serverBuildWorkers.get(name)!;\n let isFirstBuild = true;\n\n serverBuild.worker.on(\"buildStart\", () => {\n if (!isFirstBuild) {\n // \uB9AC\uBE4C\uB4DC \uC2DC RebuildListrManager\uC5D0 \uB4F1\uB85D\n const resolver = rebuildManager.registerBuild(`${name}:server`, `${name} (server)`);\n serverBuildWorkers.set(name, {\n ...serverBuild,\n buildResolver: resolver,\n });\n }\n });\n\n serverBuild.worker.on(\"build\", async (data) => {\n const event = data as ServerBuildEventData;\n\n if (event.success) {\n // mainJsPath \uC800\uC7A5\n const updatedBuild = serverBuildWorkers.get(name)!;\n updatedBuild.mainJsPath = event.mainJsPath;\n\n // \uAE30\uC874 Server Runtime Worker \uC885\uB8CC\n const existingRuntime = serverRuntimeWorkers.get(name);\n if (existingRuntime != null) {\n // \uC11C\uBC84 \uC7AC\uC2DC\uC791 \uC911 \uBA54\uC2DC\uC9C0 \uCD9C\uB825\n consola.info(`[${name}] \uC11C\uBC84 \uC7AC\uC2DC\uC791 \uC911...`);\n await existingRuntime.terminate();\n }\n\n // \uC0C8 Server Runtime Worker \uC0DD\uC131 \uBC0F \uC2DC\uC791\n const runtimeWorker = Worker.create<typeof ServerRuntimeWorkerModule>(serverRuntimeWorkerPath);\n serverRuntimeWorkers.set(name, runtimeWorker);\n\n // \uC774 \uC11C\uBC84\uC5D0 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8\uB4E4\uC758 Vite \uC11C\uBC84\uAC00 \uC900\uBE44\uB420 \uB54C\uAE4C\uC9C0 \uB300\uAE30\n const connectedClients = serverClientsMap.get(name) ?? [];\n const clientReadyPromises = connectedClients\n .map((clientName) => viteClientReadyPromises.get(clientName)?.promise)\n .filter((p): p is Promise<void> => p != null);\n if (clientReadyPromises.length > 0) {\n await Promise.all(clientReadyPromises);\n }\n\n // \uC774 \uC11C\uBC84\uC5D0 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8 \uD3EC\uD2B8 \uC218\uC9D1\n const serverClientPorts: Record<string, number> = {};\n for (const clientName of connectedClients) {\n if (clientName in clientPorts) {\n serverClientPorts[clientName] = clientPorts[clientName];\n }\n }\n\n // Server Runtime \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC\n runtimeWorker.on(\"serverReady\", (readyData) => {\n const readyEvent = readyData as ServerReadyEventData;\n results.set(`${name}:server`, {\n name,\n target: \"server\",\n type: \"server\",\n status: \"server\",\n port: readyEvent.port,\n });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n serverRuntimePromises.get(name)?.resolver();\n }\n updatedBuild.buildResolver();\n });\n\n runtimeWorker.on(\"error\", (errorData) => {\n const errorEvent = errorData as ErrorEventData;\n results.set(`${name}:server`, {\n name,\n target: \"server\",\n type: \"server\",\n status: \"error\",\n message: errorEvent.message,\n });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n serverRuntimePromises.get(name)?.resolver();\n }\n updatedBuild.buildResolver();\n });\n\n // Server Runtime \uC2DC\uC791\n void runtimeWorker.start({\n mainJsPath: event.mainJsPath,\n clientPorts: serverClientPorts,\n });\n } else {\n results.set(`${name}:build`, {\n name,\n target: \"server\",\n type: \"build\",\n status: \"error\",\n message: event.errors?.join(\"\\n\"),\n });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n serverRuntimePromises.get(name)?.resolver();\n }\n serverBuild.buildResolver();\n }\n });\n\n serverBuild.worker.on(\"error\", (data) => {\n const event = data as ErrorEventData;\n results.set(`${name}:build`, {\n name,\n target: \"server\",\n type: \"build\",\n status: \"error\",\n message: event.message,\n });\n serverBuild.buildResolver();\n });\n }\n\n // \uCD08\uAE30 \uBE4C\uB4DC listr (standalone client + vite client + server \uBE4C\uB4DC)\n const initialListr = new Listr(\n [\n // Standalone client \uD0DC\uC2A4\uD06C\n ...standaloneClientWorkers.map((workerInfo) => ({\n title: `${workerInfo.name} (client)`,\n task: () => standaloneClientBuildPromises.get(workerInfo.name) ?? Promise.resolve(),\n })),\n // Vite client \uD0DC\uC2A4\uD06C (\uC11C\uBC84 \uC5F0\uACB0)\n ...viteClientWorkers.map((workerInfo) => ({\n title: `${workerInfo.name} (client)`,\n task: () => viteClientBuildPromises.get(workerInfo.name) ?? Promise.resolve(),\n })),\n // Server \uBE4C\uB4DC \uD0DC\uC2A4\uD06C (\uBE4C\uB4DC + \uB7F0\uD0C0\uC784 \uC2DC\uC791)\n ...serverPackages.map(({ name }) => ({\n title: `${name} (server)`,\n task: () => serverRuntimePromises.get(name)?.promise ?? Promise.resolve(),\n })),\n ],\n { concurrent: true },\n );\n\n // Standalone client \uC6CC\uCEE4 \uC2DC\uC791\n for (const workerInfo of standaloneClientWorkers) {\n const pkgDir = path.join(cwd, \"packages\", workerInfo.name);\n const completeTask = clientCompleteTasks.get(workerInfo.name)!;\n const clientConfig: SdClientPackageConfig = {\n ...workerInfo.config,\n env: { ...baseEnv, ...workerInfo.config.env },\n };\n workerInfo.worker\n .startWatch({\n name: workerInfo.name,\n config: clientConfig,\n cwd,\n pkgDir,\n watchScopes,\n })\n .catch((err: unknown) => {\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: \"build\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n });\n }\n\n // Vite client \uC6CC\uCEE4 \uC2DC\uC791 (\uC11C\uBC84 \uC5F0\uACB0) - Vite \uC790\uB3D9 \uD3EC\uD2B8 \uC0AC\uC6A9\n for (const workerInfo of viteClientWorkers) {\n const pkgDir = path.join(cwd, \"packages\", workerInfo.name);\n const completeTask = clientCompleteTasks.get(workerInfo.name)!;\n // Vite\uAC00 \uC790\uB3D9\uC73C\uB85C \uD3EC\uD2B8\uB97C \uD560\uB2F9\uD558\uB3C4\uB85D \uC124\uC815\n const viteConfig: SdClientPackageConfig = {\n ...workerInfo.config,\n server: 0, // Vite\uAC00 \uC790\uB3D9\uC73C\uB85C \uD3EC\uD2B8 \uD560\uB2F9\n env: { ...baseEnv, ...workerInfo.config.env },\n };\n workerInfo.worker\n .startWatch({\n name: workerInfo.name,\n config: viteConfig,\n cwd,\n pkgDir,\n watchScopes,\n })\n .catch((err: unknown) => {\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: \"build\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n });\n }\n\n // Server Build \uC6CC\uCEE4 \uC2DC\uC791\n for (const { name, config } of serverPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n const serverBuild = serverBuildWorkers.get(name)!;\n serverBuild.worker\n .startWatch({\n name,\n cwd,\n pkgDir,\n env: { ...baseEnv, ...config.env },\n configs: config.configs,\n })\n .catch((err: unknown) => {\n results.set(`${name}:build`, {\n name,\n target: \"server\",\n type: \"build\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n serverBuild.buildResolver();\n });\n }\n\n // listr \uC2E4\uD589 (\uCD08\uAE30 \uBE4C\uB4DC \uC644\uB8CC\uAE4C\uC9C0 \uB300\uAE30)\n await initialListr.run();\n\n // Capacitor \uCD08\uAE30\uD654 (client \uD0C0\uAC9F \uC911 capacitor \uC124\uC815\uC774 \uC788\uB294 \uD328\uD0A4\uC9C0)\n const capacitorPackages: Array<[string, SdClientPackageConfig]> = [];\n for (const { name, config } of clientPackages) {\n if (config.capacitor != null) {\n capacitorPackages.push([name, config]);\n }\n }\n\n if (capacitorPackages.length > 0) {\n const capacitorListr = new Listr(\n capacitorPackages.map(([name, config]) => ({\n title: `${name} (capacitor)`,\n task: async () => {\n const pkgDir = path.join(cwd, \"packages\", name);\n try {\n const cap = await Capacitor.create(pkgDir, config.capacitor!);\n await cap.initialize();\n results.set(`${name}:capacitor`, {\n name,\n target: \"client\",\n type: \"capacitor\",\n status: \"success\",\n });\n } catch (err) {\n results.set(`${name}:capacitor`, {\n name,\n target: \"client\",\n type: \"capacitor\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n },\n })),\n { concurrent: false, exitOnError: false },\n );\n\n try {\n await capacitorListr.run();\n } catch {\n // \uC5D0\uB7EC\uB294 results\uC5D0 \uC774\uBBF8 \uAE30\uB85D\uB428\n }\n }\n\n // \uCD08\uAE30 \uBE4C\uB4DC \uACB0\uACFC \uCD9C\uB825\n printErrors(results);\n printServers(results, serverClientsMap);\n\n // \uC885\uB8CC \uC2DC\uADF8\uB110\uAE4C\uC9C0 \uB300\uAE30\n await terminatePromise;\n\n // Worker \uC885\uB8CC (\uBAA8\uB4E0 \uC6CC\uCEE4)\n process.stdout.write(\"\u23F3 \uC885\uB8CC \uC911...\\n\");\n await Promise.all([\n ...standaloneClientWorkers.map(({ worker }) => worker.terminate()),\n ...viteClientWorkers.map(({ worker }) => worker.terminate()),\n ...[...serverBuildWorkers.values()].map(({ worker }) => worker.terminate()),\n ...[...serverRuntimeWorkers.values()].map((worker) => worker.terminate()),\n ]);\n process.stdout.write(\"\u2714 \uC644\uB8CC\\n\");\n}\n\n//#endregion\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import fs from \"fs\";\nimport path from \"path\";\nimport { Listr } from \"listr2\";\nimport { Worker, type WorkerProxy } from \"@simplysm/core-node\";\nimport type { SdConfig, SdClientPackageConfig, SdServerPackageConfig } from \"../sd-config.types\";\nimport { consola } from \"consola\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { getVersion } from \"../utils/build-env\";\nimport { setupReplaceDeps } from \"../utils/replace-deps\";\nimport type * as ClientWorkerModule from \"../workers/client.worker\";\nimport type * as ServerWorkerModule from \"../workers/server.worker\";\nimport type * as ServerRuntimeWorkerModule from \"../workers/server-runtime.worker\";\nimport { Capacitor } from \"../capacitor/capacitor\";\nimport { filterPackagesByTargets, getWatchScopes, type PackageResult } from \"../utils/package-utils\";\nimport { printErrors, printServers } from \"../utils/output-utils\";\nimport { RebuildListrManager } from \"../utils/listr-manager\";\nimport {\n registerWorkerEventHandlers,\n type ServerReadyEventData,\n type ServerBuildEventData,\n type ErrorEventData,\n} from \"../utils/worker-events\";\n\n//#region Types\n\n/**\n * Dev \uBA85\uB839 \uC635\uC158\n */\nexport interface DevOptions {\n /** dev\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n options: string[];\n}\n\n/**\n * Client Worker \uC815\uBCF4 (Vite dev server\uC6A9)\n */\ninterface ClientWorkerInfo {\n name: string;\n config: SdClientPackageConfig;\n worker: WorkerProxy<typeof ClientWorkerModule>;\n isInitialBuild: boolean;\n buildResolver: (() => void) | undefined;\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * Client \uBC0F Server \uD328\uD0A4\uC9C0\uB97C \uAC1C\uBC1C \uBAA8\uB4DC\uB85C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `sd.config.ts`\uB97C \uB85C\uB4DC\uD558\uC5EC \uD328\uD0A4\uC9C0\uBCC4 \uBE4C\uB4DC \uD0C0\uAC9F \uC815\uBCF4 \uD655\uC778 (\uD544\uC218)\n * - `client` \uD0C0\uAC9F: Vite dev server \uC2DC\uC791\n * - `server` \uD0C0\uAC9F: Server Build Worker + Server Runtime Worker\n * - Server-Client \uD504\uB85D\uC2DC \uC5F0\uACB0 \uC9C0\uC6D0\n * - Capacitor \uCD08\uAE30\uD654 \uC9C0\uC6D0\n * - SIGINT/SIGTERM \uC2DC\uADF8\uB110\uB85C \uC885\uB8CC\n *\n * @param options - dev \uC2E4\uD589 \uC635\uC158\n * @returns \uC885\uB8CC \uC2DC\uADF8\uB110 \uC218\uC2E0 \uC2DC resolve\n */\nexport async function runDev(options: DevOptions): Promise<void> {\n const { targets } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:dev\");\n\n logger.debug(\"dev \uC2DC\uC791\", { targets });\n\n // sd.config.ts \uB85C\uB4DC (dev\uB294 \uD328\uD0A4\uC9C0 \uBE4C\uB4DC \uC815\uBCF4\uAC00 \uD544\uC694\uD558\uBBC0\uB85C \uD544\uC218)\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({ cwd, dev: true, opt: options.options });\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // replaceDeps \uC124\uC815\uC774 \uC788\uC73C\uBA74 symlink \uAD50\uCCB4\n if (sdConfig.replaceDeps != null) {\n await setupReplaceDeps(cwd, sdConfig.replaceDeps);\n }\n\n // VER, DEV \uD658\uACBD\uBCC0\uC218 \uC900\uBE44\n const version = await getVersion(cwd);\n const baseEnv = { VER: version, DEV: \"true\" };\n\n // watchScopes \uC0DD\uC131 (\uB8E8\uD2B8 package.json\uC5D0\uC11C scope \uCD94\uCD9C)\n const rootPkgJsonPath = path.join(cwd, \"package.json\");\n const rootPkgName = JSON.parse(fs.readFileSync(rootPkgJsonPath, \"utf-8\")).name as string;\n const watchScopes = getWatchScopes(rootPkgName);\n\n // targets \uD544\uD130\uB9C1\n const allPackages = filterPackagesByTargets(sdConfig.packages, targets);\n\n // client/server \uD328\uD0A4\uC9C0\uB9CC \uD544\uD130\uB9C1\n const serverPackages: Array<{ name: string; config: SdServerPackageConfig }> = [];\n const clientPackages: Array<{ name: string; config: SdClientPackageConfig }> = [];\n\n for (const [name, config] of Object.entries(allPackages)) {\n if (config.target === \"server\") {\n serverPackages.push({ name, config });\n } else if (config.target === \"client\") {\n clientPackages.push({ name, config });\n }\n }\n\n if (serverPackages.length === 0 && clientPackages.length === 0) {\n process.stdout.write(\"\u26A0 dev\uD560 client/server \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n // \uC11C\uBC84\uC640 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8 \uCC3E\uAE30 (\uC11C\uBC84\uAC00 dev \uB300\uC0C1\uC778 \uACBD\uC6B0\uB9CC)\n const serverNames = new Set(serverPackages.map(({ name }) => name));\n const serverClientsMap = new Map<string, string[]>();\n for (const { name, config } of clientPackages) {\n if (typeof config.server === \"string\" && serverNames.has(config.server)) {\n const clients = serverClientsMap.get(config.server) ?? [];\n clients.push(name);\n serverClientsMap.set(config.server, clients);\n }\n }\n\n // Worker \uACBD\uB85C\n const clientWorkerPath = import.meta.resolve(\"../workers/client.worker\");\n const serverWorkerPath = import.meta.resolve(\"../workers/server.worker\");\n const serverRuntimeWorkerPath = import.meta.resolve(\"../workers/server-runtime.worker\");\n\n // \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uB2E8\uB3C5 \uC2E4\uD589\uC778 \uACBD\uC6B0:\n // - server\uAC00 \uC22B\uC790\uC778 \uACBD\uC6B0\n // - server\uAC00 \uBB38\uC790\uC5F4\uC774\uC9C0\uB9CC \uD574\uB2F9 \uC11C\uBC84\uAC00 dev \uB300\uC0C1\uC774 \uC544\uB2CC \uACBD\uC6B0\n const standaloneClientWorkers: ClientWorkerInfo[] = clientPackages\n .filter(\n ({ config }) =>\n typeof config.server === \"number\" || (typeof config.server === \"string\" && !serverNames.has(config.server)),\n )\n .map(({ name, config }) => ({\n name,\n config,\n worker: Worker.create<typeof ClientWorkerModule>(clientWorkerPath),\n isInitialBuild: true,\n buildResolver: undefined,\n }));\n\n // \uC11C\uBC84\uC5D0 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8\uC758 Vite Worker (\uC11C\uBC84\uAC00 dev \uB300\uC0C1\uC778 \uACBD\uC6B0\uB9CC)\n const viteClientWorkers: ClientWorkerInfo[] = clientPackages\n .filter(({ config }) => typeof config.server === \"string\" && serverNames.has(config.server))\n .map(({ name, config }) => ({\n name,\n config,\n worker: Worker.create<typeof ClientWorkerModule>(clientWorkerPath),\n isInitialBuild: true,\n buildResolver: undefined,\n }));\n\n // \uACB0\uACFC \uC0C1\uD0DC \uAD00\uB9AC\n const results = new Map<string, PackageResult>();\n\n // RebuildListrManager \uC0DD\uC131\n const rebuildManager = new RebuildListrManager(logger);\n\n // \uBC30\uCE58 \uC644\uB8CC \uC2DC \uC5D0\uB7EC\uC640 \uC11C\uBC84 URL \uCD9C\uB825\n rebuildManager.on(\"batchComplete\", () => {\n printErrors(results);\n printServers(results, serverClientsMap);\n });\n\n // \uC885\uB8CC Promise \uC0DD\uC131\n let resolveTerminate!: () => void;\n const terminatePromise = new Promise<void>((resolve) => {\n resolveTerminate = resolve;\n });\n\n // \uC885\uB8CC \uC2DC\uADF8\uB110 \uD578\uB4E4\uB7EC \uB4F1\uB85D\n const signalHandler = () => {\n process.off(\"SIGINT\", signalHandler);\n process.off(\"SIGTERM\", signalHandler);\n resolveTerminate();\n };\n process.on(\"SIGINT\", signalHandler);\n process.on(\"SIGTERM\", signalHandler);\n\n // Standalone client \uBE4C\uB4DC Promise \uBBF8\uB9AC \uC0DD\uC131\n const standaloneClientBuildPromises = new Map<string, Promise<void>>();\n for (const workerInfo of standaloneClientWorkers) {\n standaloneClientBuildPromises.set(\n workerInfo.name,\n new Promise<void>((resolve) => {\n workerInfo.buildResolver = resolve;\n }),\n );\n }\n\n // Vite client \uBE4C\uB4DC Promise \uBBF8\uB9AC \uC0DD\uC131 (\uC11C\uBC84 \uC5F0\uACB0 \uD074\uB77C\uC774\uC5B8\uD2B8)\n const viteClientBuildPromises = new Map<string, Promise<void>>();\n const viteClientReadyPromises = new Map<string, { promise: Promise<void>; resolver: () => void }>();\n for (const workerInfo of viteClientWorkers) {\n viteClientBuildPromises.set(\n workerInfo.name,\n new Promise<void>((resolve) => {\n workerInfo.buildResolver = resolve;\n }),\n );\n // Vite \uC11C\uBC84 \uC900\uBE44 \uC644\uB8CC Promise (\uC11C\uBC84\uAC00 \uD074\uB77C\uC774\uC5B8\uD2B8 \uD3EC\uD2B8\uB97C \uC54C \uB54C\uAE4C\uC9C0 \uB300\uAE30)\n let readyResolver!: () => void;\n const readyPromise = new Promise<void>((resolve) => {\n readyResolver = resolve;\n });\n viteClientReadyPromises.set(workerInfo.name, { promise: readyPromise, resolver: readyResolver });\n }\n\n // Server Build Worker \uBC0F Promise \uC0DD\uC131\n const serverBuildWorkers = new Map<\n string,\n {\n worker: WorkerProxy<typeof ServerWorkerModule>;\n buildPromise: Promise<void>;\n buildResolver: () => void;\n mainJsPath?: string;\n }\n >();\n for (const { name } of serverPackages) {\n let resolver!: () => void;\n const promise = new Promise<void>((resolve) => {\n resolver = resolve;\n });\n serverBuildWorkers.set(name, {\n worker: Worker.create<typeof ServerWorkerModule>(serverWorkerPath),\n buildPromise: promise,\n buildResolver: resolver,\n });\n }\n\n // clientPorts \uCE90\uC2DC (\uC11C\uBC84 \uC7AC\uC2DC\uC791 \uC2DC \uC7AC\uC0AC\uC6A9)\n const clientPorts: Record<string, number> = {};\n\n // Server Runtime Worker (\uC11C\uBC84\uB2F9 \uD558\uB098, \uC7AC\uC2DC\uC791 \uC2DC \uAD50\uCCB4)\n const serverRuntimeWorkers = new Map<string, WorkerProxy<typeof ServerRuntimeWorkerModule>>();\n\n // Server Runtime Promise (\uCD08\uAE30 \uC11C\uBC84 \uC2DC\uC791 \uC644\uB8CC \uB300\uAE30\uC6A9)\n const serverRuntimePromises = new Map<string, { promise: Promise<void>; resolver: () => void }>();\n for (const { name } of serverPackages) {\n let resolver!: () => void;\n const promise = new Promise<void>((resolve) => {\n resolver = resolve;\n });\n serverRuntimePromises.set(name, { promise, resolver });\n }\n\n // Standalone client \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uB4F1\uB85D \uBC0F completeTask \uD568\uC218 \uC800\uC7A5\n const clientCompleteTasks = new Map<string, (result: PackageResult) => void>();\n for (const workerInfo of standaloneClientWorkers) {\n const completeTask = registerWorkerEventHandlers(\n workerInfo,\n {\n resultKey: `${workerInfo.name}:build`,\n listrTitle: `${workerInfo.name} (client)`,\n resultType: \"build\",\n },\n results,\n rebuildManager,\n );\n clientCompleteTasks.set(workerInfo.name, completeTask);\n\n // serverReady (Vite dev server)\n workerInfo.worker.on(\"serverReady\", (data) => {\n const event = data as ServerReadyEventData;\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: \"server\",\n status: \"server\",\n port: event.port,\n });\n });\n }\n\n // Vite client (\uC11C\uBC84 \uC5F0\uACB0) \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uB4F1\uB85D\n for (const workerInfo of viteClientWorkers) {\n const completeTask = registerWorkerEventHandlers(\n workerInfo,\n {\n resultKey: `${workerInfo.name}:build`,\n listrTitle: `${workerInfo.name} (client)`,\n resultType: \"build\",\n },\n results,\n rebuildManager,\n );\n clientCompleteTasks.set(workerInfo.name, completeTask);\n\n // serverReady - Vite \uD3EC\uD2B8\uB97C clientPorts\uC5D0 \uC800\uC7A5 (URL\uC740 \uC11C\uBC84\uB97C \uD1B5\uD574 \uCD9C\uB825)\n workerInfo.worker.on(\"serverReady\", (data) => {\n const event = data as ServerReadyEventData;\n clientPorts[workerInfo.name] = event.port;\n // Vite \uC11C\uBC84 \uC900\uBE44 \uC644\uB8CC \uC54C\uB9BC (\uC11C\uBC84\uAC00 \uD504\uB85D\uC2DC \uC124\uC815\uC744 \uC704\uD574 \uB300\uAE30 \uC911)\n viteClientReadyPromises.get(workerInfo.name)?.resolver();\n // listr \uC644\uB8CC\uB97C \uC704\uD574 completeTask \uD638\uCD9C (Vite\uB294 build \uC774\uBCA4\uD2B8\uB97C \uBC1C\uC0DD\uC2DC\uD0A4\uC9C0 \uC54A\uC74C)\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: \"build\",\n status: \"success\",\n });\n });\n }\n\n // Server Build Worker \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uB4F1\uB85D\n for (const { name } of serverPackages) {\n const serverBuild = serverBuildWorkers.get(name)!;\n let isFirstBuild = true;\n\n serverBuild.worker.on(\"buildStart\", () => {\n if (!isFirstBuild) {\n // \uB9AC\uBE4C\uB4DC \uC2DC RebuildListrManager\uC5D0 \uB4F1\uB85D\n const resolver = rebuildManager.registerBuild(`${name}:server`, `${name} (server)`);\n serverBuildWorkers.set(name, {\n ...serverBuild,\n buildResolver: resolver,\n });\n }\n });\n\n serverBuild.worker.on(\"build\", async (data) => {\n const event = data as ServerBuildEventData;\n\n if (event.success) {\n // mainJsPath \uC800\uC7A5\n const updatedBuild = serverBuildWorkers.get(name)!;\n updatedBuild.mainJsPath = event.mainJsPath;\n\n // \uAE30\uC874 Server Runtime Worker \uC885\uB8CC\n const existingRuntime = serverRuntimeWorkers.get(name);\n if (existingRuntime != null) {\n // \uC11C\uBC84 \uC7AC\uC2DC\uC791 \uC911 \uBA54\uC2DC\uC9C0 \uCD9C\uB825\n consola.info(`[${name}] \uC11C\uBC84 \uC7AC\uC2DC\uC791 \uC911...`);\n await existingRuntime.terminate();\n }\n\n // \uC0C8 Server Runtime Worker \uC0DD\uC131 \uBC0F \uC2DC\uC791\n const runtimeWorker = Worker.create<typeof ServerRuntimeWorkerModule>(serverRuntimeWorkerPath);\n serverRuntimeWorkers.set(name, runtimeWorker);\n\n // \uC774 \uC11C\uBC84\uC5D0 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8\uB4E4\uC758 Vite \uC11C\uBC84\uAC00 \uC900\uBE44\uB420 \uB54C\uAE4C\uC9C0 \uB300\uAE30\n const connectedClients = serverClientsMap.get(name) ?? [];\n const clientReadyPromises = connectedClients\n .map((clientName) => viteClientReadyPromises.get(clientName)?.promise)\n .filter((p): p is Promise<void> => p != null);\n if (clientReadyPromises.length > 0) {\n await Promise.all(clientReadyPromises);\n }\n\n // \uC774 \uC11C\uBC84\uC5D0 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8 \uD3EC\uD2B8 \uC218\uC9D1\n const serverClientPorts: Record<string, number> = {};\n for (const clientName of connectedClients) {\n if (clientName in clientPorts) {\n serverClientPorts[clientName] = clientPorts[clientName];\n }\n }\n\n // Server Runtime \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC\n runtimeWorker.on(\"serverReady\", (readyData) => {\n const readyEvent = readyData as ServerReadyEventData;\n results.set(`${name}:server`, {\n name,\n target: \"server\",\n type: \"server\",\n status: \"server\",\n port: readyEvent.port,\n });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n serverRuntimePromises.get(name)?.resolver();\n }\n updatedBuild.buildResolver();\n });\n\n runtimeWorker.on(\"error\", (errorData) => {\n const errorEvent = errorData as ErrorEventData;\n results.set(`${name}:server`, {\n name,\n target: \"server\",\n type: \"server\",\n status: \"error\",\n message: errorEvent.message,\n });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n serverRuntimePromises.get(name)?.resolver();\n }\n updatedBuild.buildResolver();\n });\n\n // Server Runtime \uC2DC\uC791\n void runtimeWorker.start({\n mainJsPath: event.mainJsPath,\n clientPorts: serverClientPorts,\n });\n } else {\n results.set(`${name}:build`, {\n name,\n target: \"server\",\n type: \"build\",\n status: \"error\",\n message: event.errors?.join(\"\\n\"),\n });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n serverRuntimePromises.get(name)?.resolver();\n }\n serverBuild.buildResolver();\n }\n });\n\n serverBuild.worker.on(\"error\", (data) => {\n const event = data as ErrorEventData;\n results.set(`${name}:build`, {\n name,\n target: \"server\",\n type: \"build\",\n status: \"error\",\n message: event.message,\n });\n serverBuild.buildResolver();\n });\n }\n\n // \uCD08\uAE30 \uBE4C\uB4DC listr (standalone client + vite client + server \uBE4C\uB4DC)\n const initialListr = new Listr(\n [\n // Standalone client \uD0DC\uC2A4\uD06C\n ...standaloneClientWorkers.map((workerInfo) => ({\n title: `${workerInfo.name} (client)`,\n task: () => standaloneClientBuildPromises.get(workerInfo.name) ?? Promise.resolve(),\n })),\n // Vite client \uD0DC\uC2A4\uD06C (\uC11C\uBC84 \uC5F0\uACB0)\n ...viteClientWorkers.map((workerInfo) => ({\n title: `${workerInfo.name} (client)`,\n task: () => viteClientBuildPromises.get(workerInfo.name) ?? Promise.resolve(),\n })),\n // Server \uBE4C\uB4DC \uD0DC\uC2A4\uD06C (\uBE4C\uB4DC + \uB7F0\uD0C0\uC784 \uC2DC\uC791)\n ...serverPackages.map(({ name }) => ({\n title: `${name} (server)`,\n task: () => serverRuntimePromises.get(name)?.promise ?? Promise.resolve(),\n })),\n ],\n { concurrent: true },\n );\n\n // Standalone client \uC6CC\uCEE4 \uC2DC\uC791\n for (const workerInfo of standaloneClientWorkers) {\n const pkgDir = path.join(cwd, \"packages\", workerInfo.name);\n const completeTask = clientCompleteTasks.get(workerInfo.name)!;\n const clientConfig: SdClientPackageConfig = {\n ...workerInfo.config,\n env: { ...baseEnv, ...workerInfo.config.env },\n };\n workerInfo.worker\n .startWatch({\n name: workerInfo.name,\n config: clientConfig,\n cwd,\n pkgDir,\n watchScopes,\n })\n .catch((err: unknown) => {\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: \"build\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n });\n }\n\n // Vite client \uC6CC\uCEE4 \uC2DC\uC791 (\uC11C\uBC84 \uC5F0\uACB0) - Vite \uC790\uB3D9 \uD3EC\uD2B8 \uC0AC\uC6A9\n for (const workerInfo of viteClientWorkers) {\n const pkgDir = path.join(cwd, \"packages\", workerInfo.name);\n const completeTask = clientCompleteTasks.get(workerInfo.name)!;\n // Vite\uAC00 \uC790\uB3D9\uC73C\uB85C \uD3EC\uD2B8\uB97C \uD560\uB2F9\uD558\uB3C4\uB85D \uC124\uC815\n const viteConfig: SdClientPackageConfig = {\n ...workerInfo.config,\n server: 0, // Vite\uAC00 \uC790\uB3D9\uC73C\uB85C \uD3EC\uD2B8 \uD560\uB2F9\n env: { ...baseEnv, ...workerInfo.config.env },\n };\n workerInfo.worker\n .startWatch({\n name: workerInfo.name,\n config: viteConfig,\n cwd,\n pkgDir,\n watchScopes,\n })\n .catch((err: unknown) => {\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: \"build\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n });\n }\n\n // Server Build \uC6CC\uCEE4 \uC2DC\uC791\n for (const { name, config } of serverPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n const serverBuild = serverBuildWorkers.get(name)!;\n serverBuild.worker\n .startWatch({\n name,\n cwd,\n pkgDir,\n env: { ...baseEnv, ...config.env },\n configs: config.configs,\n externals: config.externals,\n })\n .catch((err: unknown) => {\n results.set(`${name}:build`, {\n name,\n target: \"server\",\n type: \"build\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n serverBuild.buildResolver();\n });\n }\n\n // listr \uC2E4\uD589 (\uCD08\uAE30 \uBE4C\uB4DC \uC644\uB8CC\uAE4C\uC9C0 \uB300\uAE30)\n await initialListr.run();\n\n // Capacitor \uCD08\uAE30\uD654 (client \uD0C0\uAC9F \uC911 capacitor \uC124\uC815\uC774 \uC788\uB294 \uD328\uD0A4\uC9C0)\n const capacitorPackages: Array<[string, SdClientPackageConfig]> = [];\n for (const { name, config } of clientPackages) {\n if (config.capacitor != null) {\n capacitorPackages.push([name, config]);\n }\n }\n\n if (capacitorPackages.length > 0) {\n const capacitorListr = new Listr(\n capacitorPackages.map(([name, config]) => ({\n title: `${name} (capacitor)`,\n task: async () => {\n const pkgDir = path.join(cwd, \"packages\", name);\n try {\n const cap = await Capacitor.create(pkgDir, config.capacitor!);\n await cap.initialize();\n results.set(`${name}:capacitor`, {\n name,\n target: \"client\",\n type: \"capacitor\",\n status: \"success\",\n });\n } catch (err) {\n results.set(`${name}:capacitor`, {\n name,\n target: \"client\",\n type: \"capacitor\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n },\n })),\n { concurrent: false, exitOnError: false },\n );\n\n try {\n await capacitorListr.run();\n } catch {\n // \uC5D0\uB7EC\uB294 results\uC5D0 \uC774\uBBF8 \uAE30\uB85D\uB428\n }\n }\n\n // \uCD08\uAE30 \uBE4C\uB4DC \uACB0\uACFC \uCD9C\uB825\n printErrors(results);\n printServers(results, serverClientsMap);\n\n // \uC885\uB8CC \uC2DC\uADF8\uB110\uAE4C\uC9C0 \uB300\uAE30\n await terminatePromise;\n\n // Worker \uC885\uB8CC (\uBAA8\uB4E0 \uC6CC\uCEE4)\n process.stdout.write(\"\u23F3 \uC885\uB8CC \uC911...\\n\");\n await Promise.all([\n ...standaloneClientWorkers.map(({ worker }) => worker.terminate()),\n ...viteClientWorkers.map(({ worker }) => worker.terminate()),\n ...[...serverBuildWorkers.values()].map(({ worker }) => worker.terminate()),\n ...[...serverRuntimeWorkers.values()].map((worker) => worker.terminate()),\n ]);\n process.stdout.write(\"\u2714 \uC644\uB8CC\\n\");\n}\n\n//#endregion\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -22,6 +22,7 @@ export declare class WatchOrchestrator {
22
22
  private _libraryBuilder;
23
23
  private _dtsBuilder;
24
24
  private _packages;
25
+ private _copySrcWatchers;
25
26
  constructor(options: WatchOrchestratorOptions);
26
27
  /**
27
28
  * Orchestrator 초기화
@@ -1 +1 @@
1
- {"version":3,"file":"WatchOrchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrators/WatchOrchestrator.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAE3D,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAqB;gBAE1B,OAAO,EAAE,wBAAwB;IAK7C;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0EjC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoC5B;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAWhC"}
1
+ {"version":3,"file":"WatchOrchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrators/WatchOrchestrator.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAE3D,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,OAAO,EAAE,wBAAwB;IAK7C;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0EjC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6C5B;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAgBhC"}
@@ -10,6 +10,7 @@ import { ResultCollector } from "../infra/ResultCollector.js";
10
10
  import { SignalHandler } from "../infra/SignalHandler.js";
11
11
  import { LibraryBuilder } from "../builders/LibraryBuilder.js";
12
12
  import { DtsBuilder } from "../builders/DtsBuilder.js";
13
+ import { watchCopySrcFiles } from "../utils/copy-src.js";
13
14
  class WatchOrchestrator {
14
15
  _cwd;
15
16
  _options;
@@ -20,6 +21,7 @@ class WatchOrchestrator {
20
21
  _libraryBuilder;
21
22
  _dtsBuilder;
22
23
  _packages = [];
24
+ _copySrcWatchers = [];
23
25
  constructor(options) {
24
26
  this._cwd = process.cwd();
25
27
  this._options = options;
@@ -107,6 +109,13 @@ class WatchOrchestrator {
107
109
  ],
108
110
  { concurrent: true }
109
111
  );
112
+ for (const pkg of this._packages) {
113
+ const buildConfig = pkg.config;
114
+ if (buildConfig.copySrc != null && buildConfig.copySrc.length > 0) {
115
+ const watcher = await watchCopySrcFiles(pkg.dir, buildConfig.copySrc);
116
+ this._copySrcWatchers.push(watcher);
117
+ }
118
+ }
110
119
  void this._libraryBuilder.startWatch();
111
120
  void this._dtsBuilder.startWatch();
112
121
  await initialListr.run();
@@ -129,7 +138,12 @@ class WatchOrchestrator {
129
138
  return;
130
139
  }
131
140
  process.stdout.write("\u23F3 \uC885\uB8CC \uC911...\n");
132
- await Promise.all([this._libraryBuilder.shutdown(), this._dtsBuilder.shutdown()]);
141
+ await Promise.all([
142
+ this._libraryBuilder.shutdown(),
143
+ this._dtsBuilder.shutdown(),
144
+ ...this._copySrcWatchers.map((w) => w.close())
145
+ ]);
146
+ this._copySrcWatchers = [];
133
147
  process.stdout.write("\u2714 \uC644\uB8CC\n");
134
148
  }
135
149
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/orchestrators/WatchOrchestrator.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport { Listr } from \"listr2\";\nimport { consola } from \"consola\";\nimport type { BuildTarget, SdConfig, SdPackageConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { filterPackagesByTargets } from \"../utils/package-utils\";\nimport { setupReplaceDeps } from \"../utils/replace-deps\";\nimport { printErrors } from \"../utils/output-utils\";\nimport { RebuildListrManager } from \"../utils/listr-manager\";\nimport { ResultCollector } from \"../infra/ResultCollector\";\nimport { SignalHandler } from \"../infra/SignalHandler\";\nimport { LibraryBuilder } from \"../builders/LibraryBuilder\";\nimport { DtsBuilder } from \"../builders/DtsBuilder\";\nimport type { PackageInfo } from \"../builders/types\";\n\n/**\n * Watch \uBA85\uB839 \uC635\uC158\n */\nexport interface WatchOrchestratorOptions {\n targets: string[];\n options: string[];\n}\n\n/**\n * Watch \uBAA8\uB4DC \uC2E4\uD589\uC744 \uC870\uC728\uD558\uB294 Orchestrator\n *\n * Library \uD328\uD0A4\uC9C0(node/browser/neutral)\uC758 watch \uBAA8\uB4DC \uC2E4\uD589\uC744 \uAD00\uB9AC\uD55C\uB2E4.\n * - LibraryBuilder: esbuild watch\n * - DtsBuilder: .d.ts \uC0DD\uC131\n */\nexport class WatchOrchestrator {\n private readonly _cwd: string;\n private readonly _options: WatchOrchestratorOptions;\n private readonly _logger = consola.withTag(\"sd:cli:watch\");\n\n private _resultCollector!: ResultCollector;\n private _signalHandler!: SignalHandler;\n private _rebuildManager!: RebuildListrManager;\n private _libraryBuilder!: LibraryBuilder;\n private _dtsBuilder!: DtsBuilder;\n private _packages: PackageInfo[] = [];\n\n constructor(options: WatchOrchestratorOptions) {\n this._cwd = process.cwd();\n this._options = options;\n }\n\n /**\n * Orchestrator \uCD08\uAE30\uD654\n * - sd.config.ts \uB85C\uB4DC\n * - \uD328\uD0A4\uC9C0 \uBD84\uB958\n * - Builder \uC0DD\uC131 \uBC0F \uCD08\uAE30\uD654\n */\n async initialize(): Promise<void> {\n this._logger.debug(\"watch \uC2DC\uC791\", { targets: this._options.targets });\n\n // sd.config.ts \uB85C\uB4DC\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({\n cwd: this._cwd,\n dev: true,\n opt: this._options.options,\n });\n this._logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n throw err;\n }\n\n // replaceDeps \uC124\uC815\uC774 \uC788\uC73C\uBA74 symlink \uAD50\uCCB4\n if (sdConfig.replaceDeps != null) {\n await setupReplaceDeps(this._cwd, sdConfig.replaceDeps);\n }\n\n // targets \uD544\uD130\uB9C1\n const allPackages = filterPackagesByTargets(sdConfig.packages, this._options.targets);\n\n // library \uD328\uD0A4\uC9C0\uB9CC \uD544\uD130\uB9C1 (node, browser, neutral)\n const isLibraryTarget = (target: string): target is BuildTarget =>\n target === \"node\" || target === \"browser\" || target === \"neutral\";\n\n const libraryConfigs: Record<string, SdPackageConfig> = {};\n for (const [name, config] of Object.entries(allPackages)) {\n if (isLibraryTarget(config.target)) {\n libraryConfigs[name] = config;\n }\n }\n\n if (Object.keys(libraryConfigs).length === 0) {\n process.stdout.write(\"\u26A0 watch\uD560 library \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n // PackageInfo \uBC30\uC5F4 \uC0DD\uC131\n this._packages = Object.entries(libraryConfigs).map(([name, config]) => ({\n name,\n dir: path.join(this._cwd, \"packages\", name),\n config,\n }));\n\n // \uC778\uD504\uB77C \uCD08\uAE30\uD654\n this._resultCollector = new ResultCollector();\n this._signalHandler = new SignalHandler();\n this._rebuildManager = new RebuildListrManager(this._logger);\n\n // \uBC30\uCE58 \uC644\uB8CC \uC2DC \uC5D0\uB7EC \uCD9C\uB825\n this._rebuildManager.on(\"batchComplete\", () => {\n printErrors(this._resultCollector.toMap());\n });\n\n // Builder \uC0DD\uC131\n const builderOptions = {\n cwd: this._cwd,\n packages: this._packages,\n resultCollector: this._resultCollector,\n rebuildManager: this._rebuildManager,\n };\n\n this._libraryBuilder = new LibraryBuilder(builderOptions);\n this._dtsBuilder = new DtsBuilder(builderOptions);\n\n // Builder \uCD08\uAE30\uD654\n await Promise.all([this._libraryBuilder.initialize(), this._dtsBuilder.initialize()]);\n }\n\n /**\n * Watch \uBAA8\uB4DC \uC2DC\uC791\n * - \uCD08\uAE30 \uBE4C\uB4DC Listr \uC2E4\uD589\n * - \uACB0\uACFC \uCD9C\uB825\n */\n async start(): Promise<void> {\n if (this._packages.length === 0) {\n return;\n }\n\n // \uCD08\uAE30 \uBE4C\uB4DC Listr \uAD6C\uC131\n const buildPromises = this._libraryBuilder.getInitialBuildPromises();\n const dtsPromises = this._dtsBuilder.getInitialBuildPromises();\n\n const initialListr = new Listr(\n [\n // Library \uBE4C\uB4DC \uD0DC\uC2A4\uD06C\n ...this._packages.map((pkg) => ({\n title: `${pkg.name} (${pkg.config.target})`,\n task: () => buildPromises.get(`${pkg.name}:build`) ?? Promise.resolve(),\n })),\n // DTS \uD0DC\uC2A4\uD06C\n ...this._packages.map((pkg) => ({\n title: `${pkg.name} (dts)`,\n task: () => dtsPromises.get(`${pkg.name}:dts`) ?? Promise.resolve(),\n })),\n ],\n { concurrent: true },\n );\n\n // Watch \uC2DC\uC791 (\uBC31\uADF8\uB77C\uC6B4\uB4DC \uC2E4\uD589)\n void this._libraryBuilder.startWatch();\n void this._dtsBuilder.startWatch();\n\n // Listr \uC2E4\uD589 (\uCD08\uAE30 \uBE4C\uB4DC \uC644\uB8CC\uAE4C\uC9C0 \uB300\uAE30)\n await initialListr.run();\n\n // \uCD08\uAE30 \uBE4C\uB4DC \uACB0\uACFC \uCD9C\uB825\n printErrors(this._resultCollector.toMap());\n }\n\n /**\n * \uC885\uB8CC \uC2DC\uADF8\uB110 \uB300\uAE30\n */\n async awaitTermination(): Promise<void> {\n if (this._packages.length === 0) {\n return;\n }\n await this._signalHandler.waitForTermination();\n }\n\n /**\n * Orchestrator \uC885\uB8CC\n */\n async shutdown(): Promise<void> {\n if (this._packages.length === 0) {\n return;\n }\n\n process.stdout.write(\"\u23F3 \uC885\uB8CC \uC911...\\n\");\n\n await Promise.all([this._libraryBuilder.shutdown(), this._dtsBuilder.shutdown()]);\n\n process.stdout.write(\"\u2714 \uC644\uB8CC\\n\");\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import path from \"path\";\nimport { Listr } from \"listr2\";\nimport { consola } from \"consola\";\nimport type { BuildTarget, SdConfig, SdPackageConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { filterPackagesByTargets } from \"../utils/package-utils\";\nimport { setupReplaceDeps } from \"../utils/replace-deps\";\nimport { printErrors } from \"../utils/output-utils\";\nimport { RebuildListrManager } from \"../utils/listr-manager\";\nimport { ResultCollector } from \"../infra/ResultCollector\";\nimport { SignalHandler } from \"../infra/SignalHandler\";\nimport { LibraryBuilder } from \"../builders/LibraryBuilder\";\nimport { DtsBuilder } from \"../builders/DtsBuilder\";\nimport type { PackageInfo } from \"../builders/types\";\nimport { watchCopySrcFiles } from \"../utils/copy-src\";\nimport type { FsWatcher } from \"@simplysm/core-node\";\nimport type { SdBuildPackageConfig } from \"../sd-config.types\";\n\n/**\n * Watch \uBA85\uB839 \uC635\uC158\n */\nexport interface WatchOrchestratorOptions {\n targets: string[];\n options: string[];\n}\n\n/**\n * Watch \uBAA8\uB4DC \uC2E4\uD589\uC744 \uC870\uC728\uD558\uB294 Orchestrator\n *\n * Library \uD328\uD0A4\uC9C0(node/browser/neutral)\uC758 watch \uBAA8\uB4DC \uC2E4\uD589\uC744 \uAD00\uB9AC\uD55C\uB2E4.\n * - LibraryBuilder: esbuild watch\n * - DtsBuilder: .d.ts \uC0DD\uC131\n */\nexport class WatchOrchestrator {\n private readonly _cwd: string;\n private readonly _options: WatchOrchestratorOptions;\n private readonly _logger = consola.withTag(\"sd:cli:watch\");\n\n private _resultCollector!: ResultCollector;\n private _signalHandler!: SignalHandler;\n private _rebuildManager!: RebuildListrManager;\n private _libraryBuilder!: LibraryBuilder;\n private _dtsBuilder!: DtsBuilder;\n private _packages: PackageInfo[] = [];\n private _copySrcWatchers: FsWatcher[] = [];\n\n constructor(options: WatchOrchestratorOptions) {\n this._cwd = process.cwd();\n this._options = options;\n }\n\n /**\n * Orchestrator \uCD08\uAE30\uD654\n * - sd.config.ts \uB85C\uB4DC\n * - \uD328\uD0A4\uC9C0 \uBD84\uB958\n * - Builder \uC0DD\uC131 \uBC0F \uCD08\uAE30\uD654\n */\n async initialize(): Promise<void> {\n this._logger.debug(\"watch \uC2DC\uC791\", { targets: this._options.targets });\n\n // sd.config.ts \uB85C\uB4DC\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({\n cwd: this._cwd,\n dev: true,\n opt: this._options.options,\n });\n this._logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n throw err;\n }\n\n // replaceDeps \uC124\uC815\uC774 \uC788\uC73C\uBA74 symlink \uAD50\uCCB4\n if (sdConfig.replaceDeps != null) {\n await setupReplaceDeps(this._cwd, sdConfig.replaceDeps);\n }\n\n // targets \uD544\uD130\uB9C1\n const allPackages = filterPackagesByTargets(sdConfig.packages, this._options.targets);\n\n // library \uD328\uD0A4\uC9C0\uB9CC \uD544\uD130\uB9C1 (node, browser, neutral)\n const isLibraryTarget = (target: string): target is BuildTarget =>\n target === \"node\" || target === \"browser\" || target === \"neutral\";\n\n const libraryConfigs: Record<string, SdPackageConfig> = {};\n for (const [name, config] of Object.entries(allPackages)) {\n if (isLibraryTarget(config.target)) {\n libraryConfigs[name] = config;\n }\n }\n\n if (Object.keys(libraryConfigs).length === 0) {\n process.stdout.write(\"\u26A0 watch\uD560 library \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n // PackageInfo \uBC30\uC5F4 \uC0DD\uC131\n this._packages = Object.entries(libraryConfigs).map(([name, config]) => ({\n name,\n dir: path.join(this._cwd, \"packages\", name),\n config,\n }));\n\n // \uC778\uD504\uB77C \uCD08\uAE30\uD654\n this._resultCollector = new ResultCollector();\n this._signalHandler = new SignalHandler();\n this._rebuildManager = new RebuildListrManager(this._logger);\n\n // \uBC30\uCE58 \uC644\uB8CC \uC2DC \uC5D0\uB7EC \uCD9C\uB825\n this._rebuildManager.on(\"batchComplete\", () => {\n printErrors(this._resultCollector.toMap());\n });\n\n // Builder \uC0DD\uC131\n const builderOptions = {\n cwd: this._cwd,\n packages: this._packages,\n resultCollector: this._resultCollector,\n rebuildManager: this._rebuildManager,\n };\n\n this._libraryBuilder = new LibraryBuilder(builderOptions);\n this._dtsBuilder = new DtsBuilder(builderOptions);\n\n // Builder \uCD08\uAE30\uD654\n await Promise.all([this._libraryBuilder.initialize(), this._dtsBuilder.initialize()]);\n }\n\n /**\n * Watch \uBAA8\uB4DC \uC2DC\uC791\n * - \uCD08\uAE30 \uBE4C\uB4DC Listr \uC2E4\uD589\n * - \uACB0\uACFC \uCD9C\uB825\n */\n async start(): Promise<void> {\n if (this._packages.length === 0) {\n return;\n }\n\n // \uCD08\uAE30 \uBE4C\uB4DC Listr \uAD6C\uC131\n const buildPromises = this._libraryBuilder.getInitialBuildPromises();\n const dtsPromises = this._dtsBuilder.getInitialBuildPromises();\n\n const initialListr = new Listr(\n [\n // Library \uBE4C\uB4DC \uD0DC\uC2A4\uD06C\n ...this._packages.map((pkg) => ({\n title: `${pkg.name} (${pkg.config.target})`,\n task: () => buildPromises.get(`${pkg.name}:build`) ?? Promise.resolve(),\n })),\n // DTS \uD0DC\uC2A4\uD06C\n ...this._packages.map((pkg) => ({\n title: `${pkg.name} (dts)`,\n task: () => dtsPromises.get(`${pkg.name}:dts`) ?? Promise.resolve(),\n })),\n ],\n { concurrent: true },\n );\n\n // copySrc watch \uC2DC\uC791\n for (const pkg of this._packages) {\n const buildConfig = pkg.config as SdBuildPackageConfig;\n if (buildConfig.copySrc != null && buildConfig.copySrc.length > 0) {\n const watcher = await watchCopySrcFiles(pkg.dir, buildConfig.copySrc);\n this._copySrcWatchers.push(watcher);\n }\n }\n\n // Watch \uC2DC\uC791 (\uBC31\uADF8\uB77C\uC6B4\uB4DC \uC2E4\uD589)\n void this._libraryBuilder.startWatch();\n void this._dtsBuilder.startWatch();\n\n // Listr \uC2E4\uD589 (\uCD08\uAE30 \uBE4C\uB4DC \uC644\uB8CC\uAE4C\uC9C0 \uB300\uAE30)\n await initialListr.run();\n\n // \uCD08\uAE30 \uBE4C\uB4DC \uACB0\uACFC \uCD9C\uB825\n printErrors(this._resultCollector.toMap());\n }\n\n /**\n * \uC885\uB8CC \uC2DC\uADF8\uB110 \uB300\uAE30\n */\n async awaitTermination(): Promise<void> {\n if (this._packages.length === 0) {\n return;\n }\n await this._signalHandler.waitForTermination();\n }\n\n /**\n * Orchestrator \uC885\uB8CC\n */\n async shutdown(): Promise<void> {\n if (this._packages.length === 0) {\n return;\n }\n\n process.stdout.write(\"\u23F3 \uC885\uB8CC \uC911...\\n\");\n\n await Promise.all([\n this._libraryBuilder.shutdown(),\n this._dtsBuilder.shutdown(),\n ...this._copySrcWatchers.map((w) => w.close()),\n ]);\n this._copySrcWatchers = [];\n\n process.stdout.write(\"\u2714 \uC644\uB8CC\\n\");\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }