@simplysm/sd-cli 13.0.0-beta.20 → 13.0.0-beta.22

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.
Files changed (33) hide show
  1. package/README.md +1 -1
  2. package/dist/builders/DtsBuilder.d.ts.map +1 -1
  3. package/dist/builders/DtsBuilder.js +1 -2
  4. package/dist/builders/DtsBuilder.js.map +2 -2
  5. package/dist/builders/LibraryBuilder.d.ts.map +1 -1
  6. package/dist/builders/LibraryBuilder.js +1 -2
  7. package/dist/builders/LibraryBuilder.js.map +2 -2
  8. package/dist/commands/build.d.ts.map +1 -1
  9. package/dist/commands/build.js +8 -4
  10. package/dist/commands/build.js.map +2 -2
  11. package/dist/commands/dev.d.ts.map +1 -1
  12. package/dist/commands/dev.js +7 -3
  13. package/dist/commands/dev.js.map +2 -2
  14. package/dist/commands/init.d.ts +1 -1
  15. package/dist/commands/init.d.ts.map +1 -1
  16. package/dist/commands/init.js +0 -3
  17. package/dist/commands/init.js.map +2 -2
  18. package/dist/commands/typecheck.js +1 -1
  19. package/dist/commands/typecheck.js.map +2 -2
  20. package/dist/orchestrators/WatchOrchestrator.d.ts.map +1 -1
  21. package/dist/orchestrators/WatchOrchestrator.js +4 -0
  22. package/dist/orchestrators/WatchOrchestrator.js.map +2 -2
  23. package/dist/sd-config.types.d.ts +7 -0
  24. package/dist/sd-config.types.d.ts.map +1 -1
  25. package/dist/utils/replace-deps.d.ts +32 -0
  26. package/dist/utils/replace-deps.d.ts.map +1 -0
  27. package/dist/utils/replace-deps.js +99 -0
  28. package/dist/utils/replace-deps.js.map +7 -0
  29. package/package.json +4 -4
  30. package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
  31. package/templates/add-server/__SERVER__/package.json.hbs +1 -1
  32. package/templates/init/package.json.hbs +3 -3
  33. package/templates/init/pnpm-workspace.yaml.hbs +9 -0
package/README.md CHANGED
@@ -211,7 +211,7 @@ sd-cli init
211
211
 
212
212
  After initialization, use `sd-cli add client` and `sd-cli add server` to add packages.
213
213
 
214
- > **Note**: To install Claude Code skills/agents, use `sd-claude install` from the separate `@simplysm/sd-claude` package.
214
+ > **Note**: Claude Code skills/agents are automatically installed via `@simplysm/claude` postinstall.
215
215
 
216
216
  ### add client
217
217
 
