@simplysm/sd-cli 13.0.0-beta.38 → 13.0.0-beta.44
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 +64 -8
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +2 -1
- package/dist/commands/build.js.map +2 -2
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +18 -8
- package/dist/commands/publish.js.map +2 -2
- package/dist/sd-config.types.d.ts +2 -2
- package/dist/sd-config.types.d.ts.map +1 -1
- package/dist/workers/server.worker.d.ts +2 -1
- package/dist/workers/server.worker.d.ts.map +1 -1
- package/dist/workers/server.worker.js +18 -12
- package/dist/workers/server.worker.js.map +2 -2
- package/package.json +4 -4
- 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
|
@@ -176,7 +176,7 @@ During production build (`sd-cli build`), the following deployment files are gen
|
|
|
176
176
|
| File | Description |
|
|
177
177
|
|------|-------------|
|
|
178
178
|
| `package.json` | Minimal package.json with externalized dependencies (version `"*"`) for `npm install` on the deployment server |
|
|
179
|
-
| `mise.toml` | Node.js version specification (read from root `mise.toml`) |
|
|
179
|
+
| `mise.toml` | Node.js version specification (read from root `mise.toml`) — only generated when `packageManager: "mise"` is set |
|
|
180
180
|
| `openssl.cnf` | Legacy OpenSSL provider activation (required for MSSQL and other legacy TLS connections) |
|
|
181
181
|
| `pm2.config.cjs` | PM2 process manager config (only generated when `pm2` is configured) |
|
|
182
182
|
|
|
@@ -478,10 +478,10 @@ Users can install the app on their home screen on supported browsers and devices
|
|
|
478
478
|
publish?: SdPublishConfig; // Deployment config (optional)
|
|
479
479
|
configs?: Record<string, unknown>; // Runtime config (written to dist/.config.json during build)
|
|
480
480
|
externals?: string[]; // Additional modules to exclude from bundle (optional)
|
|
481
|
+
packageManager?: "volta" | "mise"; // Package manager for Node.js version management (optional)
|
|
481
482
|
pm2?: { // PM2 config — generates dist/pm2.config.cjs (optional)
|
|
482
483
|
name?: string; // PM2 process name (defaults to package name)
|
|
483
484
|
ignoreWatchPaths?: string[]; // Paths to ignore in PM2 watch
|
|
484
|
-
noInterpreter?: boolean; // Skip interpreter path (use system PATH node)
|
|
485
485
|
};
|
|
486
486
|
}
|
|
487
487
|
```
|
|
@@ -715,7 +715,7 @@ Electron configuration for Windows desktop app builds in `client` target package
|
|
|
715
715
|
|
|
716
716
|
### Server Externals & PM2 Configuration
|
|
717
717
|
|
|
718
|
-
Server packages can configure external modules and PM2 deployment settings.
|
|
718
|
+
Server packages can configure external modules, package manager selection, and PM2 deployment settings.
|
|
719
719
|
|
|
720
720
|
#### Externals
|
|
721
721
|
|
|
@@ -728,6 +728,55 @@ Native modules (with `binding.gyp`) are automatically detected and externalized.
|
|
|
728
728
|
},
|
|
729
729
|
```
|
|
730
730
|
|
|
731
|
+
#### Package Manager Selection
|
|
732
|
+
|
|
733
|
+
The `packageManager` field controls which Node.js version management tool is used in production deployment:
|
|
734
|
+
|
|
735
|
+
```typescript
|
|
736
|
+
"my-server": {
|
|
737
|
+
target: "server",
|
|
738
|
+
packageManager: "volta", // Use Volta for Node.js version management
|
|
739
|
+
},
|
|
740
|
+
```
|
|
741
|
+
|
|
742
|
+
**Supported package managers:**
|
|
743
|
+
|
|
744
|
+
| Value | Behavior | Generated Files |
|
|
745
|
+
|-------|----------|-----------------|
|
|
746
|
+
| `"volta"` | Uses Volta for Node.js version management. PM2 config will execute `node` directly (Volta manages version via `package.json` engines field). | `package.json` includes `volta` field with Node.js version |
|
|
747
|
+
| `"mise"` | Uses mise for Node.js version management. PM2 config will resolve interpreter path via `mise which node`. | `mise.toml` is copied to `dist/` with Node.js version from root `mise.toml` |
|
|
748
|
+
| `undefined` | No version management tool. PM2 config will execute `node` directly from system PATH. | No additional version management files |
|
|
749
|
+
|
|
750
|
+
**Examples:**
|
|
751
|
+
|
|
752
|
+
```typescript
|
|
753
|
+
// Using Volta
|
|
754
|
+
"my-server": {
|
|
755
|
+
target: "server",
|
|
756
|
+
packageManager: "volta",
|
|
757
|
+
pm2: {
|
|
758
|
+
name: "my-app-server",
|
|
759
|
+
},
|
|
760
|
+
},
|
|
761
|
+
|
|
762
|
+
// Using mise
|
|
763
|
+
"my-server": {
|
|
764
|
+
target: "server",
|
|
765
|
+
packageManager: "mise",
|
|
766
|
+
pm2: {
|
|
767
|
+
name: "my-app-server",
|
|
768
|
+
},
|
|
769
|
+
},
|
|
770
|
+
|
|
771
|
+
// No package manager (use system PATH node)
|
|
772
|
+
"my-server": {
|
|
773
|
+
target: "server",
|
|
774
|
+
pm2: {
|
|
775
|
+
name: "my-app-server",
|
|
776
|
+
},
|
|
777
|
+
},
|
|
778
|
+
```
|
|
779
|
+
|
|
731
780
|
#### PM2 Configuration
|
|
732
781
|
|
|
733
782
|
When `pm2` is configured, `dist/pm2.config.cjs` is generated during production build for use with [PM2](https://pm2.keymetrics.io/) process manager:
|
|
@@ -735,13 +784,13 @@ When `pm2` is configured, `dist/pm2.config.cjs` is generated during production b
|
|
|
735
784
|
```typescript
|
|
736
785
|
"my-server": {
|
|
737
786
|
target: "server",
|
|
787
|
+
packageManager: "mise", // Optional: specify package manager
|
|
738
788
|
env: {
|
|
739
789
|
CUSTOM_VAR: "value",
|
|
740
790
|
},
|
|
741
791
|
pm2: {
|
|
742
792
|
name: "my-app-server", // PM2 process name (optional)
|
|
743
793
|
ignoreWatchPaths: ["uploads"], // Additional paths to ignore in PM2 watch (optional)
|
|
744
|
-
noInterpreter: false, // Set true to skip mise-managed node path (optional)
|
|
745
794
|
},
|
|
746
795
|
},
|
|
747
796
|
```
|
|
@@ -750,9 +799,9 @@ When `pm2` is configured, `dist/pm2.config.cjs` is generated during production b
|
|
|
750
799
|
|
|
751
800
|
- Process name (from `pm2.name` or derived from package name)
|
|
752
801
|
- Watch mode enabled with configurable ignore paths (`node_modules`, `www` + custom paths)
|
|
753
|
-
- Node.js interpreter path via `mise which node`
|
|
802
|
+
- Node.js interpreter path (resolved via `mise which node` if `packageManager: "mise"`, otherwise `node` from PATH)
|
|
754
803
|
- `--openssl-config=openssl.cnf` interpreter argument for legacy TLS support
|
|
755
|
-
- Environment variables: `NODE_ENV=production`, `TZ=Asia/Seoul`,
|
|
804
|
+
- Environment variables: `NODE_ENV=production`, `TZ=Asia/Seoul`, plus custom `env` values
|
|
756
805
|
|
|
757
806
|
**Deployment workflow:**
|
|
758
807
|
|
|
@@ -764,8 +813,15 @@ sd-cli build my-server
|
|
|
764
813
|
|
|
765
814
|
# 3. On the deployment server:
|
|
766
815
|
cd /path/to/my-server/dist
|
|
767
|
-
|
|
768
|
-
|
|
816
|
+
|
|
817
|
+
# If using mise, install mise and activate
|
|
818
|
+
mise install # Only needed if packageManager: "mise"
|
|
819
|
+
|
|
820
|
+
# Install externalized dependencies
|
|
821
|
+
npm install
|
|
822
|
+
|
|
823
|
+
# Start with PM2
|
|
824
|
+
pm2 start pm2.config.cjs
|
|
769
825
|
```
|
|
770
826
|
|
|
771
827
|
## Cache
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAIA,OAAO,uBAAuB,CAAC;AAmB/B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA8ED;;;;;;;;;;;;GAYG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAIA,OAAO,uBAAuB,CAAC;AAmB/B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA8ED;;;;;;;;;;;;GAYG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8VnE"}
|
package/dist/commands/build.js
CHANGED
|
@@ -255,7 +255,8 @@ async function runBuild(options) {
|
|
|
255
255
|
env: { ...baseEnv, ...config.env },
|
|
256
256
|
configs: config.configs,
|
|
257
257
|
externals: config.externals,
|
|
258
|
-
pm2: config.pm2
|
|
258
|
+
pm2: config.pm2,
|
|
259
|
+
packageManager: config.packageManager
|
|
259
260
|
});
|
|
260
261
|
results.push({
|
|
261
262
|
name,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/build.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport ts from \"typescript\";\nimport { Listr, type ListrTask } from \"listr2\";\nimport { Worker, type WorkerProxy, fsRm } from \"@simplysm/core-node\";\nimport \"@simplysm/core-common\";\nimport { consola, LogLevels } from \"consola\";\nimport type { SdConfig, SdBuildPackageConfig, SdClientPackageConfig, SdServerPackageConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { getVersion } from \"../utils/build-env\";\nimport { setupReplaceDeps } from \"../utils/replace-deps\";\nimport type { TypecheckEnv } from \"../utils/tsconfig\";\nimport { deserializeDiagnostic } from \"../utils/typecheck-serialization\";\nimport { runLint, type LintOptions } from \"./lint\";\nimport type * as LibraryWorkerModule from \"../workers/library.worker\";\nimport type * as ServerWorkerModule from \"../workers/server.worker\";\nimport type * as ClientWorkerModule from \"../workers/client.worker\";\nimport type * as DtsWorkerModule from \"../workers/dts.worker\";\nimport { Capacitor } from \"../capacitor/capacitor\";\nimport { Electron } from \"../electron/electron\";\nimport { copySrcFiles } from \"../utils/copy-src\";\n\n//#region Types\n\n/**\n * Build \uBA85\uB839 \uC635\uC158\n */\nexport interface BuildOptions {\n /** \uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n/**\n * \uBE4C\uB4DC \uACB0\uACFC\n */\ninterface BuildResult {\n name: string;\n target: string;\n type: \"js\" | \"dts\" | \"vite\" | \"capacitor\" | \"electron\";\n success: boolean;\n errors?: string[];\n diagnostics?: ts.Diagnostic[];\n}\n\n/**\n * \uD328\uD0A4\uC9C0 \uBD84\uB958 \uACB0\uACFC\n */\ninterface ClassifiedPackages {\n /** node/browser/neutral \uD0C0\uAC9F (JS + dts) */\n buildPackages: Array<{ name: string; config: SdBuildPackageConfig }>;\n /** client \uD0C0\uAC9F (Vite build + typecheck) */\n clientPackages: Array<{ name: string; config: SdClientPackageConfig }>;\n /** server \uD0C0\uAC9F (JS \uBE4C\uB4DC, dts \uC81C\uC678) */\n serverPackages: Array<{ name: string; config: SdServerPackageConfig }>;\n}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * \uD328\uD0A4\uC9C0\uB97C \uD0C0\uAC9F\uBCC4\uB85C \uBD84\uB958\n * - node/browser/neutral: buildPackages (JS + dts)\n * - client: clientPackages (Vite build + typecheck)\n * - server: serverPackages (JS \uBE4C\uB4DC, dts \uC81C\uC678)\n * - scripts: \uC81C\uC678\n */\nfunction classifyPackages(\n packages: Record<\n string,\n SdBuildPackageConfig | SdClientPackageConfig | SdServerPackageConfig | { target: \"scripts\" } | undefined\n >,\n targets: string[],\n): ClassifiedPackages {\n const buildPackages: ClassifiedPackages[\"buildPackages\"] = [];\n const clientPackages: ClassifiedPackages[\"clientPackages\"] = [];\n const serverPackages: ClassifiedPackages[\"serverPackages\"] = [];\n\n for (const [name, config] of Object.entries(packages)) {\n if (config == null) continue;\n if (config.target === \"scripts\") continue;\n\n // targets\uAC00 \uC9C0\uC815\uB418\uBA74 \uD574\uB2F9 \uD328\uD0A4\uC9C0\uB9CC \uD3EC\uD568\n if (targets.length > 0 && !targets.includes(name)) continue;\n\n if (config.target === \"client\") {\n clientPackages.push({ name, config });\n } else if (config.target === \"server\") {\n serverPackages.push({ name, config });\n } else {\n buildPackages.push({ name, config });\n }\n }\n\n return { buildPackages, clientPackages, serverPackages };\n}\n\n/**\n * dist \uD3F4\uB354 \uC0AD\uC81C\n */\nasync function cleanDistFolders(cwd: string, packageNames: string[]): Promise<void> {\n await Promise.all(packageNames.map((name) => fsRm(path.join(cwd, \"packages\", name, \"dist\"))));\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\uB97C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `sd.config.ts`\uB97C \uB85C\uB4DC\uD558\uC5EC \uD328\uD0A4\uC9C0\uBCC4 \uBE4C\uB4DC \uD0C0\uAC9F \uC815\uBCF4 \uD655\uC778 (\uD544\uC218)\n * - lint \uC2E4\uD589\n * - dist \uD3F4\uB354 \uC815\uB9AC (clean build)\n * - `node`/`browser`/`neutral` \uD0C0\uAC9F: esbuild JS \uBE4C\uB4DC + dts \uC0DD\uC131 (\uD0C0\uC785\uCCB4\uD06C \uD3EC\uD568)\n * - `client` \uD0C0\uAC9F: Vite production \uBE4C\uB4DC + typecheck (dts \uBD88\uD544\uC694)\n * - \uD558\uB098\uB77C\uB3C4 \uC2E4\uD328\uD558\uBA74 `process.exitCode = 1` \uC124\uC815\n *\n * @param options - build \uC2E4\uD589 \uC635\uC158\n * @returns \uC644\uB8CC \uC2DC resolve\n */\nexport async function runBuild(options: BuildOptions): Promise<void> {\n const { targets } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:build\");\n\n logger.debug(\"\uBE4C\uB4DC \uC2DC\uC791\", { targets });\n\n // sd.config.ts \uB85C\uB4DC\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({ cwd, dev: false, opt: options.options });\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // replaceDeps \uC124\uC815\uC774 \uC788\uC73C\uBA74 symlink \uAD50\uCCB4\n if (sdConfig.replaceDeps != null) {\n await setupReplaceDeps(cwd, sdConfig.replaceDeps);\n }\n\n // VER, DEV \uD658\uACBD\uBCC0\uC218 \uC900\uBE44\n const version = await getVersion(cwd);\n const baseEnv = { VER: version, DEV: \"false\" };\n\n // \uD328\uD0A4\uC9C0 \uBD84\uB958\n const { buildPackages, clientPackages, serverPackages } = classifyPackages(sdConfig.packages, targets);\n const allPackageNames = [\n ...buildPackages.map((p) => p.name),\n ...clientPackages.map((p) => p.name),\n ...serverPackages.map((p) => p.name),\n ];\n\n if (allPackageNames.length === 0) {\n process.stdout.write(\"\u2714 \uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n logger.debug(\"\uD328\uD0A4\uC9C0 \uBD84\uB958 \uC644\uB8CC\", {\n buildPackages: buildPackages.map((p) => p.name),\n clientPackages: clientPackages.map((p) => p.name),\n serverPackages: serverPackages.map((p) => p.name),\n });\n\n // \uACB0\uACFC \uC218\uC9D1\n const results: BuildResult[] = [];\n // \uC5D0\uB7EC \uCD94\uC801 (\uAC1D\uCCB4\uB85C \uB798\uD551\uD558\uC5EC \uCF5C\uBC31 \uB0B4 \uC218\uC815 \uCD94\uC801 \uAC00\uB2A5\uD558\uAC8C \uD568)\n const state = { hasError: false };\n\n // Worker \uACBD\uB85C\n const libraryWorkerPath = import.meta.resolve(\"../workers/library.worker\");\n const serverWorkerPath = import.meta.resolve(\"../workers/server.worker\");\n const clientWorkerPath = import.meta.resolve(\"../workers/client.worker\");\n const dtsWorkerPath = import.meta.resolve(\"../workers/dts.worker\");\n\n // \uD30C\uC77C \uCE90\uC2DC (diagnostics \uCD9C\uB825\uC6A9)\n const fileCache = new Map<string, string>();\n\n // formatHost (diagnostics \uCD9C\uB825\uC6A9)\n const formatHost: ts.FormatDiagnosticsHost = {\n getCanonicalFileName: (f) => f,\n getCurrentDirectory: () => cwd,\n getNewLine: () => ts.sys.newLine,\n };\n\n // Lint \uC635\uC158 (\uC804\uCCB4 \uD328\uD0A4\uC9C0 \uB300\uC0C1)\n const lintOptions: LintOptions = {\n targets: allPackageNames.map((name) => `packages/${name}`),\n fix: false,\n timing: false,\n };\n\n // Listr \uAD6C\uC870: Lint \u2192 Clean \u2192 Build (\uC21C\uCC28)\n const mainListr = new Listr(\n [\n {\n title: \"Lint\",\n task: async () => {\n await runLint(lintOptions);\n // lint \uC5D0\uB7EC\uAC00 \uC788\uC73C\uBA74 process.exitCode\uAC00 1\uB85C \uC124\uC815\uB428\n if (process.exitCode === 1) {\n state.hasError = true;\n }\n },\n },\n {\n title: \"Clean\",\n task: async () => {\n await cleanDistFolders(cwd, allPackageNames);\n },\n },\n {\n title: \"Build\",\n task: (_, task) => {\n const buildTasks: ListrTask[] = [];\n\n // buildPackages: JS \uBE4C\uB4DC + dts \uC0DD\uC131\n for (const { name, config } of buildPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n const env: TypecheckEnv = config.target === \"node\" ? \"node\" : \"browser\";\n\n buildTasks.push({\n title: `${name} (${config.target})`,\n task: async () => {\n // JS \uBE4C\uB4DC\uC640 DTS \uC0DD\uC131\uC744 \uBCD1\uB82C \uC2E4\uD589\n const libraryWorker: WorkerProxy<typeof LibraryWorkerModule> =\n Worker.create<typeof LibraryWorkerModule>(libraryWorkerPath);\n const dtsWorker: WorkerProxy<typeof DtsWorkerModule> =\n Worker.create<typeof DtsWorkerModule>(dtsWorkerPath);\n\n try {\n const [buildResult, dtsResult] = await Promise.all([\n // JS \uBE4C\uB4DC\n libraryWorker.build({ name, config, cwd, pkgDir }),\n // DTS \uC0DD\uC131\n dtsWorker.buildDts({ name, cwd, pkgDir, env, emit: true }),\n ]);\n\n // JS \uBE4C\uB4DC \uACB0\uACFC \uCC98\uB9AC\n results.push({\n name,\n target: config.target,\n type: \"js\",\n success: buildResult.success,\n errors: buildResult.errors,\n });\n if (!buildResult.success) state.hasError = true;\n\n // DTS \uACB0\uACFC \uCC98\uB9AC\n const diagnostics = dtsResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));\n results.push({\n name,\n target: config.target,\n type: \"dts\",\n success: dtsResult.success,\n errors: dtsResult.errors,\n diagnostics,\n });\n if (!dtsResult.success) state.hasError = true;\n } finally {\n await Promise.all([libraryWorker.terminate(), dtsWorker.terminate()]);\n }\n\n // copySrc \uD30C\uC77C \uBCF5\uC0AC\n if (config.copySrc != null && config.copySrc.length > 0) {\n await copySrcFiles(pkgDir, config.copySrc);\n }\n },\n });\n }\n\n // clientPackages: Vite \uBE4C\uB4DC + typecheck + Capacitor \uBE4C\uB4DC\n for (const { name, config } of clientPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n\n buildTasks.push({\n title: `${name} (client)`,\n task: async () => {\n // Vite \uBE4C\uB4DC\uC640 \uD0C0\uC785\uCCB4\uD06C\uB97C \uBCD1\uB82C \uC2E4\uD589\n const clientWorker: WorkerProxy<typeof ClientWorkerModule> =\n Worker.create<typeof ClientWorkerModule>(clientWorkerPath);\n const dtsWorker: WorkerProxy<typeof DtsWorkerModule> =\n Worker.create<typeof DtsWorkerModule>(dtsWorkerPath);\n\n try {\n const clientConfig: SdClientPackageConfig = {\n ...config,\n env: { ...baseEnv, ...config.env },\n };\n const [clientResult, dtsResult] = await Promise.all([\n // Vite production \uBE4C\uB4DC\n clientWorker.build({ name, config: clientConfig, cwd, pkgDir }),\n // typecheck (dts \uC5C6\uC774)\n dtsWorker.buildDts({\n name,\n cwd,\n pkgDir,\n env: \"browser\",\n emit: false,\n }),\n ]);\n\n // Vite \uBE4C\uB4DC \uACB0\uACFC \uCC98\uB9AC\n results.push({\n name,\n target: \"client\",\n type: \"vite\",\n success: clientResult.success,\n errors: clientResult.errors,\n });\n if (!clientResult.success) state.hasError = true;\n\n // \uD0C0\uC785\uCCB4\uD06C \uACB0\uACFC \uCC98\uB9AC\n const diagnostics = dtsResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));\n results.push({\n name,\n target: \"client\",\n type: \"dts\",\n success: dtsResult.success,\n errors: dtsResult.errors,\n diagnostics,\n });\n if (!dtsResult.success) state.hasError = true;\n } finally {\n await Promise.all([clientWorker.terminate(), dtsWorker.terminate()]);\n }\n\n // Capacitor \uBE4C\uB4DC (\uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n if (config.capacitor != null) {\n const outPath = path.join(pkgDir, \"dist\");\n try {\n const cap = await Capacitor.create(pkgDir, config.capacitor);\n await cap.initialize();\n await cap.build(outPath);\n results.push({\n name,\n target: \"client\",\n type: \"capacitor\",\n success: true,\n });\n } catch (err) {\n results.push({\n name,\n target: \"client\",\n type: \"capacitor\",\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n });\n state.hasError = true;\n }\n }\n\n // Electron \uBE4C\uB4DC (\uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n if (config.electron != null) {\n const outPath = path.join(pkgDir, \"dist\");\n try {\n const electron = await Electron.create(pkgDir, config.electron);\n await electron.initialize();\n await electron.build(outPath);\n results.push({\n name,\n target: \"client\",\n type: \"electron\",\n success: true,\n });\n } catch (err) {\n results.push({\n name,\n target: \"client\",\n type: \"electron\",\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n });\n state.hasError = true;\n }\n }\n },\n });\n }\n\n // serverPackages: JS \uBE4C\uB4DC\uB9CC (dts \uC0DD\uC131 \uC81C\uC678)\n for (const { name, config } of serverPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n\n buildTasks.push({\n title: `${name} (server)`,\n task: async () => {\n const serverWorker: WorkerProxy<typeof ServerWorkerModule> =\n Worker.create<typeof ServerWorkerModule>(serverWorkerPath);\n\n try {\n const buildResult = await serverWorker.build({\n name,\n cwd,\n pkgDir,\n env: { ...baseEnv, ...config.env },\n configs: config.configs,\n externals: config.externals,\n pm2: config.pm2,\n });\n\n results.push({\n name,\n target: \"server\",\n type: \"js\",\n success: buildResult.success,\n errors: buildResult.errors,\n });\n if (!buildResult.success) state.hasError = true;\n } finally {\n await serverWorker.terminate();\n }\n },\n });\n }\n\n return task.newListr(buildTasks, { concurrent: true, exitOnError: false });\n },\n },\n ],\n {\n concurrent: false,\n exitOnError: false,\n renderer: consola.level >= LogLevels.debug ? \"verbose\" : \"default\",\n },\n );\n\n try {\n await mainListr.run();\n } catch {\n // Listr \uB0B4\uBD80 \uC5D0\uB7EC\uB294 results\uC5D0 \uC774\uBBF8 \uC218\uC9D1\uB428\n }\n\n // \uACB0\uACFC \uCD9C\uB825\n const allDiagnostics: ts.Diagnostic[] = [];\n for (const result of results) {\n if (!result.success) {\n const typeLabel = result.type === \"dts\" ? \"dts\" : result.target;\n const errorLines: string[] = [`${result.name} (${typeLabel})`];\n if (result.errors != null) {\n for (const error of result.errors) {\n for (const line of error.split(\"\\n\")) {\n errorLines.push(` \u2192 ${line}`);\n }\n }\n }\n consola.error(errorLines.join(\"\\n\"));\n }\n if (result.diagnostics != null) {\n allDiagnostics.push(...result.diagnostics);\n }\n }\n\n // diagnostics \uCD9C\uB825 (\uC911\uBCF5 \uC81C\uAC70)\n if (allDiagnostics.length > 0) {\n const uniqueDiagnostics = ts.sortAndDeduplicateDiagnostics(allDiagnostics);\n const message = ts.formatDiagnosticsWithColorAndContext(uniqueDiagnostics, formatHost);\n process.stdout.write(message);\n }\n\n // \uACB0\uACFC \uB85C\uADF8 \uCD9C\uB825\n if (state.hasError) {\n logger.error(\"\uBE4C\uB4DC \uC2E4\uD328\");\n process.exitCode = 1;\n } else {\n logger.info(\"\uBE4C\uB4DC \uC644\uB8CC\");\n }\n}\n\n//#endregion\n"],
|
|
5
|
-
"mappings": "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
|
|
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
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAOA,OAAO,uBAAuB,CAAC;AAc/B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAsaD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAOA,OAAO,uBAAuB,CAAC;AAc/B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAsaD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA+WvE"}
|
package/dist/commands/publish.js
CHANGED
|
@@ -199,7 +199,7 @@ async function publishPackage(pkgPath, publishConfig, version, projectPath, logg
|
|
|
199
199
|
const pkgName = path.basename(pkgPath);
|
|
200
200
|
if (publishConfig === "npm") {
|
|
201
201
|
const prereleaseInfo = semver.prerelease(version);
|
|
202
|
-
const args = ["publish", "--access", "public"];
|
|
202
|
+
const args = ["publish", "--access", "public", "--no-git-checks"];
|
|
203
203
|
if (prereleaseInfo !== null && typeof prereleaseInfo[0] === "string") {
|
|
204
204
|
args.push("--tag", prereleaseInfo[0]);
|
|
205
205
|
}
|
|
@@ -376,13 +376,23 @@ async function runPublish(options) {
|
|
|
376
376
|
if (!noBuild && hasGit) {
|
|
377
377
|
logger.debug("Git \uCEE4\uBC0B \uC5EC\uBD80 \uD655\uC778...");
|
|
378
378
|
try {
|
|
379
|
-
const diff = await spawn("git", ["diff", "--name-only"
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
379
|
+
const diff = await spawn("git", ["diff", "--name-only"]);
|
|
380
|
+
const stagedDiff = await spawn("git", ["diff", "--cached", "--name-only"]);
|
|
381
|
+
if (diff.trim() !== "" || stagedDiff.trim() !== "") {
|
|
382
|
+
logger.info("\uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC0AC\uD56D \uAC10\uC9C0. claude \uC790\uB3D9 \uCEE4\uBC0B \uC2DC\uB3C4...");
|
|
383
|
+
try {
|
|
384
|
+
await spawn("claude", ["-p", "/sd-commit all", "--dangerously-skip-permissions", "--model", "haiku"]);
|
|
385
|
+
} catch (e) {
|
|
386
|
+
throw new Error(
|
|
387
|
+
"\uC790\uB3D9 \uCEE4\uBC0B\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uCEE4\uBC0B \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.\n" + (e instanceof Error ? e.message : String(e))
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
const recheckDiff = await spawn("git", ["diff", "--name-only"]);
|
|
391
|
+
const recheckStaged = await spawn("git", ["diff", "--cached", "--name-only"]);
|
|
392
|
+
if (recheckDiff.trim() !== "" || recheckStaged.trim() !== "") {
|
|
393
|
+
throw new Error("\uC790\uB3D9 \uCEE4\uBC0B \uD6C4\uC5D0\uB3C4 \uBBF8\uCEE4\uBC0B \uBCC0\uACBD\uC0AC\uD56D\uC774 \uB0A8\uC544\uC788\uC2B5\uB2C8\uB2E4.\n" + recheckDiff + recheckStaged);
|
|
394
|
+
}
|
|
395
|
+
logger.info("\uC790\uB3D9 \uCEE4\uBC0B \uC644\uB8CC.");
|
|
386
396
|
}
|
|
387
397
|
} catch (err) {
|
|
388
398
|
consola.error(err instanceof Error ? err.message : err);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/publish.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport semver from \"semver\";\nimport { consola, LogLevels } from \"consola\";\nimport { Listr, type ListrTask } from \"listr2\";\nimport { StorageFactory } from \"@simplysm/storage\";\nimport { fsExists, fsRead, fsReadJson, fsWrite, fsGlob, fsCopy } from \"@simplysm/core-node\";\nimport { env, jsonStringify } from \"@simplysm/core-common\";\nimport \"@simplysm/core-common\";\nimport type { SdConfig, SdPublishConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { spawn } from \"../utils/spawn\";\nimport { runBuild } from \"./build\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport ssh2 from \"ssh2\";\nimport { password as passwordPrompt } from \"@inquirer/prompts\";\n\nconst { Client: SshClient, utils } = ssh2;\n\n//#region Types\n\n/**\n * Publish \uBA85\uB839 \uC635\uC158\n */\nexport interface PublishOptions {\n /** \uBC30\uD3EC\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 publish \uC124\uC815\uC774 \uC788\uB294 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n /** \uBE4C\uB4DC \uC5C6\uC774 \uBC30\uD3EC (\uC704\uD5D8) */\n noBuild: boolean;\n /** \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC774 \uC2DC\uBBAC\uB808\uC774\uC158 */\n dryRun: boolean;\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n/**\n * package.json \uD0C0\uC785 (\uD544\uC694\uD55C \uD544\uB4DC\uB9CC)\n */\ninterface PackageJson {\n name: string;\n version: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * \uD658\uACBD\uBCC0\uC218 \uCE58\uD658 (%VAR% \uD615\uC2DD)\n * @throws \uCE58\uD658 \uACB0\uACFC\uAC00 \uBE48 \uBB38\uC790\uC5F4\uC774\uBA74 \uC5D0\uB7EC\n */\nfunction replaceEnvVariables(str: string, version: string, projectPath: string): string {\n const result = str.replace(/%([^%]+)%/g, (match, envName: string) => {\n if (envName === \"VER\") {\n return version;\n }\n if (envName === \"PROJECT\") {\n return projectPath;\n }\n return (env[envName] as string | undefined) ?? match;\n });\n\n // \uCE58\uD658\uB418\uC9C0 \uC54A\uC740 \uD658\uACBD\uBCC0\uC218\uAC00 \uB0A8\uC544\uC788\uC73C\uBA74 \uC5D0\uB7EC\n if (/%[^%]+%/.test(result)) {\n throw new Error(`\uD658\uACBD\uBCC0\uC218 \uCE58\uD658 \uC2E4\uD328: ${str} \u2192 ${result}`);\n }\n\n return result;\n}\n\n/**\n * \uCE74\uC6B4\uD2B8\uB2E4\uC6B4 \uB300\uAE30\n */\nasync function waitWithCountdown(message: string, seconds: number): Promise<void> {\n for (let i = seconds; i > 0; i--) {\n if (i !== seconds && process.stdout.isTTY) {\n process.stdout.cursorTo(0);\n }\n process.stdout.write(`${message} ${i}`);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n if (process.stdout.isTTY) {\n process.stdout.cursorTo(0);\n process.stdout.clearLine(0);\n } else {\n process.stdout.write(\"\\n\");\n }\n}\n\n/**\n * SSH \uD0A4 \uC778\uC99D \uC0AC\uC804 \uD655\uC778 \uBC0F \uC124\uC815\n *\n * pass\uAC00 \uC5C6\uB294 SFTP \uC11C\uBC84\uC5D0 \uB300\uD574:\n * 1. SSH \uD0A4 \uD30C\uC77C\uC774 \uC5C6\uC73C\uBA74 \uC0DD\uC131\n * 2. \uD0A4 \uC778\uC99D\uC744 \uD14C\uC2A4\uD2B8\uD558\uACE0, \uC2E4\uD328\uD558\uBA74 \uBE44\uBC00\uBC88\uD638\uB85C \uACF5\uAC1C\uD0A4 \uB4F1\uB85D\n */\nasync function ensureSshAuth(\n publishPackages: Array<{ name: string; config: SdPublishConfig }>,\n logger: ReturnType<typeof consola.withTag>,\n): Promise<void> {\n // pass \uC5C6\uB294 SFTP \uC11C\uBC84 \uC218\uC9D1 (user@host \uC911\uBCF5 \uC81C\uAC70)\n const sshTargets = new Map<string, { host: string; port?: number; user: string }>();\n for (const pkg of publishPackages) {\n if (pkg.config === \"npm\") continue;\n if (pkg.config.type !== \"sftp\") continue;\n if (pkg.config.pass != null) continue;\n if (pkg.config.user == null) {\n throw new Error(`[${pkg.name}] SFTP \uC124\uC815\uC5D0 user\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n const key = `${pkg.config.user}@${pkg.config.host}`;\n sshTargets.set(key, {\n host: pkg.config.host,\n port: pkg.config.port,\n user: pkg.config.user,\n });\n }\n\n if (sshTargets.size === 0) return;\n\n // SSH \uD0A4 \uD30C\uC77C \uD655\uC778/\uC0DD\uC131\n const sshDir = path.join(os.homedir(), \".ssh\");\n const keyPath = path.join(sshDir, \"id_ed25519\");\n const pubKeyPath = path.join(sshDir, \"id_ed25519.pub\");\n\n if (!fs.existsSync(keyPath)) {\n logger.info(\"SSH \uD0A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC0DD\uC131\uD569\uB2C8\uB2E4...\");\n\n if (!fs.existsSync(sshDir)) {\n fs.mkdirSync(sshDir, { mode: 0o700 });\n }\n\n const keyPair = utils.generateKeyPairSync(\"ed25519\");\n fs.writeFileSync(keyPath, keyPair.private, { mode: 0o600 });\n fs.writeFileSync(pubKeyPath, keyPair.public + \"\\n\", { mode: 0o644 });\n\n logger.info(`SSH \uD0A4 \uC0DD\uC131 \uC644\uB8CC: ${keyPath}`);\n }\n\n const privateKeyData = fs.readFileSync(keyPath);\n const publicKey = fs.readFileSync(pubKeyPath, \"utf-8\").trim();\n\n // privateKey\uAC00 \uC554\uD638\uD654\uB418\uC5B4 \uC788\uB294\uC9C0 \uD655\uC778\n const parsed = utils.parseKey(privateKeyData);\n const isKeyEncrypted = parsed instanceof Error;\n const sshAgent = process.env[\"SSH_AUTH_SOCK\"];\n\n // \uAC01 \uC11C\uBC84\uC5D0 \uB300\uD574 \uD0A4 \uC778\uC99D \uD655\uC778\n for (const [label, target] of sshTargets) {\n const canAuth = await testSshKeyAuth(target, {\n privateKey: isKeyEncrypted ? undefined : privateKeyData,\n agent: sshAgent,\n });\n if (canAuth) {\n logger.debug(`SSH \uD0A4 \uC778\uC99D \uD655\uC778: ${label}`);\n continue;\n }\n\n // \uD0A4 \uC778\uC99D \uC2E4\uD328 \u2192 \uBE44\uBC00\uBC88\uD638\uB85C \uACF5\uAC1C\uD0A4 \uB4F1\uB85D\n logger.info(`${label}: SSH \uD0A4\uAC00 \uC11C\uBC84\uC5D0 \uB4F1\uB85D\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.`);\n const pass = await passwordPrompt({\n message: `${label} \uBE44\uBC00\uBC88\uD638 (\uACF5\uAC1C\uD0A4 \uB4F1\uB85D\uC6A9):`,\n });\n\n await registerSshPublicKey(target, pass, publicKey);\n logger.info(`SSH \uACF5\uAC1C\uD0A4 \uB4F1\uB85D \uC644\uB8CC: ${label}`);\n }\n}\n\n/**\n * SSH \uD0A4 \uC778\uC99D \uD14C\uC2A4\uD2B8 (\uC811\uC18D \uD6C4 \uC989\uC2DC \uC885\uB8CC)\n */\nfunction testSshKeyAuth(\n target: { host: string; port?: number; user: string },\n auth: { privateKey?: Buffer; agent?: string },\n): Promise<boolean> {\n if (auth.privateKey == null && auth.agent == null) {\n return Promise.resolve(false);\n }\n\n return new Promise((resolve) => {\n const conn = new SshClient();\n conn.on(\"ready\", () => {\n conn.end();\n resolve(true);\n });\n conn.on(\"error\", () => {\n resolve(false);\n });\n conn.connect({\n host: target.host,\n port: target.port ?? 22,\n username: target.user,\n ...(auth.privateKey != null ? { privateKey: auth.privateKey } : {}),\n ...(auth.agent != null ? { agent: auth.agent } : {}),\n readyTimeout: 10_000,\n });\n });\n}\n\n/**\n * \uBE44\uBC00\uBC88\uD638\uB85C \uC11C\uBC84\uC5D0 \uC811\uC18D\uD558\uC5EC SSH \uACF5\uAC1C\uD0A4\uB97C \uB4F1\uB85D\n */\nfunction registerSshPublicKey(\n target: { host: string; port?: number; user: string },\n pass: string,\n publicKey: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const conn = new SshClient();\n conn.on(\"ready\", () => {\n // authorized_keys\uC5D0 \uACF5\uAC1C\uD0A4 \uCD94\uAC00\n const cmd = [\n \"mkdir -p ~/.ssh\",\n \"chmod 700 ~/.ssh\",\n `echo '${publicKey}' >> ~/.ssh/authorized_keys`,\n \"chmod 600 ~/.ssh/authorized_keys\",\n ].join(\" && \");\n\n conn.exec(cmd, (err, stream) => {\n if (err) {\n conn.end();\n reject(new Error(`SSH \uBA85\uB839 \uC2E4\uD589 \uC2E4\uD328: ${err.message}`));\n return;\n }\n\n let stderr = \"\";\n stream.on(\"data\", () => {}); // stdout \uC18C\uBE44 (\uBBF8\uC18C\uBE44 \uC2DC stream \uBBF8\uC885\uB8CC)\n stream.stderr.on(\"data\", (data: Uint8Array) => {\n stderr += data.toString();\n });\n stream.on(\"exit\", (code: number | null) => {\n conn.end();\n if (code !== 0) {\n reject(new Error(`SSH \uACF5\uAC1C\uD0A4 \uB4F1\uB85D \uC2E4\uD328 (exit code: ${code}): ${stderr}`));\n } else {\n resolve();\n }\n });\n });\n });\n conn.on(\"error\", (err) => {\n reject(new Error(`SSH \uC811\uC18D \uC2E4\uD328 (${target.host}): ${err.message}`));\n });\n conn.connect({\n host: target.host,\n port: target.port ?? 22,\n username: target.user,\n password: pass,\n readyTimeout: 10_000,\n });\n });\n}\n\n//#endregion\n\n//#region Version Upgrade\n\n/**\n * \uD504\uB85C\uC81D\uD2B8 \uBC0F \uD328\uD0A4\uC9C0 \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC\n * @param dryRun true\uBA74 \uD30C\uC77C \uC218\uC815 \uC5C6\uC774 \uC0C8 \uBC84\uC804\uB9CC \uACC4\uC0B0\n */\nasync function upgradeVersion(\n cwd: string,\n allPkgPaths: string[],\n dryRun: boolean,\n): Promise<{ version: string; changedFiles: string[] }> {\n const changedFiles: string[] = [];\n const projPkgPath = path.resolve(cwd, \"package.json\");\n const projPkg = await fsReadJson<PackageJson>(projPkgPath);\n\n const currentVersion = projPkg.version;\n const prereleaseInfo = semver.prerelease(currentVersion);\n\n // prerelease \uC5EC\uBD80\uC5D0 \uB530\uB77C \uC99D\uAC00 \uBC29\uC2DD \uACB0\uC815\n const newVersion =\n prereleaseInfo !== null ? semver.inc(currentVersion, \"prerelease\")! : semver.inc(currentVersion, \"patch\")!;\n\n if (dryRun) {\n // dry-run: \uD30C\uC77C \uC218\uC815 \uC5C6\uC774 \uC0C8 \uBC84\uC804\uB9CC \uBC18\uD658\n return { version: newVersion, changedFiles: [] };\n }\n\n projPkg.version = newVersion;\n await fsWrite(projPkgPath, jsonStringify(projPkg, { space: 2 }) + \"\\n\");\n changedFiles.push(projPkgPath);\n\n // \uAC01 \uD328\uD0A4\uC9C0 package.json \uBC84\uC804 \uC124\uC815\n for (const pkgPath of allPkgPaths) {\n const pkgJsonPath = path.resolve(pkgPath, \"package.json\");\n const pkgJson = await fsReadJson<PackageJson>(pkgJsonPath);\n pkgJson.version = newVersion;\n await fsWrite(pkgJsonPath, jsonStringify(pkgJson, { space: 2 }) + \"\\n\");\n changedFiles.push(pkgJsonPath);\n }\n\n // \uD15C\uD50C\uB9BF \uD30C\uC77C\uC758 @simplysm \uD328\uD0A4\uC9C0 \uBC84\uC804 \uB3D9\uAE30\uD654\n const templateFiles = await fsGlob(path.resolve(cwd, \"packages/sd-cli/templates/**/*.hbs\"));\n const versionRegex = /(\"@simplysm\\/[^\"]+\"\\s*:\\s*)\"~[^\"]+\"/g;\n\n for (const templatePath of templateFiles) {\n const content = await fsRead(templatePath);\n const newContent = content.replace(versionRegex, `$1\"~${newVersion}\"`);\n\n if (content !== newContent) {\n await fsWrite(templatePath, newContent);\n changedFiles.push(templatePath);\n }\n }\n\n return { version: newVersion, changedFiles };\n}\n\n//#endregion\n\n//#region Package Publishing\n\n/**\n * \uAC1C\uBCC4 \uD328\uD0A4\uC9C0 \uBC30\uD3EC\n * @param dryRun true\uBA74 \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC774 \uC2DC\uBBAC\uB808\uC774\uC158\n */\nasync function publishPackage(\n pkgPath: string,\n publishConfig: SdPublishConfig,\n version: string,\n projectPath: string,\n logger: ReturnType<typeof consola.withTag>,\n dryRun: boolean,\n): Promise<void> {\n const pkgName = path.basename(pkgPath);\n\n if (publishConfig === \"npm\") {\n // npm publish\n const prereleaseInfo = semver.prerelease(version);\n const args = [\"publish\", \"--access\", \"public\"];\n\n if (prereleaseInfo !== null && typeof prereleaseInfo[0] === \"string\") {\n args.push(\"--tag\", prereleaseInfo[0]);\n }\n\n if (dryRun) {\n args.push(\"--dry-run\");\n logger.info(`[DRY-RUN] [${pkgName}] pnpm ${args.join(\" \")}`);\n } else {\n logger.debug(`[${pkgName}] pnpm ${args.join(\" \")}`);\n }\n\n await spawn(\"pnpm\", args, { cwd: pkgPath });\n } else if (publishConfig.type === \"local-directory\") {\n // \uB85C\uCEEC \uB514\uB809\uD1A0\uB9AC \uBCF5\uC0AC\n const targetPath = replaceEnvVariables(publishConfig.path, version, projectPath);\n const distPath = path.resolve(pkgPath, \"dist\");\n\n if (dryRun) {\n logger.info(`[DRY-RUN] [${pkgName}] \uB85C\uCEEC \uBCF5\uC0AC: ${distPath} \u2192 ${targetPath}`);\n } else {\n logger.debug(`[${pkgName}] \uB85C\uCEEC \uBCF5\uC0AC: ${distPath} \u2192 ${targetPath}`);\n await fsCopy(distPath, targetPath);\n }\n } else {\n // \uC2A4\uD1A0\uB9AC\uC9C0 \uC5C5\uB85C\uB4DC\n const distPath = path.resolve(pkgPath, \"dist\");\n const remotePath = publishConfig.path ?? \"/\";\n\n if (dryRun) {\n logger.info(`[DRY-RUN] [${pkgName}] ${publishConfig.type} \uC5C5\uB85C\uB4DC: ${distPath} \u2192 ${remotePath}`);\n } else {\n logger.debug(`[${pkgName}] ${publishConfig.type} \uC5C5\uB85C\uB4DC: ${distPath} \u2192 ${remotePath}`);\n await StorageFactory.connect(\n publishConfig.type,\n {\n host: publishConfig.host,\n port: publishConfig.port,\n user: publishConfig.user,\n pass: publishConfig.pass,\n },\n async (storage) => {\n await storage.uploadDir(distPath, remotePath);\n },\n );\n }\n }\n}\n\n//#endregion\n\n//#region Dependency Levels\n\n/**\n * \uBC30\uD3EC \uD328\uD0A4\uC9C0\uC758 \uC758\uC874\uC131 \uB808\uBCA8\uC744 \uACC4\uC0B0\uD55C\uB2E4.\n * \uC758\uC874\uC131\uC774 \uC5C6\uB294 \uD328\uD0A4\uC9C0 \u2192 Level 0, Level 0\uC5D0\uB9CC \uC758\uC874 \u2192 Level 1, ...\n */\nasync function computePublishLevels(\n publishPkgs: Array<{ name: string; path: string; config: SdPublishConfig }>,\n): Promise<Array<Array<{ name: string; path: string; config: SdPublishConfig }>>> {\n const pkgNames = new Set(publishPkgs.map((p) => p.name));\n\n // \uAC01 \uD328\uD0A4\uC9C0\uC758 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uB0B4 \uC758\uC874\uC131 \uC218\uC9D1\n const depsMap = new Map<string, Set<string>>();\n for (const pkg of publishPkgs) {\n const pkgJson = await fsReadJson<PackageJson>(path.resolve(pkg.path, \"package.json\"));\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.peerDependencies,\n ...pkgJson.optionalDependencies,\n };\n\n const workspaceDeps = new Set<string>();\n for (const depName of Object.keys(allDeps)) {\n const shortName = depName.replace(/^@simplysm\\//, \"\");\n if (shortName !== depName && pkgNames.has(shortName)) {\n workspaceDeps.add(shortName);\n }\n }\n depsMap.set(pkg.name, workspaceDeps);\n }\n\n // \uC704\uC0C1 \uC815\uB82C\uB85C \uB808\uBCA8 \uBD84\uB958\n const levels: Array<Array<{ name: string; path: string; config: SdPublishConfig }>> = [];\n const assigned = new Set<string>();\n const remaining = new Map(publishPkgs.map((p) => [p.name, p]));\n\n while (remaining.size > 0) {\n const level: Array<{ name: string; path: string; config: SdPublishConfig }> = [];\n for (const [name, pkg] of remaining) {\n const deps = depsMap.get(name)!;\n if ([...deps].every((d) => assigned.has(d))) {\n level.push(pkg);\n }\n }\n\n if (level.length === 0) {\n // \uC21C\uD658 \uC758\uC874\uC131 \u2014 \uB0A8\uC740 \uD328\uD0A4\uC9C0\uB97C \uBAA8\uB450 \uB9C8\uC9C0\uB9C9 \uB808\uBCA8\uC5D0 \uBC30\uCE58\n levels.push([...remaining.values()]);\n break;\n }\n\n for (const pkg of level) {\n assigned.add(pkg.name);\n remaining.delete(pkg.name);\n }\n levels.push(level);\n }\n\n return levels;\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * publish \uBA85\uB839\uC744 \uC2E4\uD589\uD55C\uB2E4.\n *\n * **\uBC30\uD3EC \uC21C\uC11C (\uC548\uC804\uC131 \uC6B0\uC120):**\n * 1. \uC0AC\uC804 \uAC80\uC99D (npm \uC778\uC99D, Git \uC0C1\uD0DC)\n * 2. \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC (package.json + \uD15C\uD50C\uB9BF)\n * 3. \uBE4C\uB4DC\n * 4. Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC (\uBCC0\uACBD\uB41C \uD30C\uC77C\uB9CC \uBA85\uC2DC\uC801\uC73C\uB85C staging)\n * 5. pnpm \uBC30\uD3EC\n * 6. postPublish (\uC2E4\uD328\uD574\uB3C4 \uACC4\uC18D)\n */\nexport async function runPublish(options: PublishOptions): Promise<void> {\n const { targets, noBuild, dryRun } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:publish\");\n\n if (dryRun) {\n logger.info(\"[DRY-RUN] \uC2DC\uBBAC\uB808\uC774\uC158 \uBAA8\uB4DC - \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC74C\");\n }\n\n logger.debug(\"\uBC30\uD3EC \uC2DC\uC791\", { targets, noBuild, dryRun });\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 // package.json \uB85C\uB4DC\n const projPkgPath = path.resolve(cwd, \"package.json\");\n const projPkg = await fsReadJson<PackageJson>(projPkgPath);\n\n // pnpm-workspace.yaml\uC5D0\uC11C \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uD328\uD0A4\uC9C0 \uACBD\uB85C \uC218\uC9D1\n const workspaceYamlPath = path.resolve(cwd, \"pnpm-workspace.yaml\");\n const workspaceGlobs: string[] = [];\n if (await fsExists(workspaceYamlPath)) {\n const yamlContent = await fsRead(workspaceYamlPath);\n let inPackages = false;\n for (const line of yamlContent.split(\"\\n\")) {\n if (/^packages:\\s*$/.test(line)) {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const match = /^\\s+-\\s+(.+)$/.exec(line);\n if (match != null) {\n workspaceGlobs.push(match[1].trim());\n } else {\n break;\n }\n }\n }\n }\n\n const allPkgPaths = (await Promise.all(workspaceGlobs.map((item) => fsGlob(path.resolve(cwd, item)))))\n .flat()\n .filter((item) => !item.includes(\".\"));\n\n // publish \uC124\uC815\uC774 \uC788\uB294 \uD328\uD0A4\uC9C0 \uD544\uD130\uB9C1\n const publishPackages: Array<{\n name: string;\n path: string;\n config: SdPublishConfig;\n }> = [];\n\n for (const [name, config] of Object.entries(sdConfig.packages)) {\n if (config == null) continue;\n if (config.target === \"scripts\") continue;\n\n const pkgConfig = config;\n if (pkgConfig.publish == null) 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 const pkgPath = allPkgPaths.find((p) => path.basename(p) === name);\n if (pkgPath == null) {\n logger.warn(`\uD328\uD0A4\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${name}`);\n continue;\n }\n\n publishPackages.push({\n name,\n path: pkgPath,\n config: pkgConfig.publish,\n });\n }\n\n if (publishPackages.length === 0) {\n process.stdout.write(\"\u2714 \uBC30\uD3EC\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n logger.debug(\n \"\uBC30\uD3EC \uB300\uC0C1 \uD328\uD0A4\uC9C0\",\n publishPackages.map((p) => p.name),\n );\n\n // Git \uC0AC\uC6A9 \uC5EC\uBD80 \uD655\uC778\n const hasGit = await fsExists(path.resolve(cwd, \".git\"));\n\n //#region Phase 1: \uC0AC\uC804 \uAC80\uC99D\n\n // npm \uC778\uC99D \uD655\uC778 (npm publish \uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0)\n if (publishPackages.some((p) => p.config === \"npm\")) {\n logger.debug(\"npm \uC778\uC99D \uD655\uC778...\");\n try {\n const whoami = await spawn(\"npm\", [\"whoami\"]);\n if (whoami.trim() === \"\") {\n throw new Error(\"npm \uB85C\uADF8\uC778 \uC815\uBCF4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n }\n logger.debug(`npm \uB85C\uADF8\uC778 \uD655\uC778: ${whoami.trim()}`);\n } catch {\n consola.error(\n \"npm \uD1A0\uD070\uC774 \uC720\uD6A8\uD558\uC9C0 \uC54A\uAC70\uB098 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\\n\" +\n \"https://www.npmjs.com/settings/~/tokens \uC5D0\uC11C Granular Access Token \uC0DD\uC131 \uD6C4:\\n\" +\n \" npm config set //registry.npmjs.org/:_authToken <\uD1A0\uD070>\",\n );\n process.exitCode = 1;\n return;\n }\n }\n\n // SSH \uD0A4 \uC778\uC99D \uD655\uC778 (pass \uC5C6\uB294 SFTP publish \uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0)\n try {\n await ensureSshAuth(publishPackages, logger);\n } catch (err) {\n consola.error(`SSH \uC778\uC99D \uC124\uC815 \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // Git \uBBF8\uCEE4\uBC0B \uBCC0\uACBD\uC0AC\uD56D \uD655\uC778 (noBuild\uAC00 \uC544\uB2CC \uACBD\uC6B0)\n if (!noBuild && hasGit) {\n logger.debug(\"Git \uCEE4\uBC0B \uC5EC\uBD80 \uD655\uC778...\");\n try {\n // unstaged \uBCC0\uACBD\uC0AC\uD56D \uD655\uC778 (packages/ \uD3F4\uB354\uB9CC)\n const diff = await spawn(\"git\", [\"diff\", \"--name-only\", \"--\", \"packages/\"]);\n if (diff.trim() !== \"\") {\n throw new Error(\"\uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC0AC\uD56D\uC774 \uC788\uC2B5\uB2C8\uB2E4.\\n\" + diff);\n }\n\n // staged \uBCC0\uACBD\uC0AC\uD56D \uD655\uC778 (packages/ \uD3F4\uB354\uB9CC)\n const stagedDiff = await spawn(\"git\", [\"diff\", \"--cached\", \"--name-only\", \"--\", \"packages/\"]);\n if (stagedDiff.trim() !== \"\") {\n throw new Error(\"staged\uB41C \uBCC0\uACBD\uC0AC\uD56D\uC774 \uC788\uC2B5\uB2C8\uB2E4. \uBA3C\uC800 \uCEE4\uBC0B\uD558\uAC70\uB098 unstage\uD558\uC138\uC694.\\n\" + stagedDiff);\n }\n } catch (err) {\n consola.error(err instanceof Error ? err.message : err);\n process.exitCode = 1;\n return;\n }\n }\n\n //#endregion\n\n //#region Phase 2 & 3: \uBE4C\uB4DC \uB610\uB294 noBuild \uACBD\uACE0\n\n let version = projPkg.version;\n\n if (noBuild) {\n // noBuild \uACBD\uACE0\n logger.warn(\"\uBE4C\uB4DC\uD558\uC9C0 \uC54A\uACE0 \uBC30\uD3EC\uD558\uB294 \uAC83\uC740 \uC0C1\uB2F9\uD788 \uC704\uD5D8\uD569\uB2C8\uB2E4.\");\n await waitWithCountdown(\"\uD504\uB85C\uC138\uC2A4\uB97C \uC911\uC9C0\uD558\uB824\uBA74 'CTRL+C'\uB97C \uB204\uB974\uC138\uC694.\", 5);\n } else {\n // \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC\n logger.debug(\"\uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC...\");\n const upgradeResult = await upgradeVersion(cwd, allPkgPaths, dryRun);\n version = upgradeResult.version;\n const _changedFiles = upgradeResult.changedFiles;\n if (dryRun) {\n logger.info(`[DRY-RUN] \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC: ${projPkg.version} \u2192 ${version} (\uD30C\uC77C \uC218\uC815 \uC5C6\uC74C)`);\n } else {\n logger.info(`\uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC: ${projPkg.version} \u2192 ${version}`);\n }\n\n // \uBE4C\uB4DC \uC2E4\uD589\n if (dryRun) {\n logger.info(\"[DRY-RUN] \uBE4C\uB4DC \uC2DC\uC791 (\uAC80\uC99D\uC6A9)...\");\n } else {\n logger.debug(\"\uBE4C\uB4DC \uC2DC\uC791...\");\n }\n\n try {\n await runBuild({\n targets: publishPackages.map((p) => p.name),\n options: options.options,\n });\n\n // \uBE4C\uB4DC \uC2E4\uD328 \uD655\uC778\n if (process.exitCode === 1) {\n throw new Error(\"\uBE4C\uB4DC \uC2E4\uD328\");\n }\n } catch {\n if (dryRun) {\n logger.error(\"[DRY-RUN] \uBE4C\uB4DC \uC2E4\uD328\");\n } else {\n consola.error(\n \"\uBE4C\uB4DC \uC2E4\uD328. \uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4:\\n\" +\n \" \uBC84\uC804 \uBCC0\uACBD\uC744 \uB418\uB3CC\uB9AC\uB824\uBA74:\\n\" +\n \" git checkout -- package.json packages/*/package.json packages/sd-cli/templates/\",\n );\n }\n process.exitCode = 1;\n return;\n }\n\n //#region Phase 3: Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC\n\n if (hasGit) {\n if (dryRun) {\n logger.info(\"[DRY-RUN] Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC \uC2DC\uBBAC\uB808\uC774\uC158...\");\n logger.info(`[DRY-RUN] git add (${_changedFiles.length}\uAC1C \uD30C\uC77C)`);\n logger.info(`[DRY-RUN] git commit -m \"v${version}\"`);\n logger.info(`[DRY-RUN] git tag -a v${version} -m \"v${version}\"`);\n logger.info(\"[DRY-RUN] git push --dry-run\");\n await spawn(\"git\", [\"push\", \"--dry-run\"]);\n logger.info(\"[DRY-RUN] git push --tags --dry-run\");\n await spawn(\"git\", [\"push\", \"--tags\", \"--dry-run\"]);\n logger.info(\"[DRY-RUN] Git \uC791\uC5C5 \uC2DC\uBBAC\uB808\uC774\uC158 \uC644\uB8CC\");\n } else {\n logger.debug(\"Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC...\");\n try {\n await spawn(\"git\", [\"add\", ..._changedFiles]);\n await spawn(\"git\", [\"commit\", \"-m\", `v${version}`]);\n await spawn(\"git\", [\"tag\", \"-a\", `v${version}`, \"-m\", `v${version}`]);\n await spawn(\"git\", [\"push\"]);\n await spawn(\"git\", [\"push\", \"--tags\"]);\n logger.debug(\"Git \uC791\uC5C5 \uC644\uB8CC\");\n } catch (err) {\n consola.error(\n `Git \uC791\uC5C5 \uC2E4\uD328: ${err instanceof Error ? err.message : err}\\n` +\n \"\uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4:\\n\" +\n ` git revert HEAD # \uBC84\uC804 \uCEE4\uBC0B \uB418\uB3CC\uB9AC\uAE30\\n` +\n ` git tag -d v${version} # \uD0DC\uADF8 \uC0AD\uC81C`,\n );\n process.exitCode = 1;\n return;\n }\n }\n }\n\n //#endregion\n }\n\n //#endregion\n\n //#region Phase 4: \uBC30\uD3EC (\uC758\uC874\uC131 \uB808\uBCA8\uBCC4 \uBCD1\uB82C, Listr)\n\n const levels = await computePublishLevels(publishPackages);\n const publishedPackages: string[] = [];\n let publishFailed = false;\n\n const publishListr = new Listr(\n levels.map(\n (levelPkgs, levelIdx): ListrTask => ({\n title: `Level ${levelIdx + 1}/${levels.length}`,\n skip: () => publishFailed,\n task: (_, task) =>\n task.newListr(\n levelPkgs.map(\n (pkg): ListrTask => ({\n title: dryRun ? `[DRY-RUN] ${pkg.name}` : pkg.name,\n task: async (_ctx, pkgTask) => {\n const maxRetries = 3;\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n await publishPackage(pkg.path, pkg.config, version, cwd, logger, dryRun);\n break;\n } catch (err) {\n if (attempt < maxRetries) {\n const delay = attempt * 5_000;\n pkgTask.title = dryRun\n ? `[DRY-RUN] ${pkg.name} (\uC7AC\uC2DC\uB3C4 ${attempt + 1}/${maxRetries})`\n : `${pkg.name} (\uC7AC\uC2DC\uB3C4 ${attempt + 1}/${maxRetries})`;\n await new Promise((resolve) => setTimeout(resolve, delay));\n } else {\n throw err;\n }\n }\n }\n publishedPackages.push(pkg.name);\n },\n }),\n ),\n { 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 publishListr.run();\n } catch {\n // Listr \uB0B4\uBD80 \uC5D0\uB7EC\uB294 \uC544\uB798\uC5D0\uC11C \uCC98\uB9AC\n }\n\n // \uC2E4\uD328\uD55C \uD328\uD0A4\uC9C0 \uD655\uC778\n const allPkgNames = publishPackages.map((p) => p.name);\n const failedPkgNames = allPkgNames.filter((n) => !publishedPackages.includes(n));\n\n if (failedPkgNames.length > 0) {\n publishFailed = true;\n\n if (publishedPackages.length > 0) {\n consola.error(\n \"\uBC30\uD3EC \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\\n\" +\n \"\uC774\uBBF8 \uBC30\uD3EC\uB41C \uD328\uD0A4\uC9C0:\\n\" +\n publishedPackages.map((n) => ` - ${n}`).join(\"\\n\") +\n \"\\n\\n\uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\\n\" +\n \"npm \uD328\uD0A4\uC9C0\uB294 72\uC2DC\uAC04 \uB0B4\uC5D0 `npm unpublish <pkg>@<version>` \uC73C\uB85C \uC0AD\uC81C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\",\n );\n }\n\n for (const name of failedPkgNames) {\n consola.error(`[${name}] \uBC30\uD3EC \uC2E4\uD328`);\n }\n process.exitCode = 1;\n return;\n }\n\n //#endregion\n\n //#region Phase 5: postPublish\n\n if (sdConfig.postPublish != null && sdConfig.postPublish.length > 0) {\n if (dryRun) {\n logger.info(\"[DRY-RUN] postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2DC\uBBAC\uB808\uC774\uC158...\");\n } else {\n logger.debug(\"postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD589...\");\n }\n\n for (const script of sdConfig.postPublish) {\n try {\n const cmd = replaceEnvVariables(script.cmd, version, cwd);\n const args = script.args.map((arg) => replaceEnvVariables(arg, version, cwd));\n\n if (dryRun) {\n logger.info(`[DRY-RUN] \uC2E4\uD589 \uC608\uC815: ${cmd} ${args.join(\" \")}`);\n } else {\n logger.debug(`\uC2E4\uD589: ${cmd} ${args.join(\" \")}`);\n await spawn(cmd, args, { cwd });\n }\n } catch (err) {\n // postPublish \uC2E4\uD328 \uC2DC \uACBD\uACE0\uB9CC \uCD9C\uB825 (\uBC30\uD3EC \uB864\uBC31 \uBD88\uAC00)\n logger.warn(`postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD328 (\uACC4\uC18D \uC9C4\uD589): ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n\n //#endregion\n\n if (dryRun) {\n logger.info(`[DRY-RUN] \uC2DC\uBBAC\uB808\uC774\uC158 \uC644\uB8CC. \uC2E4\uC81C \uBC30\uD3EC \uC2DC \uBC84\uC804: v${version}`);\n } else {\n logger.info(`\uBAA8\uB4E0 \uBC30\uD3EC\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. (v${version})`);\n }\n}\n\n//#endregion\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import path from \"path\";\nimport semver from \"semver\";\nimport { consola, LogLevels } from \"consola\";\nimport { Listr, type ListrTask } from \"listr2\";\nimport { StorageFactory } from \"@simplysm/storage\";\nimport { fsExists, fsRead, fsReadJson, fsWrite, fsGlob, fsCopy } from \"@simplysm/core-node\";\nimport { env, jsonStringify } from \"@simplysm/core-common\";\nimport \"@simplysm/core-common\";\nimport type { SdConfig, SdPublishConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { spawn } from \"../utils/spawn\";\nimport { runBuild } from \"./build\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport ssh2 from \"ssh2\";\nimport { password as passwordPrompt } from \"@inquirer/prompts\";\n\nconst { Client: SshClient, utils } = ssh2;\n\n//#region Types\n\n/**\n * Publish \uBA85\uB839 \uC635\uC158\n */\nexport interface PublishOptions {\n /** \uBC30\uD3EC\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 publish \uC124\uC815\uC774 \uC788\uB294 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n /** \uBE4C\uB4DC \uC5C6\uC774 \uBC30\uD3EC (\uC704\uD5D8) */\n noBuild: boolean;\n /** \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC774 \uC2DC\uBBAC\uB808\uC774\uC158 */\n dryRun: boolean;\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n/**\n * package.json \uD0C0\uC785 (\uD544\uC694\uD55C \uD544\uB4DC\uB9CC)\n */\ninterface PackageJson {\n name: string;\n version: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * \uD658\uACBD\uBCC0\uC218 \uCE58\uD658 (%VAR% \uD615\uC2DD)\n * @throws \uCE58\uD658 \uACB0\uACFC\uAC00 \uBE48 \uBB38\uC790\uC5F4\uC774\uBA74 \uC5D0\uB7EC\n */\nfunction replaceEnvVariables(str: string, version: string, projectPath: string): string {\n const result = str.replace(/%([^%]+)%/g, (match, envName: string) => {\n if (envName === \"VER\") {\n return version;\n }\n if (envName === \"PROJECT\") {\n return projectPath;\n }\n return (env[envName] as string | undefined) ?? match;\n });\n\n // \uCE58\uD658\uB418\uC9C0 \uC54A\uC740 \uD658\uACBD\uBCC0\uC218\uAC00 \uB0A8\uC544\uC788\uC73C\uBA74 \uC5D0\uB7EC\n if (/%[^%]+%/.test(result)) {\n throw new Error(`\uD658\uACBD\uBCC0\uC218 \uCE58\uD658 \uC2E4\uD328: ${str} \u2192 ${result}`);\n }\n\n return result;\n}\n\n/**\n * \uCE74\uC6B4\uD2B8\uB2E4\uC6B4 \uB300\uAE30\n */\nasync function waitWithCountdown(message: string, seconds: number): Promise<void> {\n for (let i = seconds; i > 0; i--) {\n if (i !== seconds && process.stdout.isTTY) {\n process.stdout.cursorTo(0);\n }\n process.stdout.write(`${message} ${i}`);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n if (process.stdout.isTTY) {\n process.stdout.cursorTo(0);\n process.stdout.clearLine(0);\n } else {\n process.stdout.write(\"\\n\");\n }\n}\n\n/**\n * SSH \uD0A4 \uC778\uC99D \uC0AC\uC804 \uD655\uC778 \uBC0F \uC124\uC815\n *\n * pass\uAC00 \uC5C6\uB294 SFTP \uC11C\uBC84\uC5D0 \uB300\uD574:\n * 1. SSH \uD0A4 \uD30C\uC77C\uC774 \uC5C6\uC73C\uBA74 \uC0DD\uC131\n * 2. \uD0A4 \uC778\uC99D\uC744 \uD14C\uC2A4\uD2B8\uD558\uACE0, \uC2E4\uD328\uD558\uBA74 \uBE44\uBC00\uBC88\uD638\uB85C \uACF5\uAC1C\uD0A4 \uB4F1\uB85D\n */\nasync function ensureSshAuth(\n publishPackages: Array<{ name: string; config: SdPublishConfig }>,\n logger: ReturnType<typeof consola.withTag>,\n): Promise<void> {\n // pass \uC5C6\uB294 SFTP \uC11C\uBC84 \uC218\uC9D1 (user@host \uC911\uBCF5 \uC81C\uAC70)\n const sshTargets = new Map<string, { host: string; port?: number; user: string }>();\n for (const pkg of publishPackages) {\n if (pkg.config === \"npm\") continue;\n if (pkg.config.type !== \"sftp\") continue;\n if (pkg.config.pass != null) continue;\n if (pkg.config.user == null) {\n throw new Error(`[${pkg.name}] SFTP \uC124\uC815\uC5D0 user\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n const key = `${pkg.config.user}@${pkg.config.host}`;\n sshTargets.set(key, {\n host: pkg.config.host,\n port: pkg.config.port,\n user: pkg.config.user,\n });\n }\n\n if (sshTargets.size === 0) return;\n\n // SSH \uD0A4 \uD30C\uC77C \uD655\uC778/\uC0DD\uC131\n const sshDir = path.join(os.homedir(), \".ssh\");\n const keyPath = path.join(sshDir, \"id_ed25519\");\n const pubKeyPath = path.join(sshDir, \"id_ed25519.pub\");\n\n if (!fs.existsSync(keyPath)) {\n logger.info(\"SSH \uD0A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC0DD\uC131\uD569\uB2C8\uB2E4...\");\n\n if (!fs.existsSync(sshDir)) {\n fs.mkdirSync(sshDir, { mode: 0o700 });\n }\n\n const keyPair = utils.generateKeyPairSync(\"ed25519\");\n fs.writeFileSync(keyPath, keyPair.private, { mode: 0o600 });\n fs.writeFileSync(pubKeyPath, keyPair.public + \"\\n\", { mode: 0o644 });\n\n logger.info(`SSH \uD0A4 \uC0DD\uC131 \uC644\uB8CC: ${keyPath}`);\n }\n\n const privateKeyData = fs.readFileSync(keyPath);\n const publicKey = fs.readFileSync(pubKeyPath, \"utf-8\").trim();\n\n // privateKey\uAC00 \uC554\uD638\uD654\uB418\uC5B4 \uC788\uB294\uC9C0 \uD655\uC778\n const parsed = utils.parseKey(privateKeyData);\n const isKeyEncrypted = parsed instanceof Error;\n const sshAgent = process.env[\"SSH_AUTH_SOCK\"];\n\n // \uAC01 \uC11C\uBC84\uC5D0 \uB300\uD574 \uD0A4 \uC778\uC99D \uD655\uC778\n for (const [label, target] of sshTargets) {\n const canAuth = await testSshKeyAuth(target, {\n privateKey: isKeyEncrypted ? undefined : privateKeyData,\n agent: sshAgent,\n });\n if (canAuth) {\n logger.debug(`SSH \uD0A4 \uC778\uC99D \uD655\uC778: ${label}`);\n continue;\n }\n\n // \uD0A4 \uC778\uC99D \uC2E4\uD328 \u2192 \uBE44\uBC00\uBC88\uD638\uB85C \uACF5\uAC1C\uD0A4 \uB4F1\uB85D\n logger.info(`${label}: SSH \uD0A4\uAC00 \uC11C\uBC84\uC5D0 \uB4F1\uB85D\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.`);\n const pass = await passwordPrompt({\n message: `${label} \uBE44\uBC00\uBC88\uD638 (\uACF5\uAC1C\uD0A4 \uB4F1\uB85D\uC6A9):`,\n });\n\n await registerSshPublicKey(target, pass, publicKey);\n logger.info(`SSH \uACF5\uAC1C\uD0A4 \uB4F1\uB85D \uC644\uB8CC: ${label}`);\n }\n}\n\n/**\n * SSH \uD0A4 \uC778\uC99D \uD14C\uC2A4\uD2B8 (\uC811\uC18D \uD6C4 \uC989\uC2DC \uC885\uB8CC)\n */\nfunction testSshKeyAuth(\n target: { host: string; port?: number; user: string },\n auth: { privateKey?: Buffer; agent?: string },\n): Promise<boolean> {\n if (auth.privateKey == null && auth.agent == null) {\n return Promise.resolve(false);\n }\n\n return new Promise((resolve) => {\n const conn = new SshClient();\n conn.on(\"ready\", () => {\n conn.end();\n resolve(true);\n });\n conn.on(\"error\", () => {\n resolve(false);\n });\n conn.connect({\n host: target.host,\n port: target.port ?? 22,\n username: target.user,\n ...(auth.privateKey != null ? { privateKey: auth.privateKey } : {}),\n ...(auth.agent != null ? { agent: auth.agent } : {}),\n readyTimeout: 10_000,\n });\n });\n}\n\n/**\n * \uBE44\uBC00\uBC88\uD638\uB85C \uC11C\uBC84\uC5D0 \uC811\uC18D\uD558\uC5EC SSH \uACF5\uAC1C\uD0A4\uB97C \uB4F1\uB85D\n */\nfunction registerSshPublicKey(\n target: { host: string; port?: number; user: string },\n pass: string,\n publicKey: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const conn = new SshClient();\n conn.on(\"ready\", () => {\n // authorized_keys\uC5D0 \uACF5\uAC1C\uD0A4 \uCD94\uAC00\n const cmd = [\n \"mkdir -p ~/.ssh\",\n \"chmod 700 ~/.ssh\",\n `echo '${publicKey}' >> ~/.ssh/authorized_keys`,\n \"chmod 600 ~/.ssh/authorized_keys\",\n ].join(\" && \");\n\n conn.exec(cmd, (err, stream) => {\n if (err) {\n conn.end();\n reject(new Error(`SSH \uBA85\uB839 \uC2E4\uD589 \uC2E4\uD328: ${err.message}`));\n return;\n }\n\n let stderr = \"\";\n stream.on(\"data\", () => {}); // stdout \uC18C\uBE44 (\uBBF8\uC18C\uBE44 \uC2DC stream \uBBF8\uC885\uB8CC)\n stream.stderr.on(\"data\", (data: Uint8Array) => {\n stderr += data.toString();\n });\n stream.on(\"exit\", (code: number | null) => {\n conn.end();\n if (code !== 0) {\n reject(new Error(`SSH \uACF5\uAC1C\uD0A4 \uB4F1\uB85D \uC2E4\uD328 (exit code: ${code}): ${stderr}`));\n } else {\n resolve();\n }\n });\n });\n });\n conn.on(\"error\", (err) => {\n reject(new Error(`SSH \uC811\uC18D \uC2E4\uD328 (${target.host}): ${err.message}`));\n });\n conn.connect({\n host: target.host,\n port: target.port ?? 22,\n username: target.user,\n password: pass,\n readyTimeout: 10_000,\n });\n });\n}\n\n//#endregion\n\n//#region Version Upgrade\n\n/**\n * \uD504\uB85C\uC81D\uD2B8 \uBC0F \uD328\uD0A4\uC9C0 \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC\n * @param dryRun true\uBA74 \uD30C\uC77C \uC218\uC815 \uC5C6\uC774 \uC0C8 \uBC84\uC804\uB9CC \uACC4\uC0B0\n */\nasync function upgradeVersion(\n cwd: string,\n allPkgPaths: string[],\n dryRun: boolean,\n): Promise<{ version: string; changedFiles: string[] }> {\n const changedFiles: string[] = [];\n const projPkgPath = path.resolve(cwd, \"package.json\");\n const projPkg = await fsReadJson<PackageJson>(projPkgPath);\n\n const currentVersion = projPkg.version;\n const prereleaseInfo = semver.prerelease(currentVersion);\n\n // prerelease \uC5EC\uBD80\uC5D0 \uB530\uB77C \uC99D\uAC00 \uBC29\uC2DD \uACB0\uC815\n const newVersion =\n prereleaseInfo !== null ? semver.inc(currentVersion, \"prerelease\")! : semver.inc(currentVersion, \"patch\")!;\n\n if (dryRun) {\n // dry-run: \uD30C\uC77C \uC218\uC815 \uC5C6\uC774 \uC0C8 \uBC84\uC804\uB9CC \uBC18\uD658\n return { version: newVersion, changedFiles: [] };\n }\n\n projPkg.version = newVersion;\n await fsWrite(projPkgPath, jsonStringify(projPkg, { space: 2 }) + \"\\n\");\n changedFiles.push(projPkgPath);\n\n // \uAC01 \uD328\uD0A4\uC9C0 package.json \uBC84\uC804 \uC124\uC815\n for (const pkgPath of allPkgPaths) {\n const pkgJsonPath = path.resolve(pkgPath, \"package.json\");\n const pkgJson = await fsReadJson<PackageJson>(pkgJsonPath);\n pkgJson.version = newVersion;\n await fsWrite(pkgJsonPath, jsonStringify(pkgJson, { space: 2 }) + \"\\n\");\n changedFiles.push(pkgJsonPath);\n }\n\n // \uD15C\uD50C\uB9BF \uD30C\uC77C\uC758 @simplysm \uD328\uD0A4\uC9C0 \uBC84\uC804 \uB3D9\uAE30\uD654\n const templateFiles = await fsGlob(path.resolve(cwd, \"packages/sd-cli/templates/**/*.hbs\"));\n const versionRegex = /(\"@simplysm\\/[^\"]+\"\\s*:\\s*)\"~[^\"]+\"/g;\n\n for (const templatePath of templateFiles) {\n const content = await fsRead(templatePath);\n const newContent = content.replace(versionRegex, `$1\"~${newVersion}\"`);\n\n if (content !== newContent) {\n await fsWrite(templatePath, newContent);\n changedFiles.push(templatePath);\n }\n }\n\n return { version: newVersion, changedFiles };\n}\n\n//#endregion\n\n//#region Package Publishing\n\n/**\n * \uAC1C\uBCC4 \uD328\uD0A4\uC9C0 \uBC30\uD3EC\n * @param dryRun true\uBA74 \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC774 \uC2DC\uBBAC\uB808\uC774\uC158\n */\nasync function publishPackage(\n pkgPath: string,\n publishConfig: SdPublishConfig,\n version: string,\n projectPath: string,\n logger: ReturnType<typeof consola.withTag>,\n dryRun: boolean,\n): Promise<void> {\n const pkgName = path.basename(pkgPath);\n\n if (publishConfig === \"npm\") {\n // npm publish\n const prereleaseInfo = semver.prerelease(version);\n const args = [\"publish\", \"--access\", \"public\", \"--no-git-checks\"];\n\n if (prereleaseInfo !== null && typeof prereleaseInfo[0] === \"string\") {\n args.push(\"--tag\", prereleaseInfo[0]);\n }\n\n if (dryRun) {\n args.push(\"--dry-run\");\n logger.info(`[DRY-RUN] [${pkgName}] pnpm ${args.join(\" \")}`);\n } else {\n logger.debug(`[${pkgName}] pnpm ${args.join(\" \")}`);\n }\n\n await spawn(\"pnpm\", args, { cwd: pkgPath });\n } else if (publishConfig.type === \"local-directory\") {\n // \uB85C\uCEEC \uB514\uB809\uD1A0\uB9AC \uBCF5\uC0AC\n const targetPath = replaceEnvVariables(publishConfig.path, version, projectPath);\n const distPath = path.resolve(pkgPath, \"dist\");\n\n if (dryRun) {\n logger.info(`[DRY-RUN] [${pkgName}] \uB85C\uCEEC \uBCF5\uC0AC: ${distPath} \u2192 ${targetPath}`);\n } else {\n logger.debug(`[${pkgName}] \uB85C\uCEEC \uBCF5\uC0AC: ${distPath} \u2192 ${targetPath}`);\n await fsCopy(distPath, targetPath);\n }\n } else {\n // \uC2A4\uD1A0\uB9AC\uC9C0 \uC5C5\uB85C\uB4DC\n const distPath = path.resolve(pkgPath, \"dist\");\n const remotePath = publishConfig.path ?? \"/\";\n\n if (dryRun) {\n logger.info(`[DRY-RUN] [${pkgName}] ${publishConfig.type} \uC5C5\uB85C\uB4DC: ${distPath} \u2192 ${remotePath}`);\n } else {\n logger.debug(`[${pkgName}] ${publishConfig.type} \uC5C5\uB85C\uB4DC: ${distPath} \u2192 ${remotePath}`);\n await StorageFactory.connect(\n publishConfig.type,\n {\n host: publishConfig.host,\n port: publishConfig.port,\n user: publishConfig.user,\n pass: publishConfig.pass,\n },\n async (storage) => {\n await storage.uploadDir(distPath, remotePath);\n },\n );\n }\n }\n}\n\n//#endregion\n\n//#region Dependency Levels\n\n/**\n * \uBC30\uD3EC \uD328\uD0A4\uC9C0\uC758 \uC758\uC874\uC131 \uB808\uBCA8\uC744 \uACC4\uC0B0\uD55C\uB2E4.\n * \uC758\uC874\uC131\uC774 \uC5C6\uB294 \uD328\uD0A4\uC9C0 \u2192 Level 0, Level 0\uC5D0\uB9CC \uC758\uC874 \u2192 Level 1, ...\n */\nasync function computePublishLevels(\n publishPkgs: Array<{ name: string; path: string; config: SdPublishConfig }>,\n): Promise<Array<Array<{ name: string; path: string; config: SdPublishConfig }>>> {\n const pkgNames = new Set(publishPkgs.map((p) => p.name));\n\n // \uAC01 \uD328\uD0A4\uC9C0\uC758 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uB0B4 \uC758\uC874\uC131 \uC218\uC9D1\n const depsMap = new Map<string, Set<string>>();\n for (const pkg of publishPkgs) {\n const pkgJson = await fsReadJson<PackageJson>(path.resolve(pkg.path, \"package.json\"));\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.peerDependencies,\n ...pkgJson.optionalDependencies,\n };\n\n const workspaceDeps = new Set<string>();\n for (const depName of Object.keys(allDeps)) {\n const shortName = depName.replace(/^@simplysm\\//, \"\");\n if (shortName !== depName && pkgNames.has(shortName)) {\n workspaceDeps.add(shortName);\n }\n }\n depsMap.set(pkg.name, workspaceDeps);\n }\n\n // \uC704\uC0C1 \uC815\uB82C\uB85C \uB808\uBCA8 \uBD84\uB958\n const levels: Array<Array<{ name: string; path: string; config: SdPublishConfig }>> = [];\n const assigned = new Set<string>();\n const remaining = new Map(publishPkgs.map((p) => [p.name, p]));\n\n while (remaining.size > 0) {\n const level: Array<{ name: string; path: string; config: SdPublishConfig }> = [];\n for (const [name, pkg] of remaining) {\n const deps = depsMap.get(name)!;\n if ([...deps].every((d) => assigned.has(d))) {\n level.push(pkg);\n }\n }\n\n if (level.length === 0) {\n // \uC21C\uD658 \uC758\uC874\uC131 \u2014 \uB0A8\uC740 \uD328\uD0A4\uC9C0\uB97C \uBAA8\uB450 \uB9C8\uC9C0\uB9C9 \uB808\uBCA8\uC5D0 \uBC30\uCE58\n levels.push([...remaining.values()]);\n break;\n }\n\n for (const pkg of level) {\n assigned.add(pkg.name);\n remaining.delete(pkg.name);\n }\n levels.push(level);\n }\n\n return levels;\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * publish \uBA85\uB839\uC744 \uC2E4\uD589\uD55C\uB2E4.\n *\n * **\uBC30\uD3EC \uC21C\uC11C (\uC548\uC804\uC131 \uC6B0\uC120):**\n * 1. \uC0AC\uC804 \uAC80\uC99D (npm \uC778\uC99D, Git \uC0C1\uD0DC)\n * 2. \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC (package.json + \uD15C\uD50C\uB9BF)\n * 3. \uBE4C\uB4DC\n * 4. Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC (\uBCC0\uACBD\uB41C \uD30C\uC77C\uB9CC \uBA85\uC2DC\uC801\uC73C\uB85C staging)\n * 5. pnpm \uBC30\uD3EC\n * 6. postPublish (\uC2E4\uD328\uD574\uB3C4 \uACC4\uC18D)\n */\nexport async function runPublish(options: PublishOptions): Promise<void> {\n const { targets, noBuild, dryRun } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:publish\");\n\n if (dryRun) {\n logger.info(\"[DRY-RUN] \uC2DC\uBBAC\uB808\uC774\uC158 \uBAA8\uB4DC - \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC74C\");\n }\n\n logger.debug(\"\uBC30\uD3EC \uC2DC\uC791\", { targets, noBuild, dryRun });\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 // package.json \uB85C\uB4DC\n const projPkgPath = path.resolve(cwd, \"package.json\");\n const projPkg = await fsReadJson<PackageJson>(projPkgPath);\n\n // pnpm-workspace.yaml\uC5D0\uC11C \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uD328\uD0A4\uC9C0 \uACBD\uB85C \uC218\uC9D1\n const workspaceYamlPath = path.resolve(cwd, \"pnpm-workspace.yaml\");\n const workspaceGlobs: string[] = [];\n if (await fsExists(workspaceYamlPath)) {\n const yamlContent = await fsRead(workspaceYamlPath);\n let inPackages = false;\n for (const line of yamlContent.split(\"\\n\")) {\n if (/^packages:\\s*$/.test(line)) {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const match = /^\\s+-\\s+(.+)$/.exec(line);\n if (match != null) {\n workspaceGlobs.push(match[1].trim());\n } else {\n break;\n }\n }\n }\n }\n\n const allPkgPaths = (await Promise.all(workspaceGlobs.map((item) => fsGlob(path.resolve(cwd, item)))))\n .flat()\n .filter((item) => !item.includes(\".\"));\n\n // publish \uC124\uC815\uC774 \uC788\uB294 \uD328\uD0A4\uC9C0 \uD544\uD130\uB9C1\n const publishPackages: Array<{\n name: string;\n path: string;\n config: SdPublishConfig;\n }> = [];\n\n for (const [name, config] of Object.entries(sdConfig.packages)) {\n if (config == null) continue;\n if (config.target === \"scripts\") continue;\n\n const pkgConfig = config;\n if (pkgConfig.publish == null) 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 const pkgPath = allPkgPaths.find((p) => path.basename(p) === name);\n if (pkgPath == null) {\n logger.warn(`\uD328\uD0A4\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${name}`);\n continue;\n }\n\n publishPackages.push({\n name,\n path: pkgPath,\n config: pkgConfig.publish,\n });\n }\n\n if (publishPackages.length === 0) {\n process.stdout.write(\"\u2714 \uBC30\uD3EC\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n logger.debug(\n \"\uBC30\uD3EC \uB300\uC0C1 \uD328\uD0A4\uC9C0\",\n publishPackages.map((p) => p.name),\n );\n\n // Git \uC0AC\uC6A9 \uC5EC\uBD80 \uD655\uC778\n const hasGit = await fsExists(path.resolve(cwd, \".git\"));\n\n //#region Phase 1: \uC0AC\uC804 \uAC80\uC99D\n\n // npm \uC778\uC99D \uD655\uC778 (npm publish \uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0)\n if (publishPackages.some((p) => p.config === \"npm\")) {\n logger.debug(\"npm \uC778\uC99D \uD655\uC778...\");\n try {\n const whoami = await spawn(\"npm\", [\"whoami\"]);\n if (whoami.trim() === \"\") {\n throw new Error(\"npm \uB85C\uADF8\uC778 \uC815\uBCF4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n }\n logger.debug(`npm \uB85C\uADF8\uC778 \uD655\uC778: ${whoami.trim()}`);\n } catch {\n consola.error(\n \"npm \uD1A0\uD070\uC774 \uC720\uD6A8\uD558\uC9C0 \uC54A\uAC70\uB098 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\\n\" +\n \"https://www.npmjs.com/settings/~/tokens \uC5D0\uC11C Granular Access Token \uC0DD\uC131 \uD6C4:\\n\" +\n \" npm config set //registry.npmjs.org/:_authToken <\uD1A0\uD070>\",\n );\n process.exitCode = 1;\n return;\n }\n }\n\n // SSH \uD0A4 \uC778\uC99D \uD655\uC778 (pass \uC5C6\uB294 SFTP publish \uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0)\n try {\n await ensureSshAuth(publishPackages, logger);\n } catch (err) {\n consola.error(`SSH \uC778\uC99D \uC124\uC815 \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // Git \uBBF8\uCEE4\uBC0B \uBCC0\uACBD\uC0AC\uD56D \uD655\uC778 \uBC0F \uC790\uB3D9 \uCEE4\uBC0B (noBuild\uAC00 \uC544\uB2CC \uACBD\uC6B0)\n if (!noBuild && hasGit) {\n logger.debug(\"Git \uCEE4\uBC0B \uC5EC\uBD80 \uD655\uC778...\");\n try {\n const diff = await spawn(\"git\", [\"diff\", \"--name-only\"]);\n const stagedDiff = await spawn(\"git\", [\"diff\", \"--cached\", \"--name-only\"]);\n\n if (diff.trim() !== \"\" || stagedDiff.trim() !== \"\") {\n logger.info(\"\uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC0AC\uD56D \uAC10\uC9C0. claude \uC790\uB3D9 \uCEE4\uBC0B \uC2DC\uB3C4...\");\n try {\n await spawn(\"claude\", [\"-p\", \"/sd-commit all\", \"--dangerously-skip-permissions\", \"--model\", \"haiku\"]);\n } catch (e) {\n throw new Error(\n \"\uC790\uB3D9 \uCEE4\uBC0B\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uCEE4\uBC0B \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.\\n\" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n\n // \uCEE4\uBC0B \uD6C4 \uC7AC\uD655\uC778\n const recheckDiff = await spawn(\"git\", [\"diff\", \"--name-only\"]);\n const recheckStaged = await spawn(\"git\", [\"diff\", \"--cached\", \"--name-only\"]);\n if (recheckDiff.trim() !== \"\" || recheckStaged.trim() !== \"\") {\n throw new Error(\"\uC790\uB3D9 \uCEE4\uBC0B \uD6C4\uC5D0\uB3C4 \uBBF8\uCEE4\uBC0B \uBCC0\uACBD\uC0AC\uD56D\uC774 \uB0A8\uC544\uC788\uC2B5\uB2C8\uB2E4.\\n\" + recheckDiff + recheckStaged);\n }\n logger.info(\"\uC790\uB3D9 \uCEE4\uBC0B \uC644\uB8CC.\");\n }\n } catch (err) {\n consola.error(err instanceof Error ? err.message : err);\n process.exitCode = 1;\n return;\n }\n }\n\n //#endregion\n\n //#region Phase 2 & 3: \uBE4C\uB4DC \uB610\uB294 noBuild \uACBD\uACE0\n\n let version = projPkg.version;\n\n if (noBuild) {\n // noBuild \uACBD\uACE0\n logger.warn(\"\uBE4C\uB4DC\uD558\uC9C0 \uC54A\uACE0 \uBC30\uD3EC\uD558\uB294 \uAC83\uC740 \uC0C1\uB2F9\uD788 \uC704\uD5D8\uD569\uB2C8\uB2E4.\");\n await waitWithCountdown(\"\uD504\uB85C\uC138\uC2A4\uB97C \uC911\uC9C0\uD558\uB824\uBA74 'CTRL+C'\uB97C \uB204\uB974\uC138\uC694.\", 5);\n } else {\n // \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC\n logger.debug(\"\uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC...\");\n const upgradeResult = await upgradeVersion(cwd, allPkgPaths, dryRun);\n version = upgradeResult.version;\n const _changedFiles = upgradeResult.changedFiles;\n if (dryRun) {\n logger.info(`[DRY-RUN] \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC: ${projPkg.version} \u2192 ${version} (\uD30C\uC77C \uC218\uC815 \uC5C6\uC74C)`);\n } else {\n logger.info(`\uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC: ${projPkg.version} \u2192 ${version}`);\n }\n\n // \uBE4C\uB4DC \uC2E4\uD589\n if (dryRun) {\n logger.info(\"[DRY-RUN] \uBE4C\uB4DC \uC2DC\uC791 (\uAC80\uC99D\uC6A9)...\");\n } else {\n logger.debug(\"\uBE4C\uB4DC \uC2DC\uC791...\");\n }\n\n try {\n await runBuild({\n targets: publishPackages.map((p) => p.name),\n options: options.options,\n });\n\n // \uBE4C\uB4DC \uC2E4\uD328 \uD655\uC778\n if (process.exitCode === 1) {\n throw new Error(\"\uBE4C\uB4DC \uC2E4\uD328\");\n }\n } catch {\n if (dryRun) {\n logger.error(\"[DRY-RUN] \uBE4C\uB4DC \uC2E4\uD328\");\n } else {\n consola.error(\n \"\uBE4C\uB4DC \uC2E4\uD328. \uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4:\\n\" +\n \" \uBC84\uC804 \uBCC0\uACBD\uC744 \uB418\uB3CC\uB9AC\uB824\uBA74:\\n\" +\n \" git checkout -- package.json packages/*/package.json packages/sd-cli/templates/\",\n );\n }\n process.exitCode = 1;\n return;\n }\n\n //#region Phase 3: Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC\n\n if (hasGit) {\n if (dryRun) {\n logger.info(\"[DRY-RUN] Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC \uC2DC\uBBAC\uB808\uC774\uC158...\");\n logger.info(`[DRY-RUN] git add (${_changedFiles.length}\uAC1C \uD30C\uC77C)`);\n logger.info(`[DRY-RUN] git commit -m \"v${version}\"`);\n logger.info(`[DRY-RUN] git tag -a v${version} -m \"v${version}\"`);\n logger.info(\"[DRY-RUN] git push --dry-run\");\n await spawn(\"git\", [\"push\", \"--dry-run\"]);\n logger.info(\"[DRY-RUN] git push --tags --dry-run\");\n await spawn(\"git\", [\"push\", \"--tags\", \"--dry-run\"]);\n logger.info(\"[DRY-RUN] Git \uC791\uC5C5 \uC2DC\uBBAC\uB808\uC774\uC158 \uC644\uB8CC\");\n } else {\n logger.debug(\"Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC...\");\n try {\n await spawn(\"git\", [\"add\", ..._changedFiles]);\n await spawn(\"git\", [\"commit\", \"-m\", `v${version}`]);\n await spawn(\"git\", [\"tag\", \"-a\", `v${version}`, \"-m\", `v${version}`]);\n await spawn(\"git\", [\"push\"]);\n await spawn(\"git\", [\"push\", \"--tags\"]);\n logger.debug(\"Git \uC791\uC5C5 \uC644\uB8CC\");\n } catch (err) {\n consola.error(\n `Git \uC791\uC5C5 \uC2E4\uD328: ${err instanceof Error ? err.message : err}\\n` +\n \"\uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4:\\n\" +\n ` git revert HEAD # \uBC84\uC804 \uCEE4\uBC0B \uB418\uB3CC\uB9AC\uAE30\\n` +\n ` git tag -d v${version} # \uD0DC\uADF8 \uC0AD\uC81C`,\n );\n process.exitCode = 1;\n return;\n }\n }\n }\n\n //#endregion\n }\n\n //#endregion\n\n //#region Phase 4: \uBC30\uD3EC (\uC758\uC874\uC131 \uB808\uBCA8\uBCC4 \uBCD1\uB82C, Listr)\n\n const levels = await computePublishLevels(publishPackages);\n const publishedPackages: string[] = [];\n let publishFailed = false;\n\n const publishListr = new Listr(\n levels.map(\n (levelPkgs, levelIdx): ListrTask => ({\n title: `Level ${levelIdx + 1}/${levels.length}`,\n skip: () => publishFailed,\n task: (_, task) =>\n task.newListr(\n levelPkgs.map(\n (pkg): ListrTask => ({\n title: dryRun ? `[DRY-RUN] ${pkg.name}` : pkg.name,\n task: async (_ctx, pkgTask) => {\n const maxRetries = 3;\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n await publishPackage(pkg.path, pkg.config, version, cwd, logger, dryRun);\n break;\n } catch (err) {\n if (attempt < maxRetries) {\n const delay = attempt * 5_000;\n pkgTask.title = dryRun\n ? `[DRY-RUN] ${pkg.name} (\uC7AC\uC2DC\uB3C4 ${attempt + 1}/${maxRetries})`\n : `${pkg.name} (\uC7AC\uC2DC\uB3C4 ${attempt + 1}/${maxRetries})`;\n await new Promise((resolve) => setTimeout(resolve, delay));\n } else {\n throw err;\n }\n }\n }\n publishedPackages.push(pkg.name);\n },\n }),\n ),\n { 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 publishListr.run();\n } catch {\n // Listr \uB0B4\uBD80 \uC5D0\uB7EC\uB294 \uC544\uB798\uC5D0\uC11C \uCC98\uB9AC\n }\n\n // \uC2E4\uD328\uD55C \uD328\uD0A4\uC9C0 \uD655\uC778\n const allPkgNames = publishPackages.map((p) => p.name);\n const failedPkgNames = allPkgNames.filter((n) => !publishedPackages.includes(n));\n\n if (failedPkgNames.length > 0) {\n publishFailed = true;\n\n if (publishedPackages.length > 0) {\n consola.error(\n \"\uBC30\uD3EC \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\\n\" +\n \"\uC774\uBBF8 \uBC30\uD3EC\uB41C \uD328\uD0A4\uC9C0:\\n\" +\n publishedPackages.map((n) => ` - ${n}`).join(\"\\n\") +\n \"\\n\\n\uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\\n\" +\n \"npm \uD328\uD0A4\uC9C0\uB294 72\uC2DC\uAC04 \uB0B4\uC5D0 `npm unpublish <pkg>@<version>` \uC73C\uB85C \uC0AD\uC81C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\",\n );\n }\n\n for (const name of failedPkgNames) {\n consola.error(`[${name}] \uBC30\uD3EC \uC2E4\uD328`);\n }\n process.exitCode = 1;\n return;\n }\n\n //#endregion\n\n //#region Phase 5: postPublish\n\n if (sdConfig.postPublish != null && sdConfig.postPublish.length > 0) {\n if (dryRun) {\n logger.info(\"[DRY-RUN] postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2DC\uBBAC\uB808\uC774\uC158...\");\n } else {\n logger.debug(\"postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD589...\");\n }\n\n for (const script of sdConfig.postPublish) {\n try {\n const cmd = replaceEnvVariables(script.cmd, version, cwd);\n const args = script.args.map((arg) => replaceEnvVariables(arg, version, cwd));\n\n if (dryRun) {\n logger.info(`[DRY-RUN] \uC2E4\uD589 \uC608\uC815: ${cmd} ${args.join(\" \")}`);\n } else {\n logger.debug(`\uC2E4\uD589: ${cmd} ${args.join(\" \")}`);\n await spawn(cmd, args, { cwd });\n }\n } catch (err) {\n // postPublish \uC2E4\uD328 \uC2DC \uACBD\uACE0\uB9CC \uCD9C\uB825 (\uBC30\uD3EC \uB864\uBC31 \uBD88\uAC00)\n logger.warn(`postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD328 (\uACC4\uC18D \uC9C4\uD589): ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n\n //#endregion\n\n if (dryRun) {\n logger.info(`[DRY-RUN] \uC2DC\uBBAC\uB808\uC774\uC158 \uC644\uB8CC. \uC2E4\uC81C \uBC30\uD3EC \uC2DC \uBC84\uC804: v${version}`);\n } else {\n logger.info(`\uBAA8\uB4E0 \uBC30\uD3EC\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. (v${version})`);\n }\n}\n\n//#endregion\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -184,9 +184,9 @@ export interface SdServerPackageConfig {
|
|
|
184
184
|
name?: string;
|
|
185
185
|
/** PM2 watch에서 제외할 경로 */
|
|
186
186
|
ignoreWatchPaths?: string[];
|
|
187
|
-
/** true면 interpreter 경로 생략 (시스템 PATH의 node 사용) */
|
|
188
|
-
noInterpreter?: boolean;
|
|
189
187
|
};
|
|
188
|
+
/** Package manager to use (affects mise.toml or volta settings generation) */
|
|
189
|
+
packageManager?: "volta" | "mise";
|
|
190
190
|
}
|
|
191
191
|
/**
|
|
192
192
|
* 스크립트 전용 패키지 설정 (watch/typecheck 제외)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-config.types.d.ts","sourceRoot":"","sources":["../src/sd-config.types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sd-config.types.d.ts","sourceRoot":"","sources":["../src/sd-config.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,8 +15,9 @@ export interface ServerBuildInfo {
|
|
|
15
15
|
pm2?: {
|
|
16
16
|
name?: string;
|
|
17
17
|
ignoreWatchPaths?: string[];
|
|
18
|
-
noInterpreter?: boolean;
|
|
19
18
|
};
|
|
19
|
+
/** Package manager to use (affects mise.toml or volta settings generation) */
|
|
20
|
+
packageManager?: "volta" | "mise";
|
|
20
21
|
}
|
|
21
22
|
/**
|
|
22
23
|
* Server 빌드 결과
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.worker.d.ts","sourceRoot":"","sources":["../../src/workers/server.worker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.worker.d.ts","sourceRoot":"","sources":["../../src/workers/server.worker.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,GAAG,CAAC,EAAE;QACJ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF,8EAA8E;IAC9E,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAiMD;;GAEG;AACH,iBAAe,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6CtE;AAKD;;;;GAIG;AACH,iBAAe,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8E9D;AAED;;;GAGG;AACH,iBAAe,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAExC;AAED,QAAA,MAAM,MAAM;;;eACD,OAAO,KAAK;oBAAc,OAAO,UAAU;mBAAa,OAAO,SAAS;;;CAMjF,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import path from "path";
|
|
2
2
|
import fs from "fs";
|
|
3
|
+
import cp from "child_process";
|
|
3
4
|
import esbuild from "esbuild";
|
|
4
5
|
import { createWorker } from "@simplysm/core-node";
|
|
5
6
|
import { consola } from "consola";
|
|
@@ -50,20 +51,26 @@ function generateProductionFiles(info, externals) {
|
|
|
50
51
|
}
|
|
51
52
|
distPkgJson["dependencies"] = deps;
|
|
52
53
|
}
|
|
54
|
+
if (info.packageManager === "volta") {
|
|
55
|
+
const nodeVersion = cp.execSync("node -v").toString().trim();
|
|
56
|
+
distPkgJson["volta"] = { node: nodeVersion };
|
|
57
|
+
}
|
|
53
58
|
fs.writeFileSync(path.join(distDir, "package.json"), JSON.stringify(distPkgJson, void 0, 2));
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
if (info.packageManager === "mise") {
|
|
60
|
+
logger.debug("GEN mise.toml...");
|
|
61
|
+
const rootMiseTomlPath = path.join(info.cwd, "mise.toml");
|
|
62
|
+
let nodeVersion = "20";
|
|
63
|
+
if (fs.existsSync(rootMiseTomlPath)) {
|
|
64
|
+
const miseContent = fs.readFileSync(rootMiseTomlPath, "utf-8");
|
|
65
|
+
const match = /node\s*=\s*"([^"]+)"/.exec(miseContent);
|
|
66
|
+
if (match != null) {
|
|
67
|
+
nodeVersion = match[1];
|
|
68
|
+
}
|
|
62
69
|
}
|
|
63
|
-
|
|
64
|
-
fs.writeFileSync(path.join(distDir, "mise.toml"), `[tools]
|
|
70
|
+
fs.writeFileSync(path.join(distDir, "mise.toml"), `[tools]
|
|
65
71
|
node = "${nodeVersion}"
|
|
66
72
|
`);
|
|
73
|
+
}
|
|
67
74
|
logger.debug("GEN openssl.cnf...");
|
|
68
75
|
fs.writeFileSync(
|
|
69
76
|
path.join(distDir, "openssl.cnf"),
|
|
@@ -98,11 +105,10 @@ node = "${nodeVersion}"
|
|
|
98
105
|
const envObj = {
|
|
99
106
|
NODE_ENV: "production",
|
|
100
107
|
TZ: "Asia/Seoul",
|
|
101
|
-
SD_VERSION: pkgJson.version,
|
|
102
108
|
...info.env ?? {}
|
|
103
109
|
};
|
|
104
110
|
const envStr = JSON.stringify(envObj, void 0, 4);
|
|
105
|
-
const interpreterLine = info.
|
|
111
|
+
const interpreterLine = info.packageManager === "volta" ? "" : ` interpreter: cp.execSync("mise which node").toString().trim(),
|
|
106
112
|
`;
|
|
107
113
|
const pm2Config = [
|
|
108
114
|
`const cp = require("child_process");`,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/workers/server.worker.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport esbuild from \"esbuild\";\nimport { createWorker } from \"@simplysm/core-node\";\nimport { consola } from \"consola\";\nimport { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from \"../utils/tsconfig\";\nimport {\n createServerEsbuildOptions,\n collectUninstalledOptionalPeerDeps,\n collectNativeModuleExternals,\n} from \"../utils/esbuild-config\";\n\n//#region Types\n\n/**\n * Server \uBE4C\uB4DC \uC815\uBCF4 (\uC77C\uD68C\uC131 \uBE4C\uB4DC\uC6A9)\n */\nexport interface ServerBuildInfo {\n name: string;\n cwd: string;\n pkgDir: string;\n /** \uBE4C\uB4DC \uC2DC \uCE58\uD658\uD560 \uD658\uACBD\uBCC0\uC218 */\n env?: Record<string, string>;\n /** \uB7F0\uD0C0\uC784 \uC124\uC815 (dist/.config.json\uC5D0 \uAE30\uB85D) */\n configs?: Record<string, unknown>;\n /** sd.config.ts\uC5D0\uC11C \uC218\uB3D9 \uC9C0\uC815\uD55C external \uBAA8\uB4C8 */\n externals?: string[];\n /** PM2 \uC124\uC815 (\uC9C0\uC815 \uC2DC dist/pm2.config.cjs \uC0DD\uC131) */\n pm2?: {\n name?: string;\n ignoreWatchPaths?: string[];\n noInterpreter?: boolean;\n };\n}\n\n/**\n * Server \uBE4C\uB4DC \uACB0\uACFC\n */\nexport interface ServerBuildResult {\n success: boolean;\n mainJsPath: string;\n errors?: string[];\n}\n\n/**\n * Server Watch \uC815\uBCF4\n */\nexport interface ServerWatchInfo {\n name: string;\n cwd: string;\n pkgDir: string;\n /** \uBE4C\uB4DC \uC2DC \uCE58\uD658\uD560 \uD658\uACBD\uBCC0\uC218 */\n env?: Record<string, string>;\n /** \uB7F0\uD0C0\uC784 \uC124\uC815 (dist/.config.json\uC5D0 \uAE30\uB85D) */\n configs?: Record<string, unknown>;\n /** sd.config.ts\uC5D0\uC11C \uC218\uB3D9 \uC9C0\uC815\uD55C external \uBAA8\uB4C8 */\n externals?: string[];\n}\n\n/**\n * \uBE4C\uB4DC \uC774\uBCA4\uD2B8\n */\nexport interface ServerBuildEvent {\n success: boolean;\n mainJsPath: string;\n errors?: string[];\n}\n\n/**\n * \uC5D0\uB7EC \uC774\uBCA4\uD2B8\n */\nexport interface ServerErrorEvent {\n message: string;\n}\n\n/**\n * Worker \uC774\uBCA4\uD2B8 \uD0C0\uC785\n */\nexport interface ServerWorkerEvents extends Record<string, unknown> {\n buildStart: Record<string, never>;\n build: ServerBuildEvent;\n error: ServerErrorEvent;\n}\n\n//#endregion\n\n//#region \uB9AC\uC18C\uC2A4 \uAD00\uB9AC\n\nconst logger = consola.withTag(\"sd:cli:server:worker\");\n\n/** esbuild build context (\uC815\uB9AC \uB300\uC0C1) */\nlet esbuildContext: esbuild.BuildContext | undefined;\n\n/**\n * \uB9AC\uC18C\uC2A4 \uC815\uB9AC\n */\nasync function cleanup(): Promise<void> {\n // \uC804\uC5ED \uBCC0\uC218\uB97C \uC784\uC2DC \uBCC0\uC218\uB85C \uCEA1\uCC98 \uD6C4 \uCD08\uAE30\uD654\n // (Promise.all \uB300\uAE30 \uC911 \uB2E4\uB978 \uD638\uCD9C\uC5D0\uC11C \uC804\uC5ED \uBCC0\uC218\uB97C \uC218\uC815\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C)\n const contextToDispose = esbuildContext;\n esbuildContext = undefined;\n\n if (contextToDispose != null) {\n await contextToDispose.dispose();\n }\n}\n\n/**\n * \uC138 \uAC00\uC9C0 \uC18C\uC2A4\uC5D0\uC11C external \uBAA8\uB4C8\uC744 \uC218\uC9D1\uD558\uC5EC \uD569\uCE5C\uB2E4.\n * 1. \uBBF8\uC124\uCE58 optional peer deps\n * 2. binding.gyp \uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8\n * 3. sd.config.ts \uC218\uB3D9 \uC9C0\uC815\n */\nfunction collectAllExternals(pkgDir: string, manualExternals?: string[]): string[] {\n const optionalPeerDeps = collectUninstalledOptionalPeerDeps(pkgDir);\n const nativeModules = collectNativeModuleExternals(pkgDir);\n const manual = manualExternals ?? [];\n\n const merged = [...new Set([...optionalPeerDeps, ...nativeModules, ...manual])];\n\n if (optionalPeerDeps.length > 0) {\n logger.debug(\"\uBBF8\uC124\uCE58 optional peer deps (external):\", optionalPeerDeps);\n }\n if (nativeModules.length > 0) {\n logger.debug(\"\uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8 (external):\", nativeModules);\n }\n if (manual.length > 0) {\n logger.debug(\"\uC218\uB3D9 \uC9C0\uC815 (external):\", manual);\n }\n\n return merged;\n}\n\n/**\n * \uD504\uB85C\uB355\uC158 \uBC30\uD3EC\uC6A9 \uD30C\uC77C \uC0DD\uC131 (\uC77C\uD68C\uC131 \uBE4C\uB4DC\uC5D0\uC11C\uB9CC \uD638\uCD9C)\n *\n * - dist/package.json: external \uBAA8\uB4C8\uC744 dependencies\uB85C \uD3EC\uD568\n * - dist/mise.toml: Node \uBC84\uC804 \uC9C0\uC815\n * - dist/openssl.cnf: \uB808\uAC70\uC2DC OpenSSL \uD504\uB85C\uBC14\uC774\uB354 \uD65C\uC131\uD654\n * - dist/pm2.config.cjs: PM2 \uD504\uB85C\uC138\uC2A4 \uC124\uC815 (pm2 \uC635\uC158\uC774 \uC788\uC744 \uB54C\uB9CC)\n */\nfunction generateProductionFiles(info: ServerBuildInfo, externals: string[]): void {\n const distDir = path.join(info.pkgDir, \"dist\");\n const pkgJson = JSON.parse(fs.readFileSync(path.join(info.pkgDir, \"package.json\"), \"utf-8\"));\n\n // dist/package.json\n logger.debug(\"GEN package.json...\");\n const distPkgJson: Record<string, unknown> = {\n name: pkgJson.name,\n version: pkgJson.version,\n type: pkgJson.type,\n };\n if (externals.length > 0) {\n const deps: Record<string, string> = {};\n for (const ext of externals) {\n deps[ext] = \"*\";\n }\n distPkgJson[\"dependencies\"] = deps;\n }\n fs.writeFileSync(path.join(distDir, \"package.json\"), JSON.stringify(distPkgJson, undefined, 2));\n\n // dist/mise.toml\n logger.debug(\"GEN mise.toml...\");\n const rootMiseTomlPath = path.join(info.cwd, \"mise.toml\");\n let nodeVersion = \"20\";\n if (fs.existsSync(rootMiseTomlPath)) {\n const miseContent = fs.readFileSync(rootMiseTomlPath, \"utf-8\");\n const match = /node\\s*=\\s*\"([^\"]+)\"/.exec(miseContent);\n if (match != null) {\n nodeVersion = match[1];\n }\n }\n fs.writeFileSync(path.join(distDir, \"mise.toml\"), `[tools]\\nnode = \"${nodeVersion}\"\\n`);\n\n // dist/openssl.cnf\n logger.debug(\"GEN openssl.cnf...\");\n fs.writeFileSync(\n path.join(distDir, \"openssl.cnf\"),\n [\n \"nodejs_conf = openssl_init\",\n \"\",\n \"[openssl_init]\",\n \"providers = provider_sect\",\n \"ssl_conf = ssl_sect\",\n \"\",\n \"[provider_sect]\",\n \"default = default_sect\",\n \"legacy = legacy_sect\",\n \"\",\n \"[default_sect]\",\n \"activate = 1\",\n \"\",\n \"[legacy_sect]\",\n \"activate = 1\",\n \"\",\n \"[ssl_sect]\",\n \"system_default = system_default_sect\",\n \"\",\n \"[system_default_sect]\",\n \"Options = UnsafeLegacyRenegotiation\",\n ].join(\"\\n\"),\n );\n\n // dist/pm2.config.cjs (pm2 \uC124\uC815\uC774 \uC788\uC744 \uB54C\uB9CC)\n if (info.pm2 != null) {\n logger.debug(\"GEN pm2.config.cjs...\");\n\n const pm2Name = info.pm2.name ?? pkgJson.name.replace(/@/g, \"\").replace(/[/\\\\]/g, \"-\");\n const ignoreWatch = JSON.stringify([\"node_modules\", \"www\", ...(info.pm2.ignoreWatchPaths ?? [])]);\n const envObj: Record<string, string> = {\n NODE_ENV: \"production\",\n TZ: \"Asia/Seoul\",\n SD_VERSION: pkgJson.version,\n ...(info.env ?? {}),\n };\n const envStr = JSON.stringify(envObj, undefined, 4);\n\n const interpreterLine = info.pm2.noInterpreter\n ? \"\"\n : ` interpreter: cp.execSync(\"mise which node\").toString().trim(),\\n`;\n\n const pm2Config = [\n `const cp = require(\"child_process\");`,\n ``,\n `module.exports = {`,\n ` name: ${JSON.stringify(pm2Name)},`,\n ` script: \"main.js\",`,\n ` watch: true,`,\n ` watch_delay: 2000,`,\n ` ignore_watch: ${ignoreWatch},`,\n interpreterLine.trimEnd(),\n ` interpreter_args: \"--openssl-config=openssl.cnf\",`,\n ` env: ${envStr.replace(/\\n/g, \"\\n \")},`,\n ` arrayProcess: \"concat\",`,\n ` useDelTargetNull: true,`,\n `};`,\n ]\n .filter((line) => line !== \"\")\n .join(\"\\n\");\n\n fs.writeFileSync(path.join(distDir, \"pm2.config.cjs\"), pm2Config);\n }\n}\n\n// \uD504\uB85C\uC138\uC2A4 \uC885\uB8CC \uC804 \uB9AC\uC18C\uC2A4 \uC815\uB9AC (SIGTERM/SIGINT)\n// \uC8FC\uC758: worker.terminate()\uB294 \uC774 \uD578\uB4E4\uB7EC\uB4E4\uC744 \uD638\uCD9C\uD558\uC9C0 \uC54A\uACE0 \uC989\uC2DC \uC885\uB8CC\uB428.\n// \uADF8\uB7EC\uB098 watch \uBAA8\uB4DC\uC5D0\uC11C \uC815\uC0C1 \uC885\uB8CC\uB294 \uBA54\uC778 \uD504\uB85C\uC138\uC2A4\uC758 SIGINT/SIGTERM\uC744 \uD1B5\uD574 \uC774\uB8E8\uC5B4\uC9C0\uBBC0\uB85C \uBB38\uC81C\uC5C6\uC74C.\nprocess.on(\"SIGTERM\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\nprocess.on(\"SIGINT\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\n//#endregion\n\n//#region Worker\n\n/**\n * \uC77C\uD68C\uC131 \uBE4C\uB4DC\n */\nasync function build(info: ServerBuildInfo): Promise<ServerBuildResult> {\n const mainJsPath = path.join(info.pkgDir, \"dist\", \"main.js\");\n\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);\n\n // \uC11C\uBC84\uB294 node \uD658\uACBD\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, \"node\", info.pkgDir);\n\n // \uBAA8\uB4E0 external \uC218\uC9D1 (optional peer deps + native modules + manual)\n const external = collectAllExternals(info.pkgDir, info.externals);\n\n // esbuild \uC77C\uD68C\uC131 \uBE4C\uB4DC\n const esbuildOptions = createServerEsbuildOptions({\n pkgDir: info.pkgDir,\n entryPoints,\n compilerOptions,\n env: info.env,\n external,\n });\n\n const result = await esbuild.build(esbuildOptions);\n\n // Generate .config.json\n const confDistPath = path.join(info.pkgDir, \"dist\", \".config.json\");\n fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));\n\n // Generate production files (package.json, mise.toml, openssl.cnf, pm2.config.cjs)\n generateProductionFiles(info, external);\n\n const errors = result.errors.map((e) => e.text);\n return {\n success: result.errors.length === 0,\n mainJsPath,\n errors: errors.length > 0 ? errors : undefined,\n };\n } catch (err) {\n return {\n success: false,\n mainJsPath,\n errors: [err instanceof Error ? err.message : String(err)],\n };\n }\n}\n\n/** startWatch \uD638\uCD9C \uC5EC\uBD80 \uD50C\uB798\uADF8 */\nlet isWatchStarted = false;\n\n/**\n * watch \uC2DC\uC791\n * @remarks \uC774 \uD568\uC218\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.\n * @throws \uC774\uBBF8 watch\uAC00 \uC2DC\uC791\uB41C \uACBD\uC6B0\n */\nasync function startWatch(info: ServerWatchInfo): Promise<void> {\n if (isWatchStarted) {\n throw new Error(\"startWatch\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\");\n }\n isWatchStarted = true;\n\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);\n\n // \uC11C\uBC84\uB294 node \uD658\uACBD\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, \"node\", info.pkgDir);\n\n const mainJsPath = path.join(info.pkgDir, \"dist\", \"main.js\");\n\n // \uCCAB \uBC88\uC9F8 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30\uB97C \uC704\uD55C Promise\n let resolveFirstBuild!: () => void;\n const firstBuildPromise = new Promise<void>((resolve) => {\n resolveFirstBuild = resolve;\n });\n\n let isFirstBuild = true;\n\n // \uBAA8\uB4E0 external \uC218\uC9D1 (optional peer deps + native modules + manual)\n const external = collectAllExternals(info.pkgDir, info.externals);\n\n // esbuild \uAE30\uBCF8 \uC635\uC158 \uC0DD\uC131\n const baseOptions = createServerEsbuildOptions({\n pkgDir: info.pkgDir,\n entryPoints,\n compilerOptions,\n env: info.env,\n external,\n });\n\n // watch\uC6A9 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\n esbuildContext = await esbuild.context({\n ...baseOptions,\n plugins: [\n {\n name: \"watch-notify\",\n setup(pluginBuild) {\n pluginBuild.onStart(() => {\n sender.send(\"buildStart\", {});\n });\n\n pluginBuild.onEnd((result) => {\n const errors = result.errors.map((e) => e.text);\n const success = result.errors.length === 0;\n\n // Generate .config.json on first successful build\n if (isFirstBuild && success) {\n const confDistPath = path.join(info.pkgDir, \"dist\", \".config.json\");\n fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));\n }\n\n sender.send(\"build\", { success, mainJsPath, errors: errors.length > 0 ? errors : undefined });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n resolveFirstBuild();\n }\n });\n },\n },\n ],\n });\n\n await esbuildContext.watch();\n\n // \uCCAB \uBC88\uC9F8 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30\n await firstBuildPromise;\n } catch (err) {\n sender.send(\"error\", {\n message: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * watch \uC911\uC9C0\n * @remarks esbuild context\uB97C \uC815\uB9AC\uD569\uB2C8\uB2E4.\n */\nasync function stopWatch(): Promise<void> {\n await cleanup();\n}\n\nconst sender = createWorker<\n { build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },\n ServerWorkerEvents\n>({\n build,\n startWatch,\n stopWatch,\n});\n\nexport default sender;\n\n//#endregion\n"],
|
|
5
|
-
"mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,OAAO,aAAa;AACpB,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AACxB,SAAS,mBAAmB,uBAAuB,oCAAoC;AACvF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;
|
|
4
|
+
"sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport cp from \"child_process\";\nimport esbuild from \"esbuild\";\nimport { createWorker } from \"@simplysm/core-node\";\nimport { consola } from \"consola\";\nimport { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from \"../utils/tsconfig\";\nimport {\n createServerEsbuildOptions,\n collectUninstalledOptionalPeerDeps,\n collectNativeModuleExternals,\n} from \"../utils/esbuild-config\";\n\n//#region Types\n\n/**\n * Server \uBE4C\uB4DC \uC815\uBCF4 (\uC77C\uD68C\uC131 \uBE4C\uB4DC\uC6A9)\n */\nexport interface ServerBuildInfo {\n name: string;\n cwd: string;\n pkgDir: string;\n /** \uBE4C\uB4DC \uC2DC \uCE58\uD658\uD560 \uD658\uACBD\uBCC0\uC218 */\n env?: Record<string, string>;\n /** \uB7F0\uD0C0\uC784 \uC124\uC815 (dist/.config.json\uC5D0 \uAE30\uB85D) */\n configs?: Record<string, unknown>;\n /** sd.config.ts\uC5D0\uC11C \uC218\uB3D9 \uC9C0\uC815\uD55C external \uBAA8\uB4C8 */\n externals?: string[];\n /** PM2 \uC124\uC815 (\uC9C0\uC815 \uC2DC dist/pm2.config.cjs \uC0DD\uC131) */\n pm2?: {\n name?: string;\n ignoreWatchPaths?: string[];\n };\n /** Package manager to use (affects mise.toml or volta settings generation) */\n packageManager?: \"volta\" | \"mise\";\n}\n\n/**\n * Server \uBE4C\uB4DC \uACB0\uACFC\n */\nexport interface ServerBuildResult {\n success: boolean;\n mainJsPath: string;\n errors?: string[];\n}\n\n/**\n * Server Watch \uC815\uBCF4\n */\nexport interface ServerWatchInfo {\n name: string;\n cwd: string;\n pkgDir: string;\n /** \uBE4C\uB4DC \uC2DC \uCE58\uD658\uD560 \uD658\uACBD\uBCC0\uC218 */\n env?: Record<string, string>;\n /** \uB7F0\uD0C0\uC784 \uC124\uC815 (dist/.config.json\uC5D0 \uAE30\uB85D) */\n configs?: Record<string, unknown>;\n /** sd.config.ts\uC5D0\uC11C \uC218\uB3D9 \uC9C0\uC815\uD55C external \uBAA8\uB4C8 */\n externals?: string[];\n}\n\n/**\n * \uBE4C\uB4DC \uC774\uBCA4\uD2B8\n */\nexport interface ServerBuildEvent {\n success: boolean;\n mainJsPath: string;\n errors?: string[];\n}\n\n/**\n * \uC5D0\uB7EC \uC774\uBCA4\uD2B8\n */\nexport interface ServerErrorEvent {\n message: string;\n}\n\n/**\n * Worker \uC774\uBCA4\uD2B8 \uD0C0\uC785\n */\nexport interface ServerWorkerEvents extends Record<string, unknown> {\n buildStart: Record<string, never>;\n build: ServerBuildEvent;\n error: ServerErrorEvent;\n}\n\n//#endregion\n\n//#region \uB9AC\uC18C\uC2A4 \uAD00\uB9AC\n\nconst logger = consola.withTag(\"sd:cli:server:worker\");\n\n/** esbuild build context (\uC815\uB9AC \uB300\uC0C1) */\nlet esbuildContext: esbuild.BuildContext | undefined;\n\n/**\n * \uB9AC\uC18C\uC2A4 \uC815\uB9AC\n */\nasync function cleanup(): Promise<void> {\n // \uC804\uC5ED \uBCC0\uC218\uB97C \uC784\uC2DC \uBCC0\uC218\uB85C \uCEA1\uCC98 \uD6C4 \uCD08\uAE30\uD654\n // (Promise.all \uB300\uAE30 \uC911 \uB2E4\uB978 \uD638\uCD9C\uC5D0\uC11C \uC804\uC5ED \uBCC0\uC218\uB97C \uC218\uC815\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C)\n const contextToDispose = esbuildContext;\n esbuildContext = undefined;\n\n if (contextToDispose != null) {\n await contextToDispose.dispose();\n }\n}\n\n/**\n * \uC138 \uAC00\uC9C0 \uC18C\uC2A4\uC5D0\uC11C external \uBAA8\uB4C8\uC744 \uC218\uC9D1\uD558\uC5EC \uD569\uCE5C\uB2E4.\n * 1. \uBBF8\uC124\uCE58 optional peer deps\n * 2. binding.gyp \uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8\n * 3. sd.config.ts \uC218\uB3D9 \uC9C0\uC815\n */\nfunction collectAllExternals(pkgDir: string, manualExternals?: string[]): string[] {\n const optionalPeerDeps = collectUninstalledOptionalPeerDeps(pkgDir);\n const nativeModules = collectNativeModuleExternals(pkgDir);\n const manual = manualExternals ?? [];\n\n const merged = [...new Set([...optionalPeerDeps, ...nativeModules, ...manual])];\n\n if (optionalPeerDeps.length > 0) {\n logger.debug(\"\uBBF8\uC124\uCE58 optional peer deps (external):\", optionalPeerDeps);\n }\n if (nativeModules.length > 0) {\n logger.debug(\"\uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8 (external):\", nativeModules);\n }\n if (manual.length > 0) {\n logger.debug(\"\uC218\uB3D9 \uC9C0\uC815 (external):\", manual);\n }\n\n return merged;\n}\n\n/**\n * \uD504\uB85C\uB355\uC158 \uBC30\uD3EC\uC6A9 \uD30C\uC77C \uC0DD\uC131 (\uC77C\uD68C\uC131 \uBE4C\uB4DC\uC5D0\uC11C\uB9CC \uD638\uCD9C)\n *\n * - dist/package.json: external \uBAA8\uB4C8\uC744 dependencies\uB85C \uD3EC\uD568 (volta \uC0AC\uC6A9 \uC2DC volta \uD544\uB4DC \uCD94\uAC00)\n * - dist/mise.toml: Node \uBC84\uC804 \uC9C0\uC815 (packageManager === \"mise\"\uC77C \uB54C\uB9CC)\n * - dist/openssl.cnf: \uB808\uAC70\uC2DC OpenSSL \uD504\uB85C\uBC14\uC774\uB354 \uD65C\uC131\uD654\n * - dist/pm2.config.cjs: PM2 \uD504\uB85C\uC138\uC2A4 \uC124\uC815 (pm2 \uC635\uC158\uC774 \uC788\uC744 \uB54C\uB9CC)\n */\nfunction generateProductionFiles(info: ServerBuildInfo, externals: string[]): void {\n const distDir = path.join(info.pkgDir, \"dist\");\n const pkgJson = JSON.parse(fs.readFileSync(path.join(info.pkgDir, \"package.json\"), \"utf-8\"));\n\n // dist/package.json\n logger.debug(\"GEN package.json...\");\n const distPkgJson: Record<string, unknown> = {\n name: pkgJson.name,\n version: pkgJson.version,\n type: pkgJson.type,\n };\n if (externals.length > 0) {\n const deps: Record<string, string> = {};\n for (const ext of externals) {\n deps[ext] = \"*\";\n }\n distPkgJson[\"dependencies\"] = deps;\n }\n if (info.packageManager === \"volta\") {\n const nodeVersion = cp.execSync(\"node -v\").toString().trim();\n distPkgJson[\"volta\"] = { node: nodeVersion };\n }\n fs.writeFileSync(path.join(distDir, \"package.json\"), JSON.stringify(distPkgJson, undefined, 2));\n\n // dist/mise.toml (packageManager === \"mise\"\uC77C \uB54C\uB9CC)\n if (info.packageManager === \"mise\") {\n logger.debug(\"GEN mise.toml...\");\n const rootMiseTomlPath = path.join(info.cwd, \"mise.toml\");\n let nodeVersion = \"20\";\n if (fs.existsSync(rootMiseTomlPath)) {\n const miseContent = fs.readFileSync(rootMiseTomlPath, \"utf-8\");\n const match = /node\\s*=\\s*\"([^\"]+)\"/.exec(miseContent);\n if (match != null) {\n nodeVersion = match[1];\n }\n }\n fs.writeFileSync(path.join(distDir, \"mise.toml\"), `[tools]\\nnode = \"${nodeVersion}\"\\n`);\n }\n\n // dist/openssl.cnf\n logger.debug(\"GEN openssl.cnf...\");\n fs.writeFileSync(\n path.join(distDir, \"openssl.cnf\"),\n [\n \"nodejs_conf = openssl_init\",\n \"\",\n \"[openssl_init]\",\n \"providers = provider_sect\",\n \"ssl_conf = ssl_sect\",\n \"\",\n \"[provider_sect]\",\n \"default = default_sect\",\n \"legacy = legacy_sect\",\n \"\",\n \"[default_sect]\",\n \"activate = 1\",\n \"\",\n \"[legacy_sect]\",\n \"activate = 1\",\n \"\",\n \"[ssl_sect]\",\n \"system_default = system_default_sect\",\n \"\",\n \"[system_default_sect]\",\n \"Options = UnsafeLegacyRenegotiation\",\n ].join(\"\\n\"),\n );\n\n // dist/pm2.config.cjs (pm2 \uC124\uC815\uC774 \uC788\uC744 \uB54C\uB9CC)\n if (info.pm2 != null) {\n logger.debug(\"GEN pm2.config.cjs...\");\n\n const pm2Name = info.pm2.name ?? pkgJson.name.replace(/@/g, \"\").replace(/[/\\\\]/g, \"-\");\n const ignoreWatch = JSON.stringify([\"node_modules\", \"www\", ...(info.pm2.ignoreWatchPaths ?? [])]);\n const envObj: Record<string, string> = {\n NODE_ENV: \"production\",\n TZ: \"Asia/Seoul\",\n ...(info.env ?? {}),\n };\n const envStr = JSON.stringify(envObj, undefined, 4);\n\n const interpreterLine =\n info.packageManager === \"volta\" ? \"\" : ` interpreter: cp.execSync(\"mise which node\").toString().trim(),\\n`;\n\n const pm2Config = [\n `const cp = require(\"child_process\");`,\n ``,\n `module.exports = {`,\n ` name: ${JSON.stringify(pm2Name)},`,\n ` script: \"main.js\",`,\n ` watch: true,`,\n ` watch_delay: 2000,`,\n ` ignore_watch: ${ignoreWatch},`,\n interpreterLine.trimEnd(),\n ` interpreter_args: \"--openssl-config=openssl.cnf\",`,\n ` env: ${envStr.replace(/\\n/g, \"\\n \")},`,\n ` arrayProcess: \"concat\",`,\n ` useDelTargetNull: true,`,\n `};`,\n ]\n .filter((line) => line !== \"\")\n .join(\"\\n\");\n\n fs.writeFileSync(path.join(distDir, \"pm2.config.cjs\"), pm2Config);\n }\n}\n\n// \uD504\uB85C\uC138\uC2A4 \uC885\uB8CC \uC804 \uB9AC\uC18C\uC2A4 \uC815\uB9AC (SIGTERM/SIGINT)\n// \uC8FC\uC758: worker.terminate()\uB294 \uC774 \uD578\uB4E4\uB7EC\uB4E4\uC744 \uD638\uCD9C\uD558\uC9C0 \uC54A\uACE0 \uC989\uC2DC \uC885\uB8CC\uB428.\n// \uADF8\uB7EC\uB098 watch \uBAA8\uB4DC\uC5D0\uC11C \uC815\uC0C1 \uC885\uB8CC\uB294 \uBA54\uC778 \uD504\uB85C\uC138\uC2A4\uC758 SIGINT/SIGTERM\uC744 \uD1B5\uD574 \uC774\uB8E8\uC5B4\uC9C0\uBBC0\uB85C \uBB38\uC81C\uC5C6\uC74C.\nprocess.on(\"SIGTERM\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\nprocess.on(\"SIGINT\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\n//#endregion\n\n//#region Worker\n\n/**\n * \uC77C\uD68C\uC131 \uBE4C\uB4DC\n */\nasync function build(info: ServerBuildInfo): Promise<ServerBuildResult> {\n const mainJsPath = path.join(info.pkgDir, \"dist\", \"main.js\");\n\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);\n\n // \uC11C\uBC84\uB294 node \uD658\uACBD\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, \"node\", info.pkgDir);\n\n // \uBAA8\uB4E0 external \uC218\uC9D1 (optional peer deps + native modules + manual)\n const external = collectAllExternals(info.pkgDir, info.externals);\n\n // esbuild \uC77C\uD68C\uC131 \uBE4C\uB4DC\n const esbuildOptions = createServerEsbuildOptions({\n pkgDir: info.pkgDir,\n entryPoints,\n compilerOptions,\n env: info.env,\n external,\n });\n\n const result = await esbuild.build(esbuildOptions);\n\n // Generate .config.json\n const confDistPath = path.join(info.pkgDir, \"dist\", \".config.json\");\n fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));\n\n // Generate production files (package.json, mise.toml, openssl.cnf, pm2.config.cjs)\n generateProductionFiles(info, external);\n\n const errors = result.errors.map((e) => e.text);\n return {\n success: result.errors.length === 0,\n mainJsPath,\n errors: errors.length > 0 ? errors : undefined,\n };\n } catch (err) {\n return {\n success: false,\n mainJsPath,\n errors: [err instanceof Error ? err.message : String(err)],\n };\n }\n}\n\n/** startWatch \uD638\uCD9C \uC5EC\uBD80 \uD50C\uB798\uADF8 */\nlet isWatchStarted = false;\n\n/**\n * watch \uC2DC\uC791\n * @remarks \uC774 \uD568\uC218\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.\n * @throws \uC774\uBBF8 watch\uAC00 \uC2DC\uC791\uB41C \uACBD\uC6B0\n */\nasync function startWatch(info: ServerWatchInfo): Promise<void> {\n if (isWatchStarted) {\n throw new Error(\"startWatch\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\");\n }\n isWatchStarted = true;\n\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);\n\n // \uC11C\uBC84\uB294 node \uD658\uACBD\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, \"node\", info.pkgDir);\n\n const mainJsPath = path.join(info.pkgDir, \"dist\", \"main.js\");\n\n // \uCCAB \uBC88\uC9F8 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30\uB97C \uC704\uD55C Promise\n let resolveFirstBuild!: () => void;\n const firstBuildPromise = new Promise<void>((resolve) => {\n resolveFirstBuild = resolve;\n });\n\n let isFirstBuild = true;\n\n // \uBAA8\uB4E0 external \uC218\uC9D1 (optional peer deps + native modules + manual)\n const external = collectAllExternals(info.pkgDir, info.externals);\n\n // esbuild \uAE30\uBCF8 \uC635\uC158 \uC0DD\uC131\n const baseOptions = createServerEsbuildOptions({\n pkgDir: info.pkgDir,\n entryPoints,\n compilerOptions,\n env: info.env,\n external,\n });\n\n // watch\uC6A9 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\n esbuildContext = await esbuild.context({\n ...baseOptions,\n plugins: [\n {\n name: \"watch-notify\",\n setup(pluginBuild) {\n pluginBuild.onStart(() => {\n sender.send(\"buildStart\", {});\n });\n\n pluginBuild.onEnd((result) => {\n const errors = result.errors.map((e) => e.text);\n const success = result.errors.length === 0;\n\n // Generate .config.json on first successful build\n if (isFirstBuild && success) {\n const confDistPath = path.join(info.pkgDir, \"dist\", \".config.json\");\n fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));\n }\n\n sender.send(\"build\", { success, mainJsPath, errors: errors.length > 0 ? errors : undefined });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n resolveFirstBuild();\n }\n });\n },\n },\n ],\n });\n\n await esbuildContext.watch();\n\n // \uCCAB \uBC88\uC9F8 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30\n await firstBuildPromise;\n } catch (err) {\n sender.send(\"error\", {\n message: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * watch \uC911\uC9C0\n * @remarks esbuild context\uB97C \uC815\uB9AC\uD569\uB2C8\uB2E4.\n */\nasync function stopWatch(): Promise<void> {\n await cleanup();\n}\n\nconst sender = createWorker<\n { build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },\n ServerWorkerEvents\n>({\n build,\n startWatch,\n stopWatch,\n});\n\nexport default sender;\n\n//#endregion\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/sd-cli",
|
|
3
3
|
"sideEffects": false,
|
|
4
|
-
"version": "13.0.0-beta.
|
|
4
|
+
"version": "13.0.0-beta.44",
|
|
5
5
|
"description": "심플리즘 패키지 - CLI 도구",
|
|
6
6
|
"author": "김석래",
|
|
7
7
|
"repository": {
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"vite-plugin-solid": "^2.11.10",
|
|
43
43
|
"vite-tsconfig-paths": "^6.1.0",
|
|
44
44
|
"yargs": "^18.0.0",
|
|
45
|
-
"@simplysm/core-common": "13.0.0-beta.
|
|
46
|
-
"@simplysm/core-node": "13.0.0-beta.
|
|
47
|
-
"@simplysm/storage": "13.0.0-beta.
|
|
45
|
+
"@simplysm/core-common": "13.0.0-beta.44",
|
|
46
|
+
"@simplysm/core-node": "13.0.0-beta.44",
|
|
47
|
+
"@simplysm/storage": "13.0.0-beta.44"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@types/semver": "^7.7.1",
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"vitest": "vitest"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@simplysm/sd-cli": "~13.0.0-beta.
|
|
19
|
-
"@simplysm/claude": "~13.0.0-beta.
|
|
20
|
-
"@simplysm/eslint-plugin": "~13.0.0-beta.
|
|
18
|
+
"@simplysm/sd-cli": "~13.0.0-beta.44",
|
|
19
|
+
"@simplysm/claude": "~13.0.0-beta.44",
|
|
20
|
+
"@simplysm/eslint-plugin": "~13.0.0-beta.44",
|
|
21
21
|
"@types/node": "^20.19.33",
|
|
22
22
|
"eslint": "^9.39.2",
|
|
23
23
|
"prettier": "^3.8.1",
|