@simplysm/sd-cli 13.0.0-beta.45 → 13.0.0-beta.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/builders/BaseBuilder.js.map +0 -1
- package/dist/builders/DtsBuilder.js.map +0 -1
- package/dist/builders/LibraryBuilder.js.map +0 -1
- package/dist/builders/index.js.map +0 -1
- package/dist/builders/types.js.map +0 -1
- package/dist/capacitor/capacitor.js.map +0 -1
- package/dist/commands/add-client.js.map +0 -1
- package/dist/commands/add-server.js.map +0 -1
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/device.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/lint.js.map +0 -1
- package/dist/commands/publish.js.map +0 -1
- package/dist/commands/typecheck.js.map +0 -1
- package/dist/commands/watch.js.map +0 -1
- package/dist/electron/electron.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/infra/ResultCollector.js.map +0 -1
- package/dist/infra/SignalHandler.js.map +0 -1
- package/dist/infra/WorkerManager.js.map +0 -1
- package/dist/infra/index.js.map +0 -1
- package/dist/orchestrators/WatchOrchestrator.js.map +0 -1
- package/dist/orchestrators/index.js.map +0 -1
- package/dist/sd-cli.js.map +0 -1
- package/dist/sd-config.types.js.map +0 -1
- package/dist/utils/build-env.js.map +0 -1
- package/dist/utils/config-editor.js.map +0 -1
- package/dist/utils/copy-src.js.map +0 -1
- package/dist/utils/esbuild-config.d.ts +1 -0
- package/dist/utils/esbuild-config.d.ts.map +1 -1
- package/dist/utils/esbuild-config.js +13 -2
- package/dist/utils/esbuild-config.js.map +1 -2
- package/dist/utils/listr-manager.js.map +0 -1
- package/dist/utils/output-utils.js.map +0 -1
- package/dist/utils/package-utils.js.map +0 -1
- package/dist/utils/replace-deps.js.map +0 -1
- package/dist/utils/sd-config.js.map +0 -1
- package/dist/utils/spawn.js.map +0 -1
- package/dist/utils/tailwind-config-deps.js.map +0 -1
- package/dist/utils/template.js.map +0 -1
- package/dist/utils/tsconfig.js.map +0 -1
- package/dist/utils/typecheck-serialization.js.map +0 -1
- package/dist/utils/vite-config.js.map +0 -1
- package/dist/utils/worker-events.js.map +0 -1
- package/dist/workers/client.worker.js.map +0 -1
- package/dist/workers/dts.worker.js.map +0 -1
- package/dist/workers/library.worker.js.map +0 -1
- package/dist/workers/server-runtime.worker.js.map +0 -1
- package/dist/workers/server.worker.js.map +0 -1
- package/package.json +6 -4
- package/src/builders/BaseBuilder.ts +141 -0
- package/src/builders/DtsBuilder.ts +138 -0
- package/src/builders/LibraryBuilder.ts +161 -0
- package/src/builders/index.ts +4 -0
- package/src/builders/types.ts +55 -0
- package/src/capacitor/capacitor.ts +827 -0
- package/src/commands/add-client.ts +135 -0
- package/src/commands/add-server.ts +150 -0
- package/src/commands/build.ts +475 -0
- package/src/commands/dev.ts +602 -0
- package/src/commands/device.ts +151 -0
- package/src/commands/init.ts +104 -0
- package/src/commands/lint.ts +216 -0
- package/src/commands/publish.ts +836 -0
- package/src/commands/typecheck.ts +329 -0
- package/src/commands/watch.ts +38 -0
- package/src/electron/electron.ts +329 -0
- package/src/index.ts +1 -0
- package/src/infra/ResultCollector.ts +81 -0
- package/src/infra/SignalHandler.ts +52 -0
- package/src/infra/WorkerManager.ts +65 -0
- package/src/infra/index.ts +3 -0
- package/src/orchestrators/WatchOrchestrator.ts +211 -0
- package/src/orchestrators/index.ts +1 -0
- package/src/sd-cli.ts +307 -0
- package/src/sd-config.types.ts +271 -0
- package/src/utils/build-env.ts +12 -0
- package/src/utils/config-editor.ts +131 -0
- package/src/utils/copy-src.ts +60 -0
- package/src/utils/esbuild-config.ts +263 -0
- package/src/utils/listr-manager.ts +89 -0
- package/src/utils/output-utils.ts +61 -0
- package/src/utils/package-utils.ts +63 -0
- package/src/utils/replace-deps.ts +163 -0
- package/src/utils/sd-config.ts +44 -0
- package/src/utils/spawn.ts +79 -0
- package/src/utils/tailwind-config-deps.ts +95 -0
- package/src/utils/template.ts +51 -0
- package/src/utils/tsconfig.ts +111 -0
- package/src/utils/typecheck-serialization.ts +82 -0
- package/src/utils/vite-config.ts +184 -0
- package/src/utils/worker-events.ts +102 -0
- package/src/workers/client.worker.ts +236 -0
- package/src/workers/dts.worker.ts +416 -0
- package/src/workers/library.worker.ts +245 -0
- package/src/workers/server-runtime.worker.ts +154 -0
- package/src/workers/server.worker.ts +435 -0
- package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
- package/templates/add-server/__SERVER__/package.json.hbs +2 -2
- package/templates/init/package.json.hbs +3 -3
package/README.md
CHANGED
|
@@ -161,7 +161,7 @@ sd-cli build solid core-common
|
|
|
161
161
|
|
|
162
162
|
**Runtime Configuration File (.config.json):**
|
|
163
163
|
|
|
164
|
-
If a `server` or `client` package defines a `configs` field in `sd.config.ts`, the build automatically generates `dist/.config.json` containing that configuration. This is useful for storing environment-specific settings (database config, API endpoints, etc.) that are read at runtime via `
|
|
164
|
+
If a `server` or `client` package defines a `configs` field in `sd.config.ts`, the build automatically generates `dist/.config.json` containing that configuration. This is useful for storing environment-specific settings (database config, API endpoints, etc.) that are read at runtime via `ctx.getConfig()` in `service-server`.
|
|
165
165
|
|
|
166
166
|
**Server Build: Externals & Production Deployment Files:**
|
|
167
167
|
|
|
@@ -533,7 +533,7 @@ Environment variable substitution is supported in `path` for local directory and
|
|
|
533
533
|
|
|
534
534
|
### Runtime Configuration (configs)
|
|
535
535
|
|
|
536
|
-
Define runtime configuration for `server` or `client` packages using the `configs` field. This configuration is automatically written to `dist/.config.json` during build and can be read at runtime via `
|
|
536
|
+
Define runtime configuration for `server` or `client` packages using the `configs` field. This configuration is automatically written to `dist/.config.json` during build and can be read at runtime via `ctx.getConfig()` in the `service-server` package.
|
|
537
537
|
|
|
538
538
|
```typescript
|
|
539
539
|
import type { SdConfigFn } from "@simplysm/sd-cli";
|
|
@@ -594,7 +594,7 @@ const dbConfig = ormConfig.default; // Access specific DB config by name
|
|
|
594
594
|
- Configuration sections can be nested objects with any structure
|
|
595
595
|
- Environment variable substitution can be used in config values
|
|
596
596
|
- Generated `dist/.config.json` files are not included in version control (add to `.gitignore`)
|
|
597
|
-
- Client and server both support `configs`, but typically only servers expose configuration via `
|
|
597
|
+
- Client and server both support `configs`, but typically only servers expose configuration via `ctx.getConfig()`
|
|
598
598
|
|
|
599
599
|
### Dependency Replacement (replaceDeps)
|
|
600
600
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/builders/BaseBuilder.ts"],
|
|
4
|
-
"sourcesContent": ["import { WorkerManager } from \"../infra/WorkerManager\";\nimport type { ResultCollector } from \"../infra/ResultCollector\";\nimport type { RebuildListrManager } from \"../utils/listr-manager\";\nimport type { IBuilder, PackageInfo } from \"./types\";\n\n/**\n * Builder \uCD94\uC0C1 \uBCA0\uC774\uC2A4 \uD074\uB798\uC2A4\n *\n * \uBAA8\uB4E0 Builder\uC758 \uACF5\uD1B5 \uB85C\uC9C1\uC744 \uC81C\uACF5\uD558\uACE0,\n * \uC11C\uBE0C\uD074\uB798\uC2A4\uC5D0\uC11C \uAD6C\uD604\uD574\uC57C \uD560 \uCD94\uC0C1 \uBA54\uC11C\uB4DC\uB97C \uC815\uC758\uD55C\uB2E4.\n */\nexport abstract class BaseBuilder implements IBuilder {\n protected readonly workerManager: WorkerManager;\n protected readonly resultCollector: ResultCollector;\n protected readonly rebuildManager: RebuildListrManager | undefined;\n protected readonly packages: PackageInfo[];\n protected readonly cwd: string;\n protected isWatchMode = false;\n\n /** \uCD08\uAE30 \uBE4C\uB4DC Promise (\uD328\uD0A4\uC9C0\uBCC4) */\n protected readonly initialBuildPromises = new Map<string, Promise<void>>();\n /** \uCD08\uAE30 \uBE4C\uB4DC resolver (\uD328\uD0A4\uC9C0\uBCC4) */\n protected readonly buildResolvers = new Map<string, () => void>();\n\n constructor(options: {\n cwd: string;\n packages: PackageInfo[];\n resultCollector: ResultCollector;\n rebuildManager?: RebuildListrManager;\n }) {\n this.cwd = options.cwd;\n this.packages = options.packages;\n this.resultCollector = options.resultCollector;\n this.rebuildManager = options.rebuildManager;\n this.workerManager = new WorkerManager();\n }\n\n /**\n * Builder \uCD08\uAE30\uD654\n */\n initialize(): Promise<void> {\n // \uCD08\uAE30 \uBE4C\uB4DC Promise \uC0DD\uC131\n for (const pkg of this.packages) {\n const key = this.getPackageKey(pkg);\n this.initialBuildPromises.set(\n key,\n new Promise<void>((resolve) => {\n this.buildResolvers.set(key, resolve);\n }),\n );\n }\n\n // Worker \uC0DD\uC131\n this.createWorkers();\n\n // \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uB4F1\uB85D\n this.registerEventHandlers();\n\n return Promise.resolve();\n }\n\n /**\n * \uC77C\uD68C\uC131 \uBE4C\uB4DC (\uD504\uB85C\uB355\uC158)\n */\n async build(): Promise<void> {\n await Promise.all(this.packages.map((pkg) => this.buildPackage(pkg)));\n }\n\n /**\n * Watch \uBAA8\uB4DC \uC2DC\uC791\n */\n async startWatch(): Promise<void> {\n this.isWatchMode = true;\n\n // \uBAA8\uB4E0 \uD328\uD0A4\uC9C0\uC758 watch \uC2DC\uC791 (await \uC5C6\uC774 - \uBC31\uADF8\uB77C\uC6B4\uB4DC \uC2E4\uD589)\n for (const pkg of this.packages) {\n this.startWatchPackage(pkg);\n }\n\n // \uCD08\uAE30 \uBE4C\uB4DC \uC644\uB8CC\uAE4C\uC9C0 \uB300\uAE30\n await Promise.all(this.initialBuildPromises.values());\n }\n\n /**\n * Builder \uC885\uB8CC\n */\n async shutdown(): Promise<void> {\n await this.workerManager.terminateAll();\n }\n\n /**\n * \uCD08\uAE30 \uBE4C\uB4DC Promise \uB9F5 \uBC18\uD658\n */\n getInitialBuildPromises(): Map<string, Promise<void>> {\n return this.initialBuildPromises;\n }\n\n /**\n * \uD328\uD0A4\uC9C0 \uD0A4 \uC0DD\uC131 (\uACB0\uACFC \uC800\uC7A5\uC6A9)\n */\n protected getPackageKey(pkg: PackageInfo): string {\n return `${pkg.name}:${this.getBuilderType()}`;\n }\n\n /**\n * \uBE4C\uB4DC \uC644\uB8CC \uCC98\uB9AC\n */\n protected completeBuild(pkg: PackageInfo): void {\n const key = this.getPackageKey(pkg);\n const resolver = this.buildResolvers.get(key);\n if (resolver != null) {\n resolver();\n this.buildResolvers.delete(key);\n }\n }\n\n /**\n * Builder \uD0C0\uC785 (\uACB0\uACFC \uD0A4 \uC0DD\uC131\uC6A9)\n */\n protected abstract getBuilderType(): string;\n\n /**\n * Worker \uC0DD\uC131\n */\n protected abstract createWorkers(): void;\n\n /**\n * \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uB4F1\uB85D\n */\n protected abstract registerEventHandlers(): void;\n\n /**\n * \uB2E8\uC77C \uD328\uD0A4\uC9C0 \uBE4C\uB4DC (\uD504\uB85C\uB355\uC158)\n */\n protected abstract buildPackage(pkg: PackageInfo): Promise<void>;\n\n /**\n * \uB2E8\uC77C \uD328\uD0A4\uC9C0 watch \uC2DC\uC791\n */\n protected abstract startWatchPackage(pkg: PackageInfo): void;\n}\n"],
|
|
5
4
|
"mappings": "AAAA,SAAS,qBAAqB;AAWvB,MAAe,YAAgC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,cAAc;AAAA;AAAA,EAGL,uBAAuB,oBAAI,IAA2B;AAAA;AAAA,EAEtD,iBAAiB,oBAAI,IAAwB;AAAA,EAEhE,YAAY,SAKT;AACD,SAAK,MAAM,QAAQ;AACnB,SAAK,WAAW,QAAQ;AACxB,SAAK,kBAAkB,QAAQ;AAC/B,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,gBAAgB,IAAI,cAAc;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,aAA4B;AAE1B,eAAW,OAAO,KAAK,UAAU;AAC/B,YAAM,MAAM,KAAK,cAAc,GAAG;AAClC,WAAK,qBAAqB;AAAA,QACxB;AAAA,QACA,IAAI,QAAc,CAAC,YAAY;AAC7B,eAAK,eAAe,IAAI,KAAK,OAAO;AAAA,QACtC,CAAC;AAAA,MACH;AAAA,IACF;AAGA,SAAK,cAAc;AAGnB,SAAK,sBAAsB;AAE3B,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,UAAM,QAAQ,IAAI,KAAK,SAAS,IAAI,CAAC,QAAQ,KAAK,aAAa,GAAG,CAAC,CAAC;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,SAAK,cAAc;AAGnB,eAAW,OAAO,KAAK,UAAU;AAC/B,WAAK,kBAAkB,GAAG;AAAA,IAC5B;AAGA,UAAM,QAAQ,IAAI,KAAK,qBAAqB,OAAO,CAAC;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAA0B;AAC9B,UAAM,KAAK,cAAc,aAAa;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,0BAAsD;AACpD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKU,cAAc,KAA0B;AAChD,WAAO,GAAG,IAAI,IAAI,IAAI,KAAK,eAAe,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKU,cAAc,KAAwB;AAC9C,UAAM,MAAM,KAAK,cAAc,GAAG;AAClC,UAAM,WAAW,KAAK,eAAe,IAAI,GAAG;AAC5C,QAAI,YAAY,MAAM;AACpB,eAAS;AACT,WAAK,eAAe,OAAO,GAAG;AAAA,IAChC;AAAA,EACF;AA0BF;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/builders/DtsBuilder.ts"],
|
|
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
4
|
"mappings": "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",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/builders/LibraryBuilder.ts"],
|
|
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
4
|
"mappings": "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",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/builders/index.ts"],
|
|
4
|
-
"sourcesContent": ["export type { IBuilder, PackageInfo, BuilderOptions } from \"./types\";\nexport { BaseBuilder } from \"./BaseBuilder\";\nexport { LibraryBuilder } from \"./LibraryBuilder\";\nexport { DtsBuilder } from \"./DtsBuilder\";\n"],
|
|
5
4
|
"mappings": "AACA,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/capacitor/capacitor.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport { fsExists, fsMkdir, fsRead, fsReadJson, fsWrite, fsWriteJson, fsGlob, fsCopy, fsRm } from \"@simplysm/core-node\";\nimport { env } from \"@simplysm/core-common\";\nimport { consola } from \"consola\";\nimport sharp from \"sharp\";\nimport type { SdCapacitorConfig } from \"../sd-config.types\";\nimport { spawn } from \"../utils/spawn\";\n\n/**\n * package.json \uD0C0\uC785\n */\ninterface NpmConfig {\n name: string;\n version: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n volta?: unknown;\n}\n\n/**\n * \uC124\uC815 \uAC80\uC99D \uC5D0\uB7EC\n */\nclass CapacitorConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CapacitorConfigError\";\n }\n}\n\n/**\n * Capacitor \uD504\uB85C\uC81D\uD2B8 \uAD00\uB9AC \uD074\uB798\uC2A4\n *\n * - Capacitor \uD504\uB85C\uC81D\uD2B8 \uCD08\uAE30\uD654\n * - Android APK/AAB \uBE4C\uB4DC\n * - \uB514\uBC14\uC774\uC2A4\uC5D0\uC11C \uC571 \uC2E4\uD589\n */\nexport class Capacitor {\n private static readonly _ANDROID_KEYSTORE_FILE_NAME = \"android.keystore\";\n private static readonly _LOCK_FILE_NAME = \".capacitor.lock\";\n private static readonly _logger = consola.withTag(\"sd:cli:capacitor\");\n\n private readonly _capPath: string;\n private readonly _platforms: string[];\n private readonly _npmConfig: NpmConfig;\n\n private constructor(\n private readonly _pkgPath: string,\n private readonly _config: SdCapacitorConfig,\n npmConfig: NpmConfig,\n ) {\n this._platforms = Object.keys(this._config.platform ?? {});\n this._npmConfig = npmConfig;\n this._capPath = path.resolve(this._pkgPath, \".capacitor\");\n }\n\n /**\n * Capacitor \uC778\uC2A4\uD134\uC2A4 \uC0DD\uC131 (\uC124\uC815 \uAC80\uC99D \uD3EC\uD568)\n */\n static async create(pkgPath: string, config: SdCapacitorConfig): Promise<Capacitor> {\n // F5: \uB7F0\uD0C0\uC784 \uC124\uC815 \uAC80\uC99D\n Capacitor._validateConfig(config);\n\n const npmConfig = await fsReadJson<NpmConfig>(path.resolve(pkgPath, \"package.json\"));\n return new Capacitor(pkgPath, config, npmConfig);\n }\n\n /**\n * F5: \uC124\uC815 \uAC80\uC99D\n */\n private static _validateConfig(config: SdCapacitorConfig): void {\n if (typeof config.appId !== \"string\" || config.appId.trim() === \"\") {\n throw new CapacitorConfigError(\"capacitor.appId\uB294 \uD544\uC218\uC785\uB2C8\uB2E4.\");\n }\n if (!/^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*)+$/i.test(config.appId)) {\n throw new CapacitorConfigError(`capacitor.appId \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4: ${config.appId}`);\n }\n if (typeof config.appName !== \"string\" || config.appName.trim() === \"\") {\n throw new CapacitorConfigError(\"capacitor.appName\uC740 \uD544\uC218\uC785\uB2C8\uB2E4.\");\n }\n if (config.platform != null) {\n const platforms = Object.keys(config.platform);\n for (const p of platforms) {\n if (p !== \"android\") {\n throw new CapacitorConfigError(`\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uD50C\uB7AB\uD3FC: ${p} (\uD604\uC7AC android\uB9CC \uC9C0\uC6D0)`);\n }\n }\n }\n }\n\n /**\n * \uBA85\uB839\uC5B4 \uC2E4\uD589 (\uB85C\uAE45 \uD3EC\uD568)\n */\n private async _exec(cmd: string, args: string[], cwd: string): Promise<string> {\n Capacitor._logger.debug(`\uC2E4\uD589 \uBA85\uB839: ${cmd} ${args.join(\" \")}`);\n const result = await spawn(cmd, args, { cwd });\n Capacitor._logger.debug(`\uC2E4\uD589 \uACB0\uACFC: ${result}`);\n return result;\n }\n\n /**\n * F10: \uB3D9\uC2DC \uC2E4\uD589 \uBC29\uC9C0\uB97C \uC704\uD55C \uC7A0\uAE08 \uD68D\uB4DD\n */\n private async _acquireLock(): Promise<void> {\n const lockPath = path.resolve(this._capPath, Capacitor._LOCK_FILE_NAME);\n if (await fsExists(lockPath)) {\n const lockContent = await fsRead(lockPath);\n throw new Error(\n `\uB2E4\uB978 Capacitor \uC791\uC5C5\uC774 \uC9C4\uD589 \uC911\uC785\uB2C8\uB2E4 (PID: ${lockContent}). ` + `\uBB38\uC81C\uAC00 \uC788\uB2E4\uBA74 ${lockPath} \uD30C\uC77C\uC744 \uC0AD\uC81C\uD558\uC138\uC694.`,\n );\n }\n await fsMkdir(this._capPath);\n await fsWrite(lockPath, String(process.pid));\n }\n\n /**\n * F10: \uC7A0\uAE08 \uD574\uC81C\n */\n private async _releaseLock(): Promise<void> {\n const lockPath = path.resolve(this._capPath, Capacitor._LOCK_FILE_NAME);\n await fsRm(lockPath);\n }\n\n /**\n * F4: \uC678\uBD80 \uB3C4\uAD6C \uAC80\uC99D\n */\n private async _validateTools(): Promise<void> {\n // Android SDK \uD655\uC778\n const sdkPath = await this._findAndroidSdk();\n if (sdkPath == null) {\n throw new Error(\n \"Android SDK\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\" +\n \"1. Android Studio\uB97C \uC124\uCE58\uD558\uAC70\uB098\\n\" +\n \"2. ANDROID_HOME \uB610\uB294 ANDROID_SDK_ROOT \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD558\uC138\uC694.\",\n );\n }\n\n // Java \uD655\uC778 (android \uD50C\uB7AB\uD3FC\uC77C \uB54C\uB9CC)\n if (this._platforms.includes(\"android\")) {\n const javaPath = await this._findJava21();\n if (javaPath == null) {\n Capacitor._logger.warn(\"Java 21\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. Gradle\uC774 \uB0B4\uC7A5 JDK\uB97C \uC0AC\uC6A9\uD558\uAC70\uB098 \uBE4C\uB4DC\uAC00 \uC2E4\uD328\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\");\n }\n }\n }\n\n /**\n * Capacitor \uD504\uB85C\uC81D\uD2B8 \uCD08\uAE30\uD654\n *\n * 1. package.json \uC0DD\uC131 \uBC0F \uC758\uC874\uC131 \uC124\uCE58\n * 2. capacitor.config.ts \uC0DD\uC131\n * 3. \uD50C\uB7AB\uD3FC \uCD94\uAC00 (android)\n * 4. \uC544\uC774\uCF58 \uC124\uC815\n * 5. Android \uB124\uC774\uD2F0\uBE0C \uC124\uC815\n * 6. cap sync \uB610\uB294 cap copy \uC2E4\uD589\n */\n async initialize(): Promise<void> {\n await this._acquireLock();\n\n try {\n // F4: \uC678\uBD80 \uB3C4\uAD6C \uAC80\uC99D\n await this._validateTools();\n\n // 1. Capacitor \uD504\uB85C\uC81D\uD2B8 \uCD08\uAE30\uD654\n const changed = await this._initCap();\n\n // 2. Capacitor \uC124\uC815 \uD30C\uC77C \uC0DD\uC131\n await this._writeCapConf();\n\n // 3. \uD50C\uB7AB\uD3FC \uAD00\uB9AC (F12: \uBA71\uB4F1\uC131 - \uC774\uBBF8 \uC874\uC7AC\uD558\uBA74 \uC2A4\uD0B5)\n await this._addPlatforms();\n\n // 4. \uC544\uC774\uCF58 \uC124\uC815 (F6: \uC5D0\uB7EC \uBCF5\uAD6C)\n await this._setupIcon();\n\n // 5. Android \uB124\uC774\uD2F0\uBE0C \uC124\uC815\n if (this._platforms.includes(\"android\")) {\n await this._configureAndroid();\n }\n\n // 6. \uC6F9 \uC790\uC0B0 \uB3D9\uAE30\uD654\n if (changed) {\n await this._exec(\"npx\", [\"cap\", \"sync\"], this._capPath);\n } else {\n await this._exec(\"npx\", [\"cap\", \"copy\"], this._capPath);\n }\n } finally {\n await this._releaseLock();\n }\n }\n\n /**\n * Android APK/AAB \uBE4C\uB4DC\n */\n async build(outPath: string): Promise<void> {\n await this._acquireLock();\n\n try {\n const buildType = this._config.debug ? \"debug\" : \"release\";\n\n for (const platform of this._platforms) {\n await this._exec(\"npx\", [\"cap\", \"copy\", platform], this._capPath);\n\n if (platform === \"android\") {\n await this._buildAndroid(outPath, buildType);\n } else {\n throw new Error(`\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uD50C\uB7AB\uD3FC: ${platform}`);\n }\n }\n } finally {\n await this._releaseLock();\n }\n }\n\n /**\n * \uB514\uBC14\uC774\uC2A4\uC5D0\uC11C \uC571 \uC2E4\uD589 (WebView\uB97C \uAC1C\uBC1C \uC11C\uBC84\uB85C \uC5F0\uACB0)\n */\n async runOnDevice(url?: string): Promise<void> {\n // F11: URL \uAC80\uC99D\n if (url != null) {\n this._validateUrl(url);\n await this._updateServerUrl(url);\n }\n\n for (const platform of this._platforms) {\n await this._exec(\"npx\", [\"cap\", \"copy\", platform], this._capPath);\n\n try {\n await this._exec(\"npx\", [\"cap\", \"run\", platform], this._capPath);\n } catch (err) {\n if (platform === \"android\") {\n try {\n await this._exec(\"adb\", [\"kill-server\"], this._capPath);\n } catch {\n // adb kill-server \uC2E4\uD328\uB294 \uBB34\uC2DC\n }\n }\n throw err;\n }\n }\n }\n\n /**\n * F11: URL \uAC80\uC99D\n */\n private _validateUrl(url: string): void {\n try {\n const parsed = new URL(url);\n if (![\"http:\", \"https:\"].includes(parsed.protocol)) {\n throw new Error(`\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uD504\uB85C\uD1A0\uCF5C: ${parsed.protocol}`);\n }\n } catch (err) {\n if (err instanceof TypeError) {\n throw new Error(`\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 URL: ${url}`);\n }\n throw err;\n }\n }\n\n //#region Private - \uCD08\uAE30\uD654\n\n /**\n * Capacitor \uD504\uB85C\uC81D\uD2B8 \uAE30\uBCF8 \uCD08\uAE30\uD654 (package.json, npm install, cap init)\n */\n private async _initCap(): Promise<boolean> {\n const depChanged = await this._setupNpmConf();\n if (!depChanged) return false;\n\n // pnpm install\n const installResult = await this._exec(\"pnpm\", [\"install\"], this._capPath);\n Capacitor._logger.debug(`pnpm install \uC644\uB8CC: ${installResult}`);\n\n // F12: cap init \uBA71\uB4F1\uC131 - capacitor.config.ts\uAC00 \uC5C6\uC744 \uB54C\uB9CC \uC2E4\uD589\n const configPath = path.resolve(this._capPath, \"capacitor.config.ts\");\n if (!(await fsExists(configPath))) {\n await this._exec(\"npx\", [\"cap\", \"init\", this._config.appName, this._config.appId], this._capPath);\n }\n\n // \uAE30\uBCF8 www/index.html \uC0DD\uC131\n const wwwPath = path.resolve(this._capPath, \"www\");\n await fsMkdir(wwwPath);\n await fsWrite(path.resolve(wwwPath, \"index.html\"), \"<!DOCTYPE html><html><head></head><body></body></html>\");\n\n return true;\n }\n\n /**\n * package.json \uC124\uC815\n */\n private async _setupNpmConf(): Promise<boolean> {\n const projNpmConfigPath = path.resolve(this._pkgPath, \"../../package.json\");\n\n // F3: \uD30C\uC77C \uC874\uC7AC \uD655\uC778\n if (!(await fsExists(projNpmConfigPath))) {\n throw new Error(`\uB8E8\uD2B8 package.json\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${projNpmConfigPath}`);\n }\n\n const projNpmConfig = await fsReadJson<NpmConfig>(projNpmConfigPath);\n\n const capNpmConfPath = path.resolve(this._capPath, \"package.json\");\n const orgCapNpmConf: NpmConfig = (await fsExists(capNpmConfPath))\n ? await fsReadJson<NpmConfig>(capNpmConfPath)\n : { name: \"\", version: \"\" };\n\n const capNpmConf: NpmConfig = { ...orgCapNpmConf };\n capNpmConf.name = this._config.appId;\n capNpmConf.version = this._npmConfig.version;\n if (projNpmConfig.volta != null) {\n capNpmConf.volta = projNpmConfig.volta;\n }\n\n // \uAE30\uBCF8 \uC758\uC874\uC131\n capNpmConf.dependencies = capNpmConf.dependencies ?? {};\n capNpmConf.dependencies[\"@capacitor/core\"] = \"^7.0.0\";\n capNpmConf.dependencies[\"@capacitor/app\"] = \"^7.0.0\";\n for (const platform of this._platforms) {\n capNpmConf.dependencies[`@capacitor/${platform}`] = \"^7.0.0\";\n }\n\n capNpmConf.devDependencies = capNpmConf.devDependencies ?? {};\n capNpmConf.devDependencies[\"@capacitor/cli\"] = \"^7.0.0\";\n capNpmConf.devDependencies[\"@capacitor/assets\"] = \"^3.0.0\";\n\n // \uD50C\uB7EC\uADF8\uC778 \uD328\uD0A4\uC9C0 \uC124\uC815\n const mainDeps = {\n ...this._npmConfig.dependencies,\n ...this._npmConfig.devDependencies,\n ...this._npmConfig.peerDependencies,\n };\n\n const usePlugins = Object.keys(this._config.plugins ?? {});\n\n const prevPlugins = Object.keys(capNpmConf.dependencies).filter(\n (item) => ![\"@capacitor/core\", \"@capacitor/android\", \"@capacitor/ios\", \"@capacitor/app\"].includes(item),\n );\n\n // \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294 \uD50C\uB7EC\uADF8\uC778 \uC81C\uAC70\n for (const prevPlugin of prevPlugins) {\n if (!usePlugins.includes(prevPlugin)) {\n delete capNpmConf.dependencies[prevPlugin];\n Capacitor._logger.debug(`\uD50C\uB7EC\uADF8\uC778 \uC81C\uAC70: ${prevPlugin}`);\n }\n }\n\n // \uC0C8 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\n for (const plugin of usePlugins) {\n if (!(plugin in capNpmConf.dependencies)) {\n const version = mainDeps[plugin] ?? \"*\";\n capNpmConf.dependencies[plugin] = version;\n Capacitor._logger.debug(`\uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00: ${plugin}@${version}`);\n }\n }\n\n // \uC800\uC7A5\n await fsMkdir(this._capPath);\n await fsWriteJson(capNpmConfPath, capNpmConf, { space: 2 });\n\n // \uC758\uC874\uC131 \uBCC0\uACBD \uC5EC\uBD80 \uD655\uC778\n const isChanged =\n orgCapNpmConf.volta !== capNpmConf.volta ||\n JSON.stringify(orgCapNpmConf.dependencies) !== JSON.stringify(capNpmConf.dependencies) ||\n JSON.stringify(orgCapNpmConf.devDependencies) !== JSON.stringify(capNpmConf.devDependencies);\n\n return isChanged;\n }\n\n /**\n * capacitor.config.ts \uC0DD\uC131\n */\n private async _writeCapConf(): Promise<void> {\n const confPath = path.resolve(this._capPath, \"capacitor.config.ts\");\n\n // \uD50C\uB7EC\uADF8\uC778 \uC635\uC158 \uC0DD\uC131\n const pluginOptions: Record<string, Record<string, unknown>> = {};\n for (const [pluginName, options] of Object.entries(this._config.plugins ?? {})) {\n if (options !== true) {\n const configKey = this._toPascalCase(pluginName.split(\"/\").at(-1)!);\n pluginOptions[configKey] = options;\n }\n }\n\n const pluginsConfigStr =\n Object.keys(pluginOptions).length > 0 ? JSON.stringify(pluginOptions, null, 2).replace(/^/gm, \" \").trim() : \"{}\";\n\n const configContent = `import type { CapacitorConfig } from \"@capacitor/cli\";\n\nconst config: CapacitorConfig = {\n appId: \"${this._config.appId}\",\n appName: \"${this._config.appName}\",\n server: {\n androidScheme: \"http\",\n cleartext: true\n },\n android: {},\n plugins: ${pluginsConfigStr},\n};\n\nexport default config;\n`;\n\n await fsWrite(confPath, configContent);\n }\n\n /**\n * \uD50C\uB7AB\uD3FC \uCD94\uAC00 (F12: \uBA71\uB4F1\uC131 \uBCF4\uC7A5)\n */\n private async _addPlatforms(): Promise<void> {\n for (const platform of this._platforms) {\n const platformPath = path.resolve(this._capPath, platform);\n if (await fsExists(platformPath)) {\n Capacitor._logger.debug(`\uD50C\uB7AB\uD3FC \uC774\uBBF8 \uC874\uC7AC: ${platform}`);\n continue;\n }\n\n await this._exec(\"npx\", [\"cap\", \"add\", platform], this._capPath);\n }\n }\n\n /**\n * \uC544\uC774\uCF58 \uC124\uC815 (F6: \uC5D0\uB7EC \uBCF5\uAD6C)\n */\n private async _setupIcon(): Promise<void> {\n const assetsDirPath = path.resolve(this._capPath, \"assets\");\n\n if (this._config.icon != null) {\n const iconSource = path.resolve(this._pkgPath, this._config.icon);\n\n // F6: \uC18C\uC2A4 \uC544\uC774\uCF58 \uC874\uC7AC \uD655\uC778\n if (!(await fsExists(iconSource))) {\n Capacitor._logger.warn(`\uC544\uC774\uCF58 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${iconSource}. \uAE30\uBCF8 \uC544\uC774\uCF58\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.`);\n return;\n }\n\n try {\n await fsMkdir(assetsDirPath);\n\n // \uC544\uC774\uCF58 \uC0DD\uC131\n const logoPath = path.resolve(assetsDirPath, \"logo.png\");\n\n const logoSize = Math.floor(1024 * 0.6);\n const padding = Math.floor((1024 - logoSize) / 2);\n\n // F6: sharp \uC5D0\uB7EC \uCC98\uB9AC\n await sharp(iconSource)\n .resize(logoSize, logoSize, {\n fit: \"contain\",\n background: { r: 0, g: 0, b: 0, alpha: 0 },\n })\n .extend({\n top: padding,\n bottom: padding,\n left: padding,\n right: padding,\n background: { r: 0, g: 0, b: 0, alpha: 0 },\n })\n .toFile(logoPath);\n\n await this._exec(\n \"npx\",\n [\"@capacitor/assets\", \"generate\", \"--iconBackgroundColor\", \"#ffffff\", \"--splashBackgroundColor\", \"#ffffff\"],\n this._capPath,\n );\n } catch (err) {\n Capacitor._logger.warn(\n `\uC544\uC774\uCF58 \uC0DD\uC131 \uC2E4\uD328: ${err instanceof Error ? err.message : err}. \uAE30\uBCF8 \uC544\uC774\uCF58\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.`,\n );\n // F6: \uC2E4\uD328\uD574\uB3C4 \uACC4\uC18D \uC9C4\uD589 (\uAE30\uBCF8 \uC544\uC774\uCF58 \uC0AC\uC6A9)\n }\n } else {\n await fsRm(assetsDirPath);\n }\n }\n\n //#endregion\n\n //#region Private - Android \uC124\uC815\n\n /**\n * Android \uB124\uC774\uD2F0\uBE0C \uC124\uC815\n */\n private async _configureAndroid(): Promise<void> {\n const androidPath = path.resolve(this._capPath, \"android\");\n\n // F3: Android \uB514\uB809\uD1A0\uB9AC \uC874\uC7AC \uD655\uC778\n if (!(await fsExists(androidPath))) {\n throw new Error(`Android \uD504\uB85C\uC81D\uD2B8 \uB514\uB809\uD1A0\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4: ${androidPath}`);\n }\n\n await this._configureAndroidJavaHomePath(androidPath);\n await this._configureAndroidSdkPath(androidPath);\n await this._configureAndroidManifest(androidPath);\n await this._configureAndroidBuildGradle(androidPath);\n }\n\n /**\n * JAVA_HOME \uACBD\uB85C \uC124\uC815 (gradle.properties)\n */\n private async _configureAndroidJavaHomePath(androidPath: string): Promise<void> {\n const gradlePropsPath = path.resolve(androidPath, \"gradle.properties\");\n\n // F3: \uD30C\uC77C \uC874\uC7AC \uD655\uC778\n if (!(await fsExists(gradlePropsPath))) {\n Capacitor._logger.warn(`gradle.properties \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4: ${gradlePropsPath}`);\n return;\n }\n\n let content = await fsRead(gradlePropsPath);\n\n const java21Path = await this._findJava21();\n if (java21Path != null && !content.includes(\"org.gradle.java.home\")) {\n // F9: Windows \uACBD\uB85C \uC774\uC2A4\uCF00\uC774\uD504 \uAC1C\uC120\n const escapedPath = java21Path.replace(/\\\\/g, \"\\\\\\\\\");\n content += `\\norg.gradle.java.home=${escapedPath}\\n`;\n await fsWrite(gradlePropsPath, content);\n }\n }\n\n /**\n * Java 21 \uACBD\uB85C \uC790\uB3D9 \uD0D0\uC0C9\n */\n private async _findJava21(): Promise<string | undefined> {\n const patterns = [\n \"C:/Program Files/Amazon Corretto/jdk21*\",\n \"C:/Program Files/Eclipse Adoptium/jdk-21*\",\n \"C:/Program Files/Java/jdk-21*\",\n \"C:/Program Files/Microsoft/jdk-21*\",\n \"/usr/lib/jvm/java-21*\",\n \"/usr/lib/jvm/temurin-21*\",\n ];\n\n for (const pattern of patterns) {\n const matches = await fsGlob(pattern);\n if (matches.length > 0) {\n return matches.sort().at(-1);\n }\n }\n\n return undefined;\n }\n\n /**\n * Android SDK \uACBD\uB85C \uC124\uC815 (local.properties)\n */\n private async _configureAndroidSdkPath(androidPath: string): Promise<void> {\n const localPropsPath = path.resolve(androidPath, \"local.properties\");\n\n const sdkPath = await this._findAndroidSdk();\n if (sdkPath != null) {\n // F9: \uD56D\uC0C1 forward slash \uC0AC\uC6A9 (Gradle \uD638\uD658)\n await fsWrite(localPropsPath, `sdk.dir=${sdkPath.replace(/\\\\/g, \"/\")}\\n`);\n } else {\n throw new Error(\n \"Android SDK\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\" +\n \"1. Android Studio\uB97C \uC124\uCE58\uD558\uAC70\uB098\\n\" +\n \"2. ANDROID_HOME \uB610\uB294 ANDROID_SDK_ROOT \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD558\uC138\uC694.\",\n );\n }\n }\n\n /**\n * Android SDK \uACBD\uB85C \uD0D0\uC0C9\n */\n private async _findAndroidSdk(): Promise<string | undefined> {\n const fromEnv = (env[\"ANDROID_HOME\"] ?? env[\"ANDROID_SDK_ROOT\"]) as string | undefined;\n if (fromEnv != null && (await fsExists(fromEnv))) {\n return fromEnv;\n }\n\n const candidates = [\n path.resolve((env[\"LOCALAPPDATA\"] as string | undefined) ?? \"\", \"Android/Sdk\"),\n path.resolve((env[\"HOME\"] as string | undefined) ?? \"\", \"Android/Sdk\"),\n \"C:/Program Files/Android/Sdk\",\n \"C:/Android/Sdk\",\n ];\n\n for (const candidate of candidates) {\n if (await fsExists(candidate)) {\n return candidate;\n }\n }\n\n return undefined;\n }\n\n /**\n * AndroidManifest.xml \uC218\uC815 (F3: \uC5D0\uB7EC \uCC98\uB9AC \uCD94\uAC00)\n */\n private async _configureAndroidManifest(androidPath: string): Promise<void> {\n const manifestPath = path.resolve(androidPath, \"app/src/main/AndroidManifest.xml\");\n\n // F3: \uD30C\uC77C \uC874\uC7AC \uD655\uC778\n if (!(await fsExists(manifestPath))) {\n throw new Error(`AndroidManifest.xml \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4: ${manifestPath}`);\n }\n\n let content = await fsRead(manifestPath);\n\n // usesCleartextTraffic \uC124\uC815\n if (!content.includes(\"android:usesCleartextTraffic\")) {\n content = content.replace(\"<application\", '<application android:usesCleartextTraffic=\"true\"');\n }\n\n // \uCD94\uAC00 \uAD8C\uD55C \uC124\uC815\n const permissions = this._config.platform?.android?.permissions ?? [];\n for (const perm of permissions) {\n const permTag = `<uses-permission android:name=\"android.permission.${perm.name}\"`;\n if (!content.includes(permTag)) {\n const maxSdkAttr = perm.maxSdkVersion != null ? ` android:maxSdkVersion=\"${perm.maxSdkVersion}\"` : \"\";\n const ignoreAttr = perm.ignore != null ? ` tools:ignore=\"${perm.ignore}\"` : \"\";\n const permLine = ` ${permTag}${maxSdkAttr}${ignoreAttr} />\\n`;\n\n if (perm.ignore != null && !content.includes(\"xmlns:tools=\")) {\n content = content.replace(\n \"<manifest xmlns:android\",\n '<manifest xmlns:tools=\"http://schemas.android.com/tools\" xmlns:android',\n );\n }\n\n content = content.replace(\"</manifest>\", `${permLine}</manifest>`);\n }\n }\n\n // \uCD94\uAC00 application \uC124\uC815\n const appConfig = this._config.platform?.android?.config;\n if (appConfig) {\n for (const [key, value] of Object.entries(appConfig)) {\n const attr = `android:${key}=\"${value}\"`;\n if (!content.includes(`android:${key}=`)) {\n content = content.replace(\"<application\", `<application ${attr}`);\n }\n }\n }\n\n // intentFilters \uC124\uC815\n const intentFilters = this._config.platform?.android?.intentFilters ?? [];\n for (const filter of intentFilters) {\n const filterKey = filter.action ?? filter.category ?? \"\";\n if (filterKey && !content.includes(filterKey)) {\n const actionLine = filter.action != null ? `<action android:name=\"${filter.action}\"/>` : \"\";\n const categoryLine = filter.category != null ? `<category android:name=\"${filter.category}\"/>` : \"\";\n\n content = content.replace(\n /(<activity[\\s\\S]*?android:name=\"\\.MainActivity\"[\\s\\S]*?>)/,\n `$1\n <intent-filter>\n ${actionLine}\n ${categoryLine}\n </intent-filter>`,\n );\n }\n }\n\n await fsWrite(manifestPath, content);\n }\n\n /**\n * build.gradle \uC218\uC815 (F3: \uC5D0\uB7EC \uCC98\uB9AC \uCD94\uAC00)\n */\n private async _configureAndroidBuildGradle(androidPath: string): Promise<void> {\n const buildGradlePath = path.resolve(androidPath, \"app/build.gradle\");\n\n // F3: \uD30C\uC77C \uC874\uC7AC \uD655\uC778\n if (!(await fsExists(buildGradlePath))) {\n throw new Error(`build.gradle \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4: ${buildGradlePath}`);\n }\n\n let content = await fsRead(buildGradlePath);\n\n // versionName, versionCode \uC124\uC815\n const version = this._npmConfig.version;\n const versionParts = version.split(\".\");\n const versionCode =\n parseInt(versionParts[0] ?? \"0\") * 10000 +\n parseInt(versionParts[1] ?? \"0\") * 100 +\n parseInt(versionParts[2] ?? \"0\");\n\n content = content.replace(/versionCode \\d+/, `versionCode ${versionCode}`);\n content = content.replace(/versionName \"[^\"]+\"/, `versionName \"${version}\"`);\n\n // SDK \uBC84\uC804 \uC124\uC815\n if (this._config.platform?.android?.sdkVersion != null) {\n const sdkVersion = this._config.platform.android.sdkVersion;\n content = content.replace(/minSdkVersion .+/, `minSdkVersion ${sdkVersion}`);\n content = content.replace(/targetSdkVersion .+/, `targetSdkVersion ${sdkVersion}`);\n } else {\n content = content.replace(/minSdkVersion .+/, `minSdkVersion rootProject.ext.minSdkVersion`);\n content = content.replace(/targetSdkVersion .+/, `targetSdkVersion rootProject.ext.targetSdkVersion`);\n }\n\n // Signing \uC124\uC815\n const keystorePath = path.resolve(this._capPath, Capacitor._ANDROID_KEYSTORE_FILE_NAME);\n const signConfig = this._config.platform?.android?.sign;\n if (signConfig) {\n const keystoreSource = path.resolve(this._pkgPath, signConfig.keystore);\n // F3: keystore \uD30C\uC77C \uC874\uC7AC \uD655\uC778\n if (!(await fsExists(keystoreSource))) {\n throw new Error(`keystore \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${keystoreSource}`);\n }\n await fsCopy(keystoreSource, keystorePath);\n\n // F9: \uC0C1\uB300 \uACBD\uB85C\uB97C forward slash\uB85C \uBCC0\uD658\n const keystoreRelativePath = path.relative(path.dirname(buildGradlePath), keystorePath).replace(/\\\\/g, \"/\");\n const keystoreType = signConfig.keystoreType ?? \"jks\";\n\n if (!content.includes(\"signingConfigs\")) {\n const signingConfigsBlock = `\n signingConfigs {\n release {\n storeFile file(\"${keystoreRelativePath}\")\n storePassword '${signConfig.storePassword}'\n keyAlias '${signConfig.alias}'\n keyPassword '${signConfig.password}'\n storeType \"${keystoreType}\"\n }\n }\n`;\n content = content.replace(/(android\\s*\\{)/, (match) => `${match}${signingConfigsBlock}`);\n }\n\n if (!content.includes(\"signingConfig signingConfigs.release\")) {\n content = content.replace(\n /(buildTypes\\s*\\{[\\s\\S]*?release\\s*\\{)/,\n `$1\\n signingConfig signingConfigs.release`,\n );\n }\n } else {\n await fsRm(keystorePath);\n }\n\n await fsWrite(buildGradlePath, content);\n }\n\n //#endregion\n\n //#region Private - \uBE4C\uB4DC\n\n /**\n * Android \uBE4C\uB4DC\n */\n private async _buildAndroid(outPath: string, buildType: string): Promise<void> {\n const androidPath = path.resolve(this._capPath, \"android\");\n const targetOutPath = path.resolve(outPath, \"android\");\n\n const isBundle = this._config.platform?.android?.bundle;\n const gradleTask = buildType === \"release\" ? (isBundle ? \"bundleRelease\" : \"assembleRelease\") : \"assembleDebug\";\n\n // Gradle \uBE4C\uB4DC \uC2E4\uD589 (\uD06C\uB85C\uC2A4 \uD50C\uB7AB\uD3FC)\n // F9: Windows\uC5D0\uC11C cmd.exe\uB97C \uD1B5\uD574 \uC2E4\uD589 (shell: false \uC774\uBBC0\uB85C)\n if (process.platform === \"win32\") {\n await this._exec(\"cmd\", [\"/c\", \"gradlew.bat\", gradleTask, \"--no-daemon\"], androidPath);\n } else {\n await this._exec(\"sh\", [\"./gradlew\", gradleTask, \"--no-daemon\"], androidPath);\n }\n\n // \uBE4C\uB4DC \uACB0\uACFC\uBB3C \uBCF5\uC0AC\n await this._copyAndroidBuildOutput(androidPath, targetOutPath, buildType);\n }\n\n /**\n * Android \uBE4C\uB4DC \uACB0\uACFC\uBB3C \uBCF5\uC0AC\n */\n private async _copyAndroidBuildOutput(androidPath: string, targetOutPath: string, buildType: string): Promise<void> {\n const isBundle = this._config.platform?.android?.bundle;\n const isSigned = Boolean(this._config.platform?.android?.sign);\n\n const ext = isBundle ? \"aab\" : \"apk\";\n const outputType = isBundle ? \"bundle\" : \"apk\";\n const fileName = isSigned ? `app-${buildType}.${ext}` : `app-${buildType}-unsigned.${ext}`;\n\n const sourcePath = path.resolve(androidPath, \"app/build/outputs\", outputType, buildType, fileName);\n\n const actualPath = (await fsExists(sourcePath))\n ? sourcePath\n : path.resolve(androidPath, \"app/build/outputs\", outputType, buildType, `app-${buildType}.${ext}`);\n\n if (!(await fsExists(actualPath))) {\n Capacitor._logger.warn(`\uBE4C\uB4DC \uACB0\uACFC\uBB3C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${actualPath}`);\n return;\n }\n\n const outputFileName = `${this._config.appName}${isSigned ? \"\" : \"-unsigned\"}-latest.${ext}`;\n\n await fsMkdir(targetOutPath);\n await fsCopy(actualPath, path.resolve(targetOutPath, outputFileName));\n\n // \uBC84\uC804\uBCC4 \uC800\uC7A5\n const updatesPath = path.resolve(targetOutPath, \"updates\");\n await fsMkdir(updatesPath);\n await fsCopy(actualPath, path.resolve(updatesPath, `${this._npmConfig.version}.${ext}`));\n }\n\n //#endregion\n\n //#region Private - \uB514\uBC14\uC774\uC2A4 \uC2E4\uD589\n\n /**\n * capacitor.config.ts\uC758 server.url \uC5C5\uB370\uC774\uD2B8\n */\n private async _updateServerUrl(url: string): Promise<void> {\n const configPath = path.resolve(this._capPath, \"capacitor.config.ts\");\n\n if (!(await fsExists(configPath))) return;\n\n let content = await fsRead(configPath);\n\n if (content.includes(\"url:\")) {\n content = content.replace(/url:\\s*\"[^\"]*\"/, `url: \"${url}\"`);\n } else if (content.includes(\"server:\")) {\n content = content.replace(/server:\\s*\\{/, `server: {\\n url: \"${url}\",`);\n }\n\n await fsWrite(configPath, content);\n }\n\n //#endregion\n\n //#region Private - \uC720\uD2F8\uB9AC\uD2F0\n\n /**\n * \uBB38\uC790\uC5F4\uC744 PascalCase\uB85C \uBCC0\uD658\n */\n private _toPascalCase(str: string): string {\n return str.replace(/[-_](.)/g, (_, c: string) => c.toUpperCase()).replace(/^./, (c) => c.toUpperCase());\n }\n\n //#endregion\n}\n"],
|
|
5
4
|
"mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,UAAU,SAAS,QAAQ,YAAY,SAAS,aAAa,QAAQ,QAAQ,YAAY;AAClG,SAAS,WAAW;AACpB,SAAS,eAAe;AACxB,OAAO,WAAW;AAElB,SAAS,aAAa;AAiBtB,MAAM,6BAA6B,MAAM;AAAA,EACvC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AASO,MAAM,UAAU;AAAA,EASb,YACW,UACA,SACjB,WACA;AAHiB;AACA;AAGjB,SAAK,aAAa,OAAO,KAAK,KAAK,QAAQ,YAAY,CAAC,CAAC;AACzD,SAAK,aAAa;AAClB,SAAK,WAAW,KAAK,QAAQ,KAAK,UAAU,YAAY;AAAA,EAC1D;AAAA,EAhBA,OAAwB,8BAA8B;AAAA,EACtD,OAAwB,kBAAkB;AAAA,EAC1C,OAAwB,UAAU,QAAQ,QAAQ,kBAAkB;AAAA,EAEnD;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAejB,aAAa,OAAO,SAAiB,QAA+C;AAElF,cAAU,gBAAgB,MAAM;AAEhC,UAAM,YAAY,MAAM,WAAsB,KAAK,QAAQ,SAAS,cAAc,CAAC;AACnF,WAAO,IAAI,UAAU,SAAS,QAAQ,SAAS;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,gBAAgB,QAAiC;AAC9D,QAAI,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK,MAAM,IAAI;AAClE,YAAM,IAAI,qBAAqB,uDAAyB;AAAA,IAC1D;AACA,QAAI,CAAC,yCAAyC,KAAK,OAAO,KAAK,GAAG;AAChE,YAAM,IAAI,qBAAqB,yFAAkC,OAAO,KAAK,EAAE;AAAA,IACjF;AACA,QAAI,OAAO,OAAO,YAAY,YAAY,OAAO,QAAQ,KAAK,MAAM,IAAI;AACtE,YAAM,IAAI,qBAAqB,yDAA2B;AAAA,IAC5D;AACA,QAAI,OAAO,YAAY,MAAM;AAC3B,YAAM,YAAY,OAAO,KAAK,OAAO,QAAQ;AAC7C,iBAAW,KAAK,WAAW;AACzB,YAAI,MAAM,WAAW;AACnB,gBAAM,IAAI,qBAAqB,6DAAgB,CAAC,4CAAmB;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,MAAM,KAAa,MAAgB,KAA8B;AAC7E,cAAU,QAAQ,MAAM,8BAAU,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE;AACzD,UAAM,SAAS,MAAM,MAAM,KAAK,MAAM,EAAE,IAAI,CAAC;AAC7C,cAAU,QAAQ,MAAM,8BAAU,MAAM,EAAE;AAC1C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAA8B;AAC1C,UAAM,WAAW,KAAK,QAAQ,KAAK,UAAU,UAAU,eAAe;AACtE,QAAI,MAAM,SAAS,QAAQ,GAAG;AAC5B,YAAM,cAAc,MAAM,OAAO,QAAQ;AACzC,YAAM,IAAI;AAAA,QACR,yFAAkC,WAAW,4CAAmB,QAAQ;AAAA,MAC1E;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,QAAQ;AAC3B,UAAM,QAAQ,UAAU,OAAO,QAAQ,GAAG,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAA8B;AAC1C,UAAM,WAAW,KAAK,QAAQ,KAAK,UAAU,UAAU,eAAe;AACtE,UAAM,KAAK,QAAQ;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAgC;AAE5C,UAAM,UAAU,MAAM,KAAK,gBAAgB;AAC3C,QAAI,WAAW,MAAM;AACnB,YAAM,IAAI;AAAA,QACR;AAAA,MAGF;AAAA,IACF;AAGA,QAAI,KAAK,WAAW,SAAS,SAAS,GAAG;AACvC,YAAM,WAAW,MAAM,KAAK,YAAY;AACxC,UAAI,YAAY,MAAM;AACpB,kBAAU,QAAQ,KAAK,uMAA2D;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,aAA4B;AAChC,UAAM,KAAK,aAAa;AAExB,QAAI;AAEF,YAAM,KAAK,eAAe;AAG1B,YAAM,UAAU,MAAM,KAAK,SAAS;AAGpC,YAAM,KAAK,cAAc;AAGzB,YAAM,KAAK,cAAc;AAGzB,YAAM,KAAK,WAAW;AAGtB,UAAI,KAAK,WAAW,SAAS,SAAS,GAAG;AACvC,cAAM,KAAK,kBAAkB;AAAA,MAC/B;AAGA,UAAI,SAAS;AACX,cAAM,KAAK,MAAM,OAAO,CAAC,OAAO,MAAM,GAAG,KAAK,QAAQ;AAAA,MACxD,OAAO;AACL,cAAM,KAAK,MAAM,OAAO,CAAC,OAAO,MAAM,GAAG,KAAK,QAAQ;AAAA,MACxD;AAAA,IACF,UAAE;AACA,YAAM,KAAK,aAAa;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,SAAgC;AAC1C,UAAM,KAAK,aAAa;AAExB,QAAI;AACF,YAAM,YAAY,KAAK,QAAQ,QAAQ,UAAU;AAEjD,iBAAW,YAAY,KAAK,YAAY;AACtC,cAAM,KAAK,MAAM,OAAO,CAAC,OAAO,QAAQ,QAAQ,GAAG,KAAK,QAAQ;AAEhE,YAAI,aAAa,WAAW;AAC1B,gBAAM,KAAK,cAAc,SAAS,SAAS;AAAA,QAC7C,OAAO;AACL,gBAAM,IAAI,MAAM,6DAAgB,QAAQ,EAAE;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,UAAE;AACA,YAAM,KAAK,aAAa;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,KAA6B;AAE7C,QAAI,OAAO,MAAM;AACf,WAAK,aAAa,GAAG;AACrB,YAAM,KAAK,iBAAiB,GAAG;AAAA,IACjC;AAEA,eAAW,YAAY,KAAK,YAAY;AACtC,YAAM,KAAK,MAAM,OAAO,CAAC,OAAO,QAAQ,QAAQ,GAAG,KAAK,QAAQ;AAEhE,UAAI;AACF,cAAM,KAAK,MAAM,OAAO,CAAC,OAAO,OAAO,QAAQ,GAAG,KAAK,QAAQ;AAAA,MACjE,SAAS,KAAK;AACZ,YAAI,aAAa,WAAW;AAC1B,cAAI;AACF,kBAAM,KAAK,MAAM,OAAO,CAAC,aAAa,GAAG,KAAK,QAAQ;AAAA,UACxD,QAAQ;AAAA,UAER;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,KAAmB;AACtC,QAAI;AACF,YAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,OAAO,QAAQ,GAAG;AAClD,cAAM,IAAI,MAAM,mEAAiB,OAAO,QAAQ,EAAE;AAAA,MACpD;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,WAAW;AAC5B,cAAM,IAAI,MAAM,8CAAgB,GAAG,EAAE;AAAA,MACvC;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,WAA6B;AACzC,UAAM,aAAa,MAAM,KAAK,cAAc;AAC5C,QAAI,CAAC,WAAY,QAAO;AAGxB,UAAM,gBAAgB,MAAM,KAAK,MAAM,QAAQ,CAAC,SAAS,GAAG,KAAK,QAAQ;AACzE,cAAU,QAAQ,MAAM,8BAAoB,aAAa,EAAE;AAG3D,UAAM,aAAa,KAAK,QAAQ,KAAK,UAAU,qBAAqB;AACpE,QAAI,CAAE,MAAM,SAAS,UAAU,GAAI;AACjC,YAAM,KAAK,MAAM,OAAO,CAAC,OAAO,QAAQ,KAAK,QAAQ,SAAS,KAAK,QAAQ,KAAK,GAAG,KAAK,QAAQ;AAAA,IAClG;AAGA,UAAM,UAAU,KAAK,QAAQ,KAAK,UAAU,KAAK;AACjD,UAAM,QAAQ,OAAO;AACrB,UAAM,QAAQ,KAAK,QAAQ,SAAS,YAAY,GAAG,wDAAwD;AAE3G,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAkC;AAC9C,UAAM,oBAAoB,KAAK,QAAQ,KAAK,UAAU,oBAAoB;AAG1E,QAAI,CAAE,MAAM,SAAS,iBAAiB,GAAI;AACxC,YAAM,IAAI,MAAM,iFAA+B,iBAAiB,EAAE;AAAA,IACpE;AAEA,UAAM,gBAAgB,MAAM,WAAsB,iBAAiB;AAEnE,UAAM,iBAAiB,KAAK,QAAQ,KAAK,UAAU,cAAc;AACjE,UAAM,gBAA4B,MAAM,SAAS,cAAc,IAC3D,MAAM,WAAsB,cAAc,IAC1C,EAAE,MAAM,IAAI,SAAS,GAAG;AAE5B,UAAM,aAAwB,EAAE,GAAG,cAAc;AACjD,eAAW,OAAO,KAAK,QAAQ;AAC/B,eAAW,UAAU,KAAK,WAAW;AACrC,QAAI,cAAc,SAAS,MAAM;AAC/B,iBAAW,QAAQ,cAAc;AAAA,IACnC;AAGA,eAAW,eAAe,WAAW,gBAAgB,CAAC;AACtD,eAAW,aAAa,iBAAiB,IAAI;AAC7C,eAAW,aAAa,gBAAgB,IAAI;AAC5C,eAAW,YAAY,KAAK,YAAY;AACtC,iBAAW,aAAa,cAAc,QAAQ,EAAE,IAAI;AAAA,IACtD;AAEA,eAAW,kBAAkB,WAAW,mBAAmB,CAAC;AAC5D,eAAW,gBAAgB,gBAAgB,IAAI;AAC/C,eAAW,gBAAgB,mBAAmB,IAAI;AAGlD,UAAM,WAAW;AAAA,MACf,GAAG,KAAK,WAAW;AAAA,MACnB,GAAG,KAAK,WAAW;AAAA,MACnB,GAAG,KAAK,WAAW;AAAA,IACrB;AAEA,UAAM,aAAa,OAAO,KAAK,KAAK,QAAQ,WAAW,CAAC,CAAC;AAEzD,UAAM,cAAc,OAAO,KAAK,WAAW,YAAY,EAAE;AAAA,MACvD,CAAC,SAAS,CAAC,CAAC,mBAAmB,sBAAsB,kBAAkB,gBAAgB,EAAE,SAAS,IAAI;AAAA,IACxG;AAGA,eAAW,cAAc,aAAa;AACpC,UAAI,CAAC,WAAW,SAAS,UAAU,GAAG;AACpC,eAAO,WAAW,aAAa,UAAU;AACzC,kBAAU,QAAQ,MAAM,0CAAY,UAAU,EAAE;AAAA,MAClD;AAAA,IACF;AAGA,eAAW,UAAU,YAAY;AAC/B,UAAI,EAAE,UAAU,WAAW,eAAe;AACxC,cAAM,UAAU,SAAS,MAAM,KAAK;AACpC,mBAAW,aAAa,MAAM,IAAI;AAClC,kBAAU,QAAQ,MAAM,0CAAY,MAAM,IAAI,OAAO,EAAE;AAAA,MACzD;AAAA,IACF;AAGA,UAAM,QAAQ,KAAK,QAAQ;AAC3B,UAAM,YAAY,gBAAgB,YAAY,EAAE,OAAO,EAAE,CAAC;AAG1D,UAAM,YACJ,cAAc,UAAU,WAAW,SACnC,KAAK,UAAU,cAAc,YAAY,MAAM,KAAK,UAAU,WAAW,YAAY,KACrF,KAAK,UAAU,cAAc,eAAe,MAAM,KAAK,UAAU,WAAW,eAAe;AAE7F,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAA+B;AAC3C,UAAM,WAAW,KAAK,QAAQ,KAAK,UAAU,qBAAqB;AAGlE,UAAM,gBAAyD,CAAC;AAChE,eAAW,CAAC,YAAY,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,WAAW,CAAC,CAAC,GAAG;AAC9E,UAAI,YAAY,MAAM;AACpB,cAAM,YAAY,KAAK,cAAc,WAAW,MAAM,GAAG,EAAE,GAAG,EAAE,CAAE;AAClE,sBAAc,SAAS,IAAI;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,mBACJ,OAAO,KAAK,aAAa,EAAE,SAAS,IAAI,KAAK,UAAU,eAAe,MAAM,CAAC,EAAE,QAAQ,OAAO,IAAI,EAAE,KAAK,IAAI;AAE/G,UAAM,gBAAgB;AAAA;AAAA;AAAA,YAGd,KAAK,QAAQ,KAAK;AAAA,cAChB,KAAK,QAAQ,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAMrB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAMzB,UAAM,QAAQ,UAAU,aAAa;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAA+B;AAC3C,eAAW,YAAY,KAAK,YAAY;AACtC,YAAM,eAAe,KAAK,QAAQ,KAAK,UAAU,QAAQ;AACzD,UAAI,MAAM,SAAS,YAAY,GAAG;AAChC,kBAAU,QAAQ,MAAM,iDAAc,QAAQ,EAAE;AAChD;AAAA,MACF;AAEA,YAAM,KAAK,MAAM,OAAO,CAAC,OAAO,OAAO,QAAQ,GAAG,KAAK,QAAQ;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAA4B;AACxC,UAAM,gBAAgB,KAAK,QAAQ,KAAK,UAAU,QAAQ;AAE1D,QAAI,KAAK,QAAQ,QAAQ,MAAM;AAC7B,YAAM,aAAa,KAAK,QAAQ,KAAK,UAAU,KAAK,QAAQ,IAAI;AAGhE,UAAI,CAAE,MAAM,SAAS,UAAU,GAAI;AACjC,kBAAU,QAAQ,KAAK,uFAAsB,UAAU,yEAAkB;AACzE;AAAA,MACF;AAEA,UAAI;AACF,cAAM,QAAQ,aAAa;AAG3B,cAAM,WAAW,KAAK,QAAQ,eAAe,UAAU;AAEvD,cAAM,WAAW,KAAK,MAAM,OAAO,GAAG;AACtC,cAAM,UAAU,KAAK,OAAO,OAAO,YAAY,CAAC;AAGhD,cAAM,MAAM,UAAU,EACnB,OAAO,UAAU,UAAU;AAAA,UAC1B,KAAK;AAAA,UACL,YAAY,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,EAAE;AAAA,QAC3C,CAAC,EACA,OAAO;AAAA,UACN,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,OAAO;AAAA,UACP,YAAY,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,EAAE;AAAA,QAC3C,CAAC,EACA,OAAO,QAAQ;AAElB,cAAM,KAAK;AAAA,UACT;AAAA,UACA,CAAC,qBAAqB,YAAY,yBAAyB,WAAW,2BAA2B,SAAS;AAAA,UAC1G,KAAK;AAAA,QACP;AAAA,MACF,SAAS,KAAK;AACZ,kBAAU,QAAQ;AAAA,UAChB,iDAAc,eAAe,QAAQ,IAAI,UAAU,GAAG;AAAA,QACxD;AAAA,MAEF;AAAA,IACF,OAAO;AACL,YAAM,KAAK,aAAa;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,oBAAmC;AAC/C,UAAM,cAAc,KAAK,QAAQ,KAAK,UAAU,SAAS;AAGzD,QAAI,CAAE,MAAM,SAAS,WAAW,GAAI;AAClC,YAAM,IAAI,MAAM,6FAA4B,WAAW,EAAE;AAAA,IAC3D;AAEA,UAAM,KAAK,8BAA8B,WAAW;AACpD,UAAM,KAAK,yBAAyB,WAAW;AAC/C,UAAM,KAAK,0BAA0B,WAAW;AAChD,UAAM,KAAK,6BAA6B,WAAW;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,8BAA8B,aAAoC;AAC9E,UAAM,kBAAkB,KAAK,QAAQ,aAAa,mBAAmB;AAGrE,QAAI,CAAE,MAAM,SAAS,eAAe,GAAI;AACtC,gBAAU,QAAQ,KAAK,kEAA+B,eAAe,EAAE;AACvE;AAAA,IACF;AAEA,QAAI,UAAU,MAAM,OAAO,eAAe;AAE1C,UAAM,aAAa,MAAM,KAAK,YAAY;AAC1C,QAAI,cAAc,QAAQ,CAAC,QAAQ,SAAS,sBAAsB,GAAG;AAEnE,YAAM,cAAc,WAAW,QAAQ,OAAO,MAAM;AACpD,iBAAW;AAAA,uBAA0B,WAAW;AAAA;AAChD,YAAM,QAAQ,iBAAiB,OAAO;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAA2C;AACvD,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,WAAW,UAAU;AAC9B,YAAM,UAAU,MAAM,OAAO,OAAO;AACpC,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO,QAAQ,KAAK,EAAE,GAAG,EAAE;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,yBAAyB,aAAoC;AACzE,UAAM,iBAAiB,KAAK,QAAQ,aAAa,kBAAkB;AAEnE,UAAM,UAAU,MAAM,KAAK,gBAAgB;AAC3C,QAAI,WAAW,MAAM;AAEnB,YAAM,QAAQ,gBAAgB,WAAW,QAAQ,QAAQ,OAAO,GAAG,CAAC;AAAA,CAAI;AAAA,IAC1E,OAAO;AACL,YAAM,IAAI;AAAA,QACR;AAAA,MAGF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAA+C;AAC3D,UAAM,UAAW,IAAI,cAAc,KAAK,IAAI,kBAAkB;AAC9D,QAAI,WAAW,QAAS,MAAM,SAAS,OAAO,GAAI;AAChD,aAAO;AAAA,IACT;AAEA,UAAM,aAAa;AAAA,MACjB,KAAK,QAAS,IAAI,cAAc,KAA4B,IAAI,aAAa;AAAA,MAC7E,KAAK,QAAS,IAAI,MAAM,KAA4B,IAAI,aAAa;AAAA,MACrE;AAAA,MACA;AAAA,IACF;AAEA,eAAW,aAAa,YAAY;AAClC,UAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,0BAA0B,aAAoC;AAC1E,UAAM,eAAe,KAAK,QAAQ,aAAa,kCAAkC;AAGjF,QAAI,CAAE,MAAM,SAAS,YAAY,GAAI;AACnC,YAAM,IAAI,MAAM,oEAAiC,YAAY,EAAE;AAAA,IACjE;AAEA,QAAI,UAAU,MAAM,OAAO,YAAY;AAGvC,QAAI,CAAC,QAAQ,SAAS,8BAA8B,GAAG;AACrD,gBAAU,QAAQ,QAAQ,gBAAgB,kDAAkD;AAAA,IAC9F;AAGA,UAAM,cAAc,KAAK,QAAQ,UAAU,SAAS,eAAe,CAAC;AACpE,eAAW,QAAQ,aAAa;AAC9B,YAAM,UAAU,qDAAqD,KAAK,IAAI;AAC9E,UAAI,CAAC,QAAQ,SAAS,OAAO,GAAG;AAC9B,cAAM,aAAa,KAAK,iBAAiB,OAAO,2BAA2B,KAAK,aAAa,MAAM;AACnG,cAAM,aAAa,KAAK,UAAU,OAAO,kBAAkB,KAAK,MAAM,MAAM;AAC5E,cAAM,WAAW,OAAO,OAAO,GAAG,UAAU,GAAG,UAAU;AAAA;AAEzD,YAAI,KAAK,UAAU,QAAQ,CAAC,QAAQ,SAAS,cAAc,GAAG;AAC5D,oBAAU,QAAQ;AAAA,YAChB;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAEA,kBAAU,QAAQ,QAAQ,eAAe,GAAG,QAAQ,aAAa;AAAA,MACnE;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,QAAQ,UAAU,SAAS;AAClD,QAAI,WAAW;AACb,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,cAAM,OAAO,WAAW,GAAG,KAAK,KAAK;AACrC,YAAI,CAAC,QAAQ,SAAS,WAAW,GAAG,GAAG,GAAG;AACxC,oBAAU,QAAQ,QAAQ,gBAAgB,gBAAgB,IAAI,EAAE;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAGA,UAAM,gBAAgB,KAAK,QAAQ,UAAU,SAAS,iBAAiB,CAAC;AACxE,eAAW,UAAU,eAAe;AAClC,YAAM,YAAY,OAAO,UAAU,OAAO,YAAY;AACtD,UAAI,aAAa,CAAC,QAAQ,SAAS,SAAS,GAAG;AAC7C,cAAM,aAAa,OAAO,UAAU,OAAO,yBAAyB,OAAO,MAAM,QAAQ;AACzF,cAAM,eAAe,OAAO,YAAY,OAAO,2BAA2B,OAAO,QAAQ,QAAQ;AAEjG,kBAAU,QAAQ;AAAA,UAChB;AAAA,UACA;AAAA;AAAA,kBAEQ,UAAU;AAAA,kBACV,YAAY;AAAA;AAAA,QAEtB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,cAAc,OAAO;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,6BAA6B,aAAoC;AAC7E,UAAM,kBAAkB,KAAK,QAAQ,aAAa,kBAAkB;AAGpE,QAAI,CAAE,MAAM,SAAS,eAAe,GAAI;AACtC,YAAM,IAAI,MAAM,6DAA0B,eAAe,EAAE;AAAA,IAC7D;AAEA,QAAI,UAAU,MAAM,OAAO,eAAe;AAG1C,UAAM,UAAU,KAAK,WAAW;AAChC,UAAM,eAAe,QAAQ,MAAM,GAAG;AACtC,UAAM,cACJ,SAAS,aAAa,CAAC,KAAK,GAAG,IAAI,MACnC,SAAS,aAAa,CAAC,KAAK,GAAG,IAAI,MACnC,SAAS,aAAa,CAAC,KAAK,GAAG;AAEjC,cAAU,QAAQ,QAAQ,mBAAmB,eAAe,WAAW,EAAE;AACzE,cAAU,QAAQ,QAAQ,uBAAuB,gBAAgB,OAAO,GAAG;AAG3E,QAAI,KAAK,QAAQ,UAAU,SAAS,cAAc,MAAM;AACtD,YAAM,aAAa,KAAK,QAAQ,SAAS,QAAQ;AACjD,gBAAU,QAAQ,QAAQ,oBAAoB,iBAAiB,UAAU,EAAE;AAC3E,gBAAU,QAAQ,QAAQ,uBAAuB,oBAAoB,UAAU,EAAE;AAAA,IACnF,OAAO;AACL,gBAAU,QAAQ,QAAQ,oBAAoB,6CAA6C;AAC3F,gBAAU,QAAQ,QAAQ,uBAAuB,mDAAmD;AAAA,IACtG;AAGA,UAAM,eAAe,KAAK,QAAQ,KAAK,UAAU,UAAU,2BAA2B;AACtF,UAAM,aAAa,KAAK,QAAQ,UAAU,SAAS;AACnD,QAAI,YAAY;AACd,YAAM,iBAAiB,KAAK,QAAQ,KAAK,UAAU,WAAW,QAAQ;AAEtE,UAAI,CAAE,MAAM,SAAS,cAAc,GAAI;AACrC,cAAM,IAAI,MAAM,6EAA2B,cAAc,EAAE;AAAA,MAC7D;AACA,YAAM,OAAO,gBAAgB,YAAY;AAGzC,YAAM,uBAAuB,KAAK,SAAS,KAAK,QAAQ,eAAe,GAAG,YAAY,EAAE,QAAQ,OAAO,GAAG;AAC1G,YAAM,eAAe,WAAW,gBAAgB;AAEhD,UAAI,CAAC,QAAQ,SAAS,gBAAgB,GAAG;AACvC,cAAM,sBAAsB;AAAA;AAAA;AAAA,8BAGN,oBAAoB;AAAA,6BACrB,WAAW,aAAa;AAAA,wBAC7B,WAAW,KAAK;AAAA,2BACb,WAAW,QAAQ;AAAA,yBACrB,YAAY;AAAA;AAAA;AAAA;AAI7B,kBAAU,QAAQ,QAAQ,kBAAkB,CAAC,UAAU,GAAG,KAAK,GAAG,mBAAmB,EAAE;AAAA,MACzF;AAEA,UAAI,CAAC,QAAQ,SAAS,sCAAsC,GAAG;AAC7D,kBAAU,QAAQ;AAAA,UAChB;AAAA,UACA;AAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,KAAK,YAAY;AAAA,IACzB;AAEA,UAAM,QAAQ,iBAAiB,OAAO;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,cAAc,SAAiB,WAAkC;AAC7E,UAAM,cAAc,KAAK,QAAQ,KAAK,UAAU,SAAS;AACzD,UAAM,gBAAgB,KAAK,QAAQ,SAAS,SAAS;AAErD,UAAM,WAAW,KAAK,QAAQ,UAAU,SAAS;AACjD,UAAM,aAAa,cAAc,YAAa,WAAW,kBAAkB,oBAAqB;AAIhG,QAAI,QAAQ,aAAa,SAAS;AAChC,YAAM,KAAK,MAAM,OAAO,CAAC,MAAM,eAAe,YAAY,aAAa,GAAG,WAAW;AAAA,IACvF,OAAO;AACL,YAAM,KAAK,MAAM,MAAM,CAAC,aAAa,YAAY,aAAa,GAAG,WAAW;AAAA,IAC9E;AAGA,UAAM,KAAK,wBAAwB,aAAa,eAAe,SAAS;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,wBAAwB,aAAqB,eAAuB,WAAkC;AAClH,UAAM,WAAW,KAAK,QAAQ,UAAU,SAAS;AACjD,UAAM,WAAW,QAAQ,KAAK,QAAQ,UAAU,SAAS,IAAI;AAE7D,UAAM,MAAM,WAAW,QAAQ;AAC/B,UAAM,aAAa,WAAW,WAAW;AACzC,UAAM,WAAW,WAAW,OAAO,SAAS,IAAI,GAAG,KAAK,OAAO,SAAS,aAAa,GAAG;AAExF,UAAM,aAAa,KAAK,QAAQ,aAAa,qBAAqB,YAAY,WAAW,QAAQ;AAEjG,UAAM,aAAc,MAAM,SAAS,UAAU,IACzC,aACA,KAAK,QAAQ,aAAa,qBAAqB,YAAY,WAAW,OAAO,SAAS,IAAI,GAAG,EAAE;AAEnG,QAAI,CAAE,MAAM,SAAS,UAAU,GAAI;AACjC,gBAAU,QAAQ,KAAK,uFAAsB,UAAU,EAAE;AACzD;AAAA,IACF;AAEA,UAAM,iBAAiB,GAAG,KAAK,QAAQ,OAAO,GAAG,WAAW,KAAK,WAAW,WAAW,GAAG;AAE1F,UAAM,QAAQ,aAAa;AAC3B,UAAM,OAAO,YAAY,KAAK,QAAQ,eAAe,cAAc,CAAC;AAGpE,UAAM,cAAc,KAAK,QAAQ,eAAe,SAAS;AACzD,UAAM,QAAQ,WAAW;AACzB,UAAM,OAAO,YAAY,KAAK,QAAQ,aAAa,GAAG,KAAK,WAAW,OAAO,IAAI,GAAG,EAAE,CAAC;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,iBAAiB,KAA4B;AACzD,UAAM,aAAa,KAAK,QAAQ,KAAK,UAAU,qBAAqB;AAEpE,QAAI,CAAE,MAAM,SAAS,UAAU,EAAI;AAEnC,QAAI,UAAU,MAAM,OAAO,UAAU;AAErC,QAAI,QAAQ,SAAS,MAAM,GAAG;AAC5B,gBAAU,QAAQ,QAAQ,kBAAkB,SAAS,GAAG,GAAG;AAAA,IAC7D,WAAW,QAAQ,SAAS,SAAS,GAAG;AACtC,gBAAU,QAAQ,QAAQ,gBAAgB;AAAA,YAAwB,GAAG,IAAI;AAAA,IAC3E;AAEA,UAAM,QAAQ,YAAY,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,cAAc,KAAqB;AACzC,WAAO,IAAI,QAAQ,YAAY,CAAC,GAAG,MAAc,EAAE,YAAY,CAAC,EAAE,QAAQ,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;AAAA,EACxG;AAAA;AAGF;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/add-client.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport { input, confirm } from \"@inquirer/prompts\";\nimport { consola } from \"consola\";\nimport { renderTemplateDir } from \"../utils/template\";\nimport { addPackageToSdConfig, addTailwindToEslintConfig } from \"../utils/config-editor\";\nimport { spawn } from \"../utils/spawn\";\n\n//#region Types\n\n/**\n * Add-client \uBA85\uB839 \uC635\uC158\n */\nexport interface AddClientOptions {}\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//#endregion\n\n//#region Main\n\n/**\n * \uD074\uB77C\uC774\uC5B8\uD2B8 \uD328\uD0A4\uC9C0\uB97C \uD504\uB85C\uC81D\uD2B8\uC5D0 \uCD94\uAC00\uD55C\uB2E4.\n *\n * 1. \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uD655\uC778 (sd.config.ts \uC874\uC7AC)\n * 2. \uB300\uD654\uD615 \uD504\uB86C\uD504\uD2B8 (\uC774\uB984 \uC811\uBBF8\uC0AC, \uB77C\uC6B0\uD130 \uC0AC\uC6A9 \uC5EC\uBD80)\n * 3. \uD328\uD0A4\uC9C0 \uB514\uB809\uD1A0\uB9AC \uC911\uBCF5 \uD655\uC778\n * 4. Handlebars \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n * 5. sd.config.ts\uC5D0 \uD328\uD0A4\uC9C0 \uD56D\uBAA9 \uCD94\uAC00 (ts-morph)\n * 6. eslint.config.ts\uC5D0 tailwind \uC124\uC815 \uCD94\uAC00 (\uCCAB \uD074\uB77C\uC774\uC5B8\uD2B8\uC778 \uACBD\uC6B0)\n * 7. pnpm install\n */\nexport async function runAddClient(_options: AddClientOptions): Promise<void> {\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:add-client\");\n\n // 1. \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uD655\uC778\n if (!fs.existsSync(path.join(cwd, \"sd.config.ts\"))) {\n consola.error(\"sd.config.ts\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8\uC5D0\uC11C \uC2E4\uD589\uD574\uC8FC\uC138\uC694.\");\n process.exitCode = 1;\n return;\n }\n\n // \uD504\uB85C\uC81D\uD2B8\uBA85\n const projectName = path.basename(cwd);\n\n // 2. \uB300\uD654\uD615 \uD504\uB86C\uD504\uD2B8\n const clientSuffix = await input({\n message: \"\uD074\uB77C\uC774\uC5B8\uD2B8 \uC774\uB984\uC744 \uC785\uB825\uD558\uC138\uC694 (client-___):\",\n validate: (value) => {\n if (!value.trim()) return \"\uC774\uB984\uC744 \uC785\uB825\uD574\uC8FC\uC138\uC694.\";\n if (!/^[a-z][a-z0-9-]*$/.test(value)) return \"\uC18C\uBB38\uC790, \uC22B\uC790, \uD558\uC774\uD508\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4.\";\n return true;\n },\n });\n\n const useRouter = await confirm({\n message: \"\uB77C\uC6B0\uD130\uB97C \uC0AC\uC6A9\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?\",\n default: true,\n });\n\n const clientName = `client-${clientSuffix}`;\n\n // 3. \uD328\uD0A4\uC9C0 \uB514\uB809\uD1A0\uB9AC \uC911\uBCF5 \uD655\uC778\n const packageDir = path.join(cwd, \"packages\", clientName);\n if (fs.existsSync(packageDir)) {\n consola.error(`packages/${clientName} \uB514\uB809\uD1A0\uB9AC\uAC00 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.`);\n process.exitCode = 1;\n return;\n }\n\n // 4. \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n const pkgRoot = findPackageRoot(import.meta.dirname);\n const templateDir = path.join(pkgRoot, \"templates\", \"add-client\");\n\n const context = {\n projectName,\n clientSuffix,\n clientName,\n router: useRouter,\n };\n\n const dirReplacements = {\n __CLIENT__: clientName,\n };\n\n logger.info(`${clientName} \uD328\uD0A4\uC9C0 \uC0DD\uC131 \uC911...`);\n await renderTemplateDir(templateDir, path.join(cwd, \"packages\"), context, dirReplacements);\n logger.success(`packages/${clientName} \uC0DD\uC131 \uC644\uB8CC`);\n\n // 5. sd.config.ts \uC5C5\uB370\uC774\uD2B8\n const sdConfigPath = path.join(cwd, \"sd.config.ts\");\n const added = addPackageToSdConfig(sdConfigPath, clientName, { target: \"client\" });\n if (added) {\n logger.success(\"sd.config.ts \uC5C5\uB370\uC774\uD2B8 \uC644\uB8CC\");\n } else {\n consola.warn(`\"${clientName}\"\uC774(\uAC00) sd.config.ts\uC5D0 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.`);\n }\n\n // 6. eslint.config.ts tailwind \uC124\uC815 \uCD94\uAC00 (\uCCAB \uD074\uB77C\uC774\uC5B8\uD2B8\uC778 \uACBD\uC6B0)\n const eslintConfigPath = path.join(cwd, \"eslint.config.ts\");\n if (fs.existsSync(eslintConfigPath)) {\n const tailwindAdded = addTailwindToEslintConfig(eslintConfigPath, clientName);\n if (tailwindAdded) {\n logger.success(\"eslint.config.ts\uC5D0 tailwind \uC124\uC815 \uCD94\uAC00\");\n }\n }\n\n // 7. 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 // \uC644\uB8CC\n consola.box(\n [`\uD074\uB77C\uC774\uC5B8\uD2B8 \"${clientName}\"\uC774(\uAC00) \uCD94\uAC00\uB418\uC5C8\uC2B5\uB2C8\uB2E4!`, \"\", ` pnpm dev ${clientName} \uAC1C\uBC1C \uC11C\uBC84 \uC2E4\uD589`].join(\"\\n\"),\n );\n}\n\n//#endregion\n"],
|
|
5
4
|
"mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,OAAO,eAAe;AAC/B,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,sBAAsB,iCAAiC;AAChE,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;AAiBA,eAAsB,aAAa,UAA2C;AAC5E,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,mBAAmB;AAGlD,MAAI,CAAC,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,GAAG;AAClD,YAAQ,MAAM,0JAA4C;AAC1D,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,cAAc,KAAK,SAAS,GAAG;AAGrC,QAAM,eAAe,MAAM,MAAM;AAAA,IAC/B,SAAS;AAAA,IACT,UAAU,CAAC,UAAU;AACnB,UAAI,CAAC,MAAM,KAAK,EAAG,QAAO;AAC1B,UAAI,CAAC,oBAAoB,KAAK,KAAK,EAAG,QAAO;AAC7C,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,YAAY,MAAM,QAAQ;AAAA,IAC9B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,aAAa,UAAU,YAAY;AAGzC,QAAM,aAAa,KAAK,KAAK,KAAK,YAAY,UAAU;AACxD,MAAI,GAAG,WAAW,UAAU,GAAG;AAC7B,YAAQ,MAAM,YAAY,UAAU,8EAAkB;AACtD,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,UAAU,gBAAgB,YAAY,OAAO;AACnD,QAAM,cAAc,KAAK,KAAK,SAAS,aAAa,YAAY;AAEhE,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,QAAM,kBAAkB;AAAA,IACtB,YAAY;AAAA,EACd;AAEA,SAAO,KAAK,GAAG,UAAU,4CAAc;AACvC,QAAM,kBAAkB,aAAa,KAAK,KAAK,KAAK,UAAU,GAAG,SAAS,eAAe;AACzF,SAAO,QAAQ,YAAY,UAAU,4BAAQ;AAG7C,QAAM,eAAe,KAAK,KAAK,KAAK,cAAc;AAClD,QAAM,QAAQ,qBAAqB,cAAc,YAAY,EAAE,QAAQ,SAAS,CAAC;AACjF,MAAI,OAAO;AACT,WAAO,QAAQ,oDAAsB;AAAA,EACvC,OAAO;AACL,YAAQ,KAAK,IAAI,UAAU,iFAA+B;AAAA,EAC5D;AAGA,QAAM,mBAAmB,KAAK,KAAK,KAAK,kBAAkB;AAC1D,MAAI,GAAG,WAAW,gBAAgB,GAAG;AACnC,UAAM,gBAAgB,0BAA0B,kBAAkB,UAAU;AAC5E,QAAI,eAAe;AACjB,aAAO,QAAQ,2DAAkC;AAAA,IACnD;AAAA,EACF;AAGA,SAAO,KAAK,qCAAsB;AAClC,QAAM,MAAM,QAAQ,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC;AACxC,SAAO,QAAQ,2BAAiB;AAGhC,UAAQ;AAAA,IACN,CAAC,mCAAU,UAAU,+DAAkB,IAAI,cAAc,UAAU,4CAAc,EAAE,KAAK,IAAI;AAAA,EAC9F;AACF;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/add-server.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport { input, checkbox } from \"@inquirer/prompts\";\nimport { consola } from \"consola\";\nimport { renderTemplateDir } from \"../utils/template\";\nimport { addPackageToSdConfig, setClientServerInSdConfig } from \"../utils/config-editor\";\nimport { spawn } from \"../utils/spawn\";\n\n//#region Types\n\n/**\n * Add-server \uBA85\uB839 \uC635\uC158\n */\nexport interface AddServerOptions {}\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 * sd.config.ts\uB97C \uC77D\uC5B4\uC11C target\uC774 \"client\"\uC778 \uD328\uD0A4\uC9C0\uBA85 \uBAA9\uB85D\uC744 \uBC18\uD658\uD55C\uB2E4.\n */\nfunction findClientPackages(sdConfigPath: string): string[] {\n const content = fs.readFileSync(sdConfigPath, \"utf-8\");\n const clients: string[] = [];\n\n // \uAC04\uB2E8\uD55C \uD328\uD134 \uB9E4\uCE6D\uC73C\uB85C client \uD328\uD0A4\uC9C0 \uCC3E\uAE30\n const regex = /\"([^\"]+)\":\\s*\\{[^}]*target:\\s*\"client\"/g;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(content)) != null) {\n clients.push(match[1]);\n }\n return clients;\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uC11C\uBC84 \uD328\uD0A4\uC9C0\uB97C \uD504\uB85C\uC81D\uD2B8\uC5D0 \uCD94\uAC00\uD55C\uB2E4.\n *\n * 1. \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uD655\uC778\n * 2. \uB300\uD654\uD615 \uD504\uB86C\uD504\uD2B8 (\uC774\uB984 \uC811\uBBF8\uC0AC, \uD074\uB77C\uC774\uC5B8\uD2B8 \uC120\uD0DD)\n * 3. \uD328\uD0A4\uC9C0 \uB514\uB809\uD1A0\uB9AC \uC911\uBCF5 \uD655\uC778\n * 4. Handlebars \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n * 5. sd.config.ts\uC5D0 \uC11C\uBC84 \uD328\uD0A4\uC9C0 \uD56D\uBAA9 \uCD94\uAC00\n * 6. \uC120\uD0DD\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8\uC758 server \uD544\uB4DC \uC5C5\uB370\uC774\uD2B8\n * 7. pnpm install\n */\nexport async function runAddServer(_options: AddServerOptions): Promise<void> {\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:add-server\");\n\n // 1. \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uD655\uC778\n const sdConfigPath = path.join(cwd, \"sd.config.ts\");\n if (!fs.existsSync(sdConfigPath)) {\n consola.error(\"sd.config.ts\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8\uC5D0\uC11C \uC2E4\uD589\uD574\uC8FC\uC138\uC694.\");\n process.exitCode = 1;\n return;\n }\n\n const projectName = path.basename(cwd);\n\n // 2. \uB300\uD654\uD615 \uD504\uB86C\uD504\uD2B8\n const serverSuffix = await input({\n message: '\uC11C\uBC84 \uC774\uB984 \uC811\uBBF8\uC0AC (\uBE44\uC6CC\uB450\uBA74 \"server\"):',\n validate: (value) => {\n if (value.trim() === \"\") return true; // \uBE48 \uAC12 \uD5C8\uC6A9\n if (!/^[a-z][a-z0-9-]*$/.test(value)) return \"\uC18C\uBB38\uC790, \uC22B\uC790, \uD558\uC774\uD508\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4.\";\n return true;\n },\n });\n\n const serverName = serverSuffix.trim() === \"\" ? \"server\" : `server-${serverSuffix}`;\n\n // \uD074\uB77C\uC774\uC5B8\uD2B8 \uC120\uD0DD (\uAE30\uC874 \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uC788\uB294 \uACBD\uC6B0)\n const clientPackages = findClientPackages(sdConfigPath);\n let selectedClients: string[] = [];\n\n if (clientPackages.length > 0) {\n selectedClients = await checkbox({\n message: \"\uC774 \uC11C\uBC84\uAC00 \uC11C\uBE44\uC2A4\uD560 \uD074\uB77C\uC774\uC5B8\uD2B8\uB97C \uC120\uD0DD\uD558\uC138\uC694:\",\n choices: clientPackages.map((name) => ({ name, value: name })),\n });\n }\n\n // 3. \uD328\uD0A4\uC9C0 \uB514\uB809\uD1A0\uB9AC \uC911\uBCF5 \uD655\uC778\n const packageDir = path.join(cwd, \"packages\", serverName);\n if (fs.existsSync(packageDir)) {\n consola.error(`packages/${serverName} \uB514\uB809\uD1A0\uB9AC\uAC00 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.`);\n process.exitCode = 1;\n return;\n }\n\n // 4. \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n const pkgRoot = findPackageRoot(import.meta.dirname);\n const templateDir = path.join(pkgRoot, \"templates\", \"add-server\");\n\n const context = {\n projectName,\n serverName,\n port: 3000,\n };\n\n const dirReplacements = {\n __SERVER__: serverName,\n };\n\n logger.info(`${serverName} \uD328\uD0A4\uC9C0 \uC0DD\uC131 \uC911...`);\n await renderTemplateDir(templateDir, path.join(cwd, \"packages\"), context, dirReplacements);\n logger.success(`packages/${serverName} \uC0DD\uC131 \uC644\uB8CC`);\n\n // 5. sd.config.ts\uC5D0 \uC11C\uBC84 \uD328\uD0A4\uC9C0 \uCD94\uAC00\n const added = addPackageToSdConfig(sdConfigPath, serverName, { target: \"server\" });\n if (added) {\n logger.success(\"sd.config.ts\uC5D0 \uC11C\uBC84 \uD328\uD0A4\uC9C0 \uCD94\uAC00 \uC644\uB8CC\");\n } else {\n consola.warn(`\"${serverName}\"\uC774(\uAC00) sd.config.ts\uC5D0 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.`);\n }\n\n // 6. \uC120\uD0DD\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8\uC758 server \uD544\uB4DC \uC5C5\uB370\uC774\uD2B8\n for (const clientName of selectedClients) {\n setClientServerInSdConfig(sdConfigPath, clientName, serverName);\n logger.info(`${clientName}\uC758 \uC11C\uBC84\uB97C \"${serverName}\"\uC73C\uB85C \uC124\uC815`);\n }\n\n // 7. 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 // \uC644\uB8CC\n consola.box(`\uC11C\uBC84 \"${serverName}\"\uC774(\uAC00) \uCD94\uAC00\uB418\uC5C8\uC2B5\uB2C8\uB2E4!`);\n}\n\n//#endregion\n"],
|
|
5
4
|
"mappings": "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",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/build.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport ts from \"typescript\";\nimport { Listr, type ListrTask } from \"listr2\";\nimport { Worker, type WorkerProxy, fsRm } from \"@simplysm/core-node\";\nimport \"@simplysm/core-common\";\nimport { consola, LogLevels } from \"consola\";\nimport type { SdConfig, SdBuildPackageConfig, SdClientPackageConfig, SdServerPackageConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { getVersion } from \"../utils/build-env\";\nimport { setupReplaceDeps } from \"../utils/replace-deps\";\nimport type { TypecheckEnv } from \"../utils/tsconfig\";\nimport { deserializeDiagnostic } from \"../utils/typecheck-serialization\";\nimport { runLint, type LintOptions } from \"./lint\";\nimport type * as LibraryWorkerModule from \"../workers/library.worker\";\nimport type * as ServerWorkerModule from \"../workers/server.worker\";\nimport type * as ClientWorkerModule from \"../workers/client.worker\";\nimport type * as DtsWorkerModule from \"../workers/dts.worker\";\nimport { Capacitor } from \"../capacitor/capacitor\";\nimport { Electron } from \"../electron/electron\";\nimport { copySrcFiles } from \"../utils/copy-src\";\n\n//#region Types\n\n/**\n * Build \uBA85\uB839 \uC635\uC158\n */\nexport interface BuildOptions {\n /** \uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n/**\n * \uBE4C\uB4DC \uACB0\uACFC\n */\ninterface BuildResult {\n name: string;\n target: string;\n type: \"js\" | \"dts\" | \"vite\" | \"capacitor\" | \"electron\";\n success: boolean;\n errors?: string[];\n diagnostics?: ts.Diagnostic[];\n}\n\n/**\n * \uD328\uD0A4\uC9C0 \uBD84\uB958 \uACB0\uACFC\n */\ninterface ClassifiedPackages {\n /** node/browser/neutral \uD0C0\uAC9F (JS + dts) */\n buildPackages: Array<{ name: string; config: SdBuildPackageConfig }>;\n /** client \uD0C0\uAC9F (Vite build + typecheck) */\n clientPackages: Array<{ name: string; config: SdClientPackageConfig }>;\n /** server \uD0C0\uAC9F (JS \uBE4C\uB4DC, dts \uC81C\uC678) */\n serverPackages: Array<{ name: string; config: SdServerPackageConfig }>;\n}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * \uD328\uD0A4\uC9C0\uB97C \uD0C0\uAC9F\uBCC4\uB85C \uBD84\uB958\n * - node/browser/neutral: buildPackages (JS + dts)\n * - client: clientPackages (Vite build + typecheck)\n * - server: serverPackages (JS \uBE4C\uB4DC, dts \uC81C\uC678)\n * - scripts: \uC81C\uC678\n */\nfunction classifyPackages(\n packages: Record<\n string,\n SdBuildPackageConfig | SdClientPackageConfig | SdServerPackageConfig | { target: \"scripts\" } | undefined\n >,\n targets: string[],\n): ClassifiedPackages {\n const buildPackages: ClassifiedPackages[\"buildPackages\"] = [];\n const clientPackages: ClassifiedPackages[\"clientPackages\"] = [];\n const serverPackages: ClassifiedPackages[\"serverPackages\"] = [];\n\n for (const [name, config] of Object.entries(packages)) {\n if (config == null) continue;\n if (config.target === \"scripts\") continue;\n\n // targets\uAC00 \uC9C0\uC815\uB418\uBA74 \uD574\uB2F9 \uD328\uD0A4\uC9C0\uB9CC \uD3EC\uD568\n if (targets.length > 0 && !targets.includes(name)) continue;\n\n if (config.target === \"client\") {\n clientPackages.push({ name, config });\n } else if (config.target === \"server\") {\n serverPackages.push({ name, config });\n } else {\n buildPackages.push({ name, config });\n }\n }\n\n return { buildPackages, clientPackages, serverPackages };\n}\n\n/**\n * dist \uD3F4\uB354 \uC0AD\uC81C\n */\nasync function cleanDistFolders(cwd: string, packageNames: string[]): Promise<void> {\n await Promise.all(packageNames.map((name) => fsRm(path.join(cwd, \"packages\", name, \"dist\"))));\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\uB97C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `sd.config.ts`\uB97C \uB85C\uB4DC\uD558\uC5EC \uD328\uD0A4\uC9C0\uBCC4 \uBE4C\uB4DC \uD0C0\uAC9F \uC815\uBCF4 \uD655\uC778 (\uD544\uC218)\n * - lint \uC2E4\uD589\n * - dist \uD3F4\uB354 \uC815\uB9AC (clean build)\n * - `node`/`browser`/`neutral` \uD0C0\uAC9F: esbuild JS \uBE4C\uB4DC + dts \uC0DD\uC131 (\uD0C0\uC785\uCCB4\uD06C \uD3EC\uD568)\n * - `client` \uD0C0\uAC9F: Vite production \uBE4C\uB4DC + typecheck (dts \uBD88\uD544\uC694)\n * - \uD558\uB098\uB77C\uB3C4 \uC2E4\uD328\uD558\uBA74 `process.exitCode = 1` \uC124\uC815\n *\n * @param options - build \uC2E4\uD589 \uC635\uC158\n * @returns \uC644\uB8CC \uC2DC resolve\n */\nexport async function runBuild(options: BuildOptions): Promise<void> {\n const { targets } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:build\");\n\n logger.debug(\"\uBE4C\uB4DC \uC2DC\uC791\", { targets });\n\n // sd.config.ts \uB85C\uB4DC\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({ cwd, dev: false, opt: options.options });\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // replaceDeps \uC124\uC815\uC774 \uC788\uC73C\uBA74 symlink \uAD50\uCCB4\n if (sdConfig.replaceDeps != null) {\n await setupReplaceDeps(cwd, sdConfig.replaceDeps);\n }\n\n // VER, DEV \uD658\uACBD\uBCC0\uC218 \uC900\uBE44\n const version = await getVersion(cwd);\n const baseEnv = { VER: version, DEV: \"false\" };\n\n // \uD328\uD0A4\uC9C0 \uBD84\uB958\n const { buildPackages, clientPackages, serverPackages } = classifyPackages(sdConfig.packages, targets);\n const allPackageNames = [\n ...buildPackages.map((p) => p.name),\n ...clientPackages.map((p) => p.name),\n ...serverPackages.map((p) => p.name),\n ];\n\n if (allPackageNames.length === 0) {\n process.stdout.write(\"\u2714 \uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n logger.debug(\"\uD328\uD0A4\uC9C0 \uBD84\uB958 \uC644\uB8CC\", {\n buildPackages: buildPackages.map((p) => p.name),\n clientPackages: clientPackages.map((p) => p.name),\n serverPackages: serverPackages.map((p) => p.name),\n });\n\n // \uACB0\uACFC \uC218\uC9D1\n const results: BuildResult[] = [];\n // \uC5D0\uB7EC \uCD94\uC801 (\uAC1D\uCCB4\uB85C \uB798\uD551\uD558\uC5EC \uCF5C\uBC31 \uB0B4 \uC218\uC815 \uCD94\uC801 \uAC00\uB2A5\uD558\uAC8C \uD568)\n const state = { hasError: false };\n\n // Worker \uACBD\uB85C\n const libraryWorkerPath = import.meta.resolve(\"../workers/library.worker\");\n const serverWorkerPath = import.meta.resolve(\"../workers/server.worker\");\n const clientWorkerPath = import.meta.resolve(\"../workers/client.worker\");\n const dtsWorkerPath = import.meta.resolve(\"../workers/dts.worker\");\n\n // \uD30C\uC77C \uCE90\uC2DC (diagnostics \uCD9C\uB825\uC6A9)\n const fileCache = new Map<string, string>();\n\n // formatHost (diagnostics \uCD9C\uB825\uC6A9)\n const formatHost: ts.FormatDiagnosticsHost = {\n getCanonicalFileName: (f) => f,\n getCurrentDirectory: () => cwd,\n getNewLine: () => ts.sys.newLine,\n };\n\n // Lint \uC635\uC158 (\uC804\uCCB4 \uD328\uD0A4\uC9C0 \uB300\uC0C1)\n const lintOptions: LintOptions = {\n targets: allPackageNames.map((name) => `packages/${name}`),\n fix: false,\n timing: false,\n };\n\n // Listr \uAD6C\uC870: Lint \u2192 Clean \u2192 Build (\uC21C\uCC28)\n const mainListr = new Listr(\n [\n {\n title: \"Lint\",\n task: async () => {\n await runLint(lintOptions);\n // lint \uC5D0\uB7EC\uAC00 \uC788\uC73C\uBA74 process.exitCode\uAC00 1\uB85C \uC124\uC815\uB428\n if (process.exitCode === 1) {\n state.hasError = true;\n }\n },\n },\n {\n title: \"Clean\",\n task: async () => {\n await cleanDistFolders(cwd, allPackageNames);\n },\n },\n {\n title: \"Build\",\n task: (_, task) => {\n const buildTasks: ListrTask[] = [];\n\n // buildPackages: JS \uBE4C\uB4DC + dts \uC0DD\uC131\n for (const { name, config } of buildPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n const env: TypecheckEnv = config.target === \"node\" ? \"node\" : \"browser\";\n\n buildTasks.push({\n title: `${name} (${config.target})`,\n task: async () => {\n // JS \uBE4C\uB4DC\uC640 DTS \uC0DD\uC131\uC744 \uBCD1\uB82C \uC2E4\uD589\n const libraryWorker: WorkerProxy<typeof LibraryWorkerModule> =\n Worker.create<typeof LibraryWorkerModule>(libraryWorkerPath);\n const dtsWorker: WorkerProxy<typeof DtsWorkerModule> =\n Worker.create<typeof DtsWorkerModule>(dtsWorkerPath);\n\n try {\n const [buildResult, dtsResult] = await Promise.all([\n // JS \uBE4C\uB4DC\n libraryWorker.build({ name, config, cwd, pkgDir }),\n // DTS \uC0DD\uC131\n dtsWorker.buildDts({ name, cwd, pkgDir, env, emit: true }),\n ]);\n\n // JS \uBE4C\uB4DC \uACB0\uACFC \uCC98\uB9AC\n results.push({\n name,\n target: config.target,\n type: \"js\",\n success: buildResult.success,\n errors: buildResult.errors,\n });\n if (!buildResult.success) state.hasError = true;\n\n // DTS \uACB0\uACFC \uCC98\uB9AC\n const diagnostics = dtsResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));\n results.push({\n name,\n target: config.target,\n type: \"dts\",\n success: dtsResult.success,\n errors: dtsResult.errors,\n diagnostics,\n });\n if (!dtsResult.success) state.hasError = true;\n } finally {\n await Promise.all([libraryWorker.terminate(), dtsWorker.terminate()]);\n }\n\n // copySrc \uD30C\uC77C \uBCF5\uC0AC\n if (config.copySrc != null && config.copySrc.length > 0) {\n await copySrcFiles(pkgDir, config.copySrc);\n }\n },\n });\n }\n\n // clientPackages: Vite \uBE4C\uB4DC + typecheck + Capacitor \uBE4C\uB4DC\n for (const { name, config } of clientPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n\n buildTasks.push({\n title: `${name} (client)`,\n task: async () => {\n // Vite \uBE4C\uB4DC\uC640 \uD0C0\uC785\uCCB4\uD06C\uB97C \uBCD1\uB82C \uC2E4\uD589\n const clientWorker: WorkerProxy<typeof ClientWorkerModule> =\n Worker.create<typeof ClientWorkerModule>(clientWorkerPath);\n const dtsWorker: WorkerProxy<typeof DtsWorkerModule> =\n Worker.create<typeof DtsWorkerModule>(dtsWorkerPath);\n\n try {\n const clientConfig: SdClientPackageConfig = {\n ...config,\n env: { ...baseEnv, ...config.env },\n };\n const [clientResult, dtsResult] = await Promise.all([\n // Vite production \uBE4C\uB4DC\n clientWorker.build({ name, config: clientConfig, cwd, pkgDir }),\n // typecheck (dts \uC5C6\uC774)\n dtsWorker.buildDts({\n name,\n cwd,\n pkgDir,\n env: \"browser\",\n emit: false,\n }),\n ]);\n\n // Vite \uBE4C\uB4DC \uACB0\uACFC \uCC98\uB9AC\n results.push({\n name,\n target: \"client\",\n type: \"vite\",\n success: clientResult.success,\n errors: clientResult.errors,\n });\n if (!clientResult.success) state.hasError = true;\n\n // \uD0C0\uC785\uCCB4\uD06C \uACB0\uACFC \uCC98\uB9AC\n const diagnostics = dtsResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));\n results.push({\n name,\n target: \"client\",\n type: \"dts\",\n success: dtsResult.success,\n errors: dtsResult.errors,\n diagnostics,\n });\n if (!dtsResult.success) state.hasError = true;\n } finally {\n await Promise.all([clientWorker.terminate(), dtsWorker.terminate()]);\n }\n\n // Capacitor \uBE4C\uB4DC (\uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n if (config.capacitor != null) {\n const outPath = path.join(pkgDir, \"dist\");\n try {\n const cap = await Capacitor.create(pkgDir, config.capacitor);\n await cap.initialize();\n await cap.build(outPath);\n results.push({\n name,\n target: \"client\",\n type: \"capacitor\",\n success: true,\n });\n } catch (err) {\n results.push({\n name,\n target: \"client\",\n type: \"capacitor\",\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n });\n state.hasError = true;\n }\n }\n\n // Electron \uBE4C\uB4DC (\uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n if (config.electron != null) {\n const outPath = path.join(pkgDir, \"dist\");\n try {\n const electron = await Electron.create(pkgDir, config.electron);\n await electron.initialize();\n await electron.build(outPath);\n results.push({\n name,\n target: \"client\",\n type: \"electron\",\n success: true,\n });\n } catch (err) {\n results.push({\n name,\n target: \"client\",\n type: \"electron\",\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n });\n state.hasError = true;\n }\n }\n },\n });\n }\n\n // serverPackages: JS \uBE4C\uB4DC\uB9CC (dts \uC0DD\uC131 \uC81C\uC678)\n for (const { name, config } of serverPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n\n buildTasks.push({\n title: `${name} (server)`,\n task: async () => {\n const serverWorker: WorkerProxy<typeof ServerWorkerModule> =\n Worker.create<typeof ServerWorkerModule>(serverWorkerPath);\n\n try {\n const buildResult = await serverWorker.build({\n name,\n cwd,\n pkgDir,\n env: { ...baseEnv, ...config.env },\n configs: config.configs,\n externals: config.externals,\n pm2: config.pm2,\n packageManager: config.packageManager,\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
4
|
"mappings": "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",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/dev.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from \"fs\";\nimport path from \"path\";\nimport { Listr } from \"listr2\";\nimport { Worker, type WorkerProxy } from \"@simplysm/core-node\";\nimport type { SdConfig, SdClientPackageConfig, SdServerPackageConfig } from \"../sd-config.types\";\nimport { consola } from \"consola\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { getVersion } from \"../utils/build-env\";\nimport { setupReplaceDeps } from \"../utils/replace-deps\";\nimport type * as ClientWorkerModule from \"../workers/client.worker\";\nimport type * as ServerWorkerModule from \"../workers/server.worker\";\nimport type * as ServerRuntimeWorkerModule from \"../workers/server-runtime.worker\";\nimport { Capacitor } from \"../capacitor/capacitor\";\nimport { filterPackagesByTargets, getWatchScopes, type PackageResult } from \"../utils/package-utils\";\nimport { printErrors, printServers } from \"../utils/output-utils\";\nimport { RebuildListrManager } from \"../utils/listr-manager\";\nimport {\n registerWorkerEventHandlers,\n type ServerReadyEventData,\n type ServerBuildEventData,\n type ErrorEventData,\n} from \"../utils/worker-events\";\n\n//#region Types\n\n/**\n * Dev \uBA85\uB839 \uC635\uC158\n */\nexport interface DevOptions {\n /** dev\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n options: string[];\n}\n\n/**\n * Client Worker \uC815\uBCF4 (Vite dev server\uC6A9)\n */\ninterface ClientWorkerInfo {\n name: string;\n config: SdClientPackageConfig;\n worker: WorkerProxy<typeof ClientWorkerModule>;\n isInitialBuild: boolean;\n buildResolver: (() => void) | undefined;\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * Client \uBC0F Server \uD328\uD0A4\uC9C0\uB97C \uAC1C\uBC1C \uBAA8\uB4DC\uB85C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `sd.config.ts`\uB97C \uB85C\uB4DC\uD558\uC5EC \uD328\uD0A4\uC9C0\uBCC4 \uBE4C\uB4DC \uD0C0\uAC9F \uC815\uBCF4 \uD655\uC778 (\uD544\uC218)\n * - `client` \uD0C0\uAC9F: Vite dev server \uC2DC\uC791\n * - `server` \uD0C0\uAC9F: Server Build Worker + Server Runtime Worker\n * - Server-Client \uD504\uB85D\uC2DC \uC5F0\uACB0 \uC9C0\uC6D0\n * - Capacitor \uCD08\uAE30\uD654 \uC9C0\uC6D0\n * - SIGINT/SIGTERM \uC2DC\uADF8\uB110\uB85C \uC885\uB8CC\n *\n * @param options - dev \uC2E4\uD589 \uC635\uC158\n * @returns \uC885\uB8CC \uC2DC\uADF8\uB110 \uC218\uC2E0 \uC2DC resolve\n */\nexport async function runDev(options: DevOptions): Promise<void> {\n const { targets } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:dev\");\n\n logger.debug(\"dev \uC2DC\uC791\", { targets });\n\n // sd.config.ts \uB85C\uB4DC (dev\uB294 \uD328\uD0A4\uC9C0 \uBE4C\uB4DC \uC815\uBCF4\uAC00 \uD544\uC694\uD558\uBBC0\uB85C \uD544\uC218)\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({ cwd, dev: true, opt: options.options });\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // replaceDeps \uC124\uC815\uC774 \uC788\uC73C\uBA74 symlink \uAD50\uCCB4\n if (sdConfig.replaceDeps != null) {\n await setupReplaceDeps(cwd, sdConfig.replaceDeps);\n }\n\n // VER, DEV \uD658\uACBD\uBCC0\uC218 \uC900\uBE44\n const version = await getVersion(cwd);\n const baseEnv = { VER: version, DEV: \"true\" };\n\n // watchScopes \uC0DD\uC131 (\uB8E8\uD2B8 package.json\uC5D0\uC11C scope \uCD94\uCD9C)\n const rootPkgJsonPath = path.join(cwd, \"package.json\");\n const rootPkgName = JSON.parse(fs.readFileSync(rootPkgJsonPath, \"utf-8\")).name as string;\n const watchScopes = getWatchScopes(rootPkgName);\n\n // targets \uD544\uD130\uB9C1\n const allPackages = filterPackagesByTargets(sdConfig.packages, targets);\n\n // client/server \uD328\uD0A4\uC9C0\uB9CC \uD544\uD130\uB9C1\n const serverPackages: Array<{ name: string; config: SdServerPackageConfig }> = [];\n const clientPackages: Array<{ name: string; config: SdClientPackageConfig }> = [];\n\n for (const [name, config] of Object.entries(allPackages)) {\n if (config.target === \"server\") {\n serverPackages.push({ name, config });\n } else if (config.target === \"client\") {\n clientPackages.push({ name, config });\n }\n }\n\n if (serverPackages.length === 0 && clientPackages.length === 0) {\n process.stdout.write(\"\u26A0 dev\uD560 client/server \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n // \uC11C\uBC84\uC640 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8 \uCC3E\uAE30 (\uC11C\uBC84\uAC00 dev \uB300\uC0C1\uC778 \uACBD\uC6B0\uB9CC)\n const serverNames = new Set(serverPackages.map(({ name }) => name));\n const serverClientsMap = new Map<string, string[]>();\n for (const { name, config } of clientPackages) {\n if (typeof config.server === \"string\" && serverNames.has(config.server)) {\n const clients = serverClientsMap.get(config.server) ?? [];\n clients.push(name);\n serverClientsMap.set(config.server, clients);\n }\n }\n\n // Worker \uACBD\uB85C\n const clientWorkerPath = import.meta.resolve(\"../workers/client.worker\");\n const serverWorkerPath = import.meta.resolve(\"../workers/server.worker\");\n const serverRuntimeWorkerPath = import.meta.resolve(\"../workers/server-runtime.worker\");\n\n // \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uB2E8\uB3C5 \uC2E4\uD589\uC778 \uACBD\uC6B0:\n // - server\uAC00 \uC22B\uC790\uC778 \uACBD\uC6B0\n // - server\uAC00 \uBB38\uC790\uC5F4\uC774\uC9C0\uB9CC \uD574\uB2F9 \uC11C\uBC84\uAC00 dev \uB300\uC0C1\uC774 \uC544\uB2CC \uACBD\uC6B0\n const standaloneClientWorkers: ClientWorkerInfo[] = clientPackages\n .filter(\n ({ config }) =>\n typeof config.server === \"number\" || (typeof config.server === \"string\" && !serverNames.has(config.server)),\n )\n .map(({ name, config }) => ({\n name,\n config,\n worker: Worker.create<typeof ClientWorkerModule>(clientWorkerPath),\n isInitialBuild: true,\n buildResolver: undefined,\n }));\n\n // \uC11C\uBC84\uC5D0 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8\uC758 Vite Worker (\uC11C\uBC84\uAC00 dev \uB300\uC0C1\uC778 \uACBD\uC6B0\uB9CC)\n const viteClientWorkers: ClientWorkerInfo[] = clientPackages\n .filter(({ config }) => typeof config.server === \"string\" && serverNames.has(config.server))\n .map(({ name, config }) => ({\n name,\n config,\n worker: Worker.create<typeof ClientWorkerModule>(clientWorkerPath),\n isInitialBuild: true,\n buildResolver: undefined,\n }));\n\n // \uACB0\uACFC \uC0C1\uD0DC \uAD00\uB9AC\n const results = new Map<string, PackageResult>();\n\n // RebuildListrManager \uC0DD\uC131\n const rebuildManager = new RebuildListrManager(logger);\n\n // \uBC30\uCE58 \uC644\uB8CC \uC2DC \uC5D0\uB7EC\uC640 \uC11C\uBC84 URL \uCD9C\uB825\n rebuildManager.on(\"batchComplete\", () => {\n printErrors(results);\n printServers(results, serverClientsMap);\n });\n\n // \uC885\uB8CC Promise \uC0DD\uC131\n let resolveTerminate!: () => void;\n const terminatePromise = new Promise<void>((resolve) => {\n resolveTerminate = resolve;\n });\n\n // \uC885\uB8CC \uC2DC\uADF8\uB110 \uD578\uB4E4\uB7EC \uB4F1\uB85D\n const signalHandler = () => {\n process.off(\"SIGINT\", signalHandler);\n process.off(\"SIGTERM\", signalHandler);\n resolveTerminate();\n };\n process.on(\"SIGINT\", signalHandler);\n process.on(\"SIGTERM\", signalHandler);\n\n // Standalone client \uBE4C\uB4DC Promise \uBBF8\uB9AC \uC0DD\uC131\n const standaloneClientBuildPromises = new Map<string, Promise<void>>();\n for (const workerInfo of standaloneClientWorkers) {\n standaloneClientBuildPromises.set(\n workerInfo.name,\n new Promise<void>((resolve) => {\n workerInfo.buildResolver = resolve;\n }),\n );\n }\n\n // Vite client \uBE4C\uB4DC Promise \uBBF8\uB9AC \uC0DD\uC131 (\uC11C\uBC84 \uC5F0\uACB0 \uD074\uB77C\uC774\uC5B8\uD2B8)\n const viteClientBuildPromises = new Map<string, Promise<void>>();\n const viteClientReadyPromises = new Map<string, { promise: Promise<void>; resolver: () => void }>();\n for (const workerInfo of viteClientWorkers) {\n viteClientBuildPromises.set(\n workerInfo.name,\n new Promise<void>((resolve) => {\n workerInfo.buildResolver = resolve;\n }),\n );\n // Vite \uC11C\uBC84 \uC900\uBE44 \uC644\uB8CC Promise (\uC11C\uBC84\uAC00 \uD074\uB77C\uC774\uC5B8\uD2B8 \uD3EC\uD2B8\uB97C \uC54C \uB54C\uAE4C\uC9C0 \uB300\uAE30)\n let readyResolver!: () => void;\n const readyPromise = new Promise<void>((resolve) => {\n readyResolver = resolve;\n });\n viteClientReadyPromises.set(workerInfo.name, { promise: readyPromise, resolver: readyResolver });\n }\n\n // Server Build Worker \uBC0F Promise \uC0DD\uC131\n const serverBuildWorkers = new Map<\n string,\n {\n worker: WorkerProxy<typeof ServerWorkerModule>;\n buildPromise: Promise<void>;\n buildResolver: () => void;\n mainJsPath?: string;\n }\n >();\n for (const { name } of serverPackages) {\n let resolver!: () => void;\n const promise = new Promise<void>((resolve) => {\n resolver = resolve;\n });\n serverBuildWorkers.set(name, {\n worker: Worker.create<typeof ServerWorkerModule>(serverWorkerPath),\n buildPromise: promise,\n buildResolver: resolver,\n });\n }\n\n // clientPorts \uCE90\uC2DC (\uC11C\uBC84 \uC7AC\uC2DC\uC791 \uC2DC \uC7AC\uC0AC\uC6A9)\n const clientPorts: Record<string, number> = {};\n\n // Server Runtime Worker (\uC11C\uBC84\uB2F9 \uD558\uB098, \uC7AC\uC2DC\uC791 \uC2DC \uAD50\uCCB4)\n const serverRuntimeWorkers = new Map<string, WorkerProxy<typeof ServerRuntimeWorkerModule>>();\n\n // Server Runtime Promise (\uCD08\uAE30 \uC11C\uBC84 \uC2DC\uC791 \uC644\uB8CC \uB300\uAE30\uC6A9)\n const serverRuntimePromises = new Map<string, { promise: Promise<void>; resolver: () => void }>();\n for (const { name } of serverPackages) {\n let resolver!: () => void;\n const promise = new Promise<void>((resolve) => {\n resolver = resolve;\n });\n serverRuntimePromises.set(name, { promise, resolver });\n }\n\n // Standalone client \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uB4F1\uB85D \uBC0F completeTask \uD568\uC218 \uC800\uC7A5\n const clientCompleteTasks = new Map<string, (result: PackageResult) => void>();\n for (const workerInfo of standaloneClientWorkers) {\n const completeTask = registerWorkerEventHandlers(\n workerInfo,\n {\n resultKey: `${workerInfo.name}:build`,\n listrTitle: `${workerInfo.name} (client)`,\n resultType: \"build\",\n },\n results,\n rebuildManager,\n );\n clientCompleteTasks.set(workerInfo.name, completeTask);\n\n // serverReady (Vite dev server)\n workerInfo.worker.on(\"serverReady\", (data) => {\n const event = data as ServerReadyEventData;\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: \"server\",\n status: \"server\",\n port: event.port,\n });\n });\n }\n\n // Vite client (\uC11C\uBC84 \uC5F0\uACB0) \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uB4F1\uB85D\n for (const workerInfo of viteClientWorkers) {\n const completeTask = registerWorkerEventHandlers(\n workerInfo,\n {\n resultKey: `${workerInfo.name}:build`,\n listrTitle: `${workerInfo.name} (client)`,\n resultType: \"build\",\n },\n results,\n rebuildManager,\n );\n clientCompleteTasks.set(workerInfo.name, completeTask);\n\n // serverReady - Vite \uD3EC\uD2B8\uB97C clientPorts\uC5D0 \uC800\uC7A5 (URL\uC740 \uC11C\uBC84\uB97C \uD1B5\uD574 \uCD9C\uB825)\n workerInfo.worker.on(\"serverReady\", (data) => {\n const event = data as ServerReadyEventData;\n clientPorts[workerInfo.name] = event.port;\n // Vite \uC11C\uBC84 \uC900\uBE44 \uC644\uB8CC \uC54C\uB9BC (\uC11C\uBC84\uAC00 \uD504\uB85D\uC2DC \uC124\uC815\uC744 \uC704\uD574 \uB300\uAE30 \uC911)\n viteClientReadyPromises.get(workerInfo.name)?.resolver();\n // listr \uC644\uB8CC\uB97C \uC704\uD574 completeTask \uD638\uCD9C (Vite\uB294 build \uC774\uBCA4\uD2B8\uB97C \uBC1C\uC0DD\uC2DC\uD0A4\uC9C0 \uC54A\uC74C)\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: \"build\",\n status: \"success\",\n });\n });\n }\n\n // Server Build Worker \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uB4F1\uB85D\n for (const { name } of serverPackages) {\n const serverBuild = serverBuildWorkers.get(name)!;\n let isFirstBuild = true;\n\n serverBuild.worker.on(\"buildStart\", () => {\n if (!isFirstBuild) {\n // \uB9AC\uBE4C\uB4DC \uC2DC RebuildListrManager\uC5D0 \uB4F1\uB85D\n const resolver = rebuildManager.registerBuild(`${name}:server`, `${name} (server)`);\n serverBuildWorkers.set(name, {\n ...serverBuild,\n buildResolver: resolver,\n });\n }\n });\n\n serverBuild.worker.on(\"build\", async (data) => {\n const event = data as ServerBuildEventData;\n\n if (event.success) {\n // mainJsPath \uC800\uC7A5\n const updatedBuild = serverBuildWorkers.get(name)!;\n updatedBuild.mainJsPath = event.mainJsPath;\n\n // \uAE30\uC874 Server Runtime Worker \uC885\uB8CC\n const existingRuntime = serverRuntimeWorkers.get(name);\n if (existingRuntime != null) {\n // \uC11C\uBC84 \uC7AC\uC2DC\uC791 \uC911 \uBA54\uC2DC\uC9C0 \uCD9C\uB825\n consola.info(`[${name}] \uC11C\uBC84 \uC7AC\uC2DC\uC791 \uC911...`);\n await existingRuntime.terminate();\n }\n\n // \uC0C8 Server Runtime Worker \uC0DD\uC131 \uBC0F \uC2DC\uC791\n const runtimeWorker = Worker.create<typeof ServerRuntimeWorkerModule>(serverRuntimeWorkerPath);\n serverRuntimeWorkers.set(name, runtimeWorker);\n\n // \uC774 \uC11C\uBC84\uC5D0 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8\uB4E4\uC758 Vite \uC11C\uBC84\uAC00 \uC900\uBE44\uB420 \uB54C\uAE4C\uC9C0 \uB300\uAE30\n const connectedClients = serverClientsMap.get(name) ?? [];\n const clientReadyPromises = connectedClients\n .map((clientName) => viteClientReadyPromises.get(clientName)?.promise)\n .filter((p): p is Promise<void> => p != null);\n if (clientReadyPromises.length > 0) {\n await Promise.all(clientReadyPromises);\n }\n\n // \uC774 \uC11C\uBC84\uC5D0 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8 \uD3EC\uD2B8 \uC218\uC9D1\n const serverClientPorts: Record<string, number> = {};\n for (const clientName of connectedClients) {\n if (clientName in clientPorts) {\n serverClientPorts[clientName] = clientPorts[clientName];\n }\n }\n\n // Server Runtime \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC\n runtimeWorker.on(\"serverReady\", (readyData) => {\n const readyEvent = readyData as ServerReadyEventData;\n results.set(`${name}:server`, {\n name,\n target: \"server\",\n type: \"server\",\n status: \"server\",\n port: readyEvent.port,\n });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n serverRuntimePromises.get(name)?.resolver();\n }\n updatedBuild.buildResolver();\n });\n\n runtimeWorker.on(\"error\", (errorData) => {\n const errorEvent = errorData as ErrorEventData;\n results.set(`${name}:server`, {\n name,\n target: \"server\",\n type: \"server\",\n status: \"error\",\n message: errorEvent.message,\n });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n serverRuntimePromises.get(name)?.resolver();\n }\n updatedBuild.buildResolver();\n });\n\n // Server Runtime \uC2DC\uC791\n void runtimeWorker.start({\n mainJsPath: event.mainJsPath,\n clientPorts: serverClientPorts,\n });\n } else {\n results.set(`${name}:build`, {\n name,\n target: \"server\",\n type: \"build\",\n status: \"error\",\n message: event.errors?.join(\"\\n\"),\n });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n serverRuntimePromises.get(name)?.resolver();\n }\n serverBuild.buildResolver();\n }\n });\n\n serverBuild.worker.on(\"error\", (data) => {\n const event = data as ErrorEventData;\n results.set(`${name}:build`, {\n name,\n target: \"server\",\n type: \"build\",\n status: \"error\",\n message: event.message,\n });\n serverBuild.buildResolver();\n });\n }\n\n // \uCD08\uAE30 \uBE4C\uB4DC listr (standalone client + vite client + server \uBE4C\uB4DC)\n const initialListr = new Listr(\n [\n // Standalone client \uD0DC\uC2A4\uD06C\n ...standaloneClientWorkers.map((workerInfo) => ({\n title: `${workerInfo.name} (client)`,\n task: () => standaloneClientBuildPromises.get(workerInfo.name) ?? Promise.resolve(),\n })),\n // Vite client \uD0DC\uC2A4\uD06C (\uC11C\uBC84 \uC5F0\uACB0)\n ...viteClientWorkers.map((workerInfo) => ({\n title: `${workerInfo.name} (client)`,\n task: () => viteClientBuildPromises.get(workerInfo.name) ?? Promise.resolve(),\n })),\n // Server \uBE4C\uB4DC \uD0DC\uC2A4\uD06C (\uBE4C\uB4DC + \uB7F0\uD0C0\uC784 \uC2DC\uC791)\n ...serverPackages.map(({ name }) => ({\n title: `${name} (server)`,\n task: () => serverRuntimePromises.get(name)?.promise ?? Promise.resolve(),\n })),\n ],\n { concurrent: true },\n );\n\n // Standalone client \uC6CC\uCEE4 \uC2DC\uC791\n for (const workerInfo of standaloneClientWorkers) {\n const pkgDir = path.join(cwd, \"packages\", workerInfo.name);\n const completeTask = clientCompleteTasks.get(workerInfo.name)!;\n const clientConfig: SdClientPackageConfig = {\n ...workerInfo.config,\n env: { ...baseEnv, ...workerInfo.config.env },\n };\n workerInfo.worker\n .startWatch({\n name: workerInfo.name,\n config: clientConfig,\n cwd,\n pkgDir,\n watchScopes,\n })\n .catch((err: unknown) => {\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: \"build\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n });\n }\n\n // Vite client \uC6CC\uCEE4 \uC2DC\uC791 (\uC11C\uBC84 \uC5F0\uACB0) - Vite \uC790\uB3D9 \uD3EC\uD2B8 \uC0AC\uC6A9\n for (const workerInfo of viteClientWorkers) {\n const pkgDir = path.join(cwd, \"packages\", workerInfo.name);\n const completeTask = clientCompleteTasks.get(workerInfo.name)!;\n // Vite\uAC00 \uC790\uB3D9\uC73C\uB85C \uD3EC\uD2B8\uB97C \uD560\uB2F9\uD558\uB3C4\uB85D \uC124\uC815\n const viteConfig: SdClientPackageConfig = {\n ...workerInfo.config,\n server: 0, // Vite\uAC00 \uC790\uB3D9\uC73C\uB85C \uD3EC\uD2B8 \uD560\uB2F9\n env: { ...baseEnv, ...workerInfo.config.env },\n };\n workerInfo.worker\n .startWatch({\n name: workerInfo.name,\n config: viteConfig,\n cwd,\n pkgDir,\n watchScopes,\n })\n .catch((err: unknown) => {\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: \"build\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n });\n }\n\n // Server Build \uC6CC\uCEE4 \uC2DC\uC791\n for (const { name, config } of serverPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n const serverBuild = serverBuildWorkers.get(name)!;\n serverBuild.worker\n .startWatch({\n name,\n cwd,\n pkgDir,\n env: { ...baseEnv, ...config.env },\n configs: config.configs,\n externals: config.externals,\n })\n .catch((err: unknown) => {\n results.set(`${name}:build`, {\n name,\n target: \"server\",\n type: \"build\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n serverBuild.buildResolver();\n });\n }\n\n // listr \uC2E4\uD589 (\uCD08\uAE30 \uBE4C\uB4DC \uC644\uB8CC\uAE4C\uC9C0 \uB300\uAE30)\n await initialListr.run();\n\n // Capacitor \uCD08\uAE30\uD654 (client \uD0C0\uAC9F \uC911 capacitor \uC124\uC815\uC774 \uC788\uB294 \uD328\uD0A4\uC9C0)\n const capacitorPackages: Array<[string, SdClientPackageConfig]> = [];\n for (const { name, config } of clientPackages) {\n if (config.capacitor != null) {\n capacitorPackages.push([name, config]);\n }\n }\n\n if (capacitorPackages.length > 0) {\n const capacitorListr = new Listr(\n capacitorPackages.map(([name, config]) => ({\n title: `${name} (capacitor)`,\n task: async () => {\n const pkgDir = path.join(cwd, \"packages\", name);\n try {\n const cap = await Capacitor.create(pkgDir, config.capacitor!);\n await cap.initialize();\n results.set(`${name}:capacitor`, {\n name,\n target: \"client\",\n type: \"capacitor\",\n status: \"success\",\n });\n } catch (err) {\n results.set(`${name}:capacitor`, {\n name,\n target: \"client\",\n type: \"capacitor\",\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n },\n })),\n { concurrent: false, exitOnError: false },\n );\n\n try {\n await capacitorListr.run();\n } catch {\n // \uC5D0\uB7EC\uB294 results\uC5D0 \uC774\uBBF8 \uAE30\uB85D\uB428\n }\n }\n\n // \uCD08\uAE30 \uBE4C\uB4DC \uACB0\uACFC \uCD9C\uB825\n printErrors(results);\n printServers(results, serverClientsMap);\n\n // \uC885\uB8CC \uC2DC\uADF8\uB110\uAE4C\uC9C0 \uB300\uAE30\n await terminatePromise;\n\n // Worker \uC885\uB8CC (\uBAA8\uB4E0 \uC6CC\uCEE4)\n process.stdout.write(\"\u23F3 \uC885\uB8CC \uC911...\\n\");\n await Promise.all([\n ...standaloneClientWorkers.map(({ worker }) => worker.terminate()),\n ...viteClientWorkers.map(({ worker }) => worker.terminate()),\n ...[...serverBuildWorkers.values()].map(({ worker }) => worker.terminate()),\n ...[...serverRuntimeWorkers.values()].map((worker) => worker.terminate()),\n ]);\n process.stdout.write(\"\u2714 \uC644\uB8CC\\n\");\n}\n\n//#endregion\n"],
|
|
5
4
|
"mappings": "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",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/device.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport { Listr } from \"listr2\";\nimport { fsExists } from \"@simplysm/core-node\";\nimport { consola } from \"consola\";\nimport type { SdConfig, SdClientPackageConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { Capacitor } from \"../capacitor/capacitor\";\nimport { Electron } from \"../electron/electron\";\n\n//#region Types\n\n/**\n * Device \uBA85\uB839 \uC635\uC158\n */\nexport interface DeviceOptions {\n /** \uD328\uD0A4\uC9C0 \uC774\uB984 (\uD544\uC218) */\n package: string;\n /** \uAC1C\uBC1C \uC11C\uBC84 URL (\uC120\uD0DD, \uBBF8\uC9C0\uC815 \uC2DC sd.config.ts\uC758 server \uC124\uC815 \uC0AC\uC6A9) */\n url?: string;\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * Android \uB514\uBC14\uC774\uC2A4\uC5D0\uC11C \uC571\uC744 \uC2E4\uD589\uD55C\uB2E4.\n *\n * - \uC5F0\uACB0\uB41C Android \uB514\uBC14\uC774\uC2A4\uC5D0\uC11C \uC571 \uC2E4\uD589\n * - \uAC1C\uBC1C \uC11C\uBC84 URL\uC744 WebView\uC5D0 \uC5F0\uACB0\uD558\uC5EC Hot Reload \uC9C0\uC6D0\n *\n * @param options - device \uC2E4\uD589 \uC635\uC158\n * @returns \uC644\uB8CC \uC2DC resolve\n */\nexport async function runDevice(options: DeviceOptions): Promise<void> {\n const { package: packageName, url } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:device\");\n\n logger.debug(\"device \uC2DC\uC791\", { package: packageName, url });\n\n // sd.config.ts \uB85C\uB4DC\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 // \uD328\uD0A4\uC9C0 \uC124\uC815 \uD655\uC778\n const pkgConfig = sdConfig.packages[packageName];\n if (pkgConfig == null) {\n consola.error(`\uD328\uD0A4\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${packageName}`);\n process.exitCode = 1;\n return;\n }\n\n if (pkgConfig.target !== \"client\") {\n consola.error(`client \uD0C0\uAC9F \uD328\uD0A4\uC9C0\uB9CC \uC9C0\uC6D0\uD569\uB2C8\uB2E4: ${packageName} (\uD604\uC7AC: ${pkgConfig.target})`);\n process.exitCode = 1;\n return;\n }\n\n const clientConfig: SdClientPackageConfig = pkgConfig;\n const pkgDir = path.join(cwd, \"packages\", packageName);\n\n if (clientConfig.electron != null) {\n // Electron \uAC1C\uBC1C \uC2E4\uD589\n let serverUrl = url;\n if (serverUrl == null) {\n if (typeof clientConfig.server === \"number\") {\n serverUrl = `http://localhost:${clientConfig.server}/${packageName}/`;\n } else {\n consola.error(`--url \uC635\uC158\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. server\uAC00 \uD328\uD0A4\uC9C0\uBA85\uC73C\uB85C \uC124\uC815\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4: ${clientConfig.server}`);\n process.exitCode = 1;\n return;\n }\n }\n\n logger.debug(\"\uAC1C\uBC1C \uC11C\uBC84 URL\", { serverUrl });\n\n const listr = new Listr([\n {\n title: `${packageName} (electron)`,\n task: async () => {\n const electron = await Electron.create(pkgDir, clientConfig.electron!);\n await electron.run(serverUrl);\n },\n },\n ]);\n\n try {\n await listr.run();\n logger.info(\"Electron \uC2E4\uD589 \uC644\uB8CC\");\n } catch (err) {\n consola.error(`Electron \uC2E4\uD589 \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n }\n } else if (clientConfig.capacitor != null) {\n // Capacitor \uB514\uBC14\uC774\uC2A4 \uC2E4\uD589 (\uAE30\uC874 \uB85C\uC9C1)\n let serverUrl = url;\n if (serverUrl == null) {\n if (typeof clientConfig.server === \"number\") {\n serverUrl = `http://localhost:${clientConfig.server}/${packageName}/capacitor/`;\n } else {\n consola.error(`--url \uC635\uC158\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. server\uAC00 \uD328\uD0A4\uC9C0\uBA85\uC73C\uB85C \uC124\uC815\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4: ${clientConfig.server}`);\n process.exitCode = 1;\n return;\n }\n } else if (!serverUrl.endsWith(\"/\")) {\n serverUrl = `${serverUrl}/${packageName}/capacitor/`;\n }\n\n logger.debug(\"\uAC1C\uBC1C \uC11C\uBC84 URL\", { serverUrl });\n\n const capPath = path.join(pkgDir, \".capacitor\");\n if (!(await fsExists(capPath))) {\n consola.error(`Capacitor \uD504\uB85C\uC81D\uD2B8\uAC00 \uCD08\uAE30\uD654\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uBA3C\uC800 'pnpm watch ${packageName}'\uB97C \uC2E4\uD589\uD558\uC138\uC694.`);\n process.exitCode = 1;\n return;\n }\n\n const listr = new Listr([\n {\n title: `${packageName} (device)`,\n task: async () => {\n const cap = await Capacitor.create(pkgDir, clientConfig.capacitor!);\n await cap.runOnDevice(serverUrl);\n },\n },\n ]);\n\n try {\n await listr.run();\n logger.info(\"\uB514\uBC14\uC774\uC2A4 \uC2E4\uD589 \uC644\uB8CC\");\n } catch (err) {\n consola.error(`\uB514\uBC14\uC774\uC2A4 \uC2E4\uD589 \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n }\n } else {\n consola.error(`electron \uB610\uB294 capacitor \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4: ${packageName}`);\n process.exitCode = 1;\n }\n}\n\n//#endregion\n"],
|
|
5
4
|
"mappings": "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",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
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 \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. git \uCD08\uAE30\uD654\n logger.info(\"git \uC800\uC7A5\uC18C \uCD08\uAE30\uD654 \uC911...\");\n await spawn(\"git\", [\"init\"], { cwd });\n await spawn(\"git\", [\"add\", \".\"], { cwd });\n await spawn(\"git\", [\"commit\", \"-m\", \"init\"], { cwd });\n logger.success(\"git \uC800\uC7A5\uC18C \uCD08\uAE30\uD654 \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
4
|
"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,qDAAkB;AAC9B,QAAM,MAAM,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC;AACpC,QAAM,MAAM,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,IAAI,CAAC;AACxC,QAAM,MAAM,OAAO,CAAC,UAAU,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC;AACpD,SAAO,QAAQ,wDAAgB;AAG/B,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/lint.ts"],
|
|
4
|
-
"sourcesContent": ["import { ESLint } from \"eslint\";\nimport { createJiti } from \"jiti\";\nimport path from \"path\";\nimport { Listr } from \"listr2\";\nimport { fsExists, fsGlob, pathFilterByTargets } from \"@simplysm/core-node\";\nimport \"@simplysm/core-common\";\nimport { SdError } from \"@simplysm/core-common\";\nimport { consola, LogLevels } from \"consola\";\n\n//#region Types\n\n/**\n * ESLint \uC2E4\uD589 \uC635\uC158\n */\nexport interface LintOptions {\n /** \uB9B0\uD2B8\uD560 \uACBD\uB85C \uD544\uD130 (\uC608: `packages/core-common`). \uBE48 \uBC30\uC5F4\uC774\uBA74 \uC804\uCCB4 \uB300\uC0C1 */\n targets: string[];\n /** \uC790\uB3D9 \uC218\uC815 \uD65C\uC131\uD654 */\n fix: boolean;\n /** ESLint \uADDC\uCE59\uBCC4 \uC2E4\uD589 \uC2DC\uAC04 \uCE21\uC815 \uD65C\uC131\uD654 (TIMING \uD658\uACBD\uBCC0\uC218 \uC124\uC815) */\n timing: boolean;\n}\n\n/**\n * Listr2 \uCEE8\uD14D\uC2A4\uD2B8 \uD0C0\uC785\n */\ninterface LintContext {\n ignorePatterns: string[];\n /** \uD30C\uC77C \uC218\uC9D1 \uD0DC\uC2A4\uD06C \uC644\uB8CC \uD6C4 \uCD08\uAE30\uD654\uB428 */\n files?: string[];\n /** \uB9B0\uD2B8 \uB300\uC0C1 \uD30C\uC77C\uC774 \uC788\uC744 \uB54C\uB9CC \uCD08\uAE30\uD654\uB428 */\n eslint?: ESLint;\n /** \uB9B0\uD2B8 \uB300\uC0C1 \uD30C\uC77C\uC774 \uC788\uC744 \uB54C\uB9CC \uCD08\uAE30\uD654\uB428 */\n results?: ESLint.LintResult[];\n}\n\n//#endregion\n\n//#region Utilities\n\n/** ESLint \uC124\uC815 \uD30C\uC77C \uD0D0\uC0C9 \uC21C\uC11C */\nconst ESLINT_CONFIG_FILES = [\"eslint.config.ts\", \"eslint.config.mts\", \"eslint.config.js\", \"eslint.config.mjs\"] as const;\n\n/**\n * ignores \uC18D\uC131\uB9CC \uAC00\uC9C4 ESLint \uC124\uC815 \uAC1D\uCCB4\uC778\uC9C0 \uAC80\uC0AC\uD558\uB294 \uD0C0\uC785 \uAC00\uB4DC\n */\nfunction isGlobalIgnoresConfig(item: unknown): item is { ignores: string[] } {\n if (item == null || typeof item !== \"object\") return false;\n if (!(\"ignores\" in item)) return false;\n if (\"files\" in item) return false; // files\uAC00 \uC788\uC73C\uBA74 globalIgnores\uAC00 \uC544\uB2D8\n const ignores = (item as { ignores: unknown }).ignores;\n if (!Array.isArray(ignores)) return false;\n return ignores.every((i) => typeof i === \"string\");\n}\n\n/**\n * eslint.config.ts/js\uC5D0\uC11C globalIgnores \uD328\uD134\uC744 \uCD94\uCD9C\uD55C\uB2E4.\n * files \uC18D\uC131 \uC5C6\uC774 ignores\uB9CC \uC788\uB294 \uC124\uC815 \uAC1D\uCCB4\uAC00 globalIgnores\uC774\uB2E4.\n * @internal \uD14C\uC2A4\uD2B8\uC6A9\uC73C\uB85C export\n */\nexport async function loadIgnorePatterns(cwd: string): Promise<string[]> {\n let configPath: string | undefined;\n for (const f of ESLINT_CONFIG_FILES) {\n const p = path.join(cwd, f);\n if (await fsExists(p)) {\n configPath = p;\n break;\n }\n }\n\n if (configPath == null) {\n throw new SdError(`ESLint \uC124\uC815 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 (cwd: ${cwd}): ${ESLINT_CONFIG_FILES.join(\", \")}`);\n }\n\n const jiti = createJiti(import.meta.url);\n const configModule = await jiti.import(configPath);\n\n let configs: unknown;\n if (Array.isArray(configModule)) {\n configs = configModule;\n } else if (configModule != null && typeof configModule === \"object\" && \"default\" in configModule) {\n configs = configModule.default;\n } else {\n throw new SdError(`ESLint \uC124\uC815 \uD30C\uC77C\uC774 \uC62C\uBC14\uB978 \uD615\uC2DD\uC774 \uC544\uB2D9\uB2C8\uB2E4: ${configPath}`);\n }\n\n if (!Array.isArray(configs)) {\n throw new SdError(`ESLint \uC124\uC815\uC774 \uBC30\uC5F4\uC774 \uC544\uB2D9\uB2C8\uB2E4: ${configPath}`);\n }\n\n return configs.filter(isGlobalIgnoresConfig).flatMap((item) => item.ignores);\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * ESLint\uB97C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `eslint.config.ts/js`\uC5D0\uC11C globalIgnores \uD328\uD134\uC744 \uCD94\uCD9C\uD558\uC5EC glob \uD544\uD130\uB9C1\uC5D0 \uC801\uC6A9\n * - listr2\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC9C4\uD589 \uC0C1\uD669 \uD45C\uC2DC\n * - \uCE90\uC2DC \uD65C\uC131\uD654 (`.cache/eslint.cache`\uC5D0 \uC800\uC7A5, \uC124\uC815 \uBCC0\uACBD \uC2DC \uC790\uB3D9 \uBB34\uD6A8\uD654)\n * - \uC5D0\uB7EC \uBC1C\uC0DD \uC2DC `process.exitCode = 1` \uC124\uC815\n *\n * @param options - \uB9B0\uD2B8 \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 runLint(options: LintOptions): Promise<void> {\n const { targets, fix, timing } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:lint\");\n\n logger.debug(\"\uB9B0\uD2B8 \uC2DC\uC791\", { targets, fix, timing });\n\n // TIMING \uD658\uACBD\uBCC0\uC218 \uC124\uC815\n if (timing) {\n process.env[\"TIMING\"] = \"1\";\n }\n\n const listr = new Listr<LintContext, \"default\" | \"verbose\">(\n [\n {\n title: \"ESLint \uC124\uC815 \uB85C\uB4DC\",\n task: async (ctx, task) => {\n ctx.ignorePatterns = await loadIgnorePatterns(cwd);\n logger.debug(\"ignore \uD328\uD134 \uB85C\uB4DC \uC644\uB8CC\", { ignorePatternCount: ctx.ignorePatterns.length });\n task.title = `ESLint \uC124\uC815 \uB85C\uB4DC (${ctx.ignorePatterns.length}\uAC1C ignore \uD328\uD134)`;\n },\n },\n {\n title: \"\uB9B0\uD2B8 \uB300\uC0C1 \uD30C\uC77C \uC218\uC9D1\",\n task: async (ctx, task) => {\n let files = await fsGlob(\"**/*.{ts,tsx,js,jsx}\", {\n cwd,\n ignore: ctx.ignorePatterns,\n nodir: true,\n absolute: true,\n });\n\n // targets\uAC00 \uC8FC\uC5B4\uC9C0\uBA74 \uD574\uB2F9 \uACBD\uB85C\uC758 \uD558\uC704 \uD30C\uC77C\uB9CC \uD544\uD130\uB9C1\n files = pathFilterByTargets(files, targets, cwd);\n ctx.files = files;\n logger.debug(\"\uD30C\uC77C \uC218\uC9D1 \uC644\uB8CC\", { fileCount: files.length });\n task.title = `\uB9B0\uD2B8 \uB300\uC0C1 \uD30C\uC77C \uC218\uC9D1 (${files.length}\uAC1C)`;\n\n if (files.length === 0) {\n task.skip(\"\uB9B0\uD2B8\uD560 \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n }\n },\n },\n {\n title: \"\uB9B0\uD2B8 \uC2E4\uD589\",\n enabled: (ctx) => (ctx.files?.length ?? 0) > 0,\n task: async (ctx, task) => {\n const files = ctx.files!;\n task.title = `\uB9B0\uD2B8 \uC2E4\uD589 \uC911... (${files.length}\uAC1C \uD30C\uC77C)`;\n ctx.eslint = new ESLint({\n cwd,\n fix,\n cache: true,\n cacheLocation: path.join(cwd, \".cache\", \"eslint.cache\"),\n });\n ctx.results = await ctx.eslint.lintFiles(files);\n },\n },\n {\n title: \"\uC790\uB3D9 \uC218\uC815 \uC801\uC6A9\",\n enabled: () => fix,\n skip: (ctx) => (ctx.files?.length ?? 0) === 0 || ctx.results == null,\n task: async (ctx) => {\n if (ctx.results == null) return;\n await ESLint.outputFixes(ctx.results);\n logger.debug(\"\uC790\uB3D9 \uC218\uC815 \uC801\uC6A9 \uC644\uB8CC\");\n },\n },\n ],\n {\n renderer: consola.level >= LogLevels.debug ? \"verbose\" : \"default\",\n },\n );\n\n const ctx = await listr.run();\n\n // \uD30C\uC77C\uC774 \uC5C6\uAC70\uB098 \uB9B0\uD2B8\uAC00 \uC2E4\uD589\uB418\uC9C0 \uC54A\uC558\uC73C\uBA74 \uC870\uAE30 \uC885\uB8CC\n if ((ctx.files?.length ?? 0) === 0 || ctx.results == null || ctx.eslint == null) {\n logger.info(\"\uB9B0\uD2B8\uD560 \uD30C\uC77C \uC5C6\uC74C\");\n return;\n }\n\n // \uACB0\uACFC \uC9D1\uACC4\n const errorCount = ctx.results.sum((r) => r.errorCount);\n const warningCount = ctx.results.sum((r) => r.warningCount);\n\n if (errorCount > 0) {\n logger.error(\"\uB9B0\uD2B8 \uC5D0\uB7EC \uBC1C\uC0DD\", { errorCount, warningCount });\n } else if (warningCount > 0) {\n logger.info(\"\uB9B0\uD2B8 \uC644\uB8CC (\uACBD\uACE0 \uC788\uC74C)\", { errorCount, warningCount });\n } else {\n logger.info(\"\uB9B0\uD2B8 \uC644\uB8CC\", { errorCount, warningCount });\n }\n\n // \uD3EC\uB9F7\uD130 \uCD9C\uB825\n const formatter = await ctx.eslint.loadFormatter(\"stylish\");\n const resultText = await formatter.format(ctx.results);\n if (resultText) {\n process.stdout.write(resultText);\n }\n\n // \uC5D0\uB7EC \uC788\uC73C\uBA74 exit code 1\n if (errorCount > 0) {\n process.exitCode = 1;\n }\n}\n\n//#endregion\n"],
|
|
5
4
|
"mappings": "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",
|
|
6
5
|
"names": ["ctx"]
|
|
7
6
|
}
|