@@ -1 +1 @@
1
- {"version":3,"file":"DtsBuilder.d.ts","sourceRoot":"","sources":["../../src/builders/DtsBuilder.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;GAKG;AACH,qBAAa,UAAW,SAAQ,WAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IAKjE,SAAS,CAAC,cAAc,IAAI,MAAM;IAIlC;;OAEG;IACH,OAAO,CAAC,OAAO;IAMf,SAAS,CAAC,aAAa,IAAI,IAAI;IAM/B,SAAS,CAAC,qBAAqB,IAAI,IAAI;cAsDvB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB7D,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAsBpD"}
1
+ {"version":3,"file":"DtsBuilder.d.ts","sourceRoot":"","sources":["../../src/builders/DtsBuilder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;GAKG;AACH,qBAAa,UAAW,SAAQ,WAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IAKjE,SAAS,CAAC,cAAc,IAAI,MAAM;IAIlC;;OAEG;IACH,OAAO,CAAC,OAAO;IAMf,SAAS,CAAC,aAAa,IAAI,IAAI;IAM/B,SAAS,CAAC,qBAAqB,IAAI,IAAI;cAsDvB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB7D,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;CAsBpD"}
@@ -1,10 +1,9 @@
1
- import path from "path";
2
1
  import { BaseBuilder } from "./BaseBuilder.js";
3
2
  class DtsBuilder extends BaseBuilder {
4
3
  _workerPath;
5
4
  constructor(options) {
6
5
  super(options);
7
- this._workerPath = path.resolve(import.meta.dirname, "../workers/dts.worker.ts");
6
+ this._workerPath = import.meta.resolve("../workers/dts.worker");
8
7
  }
9
8
  getBuilderType() {
10
9
  return "dts";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/builders/DtsBuilder.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport type * as DtsWorkerModule from \"../workers/dts.worker\";\nimport type { BuildResult } from \"../infra/ResultCollector\";\nimport type { TypecheckEnv } from \"../utils/tsconfig\";\nimport type { BuildEventData, ErrorEventData } from \"../utils/worker-events\";\nimport { BaseBuilder } from \"./BaseBuilder\";\nimport type { PackageInfo } from \"./types\";\n\n/**\n * .d.ts \uD30C\uC77C \uC0DD\uC131\uC744 \uB2F4\uB2F9\uD558\uB294 Builder\n *\n * Library \uD328\uD0A4\uC9C0\uC758 TypeScript \uC120\uC5B8 \uD30C\uC77C \uC0DD\uC131\uC744 \uCC98\uB9AC\uD55C\uB2E4.\n * Watch \uBAA8\uB4DC\uC640 \uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\uB97C \uBAA8\uB450 \uC9C0\uC6D0\uD55C\uB2E4.\n */\nexport class DtsBuilder extends BaseBuilder {\n private readonly _workerPath: string;\n\n constructor(options: ConstructorParameters<typeof BaseBuilder>[0]) {\n super(options);\n this._workerPath = path.resolve(import.meta.dirname, \"../workers/dts.worker.ts\");\n }\n\n protected getBuilderType(): string {\n return \"dts\";\n }\n\n /**\n * \uD328\uD0A4\uC9C0 \uD0C0\uAC9F\uC5D0\uC11C TypecheckEnv \uACB0\uC815\n */\n private _getEnv(pkg: PackageInfo): TypecheckEnv {\n const target = pkg.config.target;\n if (target === \"node\") return \"node\";\n return \"browser\"; // browser, neutral, client \uBAA8\uB450 browser \uD658\uACBD\n }\n\n protected createWorkers(): void {\n for (const pkg of this.packages) {\n this.workerManager.create<typeof DtsWorkerModule>(`${pkg.name}:dts`, this._workerPath);\n }\n }\n\n protected registerEventHandlers(): void {\n for (const pkg of this.packages) {\n const worker = this.workerManager.get<typeof DtsWorkerModule>(`${pkg.name}:dts`)!;\n const resultKey = `${pkg.name}:dts`;\n const listrTitle = `${pkg.name} (dts)`;\n\n let isInitialBuild = true;\n\n // \uBE4C\uB4DC \uC2DC\uC791 (\uB9AC\uBE4C\uB4DC \uC2DC)\n worker.on(\"buildStart\", () => {\n if (!isInitialBuild && this.rebuildManager != null) {\n const resolver = this.rebuildManager.registerBuild(resultKey, listrTitle);\n this.buildResolvers.set(resultKey, resolver);\n }\n });\n\n // \uBE4C\uB4DC \uC644\uB8CC\n worker.on(\"build\", (data) => {\n const event = data as BuildEventData;\n const result: BuildResult = {\n name: pkg.name,\n target: pkg.config.target,\n type: \"dts\",\n status: event.success ? \"success\" : \"error\",\n message: event.errors?.join(\"\\n\"),\n };\n this.resultCollector.add(result);\n\n if (isInitialBuild) {\n isInitialBuild = false;\n }\n this.completeBuild(pkg);\n });\n\n // \uC5D0\uB7EC\n worker.on(\"error\", (data) => {\n const event = data as ErrorEventData;\n const result: BuildResult = {\n name: pkg.name,\n target: pkg.config.target,\n type: \"dts\",\n status: \"error\",\n message: event.message,\n };\n this.resultCollector.add(result);\n\n if (isInitialBuild) {\n isInitialBuild = false;\n }\n this.completeBuild(pkg);\n });\n }\n }\n\n protected async buildPackage(pkg: PackageInfo): Promise<void> {\n const worker = this.workerManager.get<typeof DtsWorkerModule>(`${pkg.name}:dts`)!;\n\n const buildPromise = new Promise<void>((resolve) => {\n const originalResolver = this.buildResolvers.get(`${pkg.name}:dts`);\n this.buildResolvers.set(`${pkg.name}:dts`, () => {\n originalResolver?.();\n resolve();\n });\n });\n\n void worker.startDtsWatch({\n name: pkg.name,\n cwd: this.cwd,\n pkgDir: pkg.dir,\n env: this._getEnv(pkg),\n });\n\n await buildPromise;\n }\n\n protected startWatchPackage(pkg: PackageInfo): void {\n const worker = this.workerManager.get<typeof DtsWorkerModule>(`${pkg.name}:dts`)!;\n\n worker\n .startDtsWatch({\n name: pkg.name,\n cwd: this.cwd,\n pkgDir: pkg.dir,\n env: this._getEnv(pkg),\n })\n .catch((err: unknown) => {\n const result: BuildResult = {\n name: pkg.name,\n target: pkg.config.target,\n type: \"dts\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n };\n this.resultCollector.add(result);\n this.completeBuild(pkg);\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type * as DtsWorkerModule from \"../workers/dts.worker\";\nimport type { BuildResult } from \"../infra/ResultCollector\";\nimport type { TypecheckEnv } from \"../utils/tsconfig\";\nimport type { BuildEventData, ErrorEventData } from \"../utils/worker-events\";\nimport { BaseBuilder } from \"./BaseBuilder\";\nimport type { PackageInfo } from \"./types\";\n\n/**\n * .d.ts \uD30C\uC77C \uC0DD\uC131\uC744 \uB2F4\uB2F9\uD558\uB294 Builder\n *\n * Library \uD328\uD0A4\uC9C0\uC758 TypeScript \uC120\uC5B8 \uD30C\uC77C \uC0DD\uC131\uC744 \uCC98\uB9AC\uD55C\uB2E4.\n * Watch \uBAA8\uB4DC\uC640 \uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\uB97C \uBAA8\uB450 \uC9C0\uC6D0\uD55C\uB2E4.\n */\nexport class DtsBuilder extends BaseBuilder {\n private readonly _workerPath: string;\n\n constructor(options: ConstructorParameters<typeof BaseBuilder>[0]) {\n super(options);\n this._workerPath = import.meta.resolve(\"../workers/dts.worker\");\n }\n\n protected getBuilderType(): string {\n return \"dts\";\n }\n\n /**\n * \uD328\uD0A4\uC9C0 \uD0C0\uAC9F\uC5D0\uC11C TypecheckEnv \uACB0\uC815\n */\n private _getEnv(pkg: PackageInfo): TypecheckEnv {\n const target = pkg.config.target;\n if (target === \"node\") return \"node\";\n return \"browser\"; // browser, neutral, client \uBAA8\uB450 browser \uD658\uACBD\n }\n\n protected createWorkers(): void {\n for (const pkg of this.packages) {\n this.workerManager.create<typeof DtsWorkerModule>(`${pkg.name}:dts`, this._workerPath);\n }\n }\n\n protected registerEventHandlers(): void {\n for (const pkg of this.packages) {\n const worker = this.workerManager.get<typeof DtsWorkerModule>(`${pkg.name}:dts`)!;\n const resultKey = `${pkg.name}:dts`;\n const listrTitle = `${pkg.name} (dts)`;\n\n let isInitialBuild = true;\n\n // \uBE4C\uB4DC \uC2DC\uC791 (\uB9AC\uBE4C\uB4DC \uC2DC)\n worker.on(\"buildStart\", () => {\n if (!isInitialBuild && this.rebuildManager != null) {\n const resolver = this.rebuildManager.registerBuild(resultKey, listrTitle);\n this.buildResolvers.set(resultKey, resolver);\n }\n });\n\n // \uBE4C\uB4DC \uC644\uB8CC\n worker.on(\"build\", (data) => {\n const event = data as BuildEventData;\n const result: BuildResult = {\n name: pkg.name,\n target: pkg.config.target,\n type: \"dts\",\n status: event.success ? \"success\" : \"error\",\n message: event.errors?.join(\"\\n\"),\n };\n this.resultCollector.add(result);\n\n if (isInitialBuild) {\n isInitialBuild = false;\n }\n this.completeBuild(pkg);\n });\n\n // \uC5D0\uB7EC\n worker.on(\"error\", (data) => {\n const event = data as ErrorEventData;\n const result: BuildResult = {\n name: pkg.name,\n target: pkg.config.target,\n type: \"dts\",\n status: \"error\",\n message: event.message,\n };\n this.resultCollector.add(result);\n\n if (isInitialBuild) {\n isInitialBuild = false;\n }\n this.completeBuild(pkg);\n });\n }\n }\n\n protected async buildPackage(pkg: PackageInfo): Promise<void> {\n const worker = this.workerManager.get<typeof DtsWorkerModule>(`${pkg.name}:dts`)!;\n\n const buildPromise = new Promise<void>((resolve) => {\n const originalResolver = this.buildResolvers.get(`${pkg.name}:dts`);\n this.buildResolvers.set(`${pkg.name}:dts`, () => {\n originalResolver?.();\n resolve();\n });\n });\n\n void worker.startDtsWatch({\n name: pkg.name,\n cwd: this.cwd,\n pkgDir: pkg.dir,\n env: this._getEnv(pkg),\n });\n\n await buildPromise;\n }\n\n protected startWatchPackage(pkg: PackageInfo): void {\n const worker = this.workerManager.get<typeof DtsWorkerModule>(`${pkg.name}:dts`)!;\n\n worker\n .startDtsWatch({\n name: pkg.name,\n cwd: this.cwd,\n pkgDir: pkg.dir,\n env: this._getEnv(pkg),\n })\n .catch((err: unknown) => {\n const result: BuildResult = {\n name: pkg.name,\n target: pkg.config.target,\n type: \"dts\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n };\n this.resultCollector.add(result);\n this.completeBuild(pkg);\n });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LibraryBuilder.d.ts","sourceRoot":"","sources":["../../src/builders/LibraryBuilder.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IAKjE,SAAS,CAAC,cAAc,IAAI,MAAM;IAIlC,SAAS,CAAC,aAAa,IAAI,IAAI;IAM/B,SAAS,CAAC,qBAAqB,IAAI,IAAI;cAwDvB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB7D,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAwBnD;;OAEG;IACY,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAsBzC"}
1
+ {"version":3,"file":"LibraryBuilder.d.ts","sourceRoot":"","sources":["../../src/builders/LibraryBuilder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IAKjE,SAAS,CAAC,cAAc,IAAI,MAAM;IAIlC,SAAS,CAAC,aAAa,IAAI,IAAI;IAM/B,SAAS,CAAC,qBAAqB,IAAI,IAAI;cAwDvB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB7D,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAwBnD;;OAEG;IACY,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAsBzC"}
@@ -1,10 +1,9 @@
1
- import path from "path";
2
1
  import { BaseBuilder } from "./BaseBuilder.js";
3
2
  class LibraryBuilder extends BaseBuilder {
4
3
  _workerPath;
5
4
  constructor(options) {
6
5
  super(options);
7
- this._workerPath = path.resolve(import.meta.dirname, "../workers/library.worker.ts");
6
+ this._workerPath = import.meta.resolve("../workers/library.worker");
8
7
  }
9
8
  getBuilderType() {
10
9
  return "build";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/builders/LibraryBuilder.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport type * as LibraryWorkerModule from \"../workers/library.worker\";\nimport type { BuildResult } from \"../infra/ResultCollector\";\nimport type { SdBuildPackageConfig } from \"../sd-config.types\";\nimport type { BuildEventData, ErrorEventData } from \"../utils/worker-events\";\nimport { BaseBuilder } from \"./BaseBuilder\";\nimport type { PackageInfo } from \"./types\";\n\n/**\n * Library \uD328\uD0A4\uC9C0 \uBE4C\uB4DC\uB97C \uB2F4\uB2F9\uD558\uB294 Builder\n *\n * node/browser/neutral \uD0C0\uAC9F \uD328\uD0A4\uC9C0\uC758 esbuild \uBE4C\uB4DC\uB97C \uCC98\uB9AC\uD55C\uB2E4.\n * Watch \uBAA8\uB4DC\uC640 \uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\uB97C \uBAA8\uB450 \uC9C0\uC6D0\uD55C\uB2E4.\n */\nexport class LibraryBuilder extends BaseBuilder {\n private readonly _workerPath: string;\n\n constructor(options: ConstructorParameters<typeof BaseBuilder>[0]) {\n super(options);\n this._workerPath = path.resolve(import.meta.dirname, \"../workers/library.worker.ts\");\n }\n\n protected getBuilderType(): string {\n return \"build\";\n }\n\n protected createWorkers(): void {\n for (const pkg of this.packages) {\n this.workerManager.create<typeof LibraryWorkerModule>(`${pkg.name}:build`, this._workerPath);\n }\n }\n\n protected registerEventHandlers(): void {\n for (const pkg of this.packages) {\n const worker = this.workerManager.get<typeof LibraryWorkerModule>(`${pkg.name}:build`)!;\n const resultKey = `${pkg.name}:build`;\n const listrTitle = `${pkg.name} (${pkg.config.target})`;\n\n // \uCD08\uAE30 \uBE4C\uB4DC \uC5EC\uBD80 \uCD94\uC801\n let isInitialBuild = true;\n\n // \uBE4C\uB4DC \uC2DC\uC791 (\uB9AC\uBE4C\uB4DC \uC2DC)\n worker.on(\"buildStart\", () => {\n if (!isInitialBuild && this.rebuildManager != null) {\n // \uB9AC\uBE4C\uB4DC \uC2DC RebuildListrManager\uC5D0 \uB4F1\uB85D\n const resolver = this.rebuildManager.registerBuild(resultKey, listrTitle);\n this.buildResolvers.set(resultKey, resolver);\n }\n });\n\n // \uBE4C\uB4DC \uC644\uB8CC\n worker.on(\"build\", (data) => {\n const event = data as BuildEventData;\n const result: BuildResult = {\n name: pkg.name,\n target: pkg.config.target,\n type: \"build\",\n status: event.success ? \"success\" : \"error\",\n message: event.errors?.join(\"\\n\"),\n };\n this.resultCollector.add(result);\n\n if (isInitialBuild) {\n isInitialBuild = false;\n }\n this.completeBuild(pkg);\n });\n\n // \uC5D0\uB7EC\n worker.on(\"error\", (data) => {\n const event = data as ErrorEventData;\n const result: BuildResult = {\n name: pkg.name,\n target: pkg.config.target,\n type: \"build\",\n status: \"error\",\n message: event.message,\n };\n this.resultCollector.add(result);\n\n if (isInitialBuild) {\n isInitialBuild = false;\n }\n this.completeBuild(pkg);\n });\n }\n }\n\n protected async buildPackage(pkg: PackageInfo): Promise<void> {\n const worker = this.workerManager.get<typeof LibraryWorkerModule>(`${pkg.name}:build`)!;\n\n // \uBE4C\uB4DC \uC644\uB8CC Promise \uC0DD\uC131\n const buildPromise = new Promise<void>((resolve) => {\n const originalResolver = this.buildResolvers.get(`${pkg.name}:build`);\n this.buildResolvers.set(`${pkg.name}:build`, () => {\n originalResolver?.();\n resolve();\n });\n });\n\n // \uBE4C\uB4DC \uC2DC\uC791 (await \uC5C6\uC774 - \uC774\uBCA4\uD2B8\uB85C \uC644\uB8CC \uAC10\uC9C0)\n // LibraryBuilder\uB294 library \uD328\uD0A4\uC9C0(node/browser/neutral)\uB9CC \uBC1B\uC73C\uBBC0\uB85C \uCE90\uC2A4\uD305 \uC548\uC804\n void worker.startWatch({\n name: pkg.name,\n config: pkg.config as SdBuildPackageConfig,\n cwd: this.cwd,\n pkgDir: pkg.dir,\n });\n\n await buildPromise;\n }\n\n protected startWatchPackage(pkg: PackageInfo): void {\n const worker = this.workerManager.get<typeof LibraryWorkerModule>(`${pkg.name}:build`)!;\n\n // LibraryBuilder\uB294 library \uD328\uD0A4\uC9C0(node/browser/neutral)\uB9CC \uBC1B\uC73C\uBBC0\uB85C \uCE90\uC2A4\uD305 \uC548\uC804\n worker\n .startWatch({\n name: pkg.name,\n config: pkg.config as SdBuildPackageConfig,\n cwd: this.cwd,\n pkgDir: pkg.dir,\n })\n .catch((err: unknown) => {\n const result: BuildResult = {\n name: pkg.name,\n target: pkg.config.target,\n type: \"build\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n };\n this.resultCollector.add(result);\n this.completeBuild(pkg);\n });\n }\n\n /**\n * Graceful shutdown (esbuild context dispose)\n */\n override async shutdown(): Promise<void> {\n const shutdownTimeout = 3000;\n\n // \uAC01 Worker\uC758 stopWatch \uBA54\uC11C\uB4DC \uD638\uCD9C \uD6C4 terminate\n await Promise.all(\n this.workerManager.ids.map(async (id) => {\n const worker = this.workerManager.get<typeof LibraryWorkerModule>(id);\n if (worker != null) {\n try {\n await Promise.race([\n worker.stopWatch(),\n new Promise<void>((resolve) => setTimeout(resolve, shutdownTimeout)),\n ]);\n } catch {\n // stopWatch \uC2E4\uD328\uD574\uB3C4 \uACC4\uC18D \uC9C4\uD589\n }\n }\n }),\n );\n\n await super.shutdown();\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type * as LibraryWorkerModule from \"../workers/library.worker\";\nimport type { BuildResult } from \"../infra/ResultCollector\";\nimport type { SdBuildPackageConfig } from \"../sd-config.types\";\nimport type { BuildEventData, ErrorEventData } from \"../utils/worker-events\";\nimport { BaseBuilder } from \"./BaseBuilder\";\nimport type { PackageInfo } from \"./types\";\n\n/**\n * Library \uD328\uD0A4\uC9C0 \uBE4C\uB4DC\uB97C \uB2F4\uB2F9\uD558\uB294 Builder\n *\n * node/browser/neutral \uD0C0\uAC9F \uD328\uD0A4\uC9C0\uC758 esbuild \uBE4C\uB4DC\uB97C \uCC98\uB9AC\uD55C\uB2E4.\n * Watch \uBAA8\uB4DC\uC640 \uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\uB97C \uBAA8\uB450 \uC9C0\uC6D0\uD55C\uB2E4.\n */\nexport class LibraryBuilder extends BaseBuilder {\n private readonly _workerPath: string;\n\n constructor(options: ConstructorParameters<typeof BaseBuilder>[0]) {\n super(options);\n this._workerPath = import.meta.resolve(\"../workers/library.worker\");\n }\n\n protected getBuilderType(): string {\n return \"build\";\n }\n\n protected createWorkers(): void {\n for (const pkg of this.packages) {\n this.workerManager.create<typeof LibraryWorkerModule>(`${pkg.name}:build`, this._workerPath);\n }\n }\n\n protected registerEventHandlers(): void {\n for (const pkg of this.packages) {\n const worker = this.workerManager.get<typeof LibraryWorkerModule>(`${pkg.name}:build`)!;\n const resultKey = `${pkg.name}:build`;\n const listrTitle = `${pkg.name} (${pkg.config.target})`;\n\n // \uCD08\uAE30 \uBE4C\uB4DC \uC5EC\uBD80 \uCD94\uC801\n let isInitialBuild = true;\n\n // \uBE4C\uB4DC \uC2DC\uC791 (\uB9AC\uBE4C\uB4DC \uC2DC)\n worker.on(\"buildStart\", () => {\n if (!isInitialBuild && this.rebuildManager != null) {\n // \uB9AC\uBE4C\uB4DC \uC2DC RebuildListrManager\uC5D0 \uB4F1\uB85D\n const resolver = this.rebuildManager.registerBuild(resultKey, listrTitle);\n this.buildResolvers.set(resultKey, resolver);\n }\n });\n\n // \uBE4C\uB4DC \uC644\uB8CC\n worker.on(\"build\", (data) => {\n const event = data as BuildEventData;\n const result: BuildResult = {\n name: pkg.name,\n target: pkg.config.target,\n type: \"build\",\n status: event.success ? \"success\" : \"error\",\n message: event.errors?.join(\"\\n\"),\n };\n this.resultCollector.add(result);\n\n if (isInitialBuild) {\n isInitialBuild = false;\n }\n this.completeBuild(pkg);\n });\n\n // \uC5D0\uB7EC\n worker.on(\"error\", (data) => {\n const event = data as ErrorEventData;\n const result: BuildResult = {\n name: pkg.name,\n target: pkg.config.target,\n type: \"build\",\n status: \"error\",\n message: event.message,\n };\n this.resultCollector.add(result);\n\n if (isInitialBuild) {\n isInitialBuild = false;\n }\n this.completeBuild(pkg);\n });\n }\n }\n\n protected async buildPackage(pkg: PackageInfo): Promise<void> {\n const worker = this.workerManager.get<typeof LibraryWorkerModule>(`${pkg.name}:build`)!;\n\n // \uBE4C\uB4DC \uC644\uB8CC Promise \uC0DD\uC131\n const buildPromise = new Promise<void>((resolve) => {\n const originalResolver = this.buildResolvers.get(`${pkg.name}:build`);\n this.buildResolvers.set(`${pkg.name}:build`, () => {\n originalResolver?.();\n resolve();\n });\n });\n\n // \uBE4C\uB4DC \uC2DC\uC791 (await \uC5C6\uC774 - \uC774\uBCA4\uD2B8\uB85C \uC644\uB8CC \uAC10\uC9C0)\n // LibraryBuilder\uB294 library \uD328\uD0A4\uC9C0(node/browser/neutral)\uB9CC \uBC1B\uC73C\uBBC0\uB85C \uCE90\uC2A4\uD305 \uC548\uC804\n void worker.startWatch({\n name: pkg.name,\n config: pkg.config as SdBuildPackageConfig,\n cwd: this.cwd,\n pkgDir: pkg.dir,\n });\n\n await buildPromise;\n }\n\n protected startWatchPackage(pkg: PackageInfo): void {\n const worker = this.workerManager.get<typeof LibraryWorkerModule>(`${pkg.name}:build`)!;\n\n // LibraryBuilder\uB294 library \uD328\uD0A4\uC9C0(node/browser/neutral)\uB9CC \uBC1B\uC73C\uBBC0\uB85C \uCE90\uC2A4\uD305 \uC548\uC804\n worker\n .startWatch({\n name: pkg.name,\n config: pkg.config as SdBuildPackageConfig,\n cwd: this.cwd,\n pkgDir: pkg.dir,\n })\n .catch((err: unknown) => {\n const result: BuildResult = {\n name: pkg.name,\n target: pkg.config.target,\n type: \"build\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n };\n this.resultCollector.add(result);\n this.completeBuild(pkg);\n });\n }\n\n /**\n * Graceful shutdown (esbuild context dispose)\n */\n override async shutdown(): Promise<void> {\n const shutdownTimeout = 3000;\n\n // \uAC01 Worker\uC758 stopWatch \uBA54\uC11C\uB4DC \uD638\uCD9C \uD6C4 terminate\n await Promise.all(\n this.workerManager.ids.map(async (id) => {\n const worker = this.workerManager.get<typeof LibraryWorkerModule>(id);\n if (worker != null) {\n try {\n await Promise.race([\n worker.stopWatch(),\n new Promise<void>((resolve) => setTimeout(resolve, shutdownTimeout)),\n ]);\n } catch {\n // stopWatch \uC2E4\uD328\uD574\uB3C4 \uACC4\uC18D \uC9C4\uD589\n }\n }\n }),\n );\n\n await super.shutdown();\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAIA,OAAO,uBAAuB,CAAC;AAiB/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,CAgVnE"}
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,CAqVnE"}
@@ -6,6 +6,7 @@ import "@simplysm/core-common";
6
6
  import { consola, LogLevels } from "consola";
7
7
  import { loadSdConfig } from "../utils/sd-config.js";
8
8
  import { getVersion } from "../utils/build-env.js";
9
+ import { setupReplaceDeps } from "../utils/replace-deps.js";
9
10
  import { deserializeDiagnostic } from "../utils/typecheck-serialization.js";
10
11
  import { runLint } from "./lint.js";
11
12
  import { Capacitor } from "../capacitor/capacitor.js";
@@ -45,6 +46,9 @@ async function runBuild(options) {
45
46
  process.exitCode = 1;
46
47
  return;
47
48
  }
49
+ if (sdConfig.replaceDeps != null) {
50
+ await setupReplaceDeps(cwd, sdConfig.replaceDeps);
51
+ }
48
52
  const version = await getVersion(cwd);
49
53
  const baseEnv = { VER: version, DEV: "false" };
50
54
  const { buildPackages, clientPackages, serverPackages } = classifyPackages(sdConfig.packages, targets);
@@ -64,10 +68,10 @@ async function runBuild(options) {
64
68
  });
65
69
  const results = [];
66
70
  const state = { hasError: false };
67
- const libraryWorkerPath = path.resolve(import.meta.dirname, "../workers/library.worker.ts");
68
- const serverWorkerPath = path.resolve(import.meta.dirname, "../workers/server.worker.ts");
69
- const clientWorkerPath = path.resolve(import.meta.dirname, "../workers/client.worker.ts");
70
- const dtsWorkerPath = path.resolve(import.meta.dirname, "../workers/dts.worker.ts");
71
+ const libraryWorkerPath = import.meta.resolve("../workers/library.worker");
72
+ const serverWorkerPath = import.meta.resolve("../workers/server.worker");
73
+ const clientWorkerPath = import.meta.resolve("../workers/client.worker");
74
+ const dtsWorkerPath = import.meta.resolve("../workers/dts.worker");
71
75
  const fileCache = /* @__PURE__ */ new Map();
72
76
  const formatHost = {
73
77
  getCanonicalFileName: (f) => f,
@@ -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 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 // 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 = path.resolve(import.meta.dirname, \"../workers/library.worker.ts\");\n const serverWorkerPath = path.resolve(import.meta.dirname, \"../workers/server.worker.ts\");\n const clientWorkerPath = path.resolve(import.meta.dirname, \"../workers/client.worker.ts\");\n const dtsWorkerPath = path.resolve(import.meta.dirname, \"../workers/dts.worker.ts\");\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 });\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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",
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 });\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":"AAwBA;;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,CAkhB/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,CAuhB/D"}
@@ -5,6 +5,7 @@ import { Worker } from "@simplysm/core-node";
5
5
  import { consola } from "consola";
6
6
  import { loadSdConfig } from "../utils/sd-config.js";
7
7
  import { getVersion } from "../utils/build-env.js";
8
+ import { setupReplaceDeps } from "../utils/replace-deps.js";
8
9
  import { Capacitor } from "../capacitor/capacitor.js";
9
10
  import { filterPackagesByTargets, getWatchScopes } from "../utils/package-utils.js";
10
11
  import { printErrors, printServers } from "../utils/output-utils.js";
@@ -26,6 +27,9 @@ async function runDev(options) {
26
27
  process.exitCode = 1;
27
28
  return;
28
29
  }
30
+ if (sdConfig.replaceDeps != null) {
31
+ await setupReplaceDeps(cwd, sdConfig.replaceDeps);
32
+ }
29
33
  const version = await getVersion(cwd);
30
34
  const baseEnv = { VER: version, DEV: "true" };
31
35
  const rootPkgJsonPath = path.join(cwd, "package.json");
@@ -54,9 +58,9 @@ async function runDev(options) {
54
58
  serverClientsMap.set(config.server, clients);
55
59
  }
56
60
  }
57
- const clientWorkerPath = path.resolve(import.meta.dirname, "../workers/client.worker.ts");
58
- const serverWorkerPath = path.resolve(import.meta.dirname, "../workers/server.worker.ts");
59
- const serverRuntimeWorkerPath = path.resolve(import.meta.dirname, "../workers/server-runtime.worker.ts");
61
+ const clientWorkerPath = import.meta.resolve("../workers/client.worker");
62
+ const serverWorkerPath = import.meta.resolve("../workers/server.worker");
63
+ const serverRuntimeWorkerPath = import.meta.resolve("../workers/server-runtime.worker");
60
64
  const standaloneClientWorkers = clientPackages.filter(
61
65
  ({ config }) => typeof config.server === "number" || typeof config.server === "string" && !serverNames.has(config.server)
62
66
  ).map(({ name, config }) => ({
@@ -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 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 // 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 = path.resolve(import.meta.dirname, \"../workers/client.worker.ts\");\n const serverWorkerPath = path.resolve(import.meta.dirname, \"../workers/server.worker.ts\");\n const serverRuntimeWorkerPath = path.resolve(import.meta.dirname, \"../workers/server-runtime.worker.ts\");\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 })\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 })\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
  }
@@ -9,7 +9,7 @@ export interface InitOptions {
9
9
  * 1. 디렉토리 비어있는지 확인
10
10
  * 2. 프로젝트명(폴더명) 검증
11
11
  * 3. Handlebars 템플릿 렌더링
12
- * 4. pnpm install + sd-cli install 실행
12
+ * 4. pnpm install 실행
13
13
  */
14
14
  export declare function runInit(_options: InitOptions): Promise<void>;
15
15
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,WAAW;CAAG;AA8B/B;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDlE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,WAAW;CAAG;AA8B/B;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6ClE"}
@@ -39,9 +39,6 @@ async function runInit(_options) {
39
39
  logger.info("pnpm install \uC2E4\uD589 \uC911...");
40
40
  await spawn("pnpm", ["install"], { cwd });
41
41
  logger.success("pnpm install \uC644\uB8CC");
42
- logger.info("sd-claude install \uC2E4\uD589 \uC911...");
43
- await spawn("pnpm", ["exec", "sd-claude", "install"], { cwd });
44
- logger.success("sd-claude install \uC644\uB8CC");
45
42
  consola.box(
46
43
  [
47
44
  "\uD504\uB85C\uC81D\uD2B8\uAC00 \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4!",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/init.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport { consola } from \"consola\";\nimport { renderTemplateDir } from \"../utils/template\";\nimport { spawn } from \"../utils/spawn\";\n\n//#region Types\n\n/**\n * Init \uBA85\uB839 \uC635\uC158\n */\nexport interface InitOptions {}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * import.meta.dirname\uC5D0\uC11C \uC0C1\uC704\uB85C \uC62C\uB77C\uAC00\uBA70 package.json\uC744 \uCC3E\uC544 \uD328\uD0A4\uC9C0 \uB8E8\uD2B8\uB97C \uBC18\uD658\uD55C\uB2E4.\n */\nfunction findPackageRoot(startDir: string): string {\n let dir = startDir;\n while (!fs.existsSync(path.join(dir, \"package.json\"))) {\n const parent = path.dirname(dir);\n if (parent === dir) throw new Error(\"package.json\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n dir = parent;\n }\n return dir;\n}\n\n/**\n * npm \uC2A4\uCF54\uD504 \uC774\uB984 \uC720\uD6A8\uC131 \uAC80\uC99D\n */\nfunction isValidScopeName(name: string): boolean {\n return /^[a-z][a-z0-9-]*$/.test(name);\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uC0C8 Simplysm \uD504\uB85C\uC81D\uD2B8\uB97C \uD604\uC7AC \uB514\uB809\uD1A0\uB9AC\uC5D0 \uCD08\uAE30\uD654\uD55C\uB2E4.\n *\n * 1. \uB514\uB809\uD1A0\uB9AC \uBE44\uC5B4\uC788\uB294\uC9C0 \uD655\uC778\n * 2. \uD504\uB85C\uC81D\uD2B8\uBA85(\uD3F4\uB354\uBA85) \uAC80\uC99D\n * 3. Handlebars \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n * 4. pnpm install + sd-cli install \uC2E4\uD589\n */\nexport async function runInit(_options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:init\");\n\n // 1. \uB514\uB809\uD1A0\uB9AC \uBE44\uC5B4\uC788\uB294\uC9C0 \uD655\uC778 (dotfile/dotfolder \uC81C\uC678)\n const entries = fs.readdirSync(cwd).filter((e) => !e.startsWith(\".\"));\n if (entries.length > 0) {\n consola.error(\"\uB514\uB809\uD1A0\uB9AC\uAC00 \uBE44\uC5B4\uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uBE48 \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C \uC2E4\uD589\uD574\uC8FC\uC138\uC694.\");\n process.exitCode = 1;\n return;\n }\n\n // 2. \uD504\uB85C\uC81D\uD2B8\uBA85 \uAC80\uC99D\n const projectName = path.basename(cwd);\n if (!isValidScopeName(projectName)) {\n consola.error(`\uD504\uB85C\uC81D\uD2B8 \uC774\uB984 \"${projectName}\"\uC774(\uAC00) \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC18C\uBB38\uC790, \uC22B\uC790, \uD558\uC774\uD508\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4.`);\n process.exitCode = 1;\n return;\n }\n\n // 3. \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n const pkgRoot = findPackageRoot(import.meta.dirname);\n const templateDir = path.join(pkgRoot, \"templates\", \"init\");\n\n const context = { projectName };\n\n logger.info(\"\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C \uC0DD\uC131 \uC911...\");\n await renderTemplateDir(templateDir, cwd, context);\n logger.success(\"\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C \uC0DD\uC131 \uC644\uB8CC\");\n\n // 4. pnpm install\n logger.info(\"pnpm install \uC2E4\uD589 \uC911...\");\n await spawn(\"pnpm\", [\"install\"], { cwd });\n logger.success(\"pnpm install \uC644\uB8CC\");\n\n // 5. sd-claude install\n logger.info(\"sd-claude install \uC2E4\uD589 \uC911...\");\n await spawn(\"pnpm\", [\"exec\", \"sd-claude\", \"install\"], { cwd });\n logger.success(\"sd-claude install \uC644\uB8CC\");\n\n // 6. \uC644\uB8CC \uBA54\uC2DC\uC9C0\n consola.box(\n [\n \"\uD504\uB85C\uC81D\uD2B8\uAC00 \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4!\",\n \"\",\n \"\uB2E4\uC74C \uB2E8\uACC4:\",\n \" sd-cli add client \uD074\uB77C\uC774\uC5B8\uD2B8 \uD328\uD0A4\uC9C0 \uCD94\uAC00\",\n \" sd-cli add server \uC11C\uBC84 \uD328\uD0A4\uC9C0 \uCD94\uAC00\",\n ].join(\"\\n\"),\n );\n}\n\n//#endregion\n"],
5
- "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,aAAa;AAgBtB,SAAS,gBAAgB,UAA0B;AACjD,MAAI,MAAM;AACV,SAAO,CAAC,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,GAAG;AACrD,UAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK,OAAM,IAAI,MAAM,kEAA0B;AAC9D,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAKA,SAAS,iBAAiB,MAAuB;AAC/C,SAAO,oBAAoB,KAAK,IAAI;AACtC;AAcA,eAAsB,QAAQ,UAAsC;AAClE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,aAAa;AAG5C,QAAM,UAAU,GAAG,YAAY,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACpE,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,MAAM,qKAAmC;AACjD,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,cAAc,KAAK,SAAS,GAAG;AACrC,MAAI,CAAC,iBAAiB,WAAW,GAAG;AAClC,YAAQ,MAAM,0CAAY,WAAW,4KAA0C;AAC/E,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,UAAU,gBAAgB,YAAY,OAAO;AACnD,QAAM,cAAc,KAAK,KAAK,SAAS,aAAa,MAAM;AAE1D,QAAM,UAAU,EAAE,YAAY;AAE9B,SAAO,KAAK,8DAAiB;AAC7B,QAAM,kBAAkB,aAAa,KAAK,OAAO;AACjD,SAAO,QAAQ,iEAAe;AAG9B,SAAO,KAAK,qCAAsB;AAClC,QAAM,MAAM,QAAQ,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC;AACxC,SAAO,QAAQ,2BAAiB;AAGhC,SAAO,KAAK,0CAA2B;AACvC,QAAM,MAAM,QAAQ,CAAC,QAAQ,aAAa,SAAS,GAAG,EAAE,IAAI,CAAC;AAC7D,SAAO,QAAQ,gCAAsB;AAGrC,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;",
4
+ "sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport { consola } from \"consola\";\nimport { renderTemplateDir } from \"../utils/template\";\nimport { spawn } from \"../utils/spawn\";\n\n//#region Types\n\n/**\n * Init \uBA85\uB839 \uC635\uC158\n */\nexport interface InitOptions {}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * import.meta.dirname\uC5D0\uC11C \uC0C1\uC704\uB85C \uC62C\uB77C\uAC00\uBA70 package.json\uC744 \uCC3E\uC544 \uD328\uD0A4\uC9C0 \uB8E8\uD2B8\uB97C \uBC18\uD658\uD55C\uB2E4.\n */\nfunction findPackageRoot(startDir: string): string {\n let dir = startDir;\n while (!fs.existsSync(path.join(dir, \"package.json\"))) {\n const parent = path.dirname(dir);\n if (parent === dir) throw new Error(\"package.json\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n dir = parent;\n }\n return dir;\n}\n\n/**\n * npm \uC2A4\uCF54\uD504 \uC774\uB984 \uC720\uD6A8\uC131 \uAC80\uC99D\n */\nfunction isValidScopeName(name: string): boolean {\n return /^[a-z][a-z0-9-]*$/.test(name);\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uC0C8 Simplysm \uD504\uB85C\uC81D\uD2B8\uB97C \uD604\uC7AC \uB514\uB809\uD1A0\uB9AC\uC5D0 \uCD08\uAE30\uD654\uD55C\uB2E4.\n *\n * 1. \uB514\uB809\uD1A0\uB9AC \uBE44\uC5B4\uC788\uB294\uC9C0 \uD655\uC778\n * 2. \uD504\uB85C\uC81D\uD2B8\uBA85(\uD3F4\uB354\uBA85) \uAC80\uC99D\n * 3. Handlebars \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n * 4. pnpm install \uC2E4\uD589\n */\nexport async function runInit(_options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:init\");\n\n // 1. \uB514\uB809\uD1A0\uB9AC \uBE44\uC5B4\uC788\uB294\uC9C0 \uD655\uC778 (dotfile/dotfolder \uC81C\uC678)\n const entries = fs.readdirSync(cwd).filter((e) => !e.startsWith(\".\"));\n if (entries.length > 0) {\n consola.error(\"\uB514\uB809\uD1A0\uB9AC\uAC00 \uBE44\uC5B4\uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uBE48 \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C \uC2E4\uD589\uD574\uC8FC\uC138\uC694.\");\n process.exitCode = 1;\n return;\n }\n\n // 2. \uD504\uB85C\uC81D\uD2B8\uBA85 \uAC80\uC99D\n const projectName = path.basename(cwd);\n if (!isValidScopeName(projectName)) {\n consola.error(`\uD504\uB85C\uC81D\uD2B8 \uC774\uB984 \"${projectName}\"\uC774(\uAC00) \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC18C\uBB38\uC790, \uC22B\uC790, \uD558\uC774\uD508\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4.`);\n process.exitCode = 1;\n return;\n }\n\n // 3. \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n const pkgRoot = findPackageRoot(import.meta.dirname);\n const templateDir = path.join(pkgRoot, \"templates\", \"init\");\n\n const context = { projectName };\n\n logger.info(\"\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C \uC0DD\uC131 \uC911...\");\n await renderTemplateDir(templateDir, cwd, context);\n logger.success(\"\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C \uC0DD\uC131 \uC644\uB8CC\");\n\n // 4. pnpm install\n logger.info(\"pnpm install \uC2E4\uD589 \uC911...\");\n await spawn(\"pnpm\", [\"install\"], { cwd });\n logger.success(\"pnpm install \uC644\uB8CC\");\n\n // 5. \uC644\uB8CC \uBA54\uC2DC\uC9C0\n consola.box(\n [\n \"\uD504\uB85C\uC81D\uD2B8\uAC00 \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4!\",\n \"\",\n \"\uB2E4\uC74C \uB2E8\uACC4:\",\n \" sd-cli add client \uD074\uB77C\uC774\uC5B8\uD2B8 \uD328\uD0A4\uC9C0 \uCD94\uAC00\",\n \" sd-cli add server \uC11C\uBC84 \uD328\uD0A4\uC9C0 \uCD94\uAC00\",\n ].join(\"\\n\"),\n );\n}\n\n//#endregion\n"],
5
+ "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,aAAa;AAgBtB,SAAS,gBAAgB,UAA0B;AACjD,MAAI,MAAM;AACV,SAAO,CAAC,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,GAAG;AACrD,UAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK,OAAM,IAAI,MAAM,kEAA0B;AAC9D,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAKA,SAAS,iBAAiB,MAAuB;AAC/C,SAAO,oBAAoB,KAAK,IAAI;AACtC;AAcA,eAAsB,QAAQ,UAAsC;AAClE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,aAAa;AAG5C,QAAM,UAAU,GAAG,YAAY,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACpE,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,MAAM,qKAAmC;AACjD,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,cAAc,KAAK,SAAS,GAAG;AACrC,MAAI,CAAC,iBAAiB,WAAW,GAAG;AAClC,YAAQ,MAAM,0CAAY,WAAW,4KAA0C;AAC/E,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,UAAU,gBAAgB,YAAY,OAAO;AACnD,QAAM,cAAc,KAAK,KAAK,SAAS,aAAa,MAAM;AAE1D,QAAM,UAAU,EAAE,YAAY;AAE9B,SAAO,KAAK,8DAAiB;AAC7B,QAAM,kBAAkB,aAAa,KAAK,OAAO;AACjD,SAAO,QAAQ,iEAAe;AAG9B,SAAO,KAAK,qCAAsB;AAClC,QAAM,MAAM,QAAQ,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC;AACxC,SAAO,QAAQ,2BAAiB;AAGhC,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;",
6
6
  "names": []
7
7
  }
@@ -101,7 +101,7 @@ async function runTypecheck(options) {
101
101
  const maxConcurrency = Math.max(Math.floor(os.cpus().length * 7 / 8), 1);
102
102
  const concurrency = Math.min(maxConcurrency, tasks.length);
103
103
  logger.debug("\uB3D9\uC2DC\uC131 \uC124\uC815", { concurrency, maxConcurrency, taskCount: tasks.length });
104
- const workerPath = path.resolve(import.meta.dirname, "../workers/dts.worker.ts");
104
+ const workerPath = import.meta.resolve("../workers/dts.worker");
105
105
  const workers = [];
106
106
  for (let i = 0; i < concurrency; i++) {
107
107
  workers.push(Worker.create(workerPath));
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/typecheck.ts"],
4
- "sourcesContent": ["import ts from \"typescript\";\nimport path from \"path\";\nimport os from \"os\";\nimport { Listr } from \"listr2\";\nimport { pathPosix, pathFilterByTargets, Worker, type WorkerProxy } from \"@simplysm/core-node\";\nimport \"@simplysm/core-common\";\nimport { consola, LogLevels } from \"consola\";\nimport type { SdConfig } from \"../sd-config.types\";\nimport { parseRootTsconfig, type TypecheckEnv } from \"../utils/tsconfig\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { deserializeDiagnostic } from \"../utils/typecheck-serialization\";\nimport type { DtsBuildInfo, DtsBuildResult } from \"../workers/dts.worker\";\nimport type * as DtsWorkerModule from \"../workers/dts.worker\";\n\n//#region Types\n\n/**\n * TypeScript \uD0C0\uC785\uCCB4\uD06C \uC635\uC158\n */\nexport interface TypecheckOptions {\n /** \uD0C0\uC785\uCCB4\uD06C\uD560 \uACBD\uB85C \uD544\uD130 (\uC608: `packages/core-common`). \uBE48 \uBC30\uC5F4\uC774\uBA74 tsconfig.json\uC5D0 \uC815\uC758\uB41C \uBAA8\uB4E0 \uD30C\uC77C \uB300\uC0C1 */\n targets: string[];\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n// \uD328\uD0A4\uC9C0 \uC815\uBCF4 (packages/* \uD558\uC704 \uD30C\uC77C \uBD84\uB958\uC6A9)\ninterface PackageInfo {\n name: string;\n dir: string;\n envs: TypecheckEnv[]; // neutral\uC740 [\"node\", \"browser\"], \uB098\uBA38\uC9C0\uB294 \uB2E8\uC77C \uD658\uACBD\n}\n\n// \uD0C0\uC785\uCCB4\uD06C \uC791\uC5C5 \uC815\uBCF4 (\uB0B4\uBD80 \uC0AC\uC6A9)\ninterface TypecheckTask {\n /** \uC791\uC5C5 \uD45C\uC2DC \uC774\uB984 (\uC608: \"\uD328\uD0A4\uC9C0: core-common [node]\") */\n displayName: string;\n /** dts.worker\uC5D0 \uC804\uB2EC\uD560 \uC815\uBCF4 */\n buildInfo: DtsBuildInfo;\n}\n\n//#endregion\n\n//#region Utilities\n\n/** \uACBD\uB85C \uBD84\uB958\uC6A9 \uC815\uADDC\uD45C\uD604\uC2DD */\nconst PATH_PATTERNS = {\n /** packages/{pkg}/... */\n PACKAGE: /^packages\\/([^/]+)\\//,\n} as const;\n\n/**\n * \uD328\uD0A4\uC9C0 \uD0C0\uAC9F\uC744 \uD0C0\uC785\uCCB4\uD06C \uD658\uACBD \uBAA9\uB85D\uC73C\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4.\n * - node/browser: \uD574\uB2F9 \uD658\uACBD\uB9CC\n * - neutral: node + browser \uB458 \uB2E4\n * - client: browser\uB85C \uCC98\uB9AC\n * @param target \uD328\uD0A4\uC9C0 \uBE4C\uB4DC \uD0C0\uAC9F\n * @returns \uD0C0\uC785\uCCB4\uD06C \uD658\uACBD \uBAA9\uB85D\n */\nfunction toTypecheckEnvs(target: string | undefined): TypecheckEnv[] {\n if (target === \"node\") return [\"node\"];\n if (target === \"browser\" || target === \"client\") return [\"browser\"];\n // neutral \uB610\uB294 \uBBF8\uC9C0\uC815\uC740 \uB458 \uB2E4\n return [\"node\", \"browser\"];\n}\n\n/**\n * \uD30C\uC77C \uACBD\uB85C\uC5D0\uC11C \uD328\uD0A4\uC9C0 \uC815\uBCF4\uB97C \uCD94\uCD9C\uD569\uB2C8\uB2E4.\n * scripts \uD0C0\uAC9F \uD328\uD0A4\uC9C0\uB294 \uC81C\uC678\uD569\uB2C8\uB2E4.\n * @internal \uD14C\uC2A4\uD2B8\uC6A9\uC73C\uB85C export\n */\nexport function extractPackages(fileNames: string[], cwd: string, config: SdConfig): Map<string, PackageInfo> {\n const packages = new Map<string, PackageInfo>();\n\n for (const fileName of fileNames) {\n const relativePath = pathPosix(path.relative(cwd, fileName));\n\n // packages/{pkg}/...\n const packageMatch = relativePath.match(PATH_PATTERNS.PACKAGE);\n if (packageMatch) {\n const pkgName = packageMatch[1];\n // scripts \uD0C0\uAC9F \uD328\uD0A4\uC9C0\uB294 \uC81C\uC678\n if (config.packages[pkgName]?.target === \"scripts\") continue;\n\n if (!packages.has(pkgName)) {\n packages.set(pkgName, {\n name: pkgName,\n dir: path.resolve(cwd, \"packages\", pkgName),\n envs: toTypecheckEnvs(config.packages[pkgName]?.target),\n });\n }\n }\n }\n\n return packages;\n}\n\n/**\n * \uD328\uD0A4\uC9C0 \uC815\uBCF4\uB85C\uBD80\uD130 \uD0C0\uC785\uCCB4\uD06C \uC791\uC5C5 \uBAA9\uB85D\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4.\n * neutral \uD328\uD0A4\uC9C0\uB294 node/browser \uB450 \uD658\uACBD\uC73C\uB85C \uBD84\uB9AC\uD558\uC5EC \uAC01\uAC01 \uCCB4\uD06C\uD569\uB2C8\uB2E4.\n * @param packages \uD328\uD0A4\uC9C0 \uC815\uBCF4 \uB9F5\n * @param cwd \uD604\uC7AC \uC791\uC5C5 \uB514\uB809\uD1A0\uB9AC\n * @returns \uD0C0\uC785\uCCB4\uD06C \uC791\uC5C5 \uC815\uBCF4 \uBC30\uC5F4\n */\nfunction createTypecheckTasks(packages: Map<string, PackageInfo>, cwd: string): TypecheckTask[] {\n const tasks: TypecheckTask[] = [];\n\n // packages/* - \uAC01 env\uB9C8\uB2E4 \uBCC4\uB3C4 task \uC0DD\uC131\n for (const info of packages.values()) {\n for (const env of info.envs) {\n const envSuffix = info.envs.length > 1 ? ` [${env}]` : \"\";\n tasks.push({\n displayName: `\uD328\uD0A4\uC9C0: ${info.name}${envSuffix}`,\n buildInfo: {\n name: info.name,\n cwd,\n pkgDir: info.dir,\n env,\n emit: false, // \uD0C0\uC785\uCCB4\uD06C\uB9CC \uC218\uD589 (dts \uC0DD\uC131 \uC548 \uD568)\n },\n });\n }\n }\n\n return tasks;\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * TypeScript \uD0C0\uC785\uCCB4\uD06C\uB97C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `tsconfig.json`\uC744 \uB85C\uB4DC\uD558\uC5EC \uCEF4\uD30C\uC77C\uB7EC \uC635\uC158 \uC801\uC6A9\n * - `sd.config.ts`\uB97C \uB85C\uB4DC\uD558\uC5EC \uD328\uD0A4\uC9C0\uBCC4 \uD0C0\uAC9F \uC815\uBCF4 \uD655\uC778 (\uC5C6\uC73C\uBA74 \uAE30\uBCF8\uAC12 \uC0AC\uC6A9)\n * - Worker threads\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC2E4\uC81C \uBCD1\uB82C \uD0C0\uC785\uCCB4\uD06C \uC218\uD589\n * - incremental \uCEF4\uD30C\uC77C \uC0AC\uC6A9 (`.cache/typecheck-{env}.tsbuildinfo`)\n * - listr2\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC9C4\uD589 \uC0C1\uD669 \uD45C\uC2DC\n * - \uC5D0\uB7EC \uBC1C\uC0DD \uC2DC `process.exitCode = 1` \uC124\uC815\n *\n * @param options - \uD0C0\uC785\uCCB4\uD06C \uC2E4\uD589 \uC635\uC158\n * @returns \uC644\uB8CC \uC2DC resolve. \uC5D0\uB7EC \uBC1C\uACAC \uC2DC `process.exitCode`\uB97C 1\uB85C \uC124\uC815\uD558\uACE0 resolve (throw\uD558\uC9C0 \uC54A\uC74C)\n */\nexport async function runTypecheck(options: TypecheckOptions): Promise<void> {\n const { targets } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:typecheck\");\n\n logger.debug(\"\uD0C0\uC785\uCCB4\uD06C \uC2DC\uC791\", { targets });\n\n const formatHost: ts.FormatDiagnosticsHost = {\n getCanonicalFileName: (f) => f,\n getCurrentDirectory: () => cwd,\n getNewLine: () => ts.sys.newLine,\n };\n\n // tsconfig.json \uB85C\uB4DC \uBC0F \uD30C\uC2F1\n let parsedConfig: ts.ParsedCommandLine;\n try {\n parsedConfig = parseRootTsconfig(cwd);\n } catch (err) {\n consola.error(err instanceof Error ? err.message : err);\n process.exitCode = 1;\n return;\n }\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 // sd.config.ts\uAC00 \uC5C6\uAC70\uB098 \uB85C\uB4DC \uC2E4\uD328 \uC2DC \uAE30\uBCF8\uAC12 \uC0AC\uC6A9\n sdConfig = { packages: {} };\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC2E4\uD328, \uAE30\uBCF8\uAC12 \uC0AC\uC6A9\", err);\n }\n\n // targets\uAC00 \uC9C0\uC815\uB418\uBA74 fileNames \uD544\uD130\uB9C1\n const fileNames = pathFilterByTargets(parsedConfig.fileNames, targets, cwd);\n\n if (fileNames.length === 0) {\n process.stdout.write(\"\u2714 \uD0C0\uC785\uCCB4\uD06C\uD560 \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n logger.info(\"\uD0C0\uC785\uCCB4\uD06C\uD560 \uD30C\uC77C \uC5C6\uC74C\");\n return;\n }\n\n // \uD328\uD0A4\uC9C0 \uC815\uBCF4 \uCD94\uCD9C\n const packages = extractPackages(fileNames, cwd, sdConfig);\n logger.debug(\"\uD328\uD0A4\uC9C0 \uCD94\uCD9C \uC644\uB8CC\", {\n packageCount: packages.size,\n packages: [...packages.keys()],\n });\n\n // \uD0C0\uC785\uCCB4\uD06C \uC791\uC5C5 \uC0DD\uC131\n const tasks = createTypecheckTasks(packages, cwd);\n\n if (tasks.length === 0) {\n process.stdout.write(\"\u2714 \uD0C0\uC785\uCCB4\uD06C\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n // \uB3D9\uC2DC\uC131 \uC124\uC815: CPU \uCF54\uC5B4\uC758 7/8\uB9CC \uC0AC\uC6A9 (\uC77C\uBC18\uC801\uC778 \uBCD1\uB82C \uBE4C\uB4DC \uB3C4\uAD6C\uC758 \uAE30\uBCF8\uAC12, OS/\uB2E4\uB978 \uD504\uB85C\uC138\uC2A4 \uC5EC\uC720\uBD84 \uD655\uBCF4, \uCD5C\uC18C 1, \uC791\uC5C5 \uC218 \uC774\uD558)\n const maxConcurrency = Math.max(Math.floor((os.cpus().length * 7) / 8), 1);\n const concurrency = Math.min(maxConcurrency, tasks.length);\n logger.debug(\"\uB3D9\uC2DC\uC131 \uC124\uC815\", { concurrency, maxConcurrency, taskCount: tasks.length });\n\n // Worker \uD480 \uC0DD\uC131 (\uC791\uC5C5 \uC218\uB9CC\uD07C\uB9CC \uC0DD\uC131)\n const workerPath = path.resolve(import.meta.dirname, \"../workers/dts.worker.ts\");\n const workers: WorkerProxy<typeof DtsWorkerModule>[] = [];\n for (let i = 0; i < concurrency; i++) {\n workers.push(Worker.create<typeof DtsWorkerModule>(workerPath));\n }\n\n // \uACB0\uACFC \uC218\uC9D1\uC6A9\n const allResults: { displayName: string; result: DtsBuildResult }[] = [];\n\n // listr2-Worker \uC5F0\uB3D9 \uD328\uD134:\n // 1. listr2\uC758 \uAC01 task\uB294 Promise\uB97C \uBC18\uD658\uD558\uACE0, \uD574\uB2F9 Promise\uAC00 resolve\uB418\uBA74 task\uAC00 \uC644\uB8CC\uB428\n // 2. taskResolvers \uB9F5\uC5D0 task\uBCC4 resolve \uD568\uC218\uB97C \uC800\uC7A5\n // 3. Worker\uAC00 \uC791\uC5C5 \uC644\uB8CC \uC2DC \uD574\uB2F9 task\uC758 resolver\uB97C \uD638\uCD9C\uD558\uC5EC listr2 UI \uC5C5\uB370\uC774\uD2B8\n // 4. Worker \uD480\uC740 \uB3C5\uB9BD\uC801\uC73C\uB85C \uC791\uC5C5 \uD050\uC5D0\uC11C task\uB97C \uAC00\uC838\uC640 \uC2E4\uD589\n const taskResolvers = new Map<string, () => void>();\n\n try {\n // \uC791\uC5C5 \uD050\n let taskIndex = 0;\n\n // Worker\uC5D0\uC11C \uC791\uC5C5 \uC2E4\uD589\n async function runNextTask(worker: WorkerProxy<typeof DtsWorkerModule>): Promise<void> {\n while (taskIndex < tasks.length) {\n const currentIndex = taskIndex++;\n const task = tasks[currentIndex];\n\n try {\n const result = await worker.buildDts(task.buildInfo);\n\n allResults.push({ displayName: task.displayName, result });\n } catch (err) {\n // Worker \uC624\uB958 \uB85C\uAE45 \uBC0F \uACB0\uACFC\uB85C \uBCC0\uD658\n logger.error(`Worker \uC624\uB958: ${task.displayName}`, {\n error: err instanceof Error ? err.message : String(err),\n });\n allResults.push({\n displayName: task.displayName,\n result: {\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n diagnostics: [],\n errorCount: 1,\n warningCount: 0,\n },\n });\n } finally {\n // \uC131\uACF5/\uC2E4\uD328 \uBAA8\uB450 task \uC644\uB8CC \uCC98\uB9AC\n taskResolvers.get(task.displayName)?.();\n }\n }\n }\n\n // listr2\uB85C \uC9C4\uD589 \uC0C1\uD669 \uD45C\uC2DC\n const listr = new Listr(\n tasks.map((task) => ({\n title: task.displayName,\n task: () =>\n new Promise<void>((resolve) => {\n taskResolvers.set(task.displayName, resolve);\n }),\n })),\n {\n concurrent: concurrency,\n exitOnError: false,\n renderer: consola.level >= LogLevels.debug ? \"verbose\" : \"default\",\n },\n );\n\n // \uBCD1\uB82C\uB85C \uBAA8\uB4E0 worker \uC2E4\uD589\n const workerPromises = workers.map((worker) => runNextTask(worker));\n\n // listr\uC640 worker \uB3D9\uC2DC \uC2E4\uD589\n await Promise.all([listr.run(), ...workerPromises]);\n } finally {\n // \uBBF8\uD574\uACB0 resolver \uC815\uB9AC (\uD0C0\uC784\uC544\uC6C3/\uBE44\uC815\uC0C1 \uC885\uB8CC \uB300\uBE44)\n for (const resolver of taskResolvers.values()) {\n resolver();\n }\n // Worker \uC885\uB8CC (\uC131\uACF5/\uC2E4\uD328 \uBAA8\uB450)\n await Promise.all(workers.map((w) => w.terminate()));\n }\n\n // \uACB0\uACFC \uCD9C\uB825\n const allDiagnostics: ts.Diagnostic[] = [];\n let totalErrorCount = 0;\n let totalWarningCount = 0;\n const fileCache = new Map<string, string>(); // \uD30C\uC77C \uB0B4\uC6A9 \uCE90\uC2DC (\uB3D9\uC77C \uD30C\uC77C \uC911\uBCF5 \uC77D\uAE30 \uBC29\uC9C0)\n for (const { result } of allResults) {\n totalErrorCount += result.errorCount;\n totalWarningCount += result.warningCount;\n for (const serialized of result.diagnostics) {\n allDiagnostics.push(deserializeDiagnostic(serialized, fileCache));\n }\n }\n\n if (totalErrorCount > 0) {\n logger.error(\"\uD0C0\uC785\uCCB4\uD06C \uC5D0\uB7EC \uBC1C\uC0DD\", {\n errorCount: totalErrorCount,\n warningCount: totalWarningCount,\n });\n } else if (totalWarningCount > 0) {\n logger.info(\"\uD0C0\uC785\uCCB4\uD06C \uC644\uB8CC (\uACBD\uACE0 \uC788\uC74C)\", {\n errorCount: totalErrorCount,\n warningCount: totalWarningCount,\n });\n } else {\n logger.info(\"\uD0C0\uC785\uCCB4\uD06C \uC644\uB8CC\", { errorCount: totalErrorCount, warningCount: totalWarningCount });\n }\n\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 if (totalErrorCount > 0) {\n process.exitCode = 1;\n }\n}\n\n//#endregion\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import ts from \"typescript\";\nimport path from \"path\";\nimport os from \"os\";\nimport { Listr } from \"listr2\";\nimport { pathPosix, pathFilterByTargets, Worker, type WorkerProxy } from \"@simplysm/core-node\";\nimport \"@simplysm/core-common\";\nimport { consola, LogLevels } from \"consola\";\nimport type { SdConfig } from \"../sd-config.types\";\nimport { parseRootTsconfig, type TypecheckEnv } from \"../utils/tsconfig\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { deserializeDiagnostic } from \"../utils/typecheck-serialization\";\nimport type { DtsBuildInfo, DtsBuildResult } from \"../workers/dts.worker\";\nimport type * as DtsWorkerModule from \"../workers/dts.worker\";\n\n//#region Types\n\n/**\n * TypeScript \uD0C0\uC785\uCCB4\uD06C \uC635\uC158\n */\nexport interface TypecheckOptions {\n /** \uD0C0\uC785\uCCB4\uD06C\uD560 \uACBD\uB85C \uD544\uD130 (\uC608: `packages/core-common`). \uBE48 \uBC30\uC5F4\uC774\uBA74 tsconfig.json\uC5D0 \uC815\uC758\uB41C \uBAA8\uB4E0 \uD30C\uC77C \uB300\uC0C1 */\n targets: string[];\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n// \uD328\uD0A4\uC9C0 \uC815\uBCF4 (packages/* \uD558\uC704 \uD30C\uC77C \uBD84\uB958\uC6A9)\ninterface PackageInfo {\n name: string;\n dir: string;\n envs: TypecheckEnv[]; // neutral\uC740 [\"node\", \"browser\"], \uB098\uBA38\uC9C0\uB294 \uB2E8\uC77C \uD658\uACBD\n}\n\n// \uD0C0\uC785\uCCB4\uD06C \uC791\uC5C5 \uC815\uBCF4 (\uB0B4\uBD80 \uC0AC\uC6A9)\ninterface TypecheckTask {\n /** \uC791\uC5C5 \uD45C\uC2DC \uC774\uB984 (\uC608: \"\uD328\uD0A4\uC9C0: core-common [node]\") */\n displayName: string;\n /** dts.worker\uC5D0 \uC804\uB2EC\uD560 \uC815\uBCF4 */\n buildInfo: DtsBuildInfo;\n}\n\n//#endregion\n\n//#region Utilities\n\n/** \uACBD\uB85C \uBD84\uB958\uC6A9 \uC815\uADDC\uD45C\uD604\uC2DD */\nconst PATH_PATTERNS = {\n /** packages/{pkg}/... */\n PACKAGE: /^packages\\/([^/]+)\\//,\n} as const;\n\n/**\n * \uD328\uD0A4\uC9C0 \uD0C0\uAC9F\uC744 \uD0C0\uC785\uCCB4\uD06C \uD658\uACBD \uBAA9\uB85D\uC73C\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4.\n * - node/browser: \uD574\uB2F9 \uD658\uACBD\uB9CC\n * - neutral: node + browser \uB458 \uB2E4\n * - client: browser\uB85C \uCC98\uB9AC\n * @param target \uD328\uD0A4\uC9C0 \uBE4C\uB4DC \uD0C0\uAC9F\n * @returns \uD0C0\uC785\uCCB4\uD06C \uD658\uACBD \uBAA9\uB85D\n */\nfunction toTypecheckEnvs(target: string | undefined): TypecheckEnv[] {\n if (target === \"node\") return [\"node\"];\n if (target === \"browser\" || target === \"client\") return [\"browser\"];\n // neutral \uB610\uB294 \uBBF8\uC9C0\uC815\uC740 \uB458 \uB2E4\n return [\"node\", \"browser\"];\n}\n\n/**\n * \uD30C\uC77C \uACBD\uB85C\uC5D0\uC11C \uD328\uD0A4\uC9C0 \uC815\uBCF4\uB97C \uCD94\uCD9C\uD569\uB2C8\uB2E4.\n * scripts \uD0C0\uAC9F \uD328\uD0A4\uC9C0\uB294 \uC81C\uC678\uD569\uB2C8\uB2E4.\n * @internal \uD14C\uC2A4\uD2B8\uC6A9\uC73C\uB85C export\n */\nexport function extractPackages(fileNames: string[], cwd: string, config: SdConfig): Map<string, PackageInfo> {\n const packages = new Map<string, PackageInfo>();\n\n for (const fileName of fileNames) {\n const relativePath = pathPosix(path.relative(cwd, fileName));\n\n // packages/{pkg}/...\n const packageMatch = relativePath.match(PATH_PATTERNS.PACKAGE);\n if (packageMatch) {\n const pkgName = packageMatch[1];\n // scripts \uD0C0\uAC9F \uD328\uD0A4\uC9C0\uB294 \uC81C\uC678\n if (config.packages[pkgName]?.target === \"scripts\") continue;\n\n if (!packages.has(pkgName)) {\n packages.set(pkgName, {\n name: pkgName,\n dir: path.resolve(cwd, \"packages\", pkgName),\n envs: toTypecheckEnvs(config.packages[pkgName]?.target),\n });\n }\n }\n }\n\n return packages;\n}\n\n/**\n * \uD328\uD0A4\uC9C0 \uC815\uBCF4\uB85C\uBD80\uD130 \uD0C0\uC785\uCCB4\uD06C \uC791\uC5C5 \uBAA9\uB85D\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4.\n * neutral \uD328\uD0A4\uC9C0\uB294 node/browser \uB450 \uD658\uACBD\uC73C\uB85C \uBD84\uB9AC\uD558\uC5EC \uAC01\uAC01 \uCCB4\uD06C\uD569\uB2C8\uB2E4.\n * @param packages \uD328\uD0A4\uC9C0 \uC815\uBCF4 \uB9F5\n * @param cwd \uD604\uC7AC \uC791\uC5C5 \uB514\uB809\uD1A0\uB9AC\n * @returns \uD0C0\uC785\uCCB4\uD06C \uC791\uC5C5 \uC815\uBCF4 \uBC30\uC5F4\n */\nfunction createTypecheckTasks(packages: Map<string, PackageInfo>, cwd: string): TypecheckTask[] {\n const tasks: TypecheckTask[] = [];\n\n // packages/* - \uAC01 env\uB9C8\uB2E4 \uBCC4\uB3C4 task \uC0DD\uC131\n for (const info of packages.values()) {\n for (const env of info.envs) {\n const envSuffix = info.envs.length > 1 ? ` [${env}]` : \"\";\n tasks.push({\n displayName: `\uD328\uD0A4\uC9C0: ${info.name}${envSuffix}`,\n buildInfo: {\n name: info.name,\n cwd,\n pkgDir: info.dir,\n env,\n emit: false, // \uD0C0\uC785\uCCB4\uD06C\uB9CC \uC218\uD589 (dts \uC0DD\uC131 \uC548 \uD568)\n },\n });\n }\n }\n\n return tasks;\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * TypeScript \uD0C0\uC785\uCCB4\uD06C\uB97C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `tsconfig.json`\uC744 \uB85C\uB4DC\uD558\uC5EC \uCEF4\uD30C\uC77C\uB7EC \uC635\uC158 \uC801\uC6A9\n * - `sd.config.ts`\uB97C \uB85C\uB4DC\uD558\uC5EC \uD328\uD0A4\uC9C0\uBCC4 \uD0C0\uAC9F \uC815\uBCF4 \uD655\uC778 (\uC5C6\uC73C\uBA74 \uAE30\uBCF8\uAC12 \uC0AC\uC6A9)\n * - Worker threads\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC2E4\uC81C \uBCD1\uB82C \uD0C0\uC785\uCCB4\uD06C \uC218\uD589\n * - incremental \uCEF4\uD30C\uC77C \uC0AC\uC6A9 (`.cache/typecheck-{env}.tsbuildinfo`)\n * - listr2\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC9C4\uD589 \uC0C1\uD669 \uD45C\uC2DC\n * - \uC5D0\uB7EC \uBC1C\uC0DD \uC2DC `process.exitCode = 1` \uC124\uC815\n *\n * @param options - \uD0C0\uC785\uCCB4\uD06C \uC2E4\uD589 \uC635\uC158\n * @returns \uC644\uB8CC \uC2DC resolve. \uC5D0\uB7EC \uBC1C\uACAC \uC2DC `process.exitCode`\uB97C 1\uB85C \uC124\uC815\uD558\uACE0 resolve (throw\uD558\uC9C0 \uC54A\uC74C)\n */\nexport async function runTypecheck(options: TypecheckOptions): Promise<void> {\n const { targets } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:typecheck\");\n\n logger.debug(\"\uD0C0\uC785\uCCB4\uD06C \uC2DC\uC791\", { targets });\n\n const formatHost: ts.FormatDiagnosticsHost = {\n getCanonicalFileName: (f) => f,\n getCurrentDirectory: () => cwd,\n getNewLine: () => ts.sys.newLine,\n };\n\n // tsconfig.json \uB85C\uB4DC \uBC0F \uD30C\uC2F1\n let parsedConfig: ts.ParsedCommandLine;\n try {\n parsedConfig = parseRootTsconfig(cwd);\n } catch (err) {\n consola.error(err instanceof Error ? err.message : err);\n process.exitCode = 1;\n return;\n }\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 // sd.config.ts\uAC00 \uC5C6\uAC70\uB098 \uB85C\uB4DC \uC2E4\uD328 \uC2DC \uAE30\uBCF8\uAC12 \uC0AC\uC6A9\n sdConfig = { packages: {} };\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC2E4\uD328, \uAE30\uBCF8\uAC12 \uC0AC\uC6A9\", err);\n }\n\n // targets\uAC00 \uC9C0\uC815\uB418\uBA74 fileNames \uD544\uD130\uB9C1\n const fileNames = pathFilterByTargets(parsedConfig.fileNames, targets, cwd);\n\n if (fileNames.length === 0) {\n process.stdout.write(\"\u2714 \uD0C0\uC785\uCCB4\uD06C\uD560 \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n logger.info(\"\uD0C0\uC785\uCCB4\uD06C\uD560 \uD30C\uC77C \uC5C6\uC74C\");\n return;\n }\n\n // \uD328\uD0A4\uC9C0 \uC815\uBCF4 \uCD94\uCD9C\n const packages = extractPackages(fileNames, cwd, sdConfig);\n logger.debug(\"\uD328\uD0A4\uC9C0 \uCD94\uCD9C \uC644\uB8CC\", {\n packageCount: packages.size,\n packages: [...packages.keys()],\n });\n\n // \uD0C0\uC785\uCCB4\uD06C \uC791\uC5C5 \uC0DD\uC131\n const tasks = createTypecheckTasks(packages, cwd);\n\n if (tasks.length === 0) {\n process.stdout.write(\"\u2714 \uD0C0\uC785\uCCB4\uD06C\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n // \uB3D9\uC2DC\uC131 \uC124\uC815: CPU \uCF54\uC5B4\uC758 7/8\uB9CC \uC0AC\uC6A9 (\uC77C\uBC18\uC801\uC778 \uBCD1\uB82C \uBE4C\uB4DC \uB3C4\uAD6C\uC758 \uAE30\uBCF8\uAC12, OS/\uB2E4\uB978 \uD504\uB85C\uC138\uC2A4 \uC5EC\uC720\uBD84 \uD655\uBCF4, \uCD5C\uC18C 1, \uC791\uC5C5 \uC218 \uC774\uD558)\n const maxConcurrency = Math.max(Math.floor((os.cpus().length * 7) / 8), 1);\n const concurrency = Math.min(maxConcurrency, tasks.length);\n logger.debug(\"\uB3D9\uC2DC\uC131 \uC124\uC815\", { concurrency, maxConcurrency, taskCount: tasks.length });\n\n // Worker \uD480 \uC0DD\uC131 (\uC791\uC5C5 \uC218\uB9CC\uD07C\uB9CC \uC0DD\uC131)\n const workerPath = import.meta.resolve(\"../workers/dts.worker\");\n const workers: WorkerProxy<typeof DtsWorkerModule>[] = [];\n for (let i = 0; i < concurrency; i++) {\n workers.push(Worker.create<typeof DtsWorkerModule>(workerPath));\n }\n\n // \uACB0\uACFC \uC218\uC9D1\uC6A9\n const allResults: { displayName: string; result: DtsBuildResult }[] = [];\n\n // listr2-Worker \uC5F0\uB3D9 \uD328\uD134:\n // 1. listr2\uC758 \uAC01 task\uB294 Promise\uB97C \uBC18\uD658\uD558\uACE0, \uD574\uB2F9 Promise\uAC00 resolve\uB418\uBA74 task\uAC00 \uC644\uB8CC\uB428\n // 2. taskResolvers \uB9F5\uC5D0 task\uBCC4 resolve \uD568\uC218\uB97C \uC800\uC7A5\n // 3. Worker\uAC00 \uC791\uC5C5 \uC644\uB8CC \uC2DC \uD574\uB2F9 task\uC758 resolver\uB97C \uD638\uCD9C\uD558\uC5EC listr2 UI \uC5C5\uB370\uC774\uD2B8\n // 4. Worker \uD480\uC740 \uB3C5\uB9BD\uC801\uC73C\uB85C \uC791\uC5C5 \uD050\uC5D0\uC11C task\uB97C \uAC00\uC838\uC640 \uC2E4\uD589\n const taskResolvers = new Map<string, () => void>();\n\n try {\n // \uC791\uC5C5 \uD050\n let taskIndex = 0;\n\n // Worker\uC5D0\uC11C \uC791\uC5C5 \uC2E4\uD589\n async function runNextTask(worker: WorkerProxy<typeof DtsWorkerModule>): Promise<void> {\n while (taskIndex < tasks.length) {\n const currentIndex = taskIndex++;\n const task = tasks[currentIndex];\n\n try {\n const result = await worker.buildDts(task.buildInfo);\n\n allResults.push({ displayName: task.displayName, result });\n } catch (err) {\n // Worker \uC624\uB958 \uB85C\uAE45 \uBC0F \uACB0\uACFC\uB85C \uBCC0\uD658\n logger.error(`Worker \uC624\uB958: ${task.displayName}`, {\n error: err instanceof Error ? err.message : String(err),\n });\n allResults.push({\n displayName: task.displayName,\n result: {\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n diagnostics: [],\n errorCount: 1,\n warningCount: 0,\n },\n });\n } finally {\n // \uC131\uACF5/\uC2E4\uD328 \uBAA8\uB450 task \uC644\uB8CC \uCC98\uB9AC\n taskResolvers.get(task.displayName)?.();\n }\n }\n }\n\n // listr2\uB85C \uC9C4\uD589 \uC0C1\uD669 \uD45C\uC2DC\n const listr = new Listr(\n tasks.map((task) => ({\n title: task.displayName,\n task: () =>\n new Promise<void>((resolve) => {\n taskResolvers.set(task.displayName, resolve);\n }),\n })),\n {\n concurrent: concurrency,\n exitOnError: false,\n renderer: consola.level >= LogLevels.debug ? \"verbose\" : \"default\",\n },\n );\n\n // \uBCD1\uB82C\uB85C \uBAA8\uB4E0 worker \uC2E4\uD589\n const workerPromises = workers.map((worker) => runNextTask(worker));\n\n // listr\uC640 worker \uB3D9\uC2DC \uC2E4\uD589\n await Promise.all([listr.run(), ...workerPromises]);\n } finally {\n // \uBBF8\uD574\uACB0 resolver \uC815\uB9AC (\uD0C0\uC784\uC544\uC6C3/\uBE44\uC815\uC0C1 \uC885\uB8CC \uB300\uBE44)\n for (const resolver of taskResolvers.values()) {\n resolver();\n }\n // Worker \uC885\uB8CC (\uC131\uACF5/\uC2E4\uD328 \uBAA8\uB450)\n await Promise.all(workers.map((w) => w.terminate()));\n }\n\n // \uACB0\uACFC \uCD9C\uB825\n const allDiagnostics: ts.Diagnostic[] = [];\n let totalErrorCount = 0;\n let totalWarningCount = 0;\n const fileCache = new Map<string, string>(); // \uD30C\uC77C \uB0B4\uC6A9 \uCE90\uC2DC (\uB3D9\uC77C \uD30C\uC77C \uC911\uBCF5 \uC77D\uAE30 \uBC29\uC9C0)\n for (const { result } of allResults) {\n totalErrorCount += result.errorCount;\n totalWarningCount += result.warningCount;\n for (const serialized of result.diagnostics) {\n allDiagnostics.push(deserializeDiagnostic(serialized, fileCache));\n }\n }\n\n if (totalErrorCount > 0) {\n logger.error(\"\uD0C0\uC785\uCCB4\uD06C \uC5D0\uB7EC \uBC1C\uC0DD\", {\n errorCount: totalErrorCount,\n warningCount: totalWarningCount,\n });\n } else if (totalWarningCount > 0) {\n logger.info(\"\uD0C0\uC785\uCCB4\uD06C \uC644\uB8CC (\uACBD\uACE0 \uC788\uC74C)\", {\n errorCount: totalErrorCount,\n warningCount: totalWarningCount,\n });\n } else {\n logger.info(\"\uD0C0\uC785\uCCB4\uD06C \uC644\uB8CC\", { errorCount: totalErrorCount, warningCount: totalWarningCount });\n }\n\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 if (totalErrorCount > 0) {\n process.exitCode = 1;\n }\n}\n\n//#endregion\n"],
5
+ "mappings": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,aAAa;AACtB,SAAS,WAAW,qBAAqB,cAAgC;AACzE,OAAO;AACP,SAAS,SAAS,iBAAiB;AAEnC,SAAS,yBAA4C;AACrD,SAAS,oBAAoB;AAC7B,SAAS,6BAA6B;AAoCtC,MAAM,gBAAgB;AAAA;AAAA,EAEpB,SAAS;AACX;AAUA,SAAS,gBAAgB,QAA4C;AACnE,MAAI,WAAW,OAAQ,QAAO,CAAC,MAAM;AACrC,MAAI,WAAW,aAAa,WAAW,SAAU,QAAO,CAAC,SAAS;AAElE,SAAO,CAAC,QAAQ,SAAS;AAC3B;AAOO,SAAS,gBAAgB,WAAqB,KAAa,QAA4C;AAC5G,QAAM,WAAW,oBAAI,IAAyB;AAE9C,aAAW,YAAY,WAAW;AAChC,UAAM,eAAe,UAAU,KAAK,SAAS,KAAK,QAAQ,CAAC;AAG3D,UAAM,eAAe,aAAa,MAAM,cAAc,OAAO;AAC7D,QAAI,cAAc;AAChB,YAAM,UAAU,aAAa,CAAC;AAE9B,UAAI,OAAO,SAAS,OAAO,GAAG,WAAW,UAAW;AAEpD,UAAI,CAAC,SAAS,IAAI,OAAO,GAAG;AAC1B,iBAAS,IAAI,SAAS;AAAA,UACpB,MAAM;AAAA,UACN,KAAK,KAAK,QAAQ,KAAK,YAAY,OAAO;AAAA,UAC1C,MAAM,gBAAgB,OAAO,SAAS,OAAO,GAAG,MAAM;AAAA,QACxD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AASA,SAAS,qBAAqB,UAAoC,KAA8B;AAC9F,QAAM,QAAyB,CAAC;AAGhC,aAAW,QAAQ,SAAS,OAAO,GAAG;AACpC,eAAW,OAAO,KAAK,MAAM;AAC3B,YAAM,YAAY,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,MAAM;AACvD,YAAM,KAAK;AAAA,QACT,aAAa,uBAAQ,KAAK,IAAI,GAAG,SAAS;AAAA,QAC1C,WAAW;AAAA,UACT,MAAM,KAAK;AAAA,UACX;AAAA,UACA,QAAQ,KAAK;AAAA,UACb;AAAA,UACA,MAAM;AAAA;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAmBA,eAAsB,aAAa,SAA0C;AAC3E,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,kBAAkB;AAEjD,SAAO,MAAM,yCAAW,EAAE,QAAQ,CAAC;AAEnC,QAAM,aAAuC;AAAA,IAC3C,sBAAsB,CAAC,MAAM;AAAA,IAC7B,qBAAqB,MAAM;AAAA,IAC3B,YAAY,MAAM,GAAG,IAAI;AAAA,EAC3B;AAGA,MAAI;AACJ,MAAI;AACF,mBAAe,kBAAkB,GAAG;AAAA,EACtC,SAAS,KAAK;AACZ,YAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,GAAG;AACtD,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,aAAa,EAAE,KAAK,KAAK,OAAO,KAAK,QAAQ,QAAQ,CAAC;AACvE,WAAO,MAAM,wCAAoB;AAAA,EACnC,SAAS,KAAK;AAEZ,eAAW,EAAE,UAAU,CAAC,EAAE;AAC1B,WAAO,MAAM,2EAA8B,GAAG;AAAA,EAChD;AAGA,QAAM,YAAY,oBAAoB,aAAa,WAAW,SAAS,GAAG;AAE1E,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,OAAO,MAAM,sFAAqB;AAC1C,WAAO,KAAK,0DAAa;AACzB;AAAA,EACF;AAGA,QAAM,WAAW,gBAAgB,WAAW,KAAK,QAAQ;AACzD,SAAO,MAAM,gDAAa;AAAA,IACxB,cAAc,SAAS;AAAA,IACvB,UAAU,CAAC,GAAG,SAAS,KAAK,CAAC;AAAA,EAC/B,CAAC;AAGD,QAAM,QAAQ,qBAAqB,UAAU,GAAG;AAEhD,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,OAAO,MAAM,4FAAsB;AAC3C;AAAA,EACF;AAGA,QAAM,iBAAiB,KAAK,IAAI,KAAK,MAAO,GAAG,KAAK,EAAE,SAAS,IAAK,CAAC,GAAG,CAAC;AACzE,QAAM,cAAc,KAAK,IAAI,gBAAgB,MAAM,MAAM;AACzD,SAAO,MAAM,mCAAU,EAAE,aAAa,gBAAgB,WAAW,MAAM,OAAO,CAAC;AAG/E,QAAM,aAAa,YAAY,QAAQ,uBAAuB;AAC9D,QAAM,UAAiD,CAAC;AACxD,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,YAAQ,KAAK,OAAO,OAA+B,UAAU,CAAC;AAAA,EAChE;AAGA,QAAM,aAAgE,CAAC;AAOvE,QAAM,gBAAgB,oBAAI,IAAwB;AAElD,MAAI;AAEF,QAAI,YAAY;AAGhB,mBAAe,YAAY,QAA4D;AACrF,aAAO,YAAY,MAAM,QAAQ;AAC/B,cAAM,eAAe;AACrB,cAAM,OAAO,MAAM,YAAY;AAE/B,YAAI;AACF,gBAAM,SAAS,MAAM,OAAO,SAAS,KAAK,SAAS;AAEnD,qBAAW,KAAK,EAAE,aAAa,KAAK,aAAa,OAAO,CAAC;AAAA,QAC3D,SAAS,KAAK;AAEZ,iBAAO,MAAM,wBAAc,KAAK,WAAW,IAAI;AAAA,YAC7C,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,UACxD,CAAC;AACD,qBAAW,KAAK;AAAA,YACd,aAAa,KAAK;AAAA,YAClB,QAAQ;AAAA,cACN,SAAS;AAAA,cACT,QAAQ,CAAC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,cACzD,aAAa,CAAC;AAAA,cACd,YAAY;AAAA,cACZ,cAAc;AAAA,YAChB;AAAA,UACF,CAAC;AAAA,QACH,UAAE;AAEA,wBAAc,IAAI,KAAK,WAAW,IAAI;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAGA,UAAM,QAAQ,IAAI;AAAA,MAChB,MAAM,IAAI,CAAC,UAAU;AAAA,QACnB,OAAO,KAAK;AAAA,QACZ,MAAM,MACJ,IAAI,QAAc,CAAC,YAAY;AAC7B,wBAAc,IAAI,KAAK,aAAa,OAAO;AAAA,QAC7C,CAAC;AAAA,MACL,EAAE;AAAA,MACF;AAAA,QACE,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,UAAU,QAAQ,SAAS,UAAU,QAAQ,YAAY;AAAA,MAC3D;AAAA,IACF;AAGA,UAAM,iBAAiB,QAAQ,IAAI,CAAC,WAAW,YAAY,MAAM,CAAC;AAGlE,UAAM,QAAQ,IAAI,CAAC,MAAM,IAAI,GAAG,GAAG,cAAc,CAAC;AAAA,EACpD,UAAE;AAEA,eAAW,YAAY,cAAc,OAAO,GAAG;AAC7C,eAAS;AAAA,IACX;AAEA,UAAM,QAAQ,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAAA,EACrD;AAGA,QAAM,iBAAkC,CAAC;AACzC,MAAI,kBAAkB;AACtB,MAAI,oBAAoB;AACxB,QAAM,YAAY,oBAAI,IAAoB;AAC1C,aAAW,EAAE,OAAO,KAAK,YAAY;AACnC,uBAAmB,OAAO;AAC1B,yBAAqB,OAAO;AAC5B,eAAW,cAAc,OAAO,aAAa;AAC3C,qBAAe,KAAK,sBAAsB,YAAY,SAAS,CAAC;AAAA,IAClE;AAAA,EACF;AAEA,MAAI,kBAAkB,GAAG;AACvB,WAAO,MAAM,sDAAc;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB,CAAC;AAAA,EACH,WAAW,oBAAoB,GAAG;AAChC,WAAO,KAAK,qEAAmB;AAAA,MAC7B,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB,CAAC;AAAA,EACH,OAAO;AACL,WAAO,KAAK,yCAAW,EAAE,YAAY,iBAAiB,cAAc,kBAAkB,CAAC;AAAA,EACzF;AAEA,MAAI,eAAe,SAAS,GAAG;AAC7B,UAAM,oBAAoB,GAAG,8BAA8B,cAAc;AACzE,UAAM,UAAU,GAAG,qCAAqC,mBAAmB,UAAU;AACrF,YAAQ,OAAO,MAAM,OAAO;AAAA,EAC9B;AAEA,MAAI,kBAAkB,GAAG;AACvB,YAAQ,WAAW;AAAA,EACrB;AACF;",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WatchOrchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrators/WatchOrchestrator.ts"],"names":[],"mappings":"AAcA;;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;IAqEjC;;;;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":"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"}
@@ -3,6 +3,7 @@ import { Listr } from "listr2";
3
3
  import { consola } from "consola";
4
4
  import { loadSdConfig } from "../utils/sd-config.js";
5
5
  import { filterPackagesByTargets } from "../utils/package-utils.js";
6
+ import { setupReplaceDeps } from "../utils/replace-deps.js";
6
7
  import { printErrors } from "../utils/output-utils.js";
7
8
  import { RebuildListrManager } from "../utils/listr-manager.js";
8
9
  import { ResultCollector } from "../infra/ResultCollector.js";
@@ -44,6 +45,9 @@ class WatchOrchestrator {
44
45
  process.exitCode = 1;
45
46
  throw err;
46
47
  }
48
+ if (sdConfig.replaceDeps != null) {
49
+ await setupReplaceDeps(this._cwd, sdConfig.replaceDeps);
50
+ }
47
51
  const allPackages = filterPackagesByTargets(sdConfig.packages, this._options.targets);
48
52
  const isLibraryTarget = (target) => target === "node" || target === "browser" || target === "neutral";
49
53
  const libraryConfigs = {};
@@ -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 { 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 // 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\";\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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",
6
6
  "names": []
7
7
  }
@@ -188,6 +188,13 @@ export type SdPackageConfig = SdBuildPackageConfig | SdClientPackageConfig | SdS
188
188
  export interface SdConfig {
189
189
  /** 패키지별 설정 (키: packages/ 하위 디렉토리 이름, 예: "core-common") */
190
190
  packages: Record<string, SdPackageConfig | undefined>;
191
+ /**
192
+ * 의존성 교체 설정 (node_modules 패키지를 로컬 소스로 symlink 교체)
193
+ * - 키: node_modules에서 찾을 패키지 glob 패턴 (예: "@simplysm/*")
194
+ * - 값: 소스 디렉토리 경로 (키의 * 캡처값이 값의 *에 치환됨)
195
+ * - 예: { "@simplysm/*": "../simplysm/packages/*" }
196
+ */
197
+ replaceDeps?: Record<string, string>;
191
198
  /** 배포 완료 후 실행할 스크립트 */
192
199
  postPublish?: SdPostPublishScriptConfig[];
193
200
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sd-config.types.d.ts","sourceRoot":"","sources":["../src/sd-config.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sd-config.types.d.ts","sourceRoot":"","sources":["../src/sd-config.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * replaceDeps 설정의 glob 패턴과 대상 패키지 목록을 매칭하여
3
+ * { targetName, sourcePath } 쌍을 반환한다.
4
+ *
5
+ * @param replaceDeps - sd.config.ts의 replaceDeps 설정 (키: glob 패턴, 값: 소스 경로)
6
+ * @param targetNames - node_modules에서 찾은 패키지 이름 목록 (예: ["@simplysm/solid", ...])
7
+ * @returns 매칭된 { targetName, sourcePath } 배열
8
+ */
9
+ export declare function resolveReplaceDepEntries(replaceDeps: Record<string, string>, targetNames: string[]): Array<{
10
+ targetName: string;
11
+ sourcePath: string;
12
+ }>;
13
+ /**
14
+ * pnpm-workspace.yaml 내용을 파싱하여 workspace packages glob 배열을 반환한다.
15
+ * 별도 YAML 라이브러리 없이 간단한 라인 파싱으로 처리한다.
16
+ *
17
+ * @param content - pnpm-workspace.yaml 파일 내용
18
+ * @returns glob 패턴 배열 (예: ["packages/*", "tools/*"])
19
+ */
20
+ export declare function parseWorkspaceGlobs(content: string): string[];
21
+ /**
22
+ * replaceDeps 설정에 따라 node_modules 내 패키지를 소스 디렉토리로 symlink 교체한다.
23
+ *
24
+ * 1. pnpm-workspace.yaml 파싱 → workspace 패키지 경로 목록
25
+ * 2. [루트, ...workspace 패키지]의 node_modules에서 매칭되는 패키지 찾기
26
+ * 3. 기존 symlink/디렉토리 제거 → 소스 경로로 symlink 생성
27
+ *
28
+ * @param projectRoot - 프로젝트 루트 경로
29
+ * @param replaceDeps - sd.config.ts의 replaceDeps 설정
30
+ */
31
+ export declare function setupReplaceDeps(projectRoot: string, replaceDeps: Record<string, string>): Promise<void>;
32
+ //# sourceMappingURL=replace-deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-deps.d.ts","sourceRoot":"","sources":["../../src/utils/replace-deps.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,WAAW,EAAE,MAAM,EAAE,GACpB,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BnD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B7D;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoE9G"}
@@ -0,0 +1,99 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { glob } from "glob";
4
+ import { consola } from "consola";
5
+ function resolveReplaceDepEntries(replaceDeps, targetNames) {
6
+ const results = [];
7
+ for (const [pattern, sourceTemplate] of Object.entries(replaceDeps)) {
8
+ const regexpText = pattern.replace(/[\\/.+*]/g, (ch) => {
9
+ if (ch === "*") return "(.*)";
10
+ if (ch === ".") return "\\.";
11
+ if (ch === "/" || ch === "\\") return "[\\\\/]";
12
+ if (ch === "+") return "\\+";
13
+ return ch;
14
+ });
15
+ const regex = new RegExp(`^${regexpText}$`);
16
+ const hasWildcard = pattern.includes("*");
17
+ for (const targetName of targetNames) {
18
+ const match = regex.exec(targetName);
19
+ if (match == null) continue;
20
+ const sourcePath = hasWildcard ? sourceTemplate.replace(/\*/g, match[1]) : sourceTemplate;
21
+ results.push({ targetName, sourcePath });
22
+ }
23
+ }
24
+ return results;
25
+ }
26
+ function parseWorkspaceGlobs(content) {
27
+ const lines = content.split("\n");
28
+ const globs = [];
29
+ let inPackages = false;
30
+ for (const line of lines) {
31
+ const trimmed = line.trim();
32
+ if (trimmed === "packages:") {
33
+ inPackages = true;
34
+ continue;
35
+ }
36
+ if (inPackages && trimmed.startsWith("- ")) {
37
+ const value = trimmed.slice(2).trim().replace(/^["']|["']$/g, "");
38
+ globs.push(value);
39
+ continue;
40
+ }
41
+ if (inPackages && trimmed !== "" && !trimmed.startsWith("#")) {
42
+ break;
43
+ }
44
+ }
45
+ return globs;
46
+ }
47
+ async function setupReplaceDeps(projectRoot, replaceDeps) {
48
+ const logger = consola.withTag("sd:cli:replace-deps");
49
+ const searchRoots = [projectRoot];
50
+ const workspaceYamlPath = path.join(projectRoot, "pnpm-workspace.yaml");
51
+ try {
52
+ const yamlContent = await fs.promises.readFile(workspaceYamlPath, "utf-8");
53
+ const workspaceGlobs = parseWorkspaceGlobs(yamlContent);
54
+ for (const pattern of workspaceGlobs) {
55
+ const dirs = await glob(pattern, { cwd: projectRoot, absolute: true });
56
+ searchRoots.push(...dirs);
57
+ }
58
+ } catch {
59
+ }
60
+ for (const searchRoot of searchRoots) {
61
+ const nodeModulesDir = path.join(searchRoot, "node_modules");
62
+ try {
63
+ await fs.promises.access(nodeModulesDir);
64
+ } catch {
65
+ continue;
66
+ }
67
+ const targetNames = [];
68
+ for (const pattern of Object.keys(replaceDeps)) {
69
+ const matches = await glob(pattern, { cwd: nodeModulesDir });
70
+ targetNames.push(...matches);
71
+ }
72
+ if (targetNames.length === 0) continue;
73
+ const entries = resolveReplaceDepEntries(replaceDeps, targetNames);
74
+ for (const { targetName, sourcePath } of entries) {
75
+ const targetPath = path.join(nodeModulesDir, targetName);
76
+ const resolvedSourcePath = path.resolve(projectRoot, sourcePath);
77
+ try {
78
+ await fs.promises.access(resolvedSourcePath);
79
+ } catch {
80
+ logger.warn(`\uC18C\uC2A4 \uACBD\uB85C\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC544 \uC2A4\uD0B5\uD569\uB2C8\uB2E4: ${resolvedSourcePath}`);
81
+ continue;
82
+ }
83
+ try {
84
+ await fs.promises.rm(targetPath, { recursive: true, force: true });
85
+ const relativePath = path.relative(path.dirname(targetPath), resolvedSourcePath);
86
+ await fs.promises.symlink(relativePath, targetPath, "dir");
87
+ logger.info(`${targetName} \u2192 ${sourcePath}`);
88
+ } catch (err) {
89
+ logger.error(`symlink \uAD50\uCCB4 \uC2E4\uD328 (${targetName}): ${err instanceof Error ? err.message : err}`);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ export {
95
+ parseWorkspaceGlobs,
96
+ resolveReplaceDepEntries,
97
+ setupReplaceDeps
98
+ };
99
+ //# sourceMappingURL=replace-deps.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/replace-deps.ts"],
4
+ "sourcesContent": ["import fs from \"fs\";\nimport path from \"path\";\nimport { glob } from \"glob\";\nimport { consola } from \"consola\";\n\n/**\n * replaceDeps \uC124\uC815\uC758 glob \uD328\uD134\uACFC \uB300\uC0C1 \uD328\uD0A4\uC9C0 \uBAA9\uB85D\uC744 \uB9E4\uCE6D\uD558\uC5EC\n * { targetName, sourcePath } \uC30D\uC744 \uBC18\uD658\uD55C\uB2E4.\n *\n * @param replaceDeps - sd.config.ts\uC758 replaceDeps \uC124\uC815 (\uD0A4: glob \uD328\uD134, \uAC12: \uC18C\uC2A4 \uACBD\uB85C)\n * @param targetNames - node_modules\uC5D0\uC11C \uCC3E\uC740 \uD328\uD0A4\uC9C0 \uC774\uB984 \uBAA9\uB85D (\uC608: [\"@simplysm/solid\", ...])\n * @returns \uB9E4\uCE6D\uB41C { targetName, sourcePath } \uBC30\uC5F4\n */\nexport function resolveReplaceDepEntries(\n replaceDeps: Record<string, string>,\n targetNames: string[],\n): Array<{ targetName: string; sourcePath: string }> {\n const results: Array<{ targetName: string; sourcePath: string }> = [];\n\n for (const [pattern, sourceTemplate] of Object.entries(replaceDeps)) {\n // glob \uD328\uD134\uC744 \uC815\uADDC\uC2DD\uC73C\uB85C \uBCC0\uD658: * \u2192 (.*), . \u2192 \\., / \u2192 [\\\\/]\n const regexpText = pattern.replace(/[\\\\/.+*]/g, (ch) => {\n if (ch === \"*\") return \"(.*)\";\n if (ch === \".\") return \"\\\\.\";\n if (ch === \"/\" || ch === \"\\\\\") return \"[\\\\\\\\/]\";\n if (ch === \"+\") return \"\\\\+\";\n return ch;\n });\n const regex = new RegExp(`^${regexpText}$`);\n const hasWildcard = pattern.includes(\"*\");\n\n for (const targetName of targetNames) {\n const match = regex.exec(targetName);\n if (match == null) continue;\n\n // \uCEA1\uCC98 \uADF8\uB8F9\uC774 \uC788\uC73C\uBA74 \uC18C\uC2A4 \uACBD\uB85C\uC758 *\uC5D0 \uCE58\uD658\n const sourcePath = hasWildcard ? sourceTemplate.replace(/\\*/g, match[1]) : sourceTemplate;\n\n results.push({ targetName, sourcePath });\n }\n }\n\n return results;\n}\n\n/**\n * pnpm-workspace.yaml \uB0B4\uC6A9\uC744 \uD30C\uC2F1\uD558\uC5EC workspace packages glob \uBC30\uC5F4\uC744 \uBC18\uD658\uD55C\uB2E4.\n * \uBCC4\uB3C4 YAML \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC5C6\uC774 \uAC04\uB2E8\uD55C \uB77C\uC778 \uD30C\uC2F1\uC73C\uB85C \uCC98\uB9AC\uD55C\uB2E4.\n *\n * @param content - pnpm-workspace.yaml \uD30C\uC77C \uB0B4\uC6A9\n * @returns glob \uD328\uD134 \uBC30\uC5F4 (\uC608: [\"packages/*\", \"tools/*\"])\n */\nexport function parseWorkspaceGlobs(content: string): string[] {\n const lines = content.split(\"\\n\");\n const globs: string[] = [];\n let inPackages = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed === \"packages:\") {\n inPackages = true;\n continue;\n }\n\n // packages \uC139\uC158 \uB0B4\uC758 \uB9AC\uC2A4\uD2B8 \uD56D\uBAA9\n if (inPackages && trimmed.startsWith(\"- \")) {\n const value = trimmed\n .slice(2)\n .trim()\n .replace(/^[\"']|[\"']$/g, \"\");\n globs.push(value);\n continue;\n }\n\n // \uB2E4\uB978 \uC139\uC158\uC774 \uC2DC\uC791\uB418\uBA74 \uC885\uB8CC\n if (inPackages && trimmed !== \"\" && !trimmed.startsWith(\"#\")) {\n break;\n }\n }\n\n return globs;\n}\n\n/**\n * replaceDeps \uC124\uC815\uC5D0 \uB530\uB77C node_modules \uB0B4 \uD328\uD0A4\uC9C0\uB97C \uC18C\uC2A4 \uB514\uB809\uD1A0\uB9AC\uB85C symlink \uAD50\uCCB4\uD55C\uB2E4.\n *\n * 1. pnpm-workspace.yaml \uD30C\uC2F1 \u2192 workspace \uD328\uD0A4\uC9C0 \uACBD\uB85C \uBAA9\uB85D\n * 2. [\uB8E8\uD2B8, ...workspace \uD328\uD0A4\uC9C0]\uC758 node_modules\uC5D0\uC11C \uB9E4\uCE6D\uB418\uB294 \uD328\uD0A4\uC9C0 \uCC3E\uAE30\n * 3. \uAE30\uC874 symlink/\uB514\uB809\uD1A0\uB9AC \uC81C\uAC70 \u2192 \uC18C\uC2A4 \uACBD\uB85C\uB85C symlink \uC0DD\uC131\n *\n * @param projectRoot - \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uACBD\uB85C\n * @param replaceDeps - sd.config.ts\uC758 replaceDeps \uC124\uC815\n */\nexport async function setupReplaceDeps(projectRoot: string, replaceDeps: Record<string, string>): Promise<void> {\n const logger = consola.withTag(\"sd:cli:replace-deps\");\n\n // 1. Workspace \uD328\uD0A4\uC9C0 \uACBD\uB85C \uBAA9\uB85D \uC218\uC9D1\n const searchRoots = [projectRoot];\n\n const workspaceYamlPath = path.join(projectRoot, \"pnpm-workspace.yaml\");\n try {\n const yamlContent = await fs.promises.readFile(workspaceYamlPath, \"utf-8\");\n const workspaceGlobs = parseWorkspaceGlobs(yamlContent);\n\n for (const pattern of workspaceGlobs) {\n const dirs = await glob(pattern, { cwd: projectRoot, absolute: true });\n searchRoots.push(...dirs);\n }\n } catch {\n // pnpm-workspace.yaml\uAC00 \uC5C6\uC73C\uBA74 \uB8E8\uD2B8\uB9CC \uCC98\uB9AC\n }\n\n // 2. \uAC01 searchRoot\uC758 node_modules\uC5D0\uC11C \uB9E4\uCE6D\uB418\uB294 \uD328\uD0A4\uC9C0 \uCC3E\uAE30\n for (const searchRoot of searchRoots) {\n const nodeModulesDir = path.join(searchRoot, \"node_modules\");\n\n try {\n await fs.promises.access(nodeModulesDir);\n } catch {\n continue; // node_modules \uC5C6\uC73C\uBA74 \uC2A4\uD0B5\n }\n\n // replaceDeps\uC758 \uAC01 glob \uD328\uD134\uC73C\uB85C node_modules \uB0B4 \uB514\uB809\uD1A0\uB9AC \uD0D0\uC0C9\n const targetNames: string[] = [];\n for (const pattern of Object.keys(replaceDeps)) {\n const matches = await glob(pattern, { cwd: nodeModulesDir });\n targetNames.push(...matches);\n }\n\n if (targetNames.length === 0) continue;\n\n // \uD328\uD134 \uB9E4\uCE6D \uBC0F \uACBD\uB85C \uD574\uC11D\n const entries = resolveReplaceDepEntries(replaceDeps, targetNames);\n\n // 3. Symlink \uAD50\uCCB4\n for (const { targetName, sourcePath } of entries) {\n const targetPath = path.join(nodeModulesDir, targetName);\n const resolvedSourcePath = path.resolve(projectRoot, sourcePath);\n\n // \uC18C\uC2A4 \uACBD\uB85C \uC874\uC7AC \uD655\uC778\n try {\n await fs.promises.access(resolvedSourcePath);\n } catch {\n logger.warn(`\uC18C\uC2A4 \uACBD\uB85C\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC544 \uC2A4\uD0B5\uD569\uB2C8\uB2E4: ${resolvedSourcePath}`);\n continue;\n }\n\n try {\n // \uAE30\uC874 symlink/\uB514\uB809\uD1A0\uB9AC \uC81C\uAC70\n await fs.promises.rm(targetPath, { recursive: true, force: true });\n\n // \uC0C1\uB300 \uACBD\uB85C\uB85C symlink \uC0DD\uC131\n const relativePath = path.relative(path.dirname(targetPath), resolvedSourcePath);\n await fs.promises.symlink(relativePath, targetPath, \"dir\");\n\n logger.info(`${targetName} \u2192 ${sourcePath}`);\n } catch (err) {\n logger.error(`symlink \uAD50\uCCB4 \uC2E4\uD328 (${targetName}): ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@simplysm/sd-cli",
3
3
  "sideEffects": false,
4
- "version": "13.0.0-beta.20",
4
+ "version": "13.0.0-beta.22",
5
5
  "description": "심플리즘 패키지 - CLI 도구",
6
6
  "author": "김석래",
7
7
  "repository": {
@@ -40,9 +40,9 @@
40
40
  "vite-plugin-solid": "^2.11.10",
41
41
  "vite-tsconfig-paths": "^6.1.0",
42
42
  "yargs": "^18.0.0",
43
- "@simplysm/core-common": "13.0.0-beta.20",
44
- "@simplysm/storage": "13.0.0-beta.20",
45
- "@simplysm/core-node": "13.0.0-beta.20"
43
+ "@simplysm/core-common": "13.0.0-beta.22",
44
+ "@simplysm/core-node": "13.0.0-beta.22",
45
+ "@simplysm/storage": "13.0.0-beta.22"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@types/semver": "^7.7.1",
@@ -4,7 +4,7 @@
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
7
- "@simplysm/solid": "~13.0.0-beta.20",
7
+ "@simplysm/solid": "~13.0.0-beta.22",
8
8
  {{#if router}}
9
9
  "@solidjs/router": "^0.15.4",
10
10
  {{/if}}
@@ -4,6 +4,6 @@
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
7
- "@simplysm/service-server": "~13.0.0-beta.20"
7
+ "@simplysm/service-server": "~13.0.0-beta.22"
8
8
  }
9
9
  }
@@ -14,9 +14,9 @@
14
14
  "lint:fix": "sd-cli lint --fix"
15
15
  },
16
16
  "devDependencies": {
17
- "@simplysm/sd-cli": "~13.0.0-beta.20",
18
- "@simplysm/sd-claude": "~13.0.0-beta.20",
19
- "@simplysm/eslint-plugin": "~13.0.0-beta.20",
17
+ "@simplysm/sd-cli": "~13.0.0-beta.22",
18
+ "@simplysm/claude": "~13.0.0-beta.22",
19
+ "@simplysm/eslint-plugin": "~13.0.0-beta.22",
20
20
  "@types/node": "^20.19.33",
21
21
  "eslint": "^9.39.2",
22
22
  "prettier": "^3.8.1",
@@ -1,2 +1,11 @@
1
1
  packages:
2
2
  - packages/*
3
+
4
+ onlyBuiltDependencies:
5
+ - bufferutil
6
+ - core-js
7
+ - cpu-features
8
+ - esbuild
9
+ - sharp
10
+ - ssh2
11
+ - utf-8-validate