@simplysm/sd-cli 13.0.0-beta.45 → 13.0.0-beta.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +3 -3
  2. package/dist/builders/BaseBuilder.js.map +0 -1
  3. package/dist/builders/DtsBuilder.js.map +0 -1
  4. package/dist/builders/LibraryBuilder.js.map +0 -1
  5. package/dist/builders/index.js.map +0 -1
  6. package/dist/builders/types.js.map +0 -1
  7. package/dist/capacitor/capacitor.js.map +0 -1
  8. package/dist/commands/add-client.js.map +0 -1
  9. package/dist/commands/add-server.js.map +0 -1
  10. package/dist/commands/build.js.map +0 -1
  11. package/dist/commands/dev.js.map +0 -1
  12. package/dist/commands/device.js.map +0 -1
  13. package/dist/commands/init.js.map +0 -1
  14. package/dist/commands/lint.js.map +0 -1
  15. package/dist/commands/publish.js.map +0 -1
  16. package/dist/commands/typecheck.js.map +0 -1
  17. package/dist/commands/watch.js.map +0 -1
  18. package/dist/electron/electron.js.map +0 -1
  19. package/dist/index.js.map +0 -1
  20. package/dist/infra/ResultCollector.js.map +0 -1
  21. package/dist/infra/SignalHandler.js.map +0 -1
  22. package/dist/infra/WorkerManager.js.map +0 -1
  23. package/dist/infra/index.js.map +0 -1
  24. package/dist/orchestrators/WatchOrchestrator.js.map +0 -1
  25. package/dist/orchestrators/index.js.map +0 -1
  26. package/dist/sd-cli.js.map +0 -1
  27. package/dist/sd-config.types.js.map +0 -1
  28. package/dist/utils/build-env.js.map +0 -1
  29. package/dist/utils/config-editor.js.map +0 -1
  30. package/dist/utils/copy-src.js.map +0 -1
  31. package/dist/utils/esbuild-config.d.ts +1 -0
  32. package/dist/utils/esbuild-config.d.ts.map +1 -1
  33. package/dist/utils/esbuild-config.js +13 -2
  34. package/dist/utils/esbuild-config.js.map +1 -2
  35. package/dist/utils/listr-manager.js.map +0 -1
  36. package/dist/utils/output-utils.js.map +0 -1
  37. package/dist/utils/package-utils.js.map +0 -1
  38. package/dist/utils/replace-deps.js.map +0 -1
  39. package/dist/utils/sd-config.js.map +0 -1
  40. package/dist/utils/spawn.js.map +0 -1
  41. package/dist/utils/tailwind-config-deps.js.map +0 -1
  42. package/dist/utils/template.js.map +0 -1
  43. package/dist/utils/tsconfig.js.map +0 -1
  44. package/dist/utils/typecheck-serialization.js.map +0 -1
  45. package/dist/utils/vite-config.js.map +0 -1
  46. package/dist/utils/worker-events.js.map +0 -1
  47. package/dist/workers/client.worker.js.map +0 -1
  48. package/dist/workers/dts.worker.js.map +0 -1
  49. package/dist/workers/library.worker.js.map +0 -1
  50. package/dist/workers/server-runtime.worker.js.map +0 -1
  51. package/dist/workers/server.worker.js.map +0 -1
  52. package/package.json +6 -4
  53. package/src/builders/BaseBuilder.ts +141 -0
  54. package/src/builders/DtsBuilder.ts +138 -0
  55. package/src/builders/LibraryBuilder.ts +161 -0
  56. package/src/builders/index.ts +4 -0
  57. package/src/builders/types.ts +55 -0
  58. package/src/capacitor/capacitor.ts +827 -0
  59. package/src/commands/add-client.ts +135 -0
  60. package/src/commands/add-server.ts +150 -0
  61. package/src/commands/build.ts +475 -0
  62. package/src/commands/dev.ts +602 -0
  63. package/src/commands/device.ts +151 -0
  64. package/src/commands/init.ts +104 -0
  65. package/src/commands/lint.ts +216 -0
  66. package/src/commands/publish.ts +836 -0
  67. package/src/commands/typecheck.ts +329 -0
  68. package/src/commands/watch.ts +38 -0
  69. package/src/electron/electron.ts +329 -0
  70. package/src/index.ts +1 -0
  71. package/src/infra/ResultCollector.ts +81 -0
  72. package/src/infra/SignalHandler.ts +52 -0
  73. package/src/infra/WorkerManager.ts +65 -0
  74. package/src/infra/index.ts +3 -0
  75. package/src/orchestrators/WatchOrchestrator.ts +211 -0
  76. package/src/orchestrators/index.ts +1 -0
  77. package/src/sd-cli.ts +307 -0
  78. package/src/sd-config.types.ts +271 -0
  79. package/src/utils/build-env.ts +12 -0
  80. package/src/utils/config-editor.ts +131 -0
  81. package/src/utils/copy-src.ts +60 -0
  82. package/src/utils/esbuild-config.ts +263 -0
  83. package/src/utils/listr-manager.ts +89 -0
  84. package/src/utils/output-utils.ts +61 -0
  85. package/src/utils/package-utils.ts +63 -0
  86. package/src/utils/replace-deps.ts +163 -0
  87. package/src/utils/sd-config.ts +44 -0
  88. package/src/utils/spawn.ts +79 -0
  89. package/src/utils/tailwind-config-deps.ts +95 -0
  90. package/src/utils/template.ts +51 -0
  91. package/src/utils/tsconfig.ts +111 -0
  92. package/src/utils/typecheck-serialization.ts +82 -0
  93. package/src/utils/vite-config.ts +184 -0
  94. package/src/utils/worker-events.ts +102 -0
  95. package/src/workers/client.worker.ts +236 -0
  96. package/src/workers/dts.worker.ts +416 -0
  97. package/src/workers/library.worker.ts +245 -0
  98. package/src/workers/server-runtime.worker.ts +154 -0
  99. package/src/workers/server.worker.ts +435 -0
  100. package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
  101. package/templates/add-server/__SERVER__/package.json.hbs +2 -2
  102. package/templates/init/package.json.hbs +3 -3
@@ -1,7 +1,6 @@
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\", \"--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
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/typecheck.ts"],
4
- "sourcesContent": ["import ts from \"typescript\";\nimport path from \"path\";\nimport os from \"os\";\nimport { Listr } from \"listr2\";\nimport { pathPosix, pathFilterByTargets, Worker, type WorkerProxy } from \"@simplysm/core-node\";\nimport \"@simplysm/core-common\";\nimport { consola, LogLevels } from \"consola\";\nimport type { SdConfig } from \"../sd-config.types\";\nimport { parseRootTsconfig, type TypecheckEnv } from \"../utils/tsconfig\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { deserializeDiagnostic } from \"../utils/typecheck-serialization\";\nimport type { DtsBuildInfo, DtsBuildResult } from \"../workers/dts.worker\";\nimport type * as DtsWorkerModule from \"../workers/dts.worker\";\n\n//#region Types\n\n/**\n * TypeScript \uD0C0\uC785\uCCB4\uD06C \uC635\uC158\n */\nexport interface TypecheckOptions {\n /** \uD0C0\uC785\uCCB4\uD06C\uD560 \uACBD\uB85C \uD544\uD130 (\uC608: `packages/core-common`). \uBE48 \uBC30\uC5F4\uC774\uBA74 tsconfig.json\uC5D0 \uC815\uC758\uB41C \uBAA8\uB4E0 \uD30C\uC77C \uB300\uC0C1 */\n targets: string[];\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n// \uD328\uD0A4\uC9C0 \uC815\uBCF4 (packages/* \uD558\uC704 \uD30C\uC77C \uBD84\uB958\uC6A9)\ninterface PackageInfo {\n name: string;\n dir: string;\n envs: TypecheckEnv[]; // neutral\uC740 [\"node\", \"browser\"], \uB098\uBA38\uC9C0\uB294 \uB2E8\uC77C \uD658\uACBD\n}\n\n// \uD0C0\uC785\uCCB4\uD06C \uC791\uC5C5 \uC815\uBCF4 (\uB0B4\uBD80 \uC0AC\uC6A9)\ninterface TypecheckTask {\n /** \uC791\uC5C5 \uD45C\uC2DC \uC774\uB984 (\uC608: \"\uD328\uD0A4\uC9C0: core-common [node]\") */\n displayName: string;\n /** dts.worker\uC5D0 \uC804\uB2EC\uD560 \uC815\uBCF4 */\n buildInfo: DtsBuildInfo;\n}\n\n//#endregion\n\n//#region Utilities\n\n/** \uACBD\uB85C \uBD84\uB958\uC6A9 \uC815\uADDC\uD45C\uD604\uC2DD */\nconst PATH_PATTERNS = {\n /** packages/{pkg}/... */\n PACKAGE: /^packages\\/([^/]+)\\//,\n} as const;\n\n/**\n * \uD328\uD0A4\uC9C0 \uD0C0\uAC9F\uC744 \uD0C0\uC785\uCCB4\uD06C \uD658\uACBD \uBAA9\uB85D\uC73C\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4.\n * - node/browser: \uD574\uB2F9 \uD658\uACBD\uB9CC\n * - neutral: node + browser \uB458 \uB2E4\n * - client: browser\uB85C \uCC98\uB9AC\n * @param target \uD328\uD0A4\uC9C0 \uBE4C\uB4DC \uD0C0\uAC9F\n * @returns \uD0C0\uC785\uCCB4\uD06C \uD658\uACBD \uBAA9\uB85D\n */\nfunction toTypecheckEnvs(target: string | undefined): TypecheckEnv[] {\n if (target === \"node\") return [\"node\"];\n if (target === \"browser\" || target === \"client\") return [\"browser\"];\n // neutral \uB610\uB294 \uBBF8\uC9C0\uC815\uC740 \uB458 \uB2E4\n return [\"node\", \"browser\"];\n}\n\n/**\n * \uD30C\uC77C \uACBD\uB85C\uC5D0\uC11C \uD328\uD0A4\uC9C0 \uC815\uBCF4\uB97C \uCD94\uCD9C\uD569\uB2C8\uB2E4.\n * scripts \uD0C0\uAC9F \uD328\uD0A4\uC9C0\uB294 \uC81C\uC678\uD569\uB2C8\uB2E4.\n * @internal \uD14C\uC2A4\uD2B8\uC6A9\uC73C\uB85C export\n */\nexport function extractPackages(fileNames: string[], cwd: string, config: SdConfig): Map<string, PackageInfo> {\n const packages = new Map<string, PackageInfo>();\n\n for (const fileName of fileNames) {\n const relativePath = pathPosix(path.relative(cwd, fileName));\n\n // packages/{pkg}/...\n const packageMatch = relativePath.match(PATH_PATTERNS.PACKAGE);\n if (packageMatch) {\n const pkgName = packageMatch[1];\n // scripts \uD0C0\uAC9F \uD328\uD0A4\uC9C0\uB294 \uC81C\uC678\n if (config.packages[pkgName]?.target === \"scripts\") continue;\n\n if (!packages.has(pkgName)) {\n packages.set(pkgName, {\n name: pkgName,\n dir: path.resolve(cwd, \"packages\", pkgName),\n envs: toTypecheckEnvs(config.packages[pkgName]?.target),\n });\n }\n }\n }\n\n return packages;\n}\n\n/**\n * \uD328\uD0A4\uC9C0 \uC815\uBCF4\uB85C\uBD80\uD130 \uD0C0\uC785\uCCB4\uD06C \uC791\uC5C5 \uBAA9\uB85D\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4.\n * neutral \uD328\uD0A4\uC9C0\uB294 node/browser \uB450 \uD658\uACBD\uC73C\uB85C \uBD84\uB9AC\uD558\uC5EC \uAC01\uAC01 \uCCB4\uD06C\uD569\uB2C8\uB2E4.\n * @param packages \uD328\uD0A4\uC9C0 \uC815\uBCF4 \uB9F5\n * @param cwd \uD604\uC7AC \uC791\uC5C5 \uB514\uB809\uD1A0\uB9AC\n * @returns \uD0C0\uC785\uCCB4\uD06C \uC791\uC5C5 \uC815\uBCF4 \uBC30\uC5F4\n */\nfunction createTypecheckTasks(packages: Map<string, PackageInfo>, cwd: string): TypecheckTask[] {\n const tasks: TypecheckTask[] = [];\n\n // packages/* - \uAC01 env\uB9C8\uB2E4 \uBCC4\uB3C4 task \uC0DD\uC131\n for (const info of packages.values()) {\n for (const env of info.envs) {\n const envSuffix = info.envs.length > 1 ? ` [${env}]` : \"\";\n tasks.push({\n displayName: `\uD328\uD0A4\uC9C0: ${info.name}${envSuffix}`,\n buildInfo: {\n name: info.name,\n cwd,\n pkgDir: info.dir,\n env,\n emit: false, // \uD0C0\uC785\uCCB4\uD06C\uB9CC \uC218\uD589 (dts \uC0DD\uC131 \uC548 \uD568)\n },\n });\n }\n }\n\n return tasks;\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * TypeScript \uD0C0\uC785\uCCB4\uD06C\uB97C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `tsconfig.json`\uC744 \uB85C\uB4DC\uD558\uC5EC \uCEF4\uD30C\uC77C\uB7EC \uC635\uC158 \uC801\uC6A9\n * - `sd.config.ts`\uB97C \uB85C\uB4DC\uD558\uC5EC \uD328\uD0A4\uC9C0\uBCC4 \uD0C0\uAC9F \uC815\uBCF4 \uD655\uC778 (\uC5C6\uC73C\uBA74 \uAE30\uBCF8\uAC12 \uC0AC\uC6A9)\n * - Worker threads\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC2E4\uC81C \uBCD1\uB82C \uD0C0\uC785\uCCB4\uD06C \uC218\uD589\n * - incremental \uCEF4\uD30C\uC77C \uC0AC\uC6A9 (`.cache/typecheck-{env}.tsbuildinfo`)\n * - listr2\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC9C4\uD589 \uC0C1\uD669 \uD45C\uC2DC\n * - \uC5D0\uB7EC \uBC1C\uC0DD \uC2DC `process.exitCode = 1` \uC124\uC815\n *\n * @param options - \uD0C0\uC785\uCCB4\uD06C \uC2E4\uD589 \uC635\uC158\n * @returns \uC644\uB8CC \uC2DC resolve. \uC5D0\uB7EC \uBC1C\uACAC \uC2DC `process.exitCode`\uB97C 1\uB85C \uC124\uC815\uD558\uACE0 resolve (throw\uD558\uC9C0 \uC54A\uC74C)\n */\nexport async function runTypecheck(options: TypecheckOptions): Promise<void> {\n const { targets } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:typecheck\");\n\n logger.debug(\"\uD0C0\uC785\uCCB4\uD06C \uC2DC\uC791\", { targets });\n\n const formatHost: ts.FormatDiagnosticsHost = {\n getCanonicalFileName: (f) => f,\n getCurrentDirectory: () => cwd,\n getNewLine: () => ts.sys.newLine,\n };\n\n // tsconfig.json \uB85C\uB4DC \uBC0F \uD30C\uC2F1\n let parsedConfig: ts.ParsedCommandLine;\n try {\n parsedConfig = parseRootTsconfig(cwd);\n } catch (err) {\n consola.error(err instanceof Error ? err.message : err);\n process.exitCode = 1;\n return;\n }\n\n // sd.config.ts \uB85C\uB4DC\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({ cwd, dev: false, opt: options.options });\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n // sd.config.ts\uAC00 \uC5C6\uAC70\uB098 \uB85C\uB4DC \uC2E4\uD328 \uC2DC \uAE30\uBCF8\uAC12 \uC0AC\uC6A9\n sdConfig = { packages: {} };\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC2E4\uD328, \uAE30\uBCF8\uAC12 \uC0AC\uC6A9\", err);\n }\n\n // targets\uAC00 \uC9C0\uC815\uB418\uBA74 fileNames \uD544\uD130\uB9C1\n const fileNames = pathFilterByTargets(parsedConfig.fileNames, targets, cwd);\n\n if (fileNames.length === 0) {\n process.stdout.write(\"\u2714 \uD0C0\uC785\uCCB4\uD06C\uD560 \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n logger.info(\"\uD0C0\uC785\uCCB4\uD06C\uD560 \uD30C\uC77C \uC5C6\uC74C\");\n return;\n }\n\n // \uD328\uD0A4\uC9C0 \uC815\uBCF4 \uCD94\uCD9C\n const packages = extractPackages(fileNames, cwd, sdConfig);\n logger.debug(\"\uD328\uD0A4\uC9C0 \uCD94\uCD9C \uC644\uB8CC\", {\n packageCount: packages.size,\n packages: [...packages.keys()],\n });\n\n // \uD0C0\uC785\uCCB4\uD06C \uC791\uC5C5 \uC0DD\uC131\n const tasks = createTypecheckTasks(packages, cwd);\n\n if (tasks.length === 0) {\n process.stdout.write(\"\u2714 \uD0C0\uC785\uCCB4\uD06C\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n // \uB3D9\uC2DC\uC131 \uC124\uC815: CPU \uCF54\uC5B4\uC758 7/8\uB9CC \uC0AC\uC6A9 (\uC77C\uBC18\uC801\uC778 \uBCD1\uB82C \uBE4C\uB4DC \uB3C4\uAD6C\uC758 \uAE30\uBCF8\uAC12, OS/\uB2E4\uB978 \uD504\uB85C\uC138\uC2A4 \uC5EC\uC720\uBD84 \uD655\uBCF4, \uCD5C\uC18C 1, \uC791\uC5C5 \uC218 \uC774\uD558)\n const maxConcurrency = Math.max(Math.floor((os.cpus().length * 7) / 8), 1);\n const concurrency = Math.min(maxConcurrency, tasks.length);\n logger.debug(\"\uB3D9\uC2DC\uC131 \uC124\uC815\", { concurrency, maxConcurrency, taskCount: tasks.length });\n\n // Worker \uD480 \uC0DD\uC131 (\uC791\uC5C5 \uC218\uB9CC\uD07C\uB9CC \uC0DD\uC131)\n const workerPath = import.meta.resolve(\"../workers/dts.worker\");\n const workers: WorkerProxy<typeof DtsWorkerModule>[] = [];\n for (let i = 0; i < concurrency; i++) {\n workers.push(Worker.create<typeof DtsWorkerModule>(workerPath));\n }\n\n // \uACB0\uACFC \uC218\uC9D1\uC6A9\n const allResults: { displayName: string; result: DtsBuildResult }[] = [];\n\n // listr2-Worker \uC5F0\uB3D9 \uD328\uD134:\n // 1. listr2\uC758 \uAC01 task\uB294 Promise\uB97C \uBC18\uD658\uD558\uACE0, \uD574\uB2F9 Promise\uAC00 resolve\uB418\uBA74 task\uAC00 \uC644\uB8CC\uB428\n // 2. taskResolvers \uB9F5\uC5D0 task\uBCC4 resolve \uD568\uC218\uB97C \uC800\uC7A5\n // 3. Worker\uAC00 \uC791\uC5C5 \uC644\uB8CC \uC2DC \uD574\uB2F9 task\uC758 resolver\uB97C \uD638\uCD9C\uD558\uC5EC listr2 UI \uC5C5\uB370\uC774\uD2B8\n // 4. Worker \uD480\uC740 \uB3C5\uB9BD\uC801\uC73C\uB85C \uC791\uC5C5 \uD050\uC5D0\uC11C task\uB97C \uAC00\uC838\uC640 \uC2E4\uD589\n const taskResolvers = new Map<string, () => void>();\n\n try {\n // \uC791\uC5C5 \uD050\n let taskIndex = 0;\n\n // Worker\uC5D0\uC11C \uC791\uC5C5 \uC2E4\uD589\n async function runNextTask(worker: WorkerProxy<typeof DtsWorkerModule>): Promise<void> {\n while (taskIndex < tasks.length) {\n const currentIndex = taskIndex++;\n const task = tasks[currentIndex];\n\n try {\n const result = await worker.buildDts(task.buildInfo);\n\n allResults.push({ displayName: task.displayName, result });\n } catch (err) {\n // Worker \uC624\uB958 \uB85C\uAE45 \uBC0F \uACB0\uACFC\uB85C \uBCC0\uD658\n logger.error(`Worker \uC624\uB958: ${task.displayName}`, {\n error: err instanceof Error ? err.message : String(err),\n });\n allResults.push({\n displayName: task.displayName,\n result: {\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n diagnostics: [],\n errorCount: 1,\n warningCount: 0,\n },\n });\n } finally {\n // \uC131\uACF5/\uC2E4\uD328 \uBAA8\uB450 task \uC644\uB8CC \uCC98\uB9AC\n taskResolvers.get(task.displayName)?.();\n }\n }\n }\n\n // listr2\uB85C \uC9C4\uD589 \uC0C1\uD669 \uD45C\uC2DC\n const listr = new Listr(\n tasks.map((task) => ({\n title: task.displayName,\n task: () =>\n new Promise<void>((resolve) => {\n taskResolvers.set(task.displayName, resolve);\n }),\n })),\n {\n concurrent: concurrency,\n exitOnError: false,\n renderer: consola.level >= LogLevels.debug ? \"verbose\" : \"default\",\n },\n );\n\n // \uBCD1\uB82C\uB85C \uBAA8\uB4E0 worker \uC2E4\uD589\n const workerPromises = workers.map((worker) => runNextTask(worker));\n\n // listr\uC640 worker \uB3D9\uC2DC \uC2E4\uD589\n await Promise.all([listr.run(), ...workerPromises]);\n } finally {\n // \uBBF8\uD574\uACB0 resolver \uC815\uB9AC (\uD0C0\uC784\uC544\uC6C3/\uBE44\uC815\uC0C1 \uC885\uB8CC \uB300\uBE44)\n for (const resolver of taskResolvers.values()) {\n resolver();\n }\n // Worker \uC885\uB8CC (\uC131\uACF5/\uC2E4\uD328 \uBAA8\uB450)\n await Promise.all(workers.map((w) => w.terminate()));\n }\n\n // \uACB0\uACFC \uCD9C\uB825\n const allDiagnostics: ts.Diagnostic[] = [];\n let totalErrorCount = 0;\n let totalWarningCount = 0;\n const fileCache = new Map<string, string>(); // \uD30C\uC77C \uB0B4\uC6A9 \uCE90\uC2DC (\uB3D9\uC77C \uD30C\uC77C \uC911\uBCF5 \uC77D\uAE30 \uBC29\uC9C0)\n for (const { result } of allResults) {\n totalErrorCount += result.errorCount;\n totalWarningCount += result.warningCount;\n for (const serialized of result.diagnostics) {\n allDiagnostics.push(deserializeDiagnostic(serialized, fileCache));\n }\n }\n\n if (totalErrorCount > 0) {\n logger.error(\"\uD0C0\uC785\uCCB4\uD06C \uC5D0\uB7EC \uBC1C\uC0DD\", {\n errorCount: totalErrorCount,\n warningCount: totalWarningCount,\n });\n } else if (totalWarningCount > 0) {\n logger.info(\"\uD0C0\uC785\uCCB4\uD06C \uC644\uB8CC (\uACBD\uACE0 \uC788\uC74C)\", {\n errorCount: totalErrorCount,\n warningCount: totalWarningCount,\n });\n } else {\n logger.info(\"\uD0C0\uC785\uCCB4\uD06C \uC644\uB8CC\", { errorCount: totalErrorCount, warningCount: totalWarningCount });\n }\n\n if (allDiagnostics.length > 0) {\n const uniqueDiagnostics = ts.sortAndDeduplicateDiagnostics(allDiagnostics);\n const message = ts.formatDiagnosticsWithColorAndContext(uniqueDiagnostics, formatHost);\n process.stdout.write(message);\n }\n\n if (totalErrorCount > 0) {\n process.exitCode = 1;\n }\n}\n\n//#endregion\n"],
5
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/watch.ts"],
4
- "sourcesContent": ["// packages/cli/src/commands/watch.ts\nimport { WatchOrchestrator, type WatchOrchestratorOptions } from \"../orchestrators/WatchOrchestrator\";\n\n/**\n * Watch \uBA85\uB839 \uC635\uC158 (\uD558\uC704 \uD638\uD658\uC131)\n */\nexport interface WatchOptions {\n targets: string[];\n options: string[];\n}\n\n/**\n * Library \uD328\uD0A4\uC9C0\uB97C watch \uBAA8\uB4DC\uB85C \uBE4C\uB4DC\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 * - `node`/`browser`/`neutral` \uD0C0\uAC9F: esbuild watch \uBAA8\uB4DC\uB85C \uBE4C\uB4DC + .d.ts \uC0DD\uC131\n * - \uD30C\uC77C \uBCC0\uACBD \uC2DC \uC790\uB3D9 \uB9AC\uBE4C\uB4DC\n * - SIGINT/SIGTERM \uC2DC\uADF8\uB110\uB85C \uC885\uB8CC\n *\n * @param options - watch \uC2E4\uD589 \uC635\uC158\n * @returns \uC885\uB8CC \uC2DC\uADF8\uB110 \uC218\uC2E0 \uC2DC resolve\n */\nexport async function runWatch(options: WatchOptions): Promise<void> {\n const orchestratorOptions: WatchOrchestratorOptions = {\n targets: options.targets,\n options: options.options,\n };\n\n const orchestrator = new WatchOrchestrator(orchestratorOptions);\n\n try {\n await orchestrator.initialize();\n await orchestrator.start();\n await orchestrator.awaitTermination();\n } finally {\n await orchestrator.shutdown();\n }\n}\n"],
5
4
  "mappings": "AACA,SAAS,yBAAwD;AAqBjE,eAAsB,SAAS,SAAsC;AACnE,QAAM,sBAAgD;AAAA,IACpD,SAAS,QAAQ;AAAA,IACjB,SAAS,QAAQ;AAAA,EACnB;AAEA,QAAM,eAAe,IAAI,kBAAkB,mBAAmB;AAE9D,MAAI;AACF,UAAM,aAAa,WAAW;AAC9B,UAAM,aAAa,MAAM;AACzB,UAAM,aAAa,iBAAiB;AAAA,EACtC,UAAE;AACA,UAAM,aAAa,SAAS;AAAA,EAC9B;AACF;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/electron/electron.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport module from \"module\";\nimport { fsExists, fsMkdir, fsCopy, fsReaddir, fsReadJson, fsWriteJson } from \"@simplysm/core-node\";\nimport { consola } from \"consola\";\nimport type { SdElectronConfig } from \"../sd-config.types\";\nimport { spawn } from \"../utils/spawn\";\n\n/**\n * package.json \uD0C0\uC785\n */\ninterface NpmConfig {\n name: string;\n version: string;\n description?: string;\n dependencies?: Record<string, string>;\n}\n\n/**\n * Electron \uD504\uB85C\uC81D\uD2B8 \uAD00\uB9AC \uD074\uB798\uC2A4\n *\n * - Electron \uD504\uB85C\uC81D\uD2B8 \uCD08\uAE30\uD654 (package.json \uC0DD\uC131, \uC758\uC874\uC131 \uC124\uCE58, native \uBAA8\uB4C8 \uC7AC\uBE4C\uB4DC)\n * - Windows \uC2E4\uD589 \uD30C\uC77C \uBE4C\uB4DC (electron-builder)\n * - \uAC1C\uBC1C \uBAA8\uB4DC \uC2E4\uD589 (Vite dev server URL \uB85C\uB4DC)\n */\nexport class Electron {\n private static readonly _logger = consola.withTag(\"sd:cli:electron\");\n\n private readonly _electronPath: string;\n private readonly _npmConfig: NpmConfig;\n\n private constructor(\n private readonly _pkgPath: string,\n private readonly _config: SdElectronConfig,\n npmConfig: NpmConfig,\n ) {\n this._npmConfig = npmConfig;\n this._electronPath = path.resolve(this._pkgPath, \".electron\");\n }\n\n /**\n * Electron \uC778\uC2A4\uD134\uC2A4 \uC0DD\uC131 (\uC124\uC815 \uAC80\uC99D \uD3EC\uD568)\n */\n static async create(pkgPath: string, config: SdElectronConfig): Promise<Electron> {\n Electron._validateConfig(config);\n\n const npmConfig = await fsReadJson<NpmConfig>(path.resolve(pkgPath, \"package.json\"));\n return new Electron(pkgPath, config, npmConfig);\n }\n\n /**\n * \uC124\uC815 \uAC80\uC99D\n */\n private static _validateConfig(config: SdElectronConfig): void {\n if (typeof config.appId !== \"string\" || config.appId.trim() === \"\") {\n throw new Error(\"electron.appId\uB294 \uD544\uC218\uC785\uB2C8\uB2E4.\");\n }\n }\n\n /**\n * \uBA85\uB839\uC5B4 \uC2E4\uD589 (\uB85C\uAE45 \uD3EC\uD568)\n */\n private async _exec(cmd: string, args: string[], cwd: string, env?: Record<string, string>): Promise<string> {\n Electron._logger.debug(`\uC2E4\uD589 \uBA85\uB839: ${cmd} ${args.join(\" \")}`);\n const result = await spawn(cmd, args, { cwd, env });\n Electron._logger.debug(`\uC2E4\uD589 \uACB0\uACFC: ${result}`);\n return result;\n }\n\n //#region Public Methods\n\n /**\n * Electron \uD504\uB85C\uC81D\uD2B8 \uCD08\uAE30\uD654\n *\n * 1. .electron/src/package.json \uC0DD\uC131\n * 2. npm install \uC2E4\uD589\n * 3. electron-rebuild \uC2E4\uD589 (native \uBAA8\uB4C8 \uC7AC\uBE4C\uB4DC)\n */\n async initialize(): Promise<void> {\n const srcPath = path.resolve(this._electronPath, \"src\");\n\n // 1. package.json \uC0DD\uC131\n await this._setupPackageJson(srcPath);\n\n // 2. npm install\n await this._exec(\"npm\", [\"install\"], srcPath);\n\n // 3. native \uBAA8\uB4C8 \uC7AC\uBE4C\uB4DC\n const reinstallDeps = this._config.reinstallDependencies ?? [];\n if (reinstallDeps.length > 0) {\n await this._exec(\"npx\", [\"electron-rebuild\"], srcPath);\n }\n }\n\n /**\n * \uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\n *\n * 1. esbuild\uB85C electron-main.ts \uBC88\uB4E4\uB9C1\n * 2. \uC6F9 \uC5D0\uC14B \uBCF5\uC0AC\n * 3. electron-builder \uC124\uC815 \uC0DD\uC131\n * 4. electron-builder \uC2E4\uD589\n * 5. \uACB0\uACFC\uBB3C \uBCF5\uC0AC\n */\n async build(outPath: string): Promise<void> {\n const srcPath = path.resolve(this._electronPath, \"src\");\n\n // 1. electron-main.ts \uBC88\uB4E4\uB9C1\n await this._bundleMainProcess(srcPath);\n\n // 2. \uC6F9 \uC5D0\uC14B \uBCF5\uC0AC (outPath \u2192 .electron/src/)\n await this._copyWebAssets(outPath, srcPath);\n\n // 3. electron-builder \uC124\uC815 \uC0DD\uC131 + \uC2E4\uD589\n await this._runElectronBuilder(srcPath);\n\n // 4. \uACB0\uACFC\uBB3C \uBCF5\uC0AC\n await this._copyBuildOutput(outPath);\n }\n\n /**\n * \uAC1C\uBC1C \uBAA8\uB4DC \uC2E4\uD589\n *\n * 1. esbuild\uB85C electron-main.ts \uBC88\uB4E4\uB9C1\n * 2. dist/electron/package.json \uC0DD\uC131\n * 3. npx electron . \uC2E4\uD589\n */\n async run(url?: string): Promise<void> {\n const electronRunPath = path.resolve(this._pkgPath, \"dist/electron\");\n\n // 1. electron-main.ts \uBC88\uB4E4\uB9C1\n await this._bundleMainProcess(electronRunPath);\n\n // 2. package.json \uC0DD\uC131\n await fsMkdir(electronRunPath);\n await fsWriteJson(\n path.resolve(electronRunPath, \"package.json\"),\n { name: this._npmConfig.name, version: this._npmConfig.version, main: \"electron-main.js\" },\n { space: 2 },\n );\n\n // 3. Electron \uC2E4\uD589\n const runEnv: Record<string, string> = {\n NODE_ENV: \"development\",\n ...this._config.env,\n };\n\n if (url != null) {\n runEnv[\"ELECTRON_DEV_URL\"] = url;\n }\n\n await this._exec(\"npx\", [\"electron\", \".\"], electronRunPath, runEnv);\n }\n\n //#endregion\n\n //#region Private - \uCD08\uAE30\uD654\n\n /**\n * .electron/src/package.json \uC0DD\uC131\n */\n private async _setupPackageJson(srcPath: string): Promise<void> {\n await fsMkdir(srcPath);\n\n const reinstallDeps = this._config.reinstallDependencies ?? [];\n\n // \uBA54\uC778 package.json\uC5D0\uC11C reinstallDependencies\uC5D0 \uD574\uB2F9\uD558\uB294 \uBC84\uC804 \uCD94\uCD9C\n const dependencies: Record<string, string> = {};\n for (const dep of reinstallDeps) {\n const version = this._npmConfig.dependencies?.[dep];\n if (version != null) {\n dependencies[dep] = version;\n }\n }\n\n const packageJson: Record<string, unknown> = {\n name: this._npmConfig.name.replace(/^@/, \"\").replace(/\\//, \"-\"),\n version: this._npmConfig.version,\n description: this._npmConfig.description,\n main: \"electron-main.js\",\n dependencies,\n };\n\n if (this._config.postInstallScript != null) {\n packageJson[\"scripts\"] = { postinstall: this._config.postInstallScript };\n }\n\n await fsWriteJson(path.resolve(srcPath, \"package.json\"), packageJson, { space: 2 });\n }\n\n //#endregion\n\n //#region Private - \uBC88\uB4E4\uB9C1\n\n /**\n * esbuild\uB85C electron-main.ts \uBC88\uB4E4\uB9C1\n */\n private async _bundleMainProcess(outDir: string): Promise<void> {\n const esbuild = await import(\"esbuild\");\n const entryPoint = path.resolve(this._pkgPath, \"src/electron-main.ts\");\n\n if (!(await fsExists(entryPoint))) {\n throw new Error(`electron-main.ts \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${entryPoint}`);\n }\n\n const builtinModules = module.builtinModules.flatMap((m) => [m, `node:${m}`]);\n const reinstallDeps = this._config.reinstallDependencies ?? [];\n\n await fsMkdir(outDir);\n\n await esbuild.build({\n entryPoints: [entryPoint],\n outfile: path.resolve(outDir, \"electron-main.js\"),\n platform: \"node\",\n target: \"node20\",\n format: \"cjs\",\n bundle: true,\n external: [\"electron\", ...builtinModules, ...reinstallDeps],\n });\n }\n\n //#endregion\n\n //#region Private - \uBE4C\uB4DC\n\n /**\n * \uC6F9 \uC5D0\uC14B \uBCF5\uC0AC (\uBE4C\uB4DC \uACB0\uACFC\uBB3C \u2192 .electron/src/)\n */\n private async _copyWebAssets(outPath: string, srcPath: string): Promise<void> {\n const items = await fsReaddir(outPath);\n for (const item of items) {\n // electron/ \uD558\uC704\uB294 \uC81C\uC678 (\uC790\uAE30 \uC790\uC2E0 \uBCF5\uC0AC \uBC29\uC9C0)\n if (item === \"electron\") continue;\n\n const source = path.resolve(outPath, item);\n const dest = path.resolve(srcPath, item);\n await fsCopy(source, dest);\n }\n }\n\n /**\n * Symlink \uC0DD\uC131 \uAC00\uB2A5 \uC5EC\uBD80 \uD655\uC778 (Windows \uBE4C\uB4DC \uC694\uAD6C\uC0AC\uD56D)\n */\n private static _canCreateSymlink(): boolean {\n const tmpDir = os.tmpdir();\n const testTarget = path.join(tmpDir, \"sd-electron-symlink-test-target.txt\");\n const testLink = path.join(tmpDir, \"sd-electron-symlink-test-link.txt\");\n\n try {\n fs.writeFileSync(testTarget, \"test\");\n fs.symlinkSync(testTarget, testLink, \"file\");\n const isSymlink = fs.lstatSync(testLink).isSymbolicLink();\n fs.unlinkSync(testLink);\n fs.unlinkSync(testTarget);\n return isSymlink;\n } catch {\n return false;\n }\n }\n\n /**\n * electron-builder \uC2E4\uD589\n */\n private async _runElectronBuilder(srcPath: string): Promise<void> {\n if (!Electron._canCreateSymlink()) {\n throw new Error(\"Electron \uBE4C\uB4DC\uB97C \uC704\uD574\uC11C\uB294 Symlink \uC0DD\uC131 \uAD8C\uD55C\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. \uC708\uB3C4\uC6B0\uC758 \uAC1C\uBC1C\uC790\uBAA8\uB4DC\uB97C \uD65C\uC131\uD654\uD558\uC138\uC694.\");\n }\n\n const distPath = path.resolve(this._electronPath, \"dist\");\n\n const builderConfig: Record<string, unknown> = {\n appId: this._config.appId,\n productName: this._npmConfig.description,\n asar: false,\n win: {\n target: this._config.portable ? \"portable\" : \"nsis\",\n },\n nsis: this._config.nsisOptions ?? {},\n directories: {\n app: srcPath,\n output: distPath,\n },\n removePackageScripts: false,\n npmRebuild: false,\n forceCodeSigning: false,\n };\n\n if (this._config.installerIcon != null) {\n builderConfig[\"icon\"] = path.resolve(this._pkgPath, this._config.installerIcon);\n }\n\n const configFilePath = path.resolve(this._electronPath, \"builder-config.json\");\n await fsWriteJson(configFilePath, builderConfig, { space: 2 });\n\n await this._exec(\"npx\", [\"electron-builder\", \"--win\", \"--config\", configFilePath], this._pkgPath);\n }\n\n /**\n * \uBE4C\uB4DC \uACB0\uACFC\uBB3C \uBCF5\uC0AC (.electron/dist/ \u2192 dist/electron/)\n */\n private async _copyBuildOutput(outPath: string): Promise<void> {\n const distPath = path.resolve(this._electronPath, \"dist\");\n const electronOutPath = path.resolve(outPath, \"electron\");\n await fsMkdir(electronOutPath);\n\n const description = this._npmConfig.description ?? this._npmConfig.name;\n const version = this._npmConfig.version;\n const isPortable = this._config.portable === true;\n\n // electron-builder \uCD9C\uB825 \uD30C\uC77C\uBA85\n const builderFileName = `${description} ${isPortable ? \"\" : \"Setup \"}${version}.exe`;\n const sourcePath = path.resolve(distPath, builderFileName);\n\n if (await fsExists(sourcePath)) {\n // latest \uD30C\uC77C \uBCF5\uC0AC\n const latestFileName = `${description}${isPortable ? \"-portable\" : \"\"}-latest.exe`;\n await fsCopy(sourcePath, path.resolve(electronOutPath, latestFileName));\n\n // updates/ \uBC84\uC804\uBCC4 \uD30C\uC77C \uBCF5\uC0AC\n const updatesPath = path.resolve(electronOutPath, \"updates\");\n await fsMkdir(updatesPath);\n await fsCopy(sourcePath, path.resolve(updatesPath, `${version}.exe`));\n } else {\n Electron._logger.warn(`\uBE4C\uB4DC \uACB0\uACFC\uBB3C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${sourcePath}`);\n }\n }\n\n //#endregion\n}\n"],
5
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
package/dist/index.js.map CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["export * from \"./sd-config.types\";\n"],
5
4
  "mappings": "AAAA,cAAc;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/infra/ResultCollector.ts"],
4
- "sourcesContent": ["/**\n * \uBE4C\uB4DC \uACB0\uACFC \uC0C1\uD0DC\n */\nexport interface BuildResult {\n name: string;\n target: string;\n type: \"build\" | \"dts\" | \"server\" | \"capacitor\";\n status: \"pending\" | \"building\" | \"success\" | \"error\" | \"server\";\n message?: string;\n port?: number;\n}\n\n/**\n * \uBE4C\uB4DC \uACB0\uACFC\uB97C \uC218\uC9D1\uD558\uACE0 \uAD00\uB9AC\uD558\uB294 \uD074\uB798\uC2A4\n *\n * \uC5EC\uB7EC Builder\uC5D0\uC11C \uBC1C\uC0DD\uD558\uB294 \uBE4C\uB4DC \uACB0\uACFC\uB97C \uC911\uC559\uC5D0\uC11C \uAD00\uB9AC\uD558\uACE0,\n * \uC0C1\uD0DC\uBCC4 \uD544\uD130\uB9C1 \uBC0F \uCD9C\uB825 \uAE30\uB2A5\uC744 \uC81C\uACF5\uD55C\uB2E4.\n */\nexport class ResultCollector {\n private readonly _results = new Map<string, BuildResult>();\n\n /**\n * \uACB0\uACFC \uCD94\uAC00\n * @param result \uBE4C\uB4DC \uACB0\uACFC\n */\n add(result: BuildResult): void {\n const key = `${result.name}:${result.type}`;\n this._results.set(key, result);\n }\n\n /**\n * \uD0A4\uB85C \uACB0\uACFC \uC870\uD68C\n * @param key \uACB0\uACFC \uD0A4 (\uC608: \"core-common:build\")\n */\n get(key: string): BuildResult | undefined {\n return this._results.get(key);\n }\n\n /**\n * \uBAA8\uB4E0 \uACB0\uACFC \uC870\uD68C\n */\n getAll(): BuildResult[] {\n return [...this._results.values()];\n }\n\n /**\n * \uC5D0\uB7EC \uC0C1\uD0DC\uC778 \uACB0\uACFC\uB9CC \uC870\uD68C\n */\n getErrors(): BuildResult[] {\n return this.getAll().filter((r) => r.status === \"error\");\n }\n\n /**\n * \uC11C\uBC84 \uC0C1\uD0DC\uC778 \uACB0\uACFC\uB9CC \uC870\uD68C\n */\n getServers(): BuildResult[] {\n return this.getAll().filter((r) => r.type === \"server\" && r.status === \"server\");\n }\n\n /**\n * \uD2B9\uC815 \uD0C0\uC785\uC758 \uACB0\uACFC\uB9CC \uC870\uD68C\n * @param type \uACB0\uACFC \uD0C0\uC785\n */\n getByType(type: BuildResult[\"type\"]): BuildResult[] {\n return this.getAll().filter((r) => r.type === type);\n }\n\n /**\n * \uACB0\uACFC \uCD08\uAE30\uD654\n */\n clear(): void {\n this._results.clear();\n }\n\n /**\n * \uB0B4\uBD80 Map \uBC18\uD658 (\uD558\uC704 \uD638\uD658\uC131)\n */\n toMap(): Map<string, BuildResult> {\n return this._results;\n }\n}\n"],
5
4
  "mappings": "AAkBO,MAAM,gBAAgB;AAAA,EACV,WAAW,oBAAI,IAAyB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzD,IAAI,QAA2B;AAC7B,UAAM,MAAM,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI;AACzC,SAAK,SAAS,IAAI,KAAK,MAAM;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAsC;AACxC,WAAO,KAAK,SAAS,IAAI,GAAG;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAwB;AACtB,WAAO,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,YAA2B;AACzB,WAAO,KAAK,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,aAA4B;AAC1B,WAAO,KAAK,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,WAAW,QAAQ;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,MAA0C;AAClD,WAAO,KAAK,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AACF;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/infra/SignalHandler.ts"],
4
- "sourcesContent": ["/**\n * \uD504\uB85C\uC138\uC2A4 \uC885\uB8CC \uC2DC\uADF8\uB110\uC744 \uCC98\uB9AC\uD558\uB294 \uD074\uB798\uC2A4\n *\n * SIGINT (Ctrl+C) \uBC0F SIGTERM \uC2DC\uADF8\uB110\uC744 \uAC10\uC9C0\uD558\uACE0,\n * \uC885\uB8CC \uC2DC\uC810\uAE4C\uC9C0 \uB300\uAE30\uD558\uB294 Promise\uB97C \uC81C\uACF5\uD55C\uB2E4.\n */\nexport class SignalHandler {\n private _terminateResolver: (() => void) | null = null;\n private readonly _terminatePromise: Promise<void>;\n private _terminated = false;\n\n constructor() {\n this._terminatePromise = new Promise((resolve) => {\n this._terminateResolver = resolve;\n });\n\n const handler = () => {\n process.off(\"SIGINT\", handler);\n process.off(\"SIGTERM\", handler);\n this._terminated = true;\n this._terminateResolver?.();\n };\n\n process.on(\"SIGINT\", handler);\n process.on(\"SIGTERM\", handler);\n }\n\n /**\n * \uC885\uB8CC \uC2DC\uADF8\uB110\uC774 \uC218\uC2E0\uB420 \uB54C\uAE4C\uC9C0 \uB300\uAE30\n */\n waitForTermination(): Promise<void> {\n return this._terminatePromise;\n }\n\n /**\n * \uC885\uB8CC \uC5EC\uBD80 \uD655\uC778\n */\n isTerminated(): boolean {\n return this._terminated;\n }\n\n /**\n * \uD504\uB85C\uADF8\uB798\uBC0D \uBC29\uC2DD\uC73C\uB85C \uC885\uB8CC \uC694\uCCAD\n * (\uD14C\uC2A4\uD2B8 \uB610\uB294 \uC678\uBD80\uC5D0\uC11C \uC885\uB8CC \uD2B8\uB9AC\uAC70 \uC2DC \uC0AC\uC6A9)\n */\n requestTermination(): void {\n if (!this._terminated) {\n this._terminated = true;\n this._terminateResolver?.();\n }\n }\n}\n"],
5
4
  "mappings": "AAMO,MAAM,cAAc;AAAA,EACjB,qBAA0C;AAAA,EACjC;AAAA,EACT,cAAc;AAAA,EAEtB,cAAc;AACZ,SAAK,oBAAoB,IAAI,QAAQ,CAAC,YAAY;AAChD,WAAK,qBAAqB;AAAA,IAC5B,CAAC;AAED,UAAM,UAAU,MAAM;AACpB,cAAQ,IAAI,UAAU,OAAO;AAC7B,cAAQ,IAAI,WAAW,OAAO;AAC9B,WAAK,cAAc;AACnB,WAAK,qBAAqB;AAAA,IAC5B;AAEA,YAAQ,GAAG,UAAU,OAAO;AAC5B,YAAQ,GAAG,WAAW,OAAO;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,eAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAA2B;AACzB,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,cAAc;AACnB,WAAK,qBAAqB;AAAA,IAC5B;AAAA,EACF;AACF;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/infra/WorkerManager.ts"],
4
- "sourcesContent": ["import { Worker, type WorkerProxy, type WorkerModule } from \"@simplysm/core-node\";\n\n/**\n * Worker \uC0DD\uBA85\uC8FC\uAE30\uB97C \uAD00\uB9AC\uD558\uB294 \uD074\uB798\uC2A4\n *\n * Worker \uC0DD\uC131, \uC870\uD68C, \uC885\uB8CC\uB97C \uC911\uC559\uC5D0\uC11C \uAD00\uB9AC\uD558\uC5EC\n * \uB9AC\uC18C\uC2A4 \uB204\uC218\uB97C \uBC29\uC9C0\uD558\uACE0 \uC77C\uAD00\uB41C Worker \uAD00\uB9AC\uB97C \uC81C\uACF5\uD55C\uB2E4.\n */\nexport class WorkerManager {\n private readonly _workers = new Map<string, WorkerProxy<WorkerModule>>();\n\n /**\n * \uC0C8 Worker \uC0DD\uC131\n * @param id Worker \uC2DD\uBCC4\uC790 (\uC608: \"core-common:build\")\n * @param workerPath Worker \uD30C\uC77C \uACBD\uB85C\n * @returns \uC0DD\uC131\uB41C WorkerProxy\n */\n create<TModule extends WorkerModule>(id: string, workerPath: string): WorkerProxy<TModule> {\n const worker = Worker.create<TModule>(workerPath);\n this._workers.set(id, worker as WorkerProxy<WorkerModule>);\n return worker;\n }\n\n /**\n * ID\uB85C Worker \uC870\uD68C\n * @param id Worker \uC2DD\uBCC4\uC790\n */\n get<TModule extends WorkerModule>(id: string): WorkerProxy<TModule> | undefined {\n return this._workers.get(id) as WorkerProxy<TModule> | undefined;\n }\n\n /**\n * \uD2B9\uC815 Worker \uC885\uB8CC \uBC0F \uC81C\uAC70\n * @param id Worker \uC2DD\uBCC4\uC790\n */\n async terminate(id: string): Promise<void> {\n const worker = this._workers.get(id);\n if (worker != null) {\n await worker.terminate();\n this._workers.delete(id);\n }\n }\n\n /**\n * \uBAA8\uB4E0 Worker \uC885\uB8CC\n */\n async terminateAll(): Promise<void> {\n await Promise.all([...this._workers.values()].map((w) => w.terminate()));\n this._workers.clear();\n }\n\n /**\n * \uAD00\uB9AC \uC911\uC778 Worker \uC218\n */\n get size(): number {\n return this._workers.size;\n }\n\n /**\n * \uBAA8\uB4E0 Worker ID \uBAA9\uB85D\n */\n get ids(): string[] {\n return [...this._workers.keys()];\n }\n}\n"],
5
4
  "mappings": "AAAA,SAAS,cAAmD;AAQrD,MAAM,cAAc;AAAA,EACR,WAAW,oBAAI,IAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvE,OAAqC,IAAY,YAA0C;AACzF,UAAM,SAAS,OAAO,OAAgB,UAAU;AAChD,SAAK,SAAS,IAAI,IAAI,MAAmC;AACzD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAkC,IAA8C;AAC9E,WAAO,KAAK,SAAS,IAAI,EAAE;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,IAA2B;AACzC,UAAM,SAAS,KAAK,SAAS,IAAI,EAAE;AACnC,QAAI,UAAU,MAAM;AAClB,YAAM,OAAO,UAAU;AACvB,WAAK,SAAS,OAAO,EAAE;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAA8B;AAClC,UAAM,QAAQ,IAAI,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACvE,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAe;AACjB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAgB;AAClB,WAAO,CAAC,GAAG,KAAK,SAAS,KAAK,CAAC;AAAA,EACjC;AACF;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/infra/index.ts"],
4
- "sourcesContent": ["export { ResultCollector, type BuildResult } from \"./ResultCollector\";\nexport { SignalHandler } from \"./SignalHandler\";\nexport { WorkerManager } from \"./WorkerManager\";\n"],
5
4
  "mappings": "AAAA,SAAS,uBAAyC;AAClD,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/orchestrators/WatchOrchestrator.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport { Listr } from \"listr2\";\nimport { consola } from \"consola\";\nimport type { BuildTarget, SdConfig, SdPackageConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { filterPackagesByTargets } from \"../utils/package-utils\";\nimport { setupReplaceDeps } from \"../utils/replace-deps\";\nimport { printErrors } from \"../utils/output-utils\";\nimport { RebuildListrManager } from \"../utils/listr-manager\";\nimport { ResultCollector } from \"../infra/ResultCollector\";\nimport { SignalHandler } from \"../infra/SignalHandler\";\nimport { LibraryBuilder } from \"../builders/LibraryBuilder\";\nimport { DtsBuilder } from \"../builders/DtsBuilder\";\nimport type { PackageInfo } from \"../builders/types\";\nimport { watchCopySrcFiles } from \"../utils/copy-src\";\nimport type { FsWatcher } from \"@simplysm/core-node\";\nimport type { SdBuildPackageConfig } from \"../sd-config.types\";\n\n/**\n * Watch \uBA85\uB839 \uC635\uC158\n */\nexport interface WatchOrchestratorOptions {\n targets: string[];\n options: string[];\n}\n\n/**\n * Watch \uBAA8\uB4DC \uC2E4\uD589\uC744 \uC870\uC728\uD558\uB294 Orchestrator\n *\n * Library \uD328\uD0A4\uC9C0(node/browser/neutral)\uC758 watch \uBAA8\uB4DC \uC2E4\uD589\uC744 \uAD00\uB9AC\uD55C\uB2E4.\n * - LibraryBuilder: esbuild watch\n * - DtsBuilder: .d.ts \uC0DD\uC131\n */\nexport class WatchOrchestrator {\n private readonly _cwd: string;\n private readonly _options: WatchOrchestratorOptions;\n private readonly _logger = consola.withTag(\"sd:cli:watch\");\n\n private _resultCollector!: ResultCollector;\n private _signalHandler!: SignalHandler;\n private _rebuildManager!: RebuildListrManager;\n private _libraryBuilder!: LibraryBuilder;\n private _dtsBuilder!: DtsBuilder;\n private _packages: PackageInfo[] = [];\n private _copySrcWatchers: FsWatcher[] = [];\n\n constructor(options: WatchOrchestratorOptions) {\n this._cwd = process.cwd();\n this._options = options;\n }\n\n /**\n * Orchestrator \uCD08\uAE30\uD654\n * - sd.config.ts \uB85C\uB4DC\n * - \uD328\uD0A4\uC9C0 \uBD84\uB958\n * - Builder \uC0DD\uC131 \uBC0F \uCD08\uAE30\uD654\n */\n async initialize(): Promise<void> {\n this._logger.debug(\"watch \uC2DC\uC791\", { targets: this._options.targets });\n\n // sd.config.ts \uB85C\uB4DC\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({\n cwd: this._cwd,\n dev: true,\n opt: this._options.options,\n });\n this._logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n throw err;\n }\n\n // replaceDeps \uC124\uC815\uC774 \uC788\uC73C\uBA74 symlink \uAD50\uCCB4\n if (sdConfig.replaceDeps != null) {\n await setupReplaceDeps(this._cwd, sdConfig.replaceDeps);\n }\n\n // targets \uD544\uD130\uB9C1\n const allPackages = filterPackagesByTargets(sdConfig.packages, this._options.targets);\n\n // library \uD328\uD0A4\uC9C0\uB9CC \uD544\uD130\uB9C1 (node, browser, neutral)\n const isLibraryTarget = (target: string): target is BuildTarget =>\n target === \"node\" || target === \"browser\" || target === \"neutral\";\n\n const libraryConfigs: Record<string, SdPackageConfig> = {};\n for (const [name, config] of Object.entries(allPackages)) {\n if (isLibraryTarget(config.target)) {\n libraryConfigs[name] = config;\n }\n }\n\n if (Object.keys(libraryConfigs).length === 0) {\n process.stdout.write(\"\u26A0 watch\uD560 library \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n // PackageInfo \uBC30\uC5F4 \uC0DD\uC131\n this._packages = Object.entries(libraryConfigs).map(([name, config]) => ({\n name,\n dir: path.join(this._cwd, \"packages\", name),\n config,\n }));\n\n // \uC778\uD504\uB77C \uCD08\uAE30\uD654\n this._resultCollector = new ResultCollector();\n this._signalHandler = new SignalHandler();\n this._rebuildManager = new RebuildListrManager(this._logger);\n\n // \uBC30\uCE58 \uC644\uB8CC \uC2DC \uC5D0\uB7EC \uCD9C\uB825\n this._rebuildManager.on(\"batchComplete\", () => {\n printErrors(this._resultCollector.toMap());\n });\n\n // Builder \uC0DD\uC131\n const builderOptions = {\n cwd: this._cwd,\n packages: this._packages,\n resultCollector: this._resultCollector,\n rebuildManager: this._rebuildManager,\n };\n\n this._libraryBuilder = new LibraryBuilder(builderOptions);\n this._dtsBuilder = new DtsBuilder(builderOptions);\n\n // Builder \uCD08\uAE30\uD654\n await Promise.all([this._libraryBuilder.initialize(), this._dtsBuilder.initialize()]);\n }\n\n /**\n * Watch \uBAA8\uB4DC \uC2DC\uC791\n * - \uCD08\uAE30 \uBE4C\uB4DC Listr \uC2E4\uD589\n * - \uACB0\uACFC \uCD9C\uB825\n */\n async start(): Promise<void> {\n if (this._packages.length === 0) {\n return;\n }\n\n // \uCD08\uAE30 \uBE4C\uB4DC Listr \uAD6C\uC131\n const buildPromises = this._libraryBuilder.getInitialBuildPromises();\n const dtsPromises = this._dtsBuilder.getInitialBuildPromises();\n\n const initialListr = new Listr(\n [\n // Library \uBE4C\uB4DC \uD0DC\uC2A4\uD06C\n ...this._packages.map((pkg) => ({\n title: `${pkg.name} (${pkg.config.target})`,\n task: () => buildPromises.get(`${pkg.name}:build`) ?? Promise.resolve(),\n })),\n // DTS \uD0DC\uC2A4\uD06C\n ...this._packages.map((pkg) => ({\n title: `${pkg.name} (dts)`,\n task: () => dtsPromises.get(`${pkg.name}:dts`) ?? Promise.resolve(),\n })),\n ],\n { concurrent: true },\n );\n\n // copySrc watch \uC2DC\uC791\n for (const pkg of this._packages) {\n const buildConfig = pkg.config as SdBuildPackageConfig;\n if (buildConfig.copySrc != null && buildConfig.copySrc.length > 0) {\n const watcher = await watchCopySrcFiles(pkg.dir, buildConfig.copySrc);\n this._copySrcWatchers.push(watcher);\n }\n }\n\n // Watch \uC2DC\uC791 (\uBC31\uADF8\uB77C\uC6B4\uB4DC \uC2E4\uD589)\n void this._libraryBuilder.startWatch();\n void this._dtsBuilder.startWatch();\n\n // Listr \uC2E4\uD589 (\uCD08\uAE30 \uBE4C\uB4DC \uC644\uB8CC\uAE4C\uC9C0 \uB300\uAE30)\n await initialListr.run();\n\n // \uCD08\uAE30 \uBE4C\uB4DC \uACB0\uACFC \uCD9C\uB825\n printErrors(this._resultCollector.toMap());\n }\n\n /**\n * \uC885\uB8CC \uC2DC\uADF8\uB110 \uB300\uAE30\n */\n async awaitTermination(): Promise<void> {\n if (this._packages.length === 0) {\n return;\n }\n await this._signalHandler.waitForTermination();\n }\n\n /**\n * Orchestrator \uC885\uB8CC\n */\n async shutdown(): Promise<void> {\n if (this._packages.length === 0) {\n return;\n }\n\n process.stdout.write(\"\u23F3 \uC885\uB8CC \uC911...\\n\");\n\n await Promise.all([\n this._libraryBuilder.shutdown(),\n this._dtsBuilder.shutdown(),\n ...this._copySrcWatchers.map((w) => w.close()),\n ]);\n this._copySrcWatchers = [];\n\n process.stdout.write(\"\u2714 \uC644\uB8CC\\n\");\n }\n}\n"],
5
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/orchestrators/index.ts"],
4
- "sourcesContent": ["export { WatchOrchestrator, type WatchOrchestratorOptions } from \"./WatchOrchestrator\";\n"],
5
4
  "mappings": "AAAA,SAAS,yBAAwD;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/sd-cli.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n\n// side-effect: Map/Array \uD504\uB85C\uD1A0\uD0C0\uC785 \uD655\uC7A5 (getOrCreate \uB4F1)\nimport \"@simplysm/core-common\";\nimport yargs, { type Argv } from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { runLint } from \"./commands/lint\";\nimport { runTypecheck } from \"./commands/typecheck\";\nimport { runWatch } from \"./commands/watch\";\nimport { runDev } from \"./commands/dev\";\nimport { runBuild } from \"./commands/build\";\nimport { runPublish } from \"./commands/publish\";\nimport { runDevice } from \"./commands/device\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { EventEmitter } from \"node:events\";\nimport { consola, LogLevels } from \"consola\";\n\nError.stackTraceLimit = Infinity;\nEventEmitter.defaultMaxListeners = 100;\n\n/**\n * CLI \uD30C\uC11C\uB97C \uC0DD\uC131\uD55C\uB2E4.\n * @internal \uD14C\uC2A4\uD2B8\uC6A9\uC73C\uB85C export\n */\nexport function createCliParser(argv: string[]): Argv {\n return yargs(argv)\n .help(\"help\", \"\uB3C4\uC6C0\uB9D0\")\n .alias(\"help\", \"h\")\n .option(\"debug\", {\n type: \"boolean\",\n describe: \"debug \uB85C\uADF8 \uCD9C\uB825\",\n default: false,\n global: true,\n })\n .middleware((args) => {\n if (args.debug) consola.level = LogLevels.debug;\n })\n .command(\n \"lint [targets..]\",\n \"ESLint\uB97C \uC2E4\uD589\uD55C\uB2E4.\",\n (cmd) =>\n cmd\n .version(false)\n .hide(\"help\")\n .positional(\"targets\", {\n type: \"string\",\n array: true,\n describe: \"\uB9B0\uD2B8\uD560 \uACBD\uB85C (\uC608: packages/core-common, tests/orm)\",\n default: [],\n })\n .options({\n fix: {\n type: \"boolean\",\n describe: \"\uC790\uB3D9 \uC218\uC815\",\n default: false,\n },\n timing: {\n type: \"boolean\",\n describe: \"\uADDC\uCE59\uBCC4 \uC2E4\uD589 \uC2DC\uAC04 \uCD9C\uB825\",\n default: false,\n },\n }),\n async (args) => {\n await runLint({\n targets: args.targets,\n fix: args.fix,\n timing: args.timing,\n });\n },\n )\n .command(\n \"typecheck [targets..]\",\n \"TypeScript \uD0C0\uC785\uCCB4\uD06C\uB97C \uC2E4\uD589\uD55C\uB2E4.\",\n (cmd) =>\n cmd\n .version(false)\n .hide(\"help\")\n .positional(\"targets\", {\n type: \"string\",\n array: true,\n describe: \"\uD0C0\uC785\uCCB4\uD06C\uD560 \uACBD\uB85C (\uC608: packages/core-common, tests/orm)\",\n default: [],\n })\n .options({\n options: {\n type: \"string\",\n array: true,\n alias: \"o\",\n description: \"sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)\",\n default: [] as string[],\n },\n }),\n async (args) => {\n await runTypecheck({\n targets: args.targets,\n options: args.options,\n });\n },\n )\n .command(\n \"watch [targets..]\",\n \"\uD328\uD0A4\uC9C0\uB97C watch \uBAA8\uB4DC\uB85C \uBE4C\uB4DC\uD55C\uB2E4.\",\n (cmd) =>\n cmd\n .version(false)\n .hide(\"help\")\n .positional(\"targets\", {\n type: \"string\",\n array: true,\n describe: \"watch\uD560 \uD328\uD0A4\uC9C0 (\uC608: solid, solid-demo)\",\n default: [],\n })\n .options({\n options: {\n type: \"string\",\n array: true,\n alias: \"o\",\n description: \"sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)\",\n default: [] as string[],\n },\n }),\n async (args) => {\n await runWatch({\n targets: args.targets,\n options: args.options,\n });\n },\n )\n .command(\n \"dev [targets..]\",\n \"Client\uC640 Server \uD328\uD0A4\uC9C0\uB97C \uAC1C\uBC1C \uBAA8\uB4DC\uB85C \uC2E4\uD589\uD55C\uB2E4.\",\n (cmd) =>\n cmd\n .version(false)\n .hide(\"help\")\n .positional(\"targets\", {\n type: \"string\",\n array: true,\n describe: \"\uC2E4\uD589\uD560 \uD328\uD0A4\uC9C0 (\uC608: solid-demo)\",\n default: [],\n })\n .options({\n options: {\n type: \"string\",\n array: true,\n alias: \"o\",\n description: \"sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)\",\n default: [] as string[],\n },\n }),\n async (args) => {\n await runDev({\n targets: args.targets,\n options: args.options,\n });\n },\n )\n .command(\n \"build [targets..]\",\n \"\uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\uB97C \uC2E4\uD589\uD55C\uB2E4.\",\n (cmd) =>\n cmd\n .version(false)\n .hide(\"help\")\n .positional(\"targets\", {\n type: \"string\",\n array: true,\n describe: \"\uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0 (\uC608: solid, core-common)\",\n default: [],\n })\n .options({\n options: {\n type: \"string\",\n array: true,\n alias: \"o\",\n description: \"sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)\",\n default: [] as string[],\n },\n }),\n async (args) => {\n await runBuild({\n targets: args.targets,\n options: args.options,\n });\n },\n )\n .command(\n \"device\",\n \"Android \uB514\uBC14\uC774\uC2A4\uC5D0\uC11C \uC571\uC744 \uC2E4\uD589\uD55C\uB2E4.\",\n (cmd) =>\n cmd\n .version(false)\n .hide(\"help\")\n .options({\n package: {\n type: \"string\",\n alias: \"p\",\n describe: \"\uD328\uD0A4\uC9C0 \uC774\uB984\",\n demandOption: true,\n },\n url: {\n type: \"string\",\n alias: \"u\",\n describe: \"\uAC1C\uBC1C \uC11C\uBC84 URL (\uBBF8\uC9C0\uC815 \uC2DC sd.config.ts\uC758 server \uC124\uC815 \uC0AC\uC6A9)\",\n },\n options: {\n type: \"string\",\n array: true,\n alias: \"o\",\n description: \"sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)\",\n default: [] as string[],\n },\n }),\n async (args) => {\n await runDevice({\n package: args.package,\n url: args.url,\n options: args.options,\n });\n },\n )\n .command(\n \"init\",\n \"\uC0C8 \uD504\uB85C\uC81D\uD2B8\uB97C \uCD08\uAE30\uD654\uD55C\uB2E4.\",\n (cmd) => cmd.version(false).hide(\"help\"),\n async () => {\n const { runInit } = await import(\"./commands/init.js\");\n await runInit({});\n },\n )\n .command(\"add\", \"\uD504\uB85C\uC81D\uD2B8\uC5D0 \uD328\uD0A4\uC9C0\uB97C \uCD94\uAC00\uD55C\uB2E4.\", (cmd) =>\n cmd\n .version(false)\n .hide(\"help\")\n .command(\n \"client\",\n \"\uD074\uB77C\uC774\uC5B8\uD2B8 \uD328\uD0A4\uC9C0\uB97C \uCD94\uAC00\uD55C\uB2E4.\",\n (subCmd) => subCmd.version(false).hide(\"help\"),\n async () => {\n const { runAddClient } = await import(\"./commands/add-client.js\");\n await runAddClient({});\n },\n )\n .command(\n \"server\",\n \"\uC11C\uBC84 \uD328\uD0A4\uC9C0\uB97C \uCD94\uAC00\uD55C\uB2E4.\",\n (subCmd) => subCmd.version(false).hide(\"help\"),\n async () => {\n const { runAddServer } = await import(\"./commands/add-server.js\");\n await runAddServer({});\n },\n )\n .demandCommand(1, \"\uD328\uD0A4\uC9C0 \uD0C0\uC785\uC744 \uC9C0\uC815\uD574\uC8FC\uC138\uC694. (client, server)\"),\n )\n .command(\n \"publish [targets..]\",\n \"\uD328\uD0A4\uC9C0\uB97C \uBC30\uD3EC\uD55C\uB2E4.\",\n (cmd) =>\n cmd\n .version(false)\n .hide(\"help\")\n .positional(\"targets\", {\n type: \"string\",\n array: true,\n describe: \"\uBC30\uD3EC\uD560 \uD328\uD0A4\uC9C0 (\uC608: solid, core-common)\",\n default: [],\n })\n .options({\n \"build\": {\n type: \"boolean\",\n describe: \"\uBE4C\uB4DC \uC2E4\uD589 (--no-build\uB85C \uC2A4\uD0B5)\",\n default: true,\n },\n \"dry-run\": {\n type: \"boolean\",\n describe: \"\uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC774 \uC2DC\uBBAC\uB808\uC774\uC158\",\n default: false,\n },\n \"options\": {\n type: \"string\",\n array: true,\n alias: \"o\",\n description: \"sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)\",\n default: [] as string[],\n },\n }),\n async (args) => {\n await runPublish({\n targets: args.targets,\n noBuild: !args.build,\n dryRun: args.dryRun,\n options: args.options,\n });\n },\n )\n .demandCommand(1, \"\uBA85\uB839\uC5B4\uB97C \uC9C0\uC815\uD574\uC8FC\uC138\uC694.\")\n .strict();\n}\n\n// CLI\uB85C \uC9C1\uC811 \uC2E4\uD589\uB420 \uB54C\uB9CC \uD30C\uC2F1 \uC218\uD589\n// ESM\uC5D0\uC11C \uBA54\uC778 \uBAA8\uB4C8 \uD310\uBCC4: import.meta.url\uACFC process.argv[1]\uC744 \uC815\uADDC\uD654\uD558\uC5EC \uBE44\uAD50\nconst cliEntryPath = process.argv.at(1);\nif (cliEntryPath != null && fileURLToPath(import.meta.url) === fs.realpathSync(path.resolve(cliEntryPath))) {\n await createCliParser(hideBin(process.argv)).parse();\n}\n"],
5
4
  "mappings": "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",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": [],
4
- "sourcesContent": [],
5
4
  "mappings": "",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/build-env.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport fs from \"fs/promises\";\n\n/**\n * \uB8E8\uD2B8 package.json\uC5D0\uC11C version \uAC00\uC838\uC624\uAE30\n */\nexport async function getVersion(cwd: string): Promise<string> {\n const pkgJsonPath = path.join(cwd, \"package.json\");\n const pkgJsonContent = await fs.readFile(pkgJsonPath, \"utf-8\");\n const pkgJson = JSON.parse(pkgJsonContent) as { version?: string };\n return pkgJson.version ?? \"0.0.0\";\n}\n"],
5
4
  "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAKf,eAAsB,WAAW,KAA8B;AAC7D,QAAM,cAAc,KAAK,KAAK,KAAK,cAAc;AACjD,QAAM,iBAAiB,MAAM,GAAG,SAAS,aAAa,OAAO;AAC7D,QAAM,UAAU,KAAK,MAAM,cAAc;AACzC,SAAO,QAAQ,WAAW;AAC5B;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/config-editor.ts"],
4
- "sourcesContent": ["import { Project, SyntaxKind, type ObjectLiteralExpression } from \"ts-morph\";\n\n/**\n * sd.config.ts\uC5D0\uC11C packages \uAC1D\uCCB4 \uB9AC\uD130\uB7F4\uC744 \uCC3E\uB294\uB2E4.\n *\n * \uAD6C\uC870: const config: SdConfigFn = () => ({ packages: { ... } });\n * -> ArrowFunction -> ParenthesizedExpression -> ObjectLiteral -> \"packages\" property -> ObjectLiteral\n */\nfunction findPackagesObject(configPath: string): {\n project: Project;\n packagesObj: ObjectLiteralExpression;\n} {\n const project = new Project();\n const sourceFile = project.addSourceFileAtPath(configPath);\n\n // \"config\" \uBCC0\uC218 \uC120\uC5B8 \uCC3E\uAE30\n const configVar = sourceFile.getVariableDeclarationOrThrow(\"config\");\n const arrowFn = configVar.getInitializerIfKindOrThrow(SyntaxKind.ArrowFunction);\n\n // \uD654\uC0B4\uD45C \uD568\uC218 \uBCF8\uBB38\uC5D0\uC11C \uBC18\uD658 \uAC1D\uCCB4 \uCC3E\uAE30\n const body = arrowFn.getBody();\n let returnObj: ObjectLiteralExpression;\n\n if (body.isKind(SyntaxKind.ParenthesizedExpression)) {\n returnObj = body.getExpressionIfKindOrThrow(SyntaxKind.ObjectLiteralExpression);\n } else if (body.isKind(SyntaxKind.Block)) {\n const returnStmt = body.getFirstDescendantByKindOrThrow(SyntaxKind.ReturnStatement);\n returnObj = returnStmt.getExpressionIfKindOrThrow(SyntaxKind.ObjectLiteralExpression);\n } else {\n throw new Error(\"sd.config.ts\uC758 \uAD6C\uC870\uB97C \uC778\uC2DD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n }\n\n // \"packages\" \uD504\uB85C\uD37C\uD2F0 \uCC3E\uAE30\n const packagesProp = returnObj.getPropertyOrThrow(\"packages\").asKindOrThrow(SyntaxKind.PropertyAssignment);\n const packagesObj = packagesProp.getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression);\n\n return { project, packagesObj };\n}\n\n/**\n * sd.config.ts\uC758 packages \uAC1D\uCCB4\uC5D0 \uC0C8 \uD328\uD0A4\uC9C0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD55C\uB2E4.\n *\n * @returns true: \uC131\uACF5, false: \uC774\uBBF8 \uC874\uC7AC\n */\nexport function addPackageToSdConfig(\n configPath: string,\n packageName: string,\n config: Record<string, unknown>,\n): boolean {\n const { project, packagesObj } = findPackagesObject(configPath);\n\n // \uC774\uBBF8 \uC874\uC7AC\uD558\uB294\uC9C0 \uD655\uC778 (\uB530\uC634\uD45C \uC788\uB294 \uD615\uD0DC\uC640 \uC5C6\uB294 \uD615\uD0DC \uBAA8\uB450 \uCCB4\uD06C)\n const existing = packagesObj.getProperty(`\"${packageName}\"`) ?? packagesObj.getProperty(packageName);\n if (existing) {\n return false;\n }\n\n // \uC0C8 \uD504\uB85C\uD37C\uD2F0 \uCD94\uAC00 -- config \uAC1D\uCCB4\uB97C ts-morph initializer \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658\n const configStr = JSON.stringify(config)\n .replace(/\"([^\"]+)\":/g, \"$1: \")\n .replace(/\"/g, '\"');\n\n packagesObj.addPropertyAssignment({\n name: `\"${packageName}\"`,\n initializer: configStr,\n });\n\n project.saveSync();\n return true;\n}\n\n/**\n * sd.config.ts\uC5D0\uC11C \uD2B9\uC815 \uD074\uB77C\uC774\uC5B8\uD2B8\uC758 server \uD544\uB4DC\uB97C \uC124\uC815\uD55C\uB2E4.\n */\nexport function setClientServerInSdConfig(configPath: string, clientName: string, serverName: string): void {\n const { project, packagesObj } = findPackagesObject(configPath);\n\n const clientPropNode = packagesObj.getProperty(`\"${clientName}\"`) ?? packagesObj.getProperty(clientName);\n if (clientPropNode == null) {\n throw new Error(`\uD074\uB77C\uC774\uC5B8\uD2B8 \"${clientName}\"\uC744(\uB97C) sd.config.ts\uC5D0\uC11C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n\n const clientProp = clientPropNode.asKindOrThrow(SyntaxKind.PropertyAssignment);\n const clientObj = clientProp.getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression);\n\n // \uAE30\uC874 server \uD504\uB85C\uD37C\uD2F0\uAC00 \uC788\uC73C\uBA74 \uC81C\uAC70\n const serverProp = clientObj.getProperty(\"server\");\n if (serverProp) {\n serverProp.remove();\n }\n\n // server \uD504\uB85C\uD37C\uD2F0 \uCD94\uAC00\n clientObj.addPropertyAssignment({\n name: \"server\",\n initializer: `\"${serverName}\"`,\n });\n\n project.saveSync();\n}\n\n/**\n * eslint.config.ts\uC5D0 tailwindcss \uC124\uC815 \uBE14\uB85D\uC744 \uCD94\uAC00\uD55C\uB2E4.\n *\n * @returns true: \uCD94\uAC00\uB428, false: \uC774\uBBF8 \uC874\uC7AC\n */\nexport function addTailwindToEslintConfig(configPath: string, clientName: string): boolean {\n const project = new Project();\n const sourceFile = project.addSourceFileAtPath(configPath);\n\n // default export \uBC30\uC5F4 \uCC3E\uAE30\n const defaultExport = sourceFile.getFirstDescendantByKindOrThrow(SyntaxKind.ArrayLiteralExpression);\n\n // tailwindcss \uC124\uC815\uC774 \uC774\uBBF8 \uC788\uB294\uC9C0 \uD655\uC778\n const text = defaultExport.getText();\n if (text.includes(\"tailwindcss\")) {\n return false;\n }\n\n // \uC0C8 \uC124\uC815 \uAC1D\uCCB4 \uCD94\uAC00\n defaultExport.addElement(`{\n files: [\"**/*.{ts,tsx}\"],\n settings: {\n tailwindcss: {\n config: \"packages/${clientName}/tailwind.config.ts\",\n },\n },\n }`);\n\n project.saveSync();\n return true;\n}\n"],
5
4
  "mappings": "AAAA,SAAS,SAAS,kBAAgD;AAQlE,SAAS,mBAAmB,YAG1B;AACA,QAAM,UAAU,IAAI,QAAQ;AAC5B,QAAM,aAAa,QAAQ,oBAAoB,UAAU;AAGzD,QAAM,YAAY,WAAW,8BAA8B,QAAQ;AACnE,QAAM,UAAU,UAAU,4BAA4B,WAAW,aAAa;AAG9E,QAAM,OAAO,QAAQ,QAAQ;AAC7B,MAAI;AAEJ,MAAI,KAAK,OAAO,WAAW,uBAAuB,GAAG;AACnD,gBAAY,KAAK,2BAA2B,WAAW,uBAAuB;AAAA,EAChF,WAAW,KAAK,OAAO,WAAW,KAAK,GAAG;AACxC,UAAM,aAAa,KAAK,gCAAgC,WAAW,eAAe;AAClF,gBAAY,WAAW,2BAA2B,WAAW,uBAAuB;AAAA,EACtF,OAAO;AACL,UAAM,IAAI,MAAM,2FAA+B;AAAA,EACjD;AAGA,QAAM,eAAe,UAAU,mBAAmB,UAAU,EAAE,cAAc,WAAW,kBAAkB;AACzG,QAAM,cAAc,aAAa,4BAA4B,WAAW,uBAAuB;AAE/F,SAAO,EAAE,SAAS,YAAY;AAChC;AAOO,SAAS,qBACd,YACA,aACA,QACS;AACT,QAAM,EAAE,SAAS,YAAY,IAAI,mBAAmB,UAAU;AAG9D,QAAM,WAAW,YAAY,YAAY,IAAI,WAAW,GAAG,KAAK,YAAY,YAAY,WAAW;AACnG,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,KAAK,UAAU,MAAM,EACpC,QAAQ,eAAe,MAAM,EAC7B,QAAQ,MAAM,GAAG;AAEpB,cAAY,sBAAsB;AAAA,IAChC,MAAM,IAAI,WAAW;AAAA,IACrB,aAAa;AAAA,EACf,CAAC;AAED,UAAQ,SAAS;AACjB,SAAO;AACT;AAKO,SAAS,0BAA0B,YAAoB,YAAoB,YAA0B;AAC1G,QAAM,EAAE,SAAS,YAAY,IAAI,mBAAmB,UAAU;AAE9D,QAAM,iBAAiB,YAAY,YAAY,IAAI,UAAU,GAAG,KAAK,YAAY,YAAY,UAAU;AACvG,MAAI,kBAAkB,MAAM;AAC1B,UAAM,IAAI,MAAM,mCAAU,UAAU,wFAAiC;AAAA,EACvE;AAEA,QAAM,aAAa,eAAe,cAAc,WAAW,kBAAkB;AAC7E,QAAM,YAAY,WAAW,4BAA4B,WAAW,uBAAuB;AAG3F,QAAM,aAAa,UAAU,YAAY,QAAQ;AACjD,MAAI,YAAY;AACd,eAAW,OAAO;AAAA,EACpB;AAGA,YAAU,sBAAsB;AAAA,IAC9B,MAAM;AAAA,IACN,aAAa,IAAI,UAAU;AAAA,EAC7B,CAAC;AAED,UAAQ,SAAS;AACnB;AAOO,SAAS,0BAA0B,YAAoB,YAA6B;AACzF,QAAM,UAAU,IAAI,QAAQ;AAC5B,QAAM,aAAa,QAAQ,oBAAoB,UAAU;AAGzD,QAAM,gBAAgB,WAAW,gCAAgC,WAAW,sBAAsB;AAGlG,QAAM,OAAO,cAAc,QAAQ;AACnC,MAAI,KAAK,SAAS,aAAa,GAAG;AAChC,WAAO;AAAA,EACT;AAGA,gBAAc,WAAW;AAAA;AAAA;AAAA;AAAA,4BAIC,UAAU;AAAA;AAAA;AAAA,IAGlC;AAEF,UAAQ,SAAS;AACjB,SAAO;AACT;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/copy-src.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport { fsGlob, fsCopy, fsMkdir, fsRm, FsWatcher } from \"@simplysm/core-node\";\n\n/**\n * src/\uC5D0\uC11C glob \uD328\uD134\uC5D0 \uB9E4\uCE6D\uB418\uB294 \uD30C\uC77C\uC744 dist/\uB85C \uBCF5\uC0AC\uD55C\uB2E4.\n * \uC0C1\uB300 \uACBD\uB85C\uAC00 \uC720\uC9C0\uB41C\uB2E4: src/a/b.css \u2192 dist/a/b.css\n *\n * @param pkgDir \uD328\uD0A4\uC9C0 \uB8E8\uD2B8 \uB514\uB809\uD1A0\uB9AC\n * @param patterns glob \uD328\uD134 \uBC30\uC5F4 (src/ \uAE30\uC900 \uC0C1\uB300 \uACBD\uB85C)\n */\nexport async function copySrcFiles(pkgDir: string, patterns: string[]): Promise<void> {\n const srcDir = path.join(pkgDir, \"src\");\n const distDir = path.join(pkgDir, \"dist\");\n\n for (const pattern of patterns) {\n const files = await fsGlob(pattern, { cwd: srcDir, absolute: true });\n for (const file of files) {\n const relativePath = path.relative(srcDir, file);\n const distPath = path.join(distDir, relativePath);\n await fsMkdir(path.dirname(distPath));\n await fsCopy(file, distPath);\n }\n }\n}\n\n/**\n * src/\uC5D0\uC11C glob \uD328\uD134\uC5D0 \uB9E4\uCE6D\uB418\uB294 \uD30C\uC77C\uC744 \uAC10\uC2DC\uD558\uC5EC dist/\uB85C \uBCF5\uC0AC\uD55C\uB2E4.\n * \uCD08\uAE30 \uBCF5\uC0AC \uD6C4 \uBCC0\uACBD/\uCD94\uAC00/\uC0AD\uC81C\uB97C \uC790\uB3D9 \uBC18\uC601\uD55C\uB2E4.\n *\n * @param pkgDir \uD328\uD0A4\uC9C0 \uB8E8\uD2B8 \uB514\uB809\uD1A0\uB9AC\n * @param patterns glob \uD328\uD134 \uBC30\uC5F4 (src/ \uAE30\uC900 \uC0C1\uB300 \uACBD\uB85C)\n * @returns FsWatcher \uC778\uC2A4\uD134\uC2A4 (shutdown \uC2DC close() \uD638\uCD9C \uD544\uC694)\n */\nexport async function watchCopySrcFiles(pkgDir: string, patterns: string[]): Promise<FsWatcher> {\n const srcDir = path.join(pkgDir, \"src\");\n const distDir = path.join(pkgDir, \"dist\");\n\n // \uCD08\uAE30 \uBCF5\uC0AC\n await copySrcFiles(pkgDir, patterns);\n\n // watch \uC2DC\uC791\n const watchPaths = patterns.map((p) => path.join(srcDir, p));\n const watcher = await FsWatcher.watch(watchPaths);\n\n watcher.onChange({ delay: 300 }, async (changes) => {\n for (const { event, path: filePath } of changes) {\n const relPath = path.relative(srcDir, filePath);\n const distPath = path.join(distDir, relPath);\n\n if (event === \"unlink\") {\n await fsRm(distPath);\n } else if (event === \"add\" || event === \"change\") {\n await fsMkdir(path.dirname(distPath));\n await fsCopy(filePath, distPath);\n }\n }\n });\n\n return watcher;\n}\n"],
5
4
  "mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,QAAQ,QAAQ,SAAS,MAAM,iBAAiB;AASzD,eAAsB,aAAa,QAAgB,UAAmC;AACpF,QAAM,SAAS,KAAK,KAAK,QAAQ,KAAK;AACtC,QAAM,UAAU,KAAK,KAAK,QAAQ,MAAM;AAExC,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,MAAM,OAAO,SAAS,EAAE,KAAK,QAAQ,UAAU,KAAK,CAAC;AACnE,eAAW,QAAQ,OAAO;AACxB,YAAM,eAAe,KAAK,SAAS,QAAQ,IAAI;AAC/C,YAAM,WAAW,KAAK,KAAK,SAAS,YAAY;AAChD,YAAM,QAAQ,KAAK,QAAQ,QAAQ,CAAC;AACpC,YAAM,OAAO,MAAM,QAAQ;AAAA,IAC7B;AAAA,EACF;AACF;AAUA,eAAsB,kBAAkB,QAAgB,UAAwC;AAC9F,QAAM,SAAS,KAAK,KAAK,QAAQ,KAAK;AACtC,QAAM,UAAU,KAAK,KAAK,QAAQ,MAAM;AAGxC,QAAM,aAAa,QAAQ,QAAQ;AAGnC,QAAM,aAAa,SAAS,IAAI,CAAC,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC;AAC3D,QAAM,UAAU,MAAM,UAAU,MAAM,UAAU;AAEhD,UAAQ,SAAS,EAAE,OAAO,IAAI,GAAG,OAAO,YAAY;AAClD,eAAW,EAAE,OAAO,MAAM,SAAS,KAAK,SAAS;AAC/C,YAAM,UAAU,KAAK,SAAS,QAAQ,QAAQ;AAC9C,YAAM,WAAW,KAAK,KAAK,SAAS,OAAO;AAE3C,UAAI,UAAU,UAAU;AACtB,cAAM,KAAK,QAAQ;AAAA,MACrB,WAAW,UAAU,SAAS,UAAU,UAAU;AAChD,cAAM,QAAQ,KAAK,QAAQ,QAAQ,CAAC;AACpC,cAAM,OAAO,UAAU,QAAQ;AAAA,MACjC;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;",
6
5
  "names": []
7
6
  }
@@ -37,6 +37,7 @@ export declare function createLibraryEsbuildOptions(options: LibraryEsbuildOptio
37
37
  *
38
38
  * 서버 패키지 빌드에 사용합니다.
39
39
  * - bundle: true (모든 의존성 포함한 단일 번들)
40
+ * - minify: true (코드 보호를 위한 압축)
40
41
  * - banner: CJS 패키지의 require() 지원을 위한 createRequire shim
41
42
  * - env를 define 옵션으로 치환 (process.env["KEY"] 형태)
42
43
  */
@@ -1 +1 @@
1
- {"version":3,"file":"esbuild-config.d.ts","sourceRoot":"","sources":["../../src/utils/esbuild-config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAsC/C;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAYhG;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAuB9F;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAE9F;AAUD;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAU3E;AAyCD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAUrE"}
1
+ {"version":3,"file":"esbuild-config.d.ts","sourceRoot":"","sources":["../../src/utils/esbuild-config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAsC/C;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAWD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAmBhG;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAuB9F;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAE9F;AAUD;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAU3E;AAyCD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAUrE"}
@@ -3,6 +3,7 @@ import { readFileSync, existsSync } from "fs";
3
3
  import fs from "fs/promises";
4
4
  import { createRequire } from "module";
5
5
  import { glob } from "glob";
6
+ import { solidPlugin } from "esbuild-plugin-solid";
6
7
  function esmRelativeImportPlugin(outdir) {
7
8
  return {
8
9
  name: "esm-relative-import",
@@ -29,17 +30,27 @@ function esmRelativeImportPlugin(outdir) {
29
30
  }
30
31
  };
31
32
  }
33
+ function hasSolidDependency(pkgDir) {
34
+ const pkgJson = JSON.parse(readFileSync(path.join(pkgDir, "package.json"), "utf-8"));
35
+ const allDeps = { ...pkgJson.dependencies, ...pkgJson.peerDependencies };
36
+ return "solid-js" in allDeps;
37
+ }
32
38
  function createLibraryEsbuildOptions(options) {
39
+ const plugins = [esmRelativeImportPlugin(path.join(options.pkgDir, "dist"))];
40
+ if (hasSolidDependency(options.pkgDir)) {
41
+ plugins.unshift(solidPlugin());
42
+ }
33
43
  return {
34
44
  entryPoints: options.entryPoints,
35
45
  outdir: path.join(options.pkgDir, "dist"),
36
46
  format: "esm",
37
47
  sourcemap: true,
48
+ sourcesContent: false,
38
49
  platform: options.target === "node" ? "node" : "browser",
39
50
  target: options.target === "node" ? "node20" : "chrome84",
40
51
  bundle: false,
41
52
  tsconfigRaw: { compilerOptions: options.compilerOptions },
42
- plugins: [esmRelativeImportPlugin(path.join(options.pkgDir, "dist"))]
53
+ plugins
43
54
  };
44
55
  }
45
56
  function createServerEsbuildOptions(options) {
@@ -53,7 +64,7 @@ function createServerEsbuildOptions(options) {
53
64
  entryPoints: options.entryPoints,
54
65
  outdir: path.join(options.pkgDir, "dist"),
55
66
  format: "esm",
56
- sourcemap: true,
67
+ minify: true,
57
68
  platform: "node",
58
69
  target: "node20",
59
70
  bundle: true,
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/esbuild-config.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport { readFileSync, existsSync } from \"fs\";\nimport fs from \"fs/promises\";\nimport { createRequire } from \"module\";\nimport { glob } from \"glob\";\nimport type esbuild from \"esbuild\";\nimport type { TypecheckEnv } from \"./tsconfig\";\n\n/**\n * ESM \uC0C1\uB300 import \uACBD\uB85C\uC5D0 .js \uD655\uC7A5\uC790\uB97C \uCD94\uAC00\uD558\uB294 esbuild \uD50C\uB7EC\uADF8\uC778.\n *\n * bundle: false \uBAA8\uB4DC\uC5D0\uC11C esbuild\uB294 import \uACBD\uB85C\uB97C \uADF8\uB300\uB85C \uC720\uC9C0\uD558\uBBC0\uB85C,\n * Node.js ESM\uC5D0\uC11C \uC9C1\uC811 \uC2E4\uD589 \uC2DC \uD655\uC7A5\uC790 \uB204\uB77D\uC73C\uB85C \uBAA8\uB4C8\uC744 \uCC3E\uC9C0 \uBABB\uD558\uB294 \uBB38\uC81C\uB97C \uD574\uACB0\uD55C\uB2E4.\n */\nfunction esmRelativeImportPlugin(outdir: string): esbuild.Plugin {\n return {\n name: \"esm-relative-import\",\n setup(build) {\n build.onEnd(async () => {\n const files = await glob(\"**/*.js\", { cwd: outdir });\n\n await Promise.all(\n files.map(async (file) => {\n const filePath = path.join(outdir, file);\n const content = await fs.readFile(filePath, \"utf-8\");\n\n const rewritten = content.replace(\n /((?:from|import)\\s*[\"'])(\\.\\.?\\/[^\"']*?)([\"'])/g,\n (_match, prefix: string, importPath: string, suffix: string) => {\n if (/\\.(js|mjs|cjs|json|css|wasm|node)$/i.test(importPath)) return _match;\n return `${prefix}${importPath}.js${suffix}`;\n },\n );\n\n if (rewritten !== content) {\n await fs.writeFile(filePath, rewritten);\n }\n }),\n );\n });\n },\n };\n}\n\n/**\n * Library \uBE4C\uB4DC\uC6A9 esbuild \uC635\uC158\n * - bundle: false (\uAC1C\uBCC4 \uD30C\uC77C \uD2B8\uB79C\uC2A4\uD30C\uC77C)\n * - platform: target\uC5D0 \uB530\uB77C node \uB610\uB294 browser\n */\nexport interface LibraryEsbuildOptions {\n pkgDir: string;\n entryPoints: string[];\n target: \"node\" | \"browser\" | \"neutral\";\n compilerOptions: Record<string, unknown>;\n}\n\n/**\n * Server \uBE4C\uB4DC\uC6A9 esbuild \uC635\uC158\n * - bundle: true (\uBAA8\uB4E0 \uC758\uC874\uC131 \uD3EC\uD568\uD55C \uB2E8\uC77C \uBC88\uB4E4)\n */\nexport interface ServerEsbuildOptions {\n pkgDir: string;\n entryPoints: string[];\n compilerOptions: Record<string, unknown>;\n env?: Record<string, string>;\n /** \uBC88\uB4E4\uC5D0\uC11C \uC81C\uC678\uD560 \uC678\uBD80 \uBAA8\uB4C8 */\n external?: string[];\n}\n\n/**\n * Library\uC6A9 esbuild \uC124\uC815 \uC0DD\uC131\n *\n * node/browser/neutral \uD0C0\uAC9F\uC758 \uB77C\uC774\uBE0C\uB7EC\uB9AC \uD328\uD0A4\uC9C0 \uBE4C\uB4DC\uC5D0 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * - bundle: false (\uAC1C\uBCC4 \uD30C\uC77C\uC744 \uAC01\uAC01 \uD2B8\uB79C\uC2A4\uD30C\uC77C)\n * - platform: target\uC774 node\uBA74 node, \uADF8 \uC678\uB294 browser\n * - target: node\uBA74 node20, \uADF8 \uC678\uB294 chrome84\n */\nexport function createLibraryEsbuildOptions(options: LibraryEsbuildOptions): esbuild.BuildOptions {\n return {\n entryPoints: options.entryPoints,\n outdir: path.join(options.pkgDir, \"dist\"),\n format: \"esm\",\n sourcemap: true,\n platform: options.target === \"node\" ? \"node\" : \"browser\",\n target: options.target === \"node\" ? \"node20\" : \"chrome84\",\n bundle: false,\n tsconfigRaw: { compilerOptions: options.compilerOptions as esbuild.TsconfigRaw[\"compilerOptions\"] },\n plugins: [esmRelativeImportPlugin(path.join(options.pkgDir, \"dist\"))],\n };\n}\n\n/**\n * Server\uC6A9 esbuild \uC124\uC815 \uC0DD\uC131\n *\n * \uC11C\uBC84 \uD328\uD0A4\uC9C0 \uBE4C\uB4DC\uC5D0 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * - bundle: true (\uBAA8\uB4E0 \uC758\uC874\uC131 \uD3EC\uD568\uD55C \uB2E8\uC77C \uBC88\uB4E4)\n * - banner: CJS \uD328\uD0A4\uC9C0\uC758 require() \uC9C0\uC6D0\uC744 \uC704\uD55C createRequire shim\n * - env\uB97C define \uC635\uC158\uC73C\uB85C \uCE58\uD658 (process.env[\"KEY\"] \uD615\uD0DC)\n */\nexport function createServerEsbuildOptions(options: ServerEsbuildOptions): esbuild.BuildOptions {\n const define: Record<string, string> = {};\n if (options.env != null) {\n for (const [key, value] of Object.entries(options.env)) {\n define[`process.env[\"${key}\"]`] = JSON.stringify(value);\n }\n }\n\n return {\n entryPoints: options.entryPoints,\n outdir: path.join(options.pkgDir, \"dist\"),\n format: \"esm\",\n sourcemap: true,\n platform: \"node\",\n target: \"node20\",\n bundle: true,\n banner: {\n js: \"import { createRequire } from 'module'; const require = createRequire(import.meta.url);\",\n },\n external: options.external,\n define,\n tsconfigRaw: { compilerOptions: options.compilerOptions as esbuild.TsconfigRaw[\"compilerOptions\"] },\n };\n}\n\n/**\n * \uBE4C\uB4DC \uD0C0\uAC9F\uC5D0\uC11C TypecheckEnv \uCD94\uCD9C\n *\n * \uBE4C\uB4DC\uC6A9\uC774\uBBC0\uB85C neutral\uC740 browser\uB85C \uCC98\uB9AC\uD569\uB2C8\uB2E4.\n * (neutral \uD328\uD0A4\uC9C0\uB294 Node/\uBE0C\uB77C\uC6B0\uC800 \uACF5\uC6A9\uC774\uC9C0\uB9CC, \uBE4C\uB4DC \uC2DC\uC5D0\uB294 browser \uD658\uACBD \uAE30\uC900\uC73C\uB85C \uCC98\uB9AC)\n */\nexport function getTypecheckEnvFromTarget(target: \"node\" | \"browser\" | \"neutral\"): TypecheckEnv {\n return target === \"node\" ? \"node\" : \"browser\";\n}\n\n//#region Optional Peer Deps\n\ninterface PkgJson {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n peerDependenciesMeta?: Record<string, { optional?: boolean }>;\n}\n\n/**\n * \uC758\uC874\uC131 \uD2B8\uB9AC\uC5D0\uC11C \uBBF8\uC124\uCE58 optional peer dep \uC218\uC9D1\n *\n * \uC11C\uBC84 \uBE4C\uB4DC(bundle: true) \uC2DC \uC124\uCE58\uB418\uC9C0 \uC54A\uC740 optional peer dependency\uB97C\n * esbuild external\uB85C \uC9C0\uC815\uD558\uC5EC \uBE4C\uB4DC \uC2E4\uD328\uB97C \uBC29\uC9C0\uD55C\uB2E4.\n */\nexport function collectUninstalledOptionalPeerDeps(pkgDir: string): string[] {\n const external = new Set<string>();\n const visited = new Set<string>();\n\n const pkgJson = JSON.parse(readFileSync(path.join(pkgDir, \"package.json\"), \"utf-8\")) as PkgJson;\n for (const dep of Object.keys(pkgJson.dependencies ?? {})) {\n scanOptionalPeerDeps(dep, pkgDir, external, visited);\n }\n\n return [...external];\n}\n\nfunction scanOptionalPeerDeps(pkgName: string, resolveDir: string, external: Set<string>, visited: Set<string>): void {\n if (visited.has(pkgName)) return;\n visited.add(pkgName);\n\n const req = createRequire(path.join(resolveDir, \"noop.js\"));\n\n let pkgJsonPath: string;\n try {\n pkgJsonPath = req.resolve(`${pkgName}/package.json`);\n } catch {\n return;\n }\n\n const depDir = path.dirname(pkgJsonPath);\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, \"utf-8\")) as PkgJson;\n\n if (pkgJson.peerDependenciesMeta != null) {\n const peerDeps = pkgJson.peerDependencies ?? {};\n const depReq = createRequire(path.join(depDir, \"noop.js\"));\n for (const [name, meta] of Object.entries(pkgJson.peerDependenciesMeta)) {\n if (meta.optional === true && name in peerDeps) {\n try {\n depReq.resolve(name);\n } catch {\n external.add(name);\n }\n }\n }\n }\n\n for (const dep of Object.keys(pkgJson.dependencies ?? {})) {\n scanOptionalPeerDeps(dep, depDir, external, visited);\n }\n}\n\n//#endregion\n\n//#region Native Module Externals\n\n/**\n * \uC758\uC874\uC131 \uC911 binding.gyp\uAC00 \uC788\uB294 \uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8 \uC218\uC9D1\n *\n * node-gyp\uB85C \uBE4C\uB4DC\uB418\uB294 \uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8\uC740 esbuild\uAC00 \uBC88\uB4E4\uB9C1\uD560 \uC218 \uC5C6\uC73C\uBBC0\uB85C\n * external\uB85C \uC9C0\uC815\uD574\uC57C \uD55C\uB2E4.\n */\nexport function collectNativeModuleExternals(pkgDir: string): string[] {\n const external = new Set<string>();\n const visited = new Set<string>();\n\n const pkgJson = JSON.parse(readFileSync(path.join(pkgDir, \"package.json\"), \"utf-8\")) as PkgJson;\n for (const dep of Object.keys(pkgJson.dependencies ?? {})) {\n scanNativeModules(dep, pkgDir, external, visited);\n }\n\n return [...external];\n}\n\nfunction scanNativeModules(pkgName: string, resolveDir: string, external: Set<string>, visited: Set<string>): void {\n if (visited.has(pkgName)) return;\n visited.add(pkgName);\n\n const req = createRequire(path.join(resolveDir, \"noop.js\"));\n\n let pkgJsonPath: string;\n try {\n pkgJsonPath = req.resolve(`${pkgName}/package.json`);\n } catch {\n return;\n }\n\n const depDir = path.dirname(pkgJsonPath);\n\n // binding.gyp \uC874\uC7AC \uC5EC\uBD80\uB85C \uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8 \uAC10\uC9C0\n if (existsSync(path.join(depDir, \"binding.gyp\"))) {\n external.add(pkgName);\n }\n\n // \uD558\uC704 dependencies\uB3C4 \uC7AC\uADC0 \uD0D0\uC0C9\n const depPkgJson = JSON.parse(readFileSync(pkgJsonPath, \"utf-8\")) as PkgJson;\n for (const dep of Object.keys(depPkgJson.dependencies ?? {})) {\n scanNativeModules(dep, depDir, external, visited);\n }\n}\n\n//#endregion\n"],
5
- "mappings": "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",
4
+ "mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,cAAc,kBAAkB;AACzC,OAAO,QAAQ;AACf,SAAS,qBAAqB;AAC9B,SAAS,YAAY;AAErB,SAAS,mBAAmB;AAS5B,SAAS,wBAAwB,QAAgC;AAC/D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,OAAO;AACX,YAAM,MAAM,YAAY;AACtB,cAAM,QAAQ,MAAM,KAAK,WAAW,EAAE,KAAK,OAAO,CAAC;AAEnD,cAAM,QAAQ;AAAA,UACZ,MAAM,IAAI,OAAO,SAAS;AACxB,kBAAM,WAAW,KAAK,KAAK,QAAQ,IAAI;AACvC,kBAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AAEnD,kBAAM,YAAY,QAAQ;AAAA,cACxB;AAAA,cACA,CAAC,QAAQ,QAAgB,YAAoB,WAAmB;AAC9D,oBAAI,sCAAsC,KAAK,UAAU,EAAG,QAAO;AACnE,uBAAO,GAAG,MAAM,GAAG,UAAU,MAAM,MAAM;AAAA,cAC3C;AAAA,YACF;AAEA,gBAAI,cAAc,SAAS;AACzB,oBAAM,GAAG,UAAU,UAAU,SAAS;AAAA,YACxC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AA8BA,SAAS,mBAAmB,QAAyB;AACnD,QAAM,UAAU,KAAK,MAAM,aAAa,KAAK,KAAK,QAAQ,cAAc,GAAG,OAAO,CAAC;AACnF,QAAM,UAAU,EAAE,GAAG,QAAQ,cAAc,GAAG,QAAQ,iBAAiB;AACvE,SAAO,cAAc;AACvB;AAUO,SAAS,4BAA4B,SAAsD;AAChG,QAAM,UAA4B,CAAC,wBAAwB,KAAK,KAAK,QAAQ,QAAQ,MAAM,CAAC,CAAC;AAE7F,MAAI,mBAAmB,QAAQ,MAAM,GAAG;AACtC,YAAQ,QAAQ,YAAY,CAAC;AAAA,EAC/B;AAEA,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB,QAAQ,KAAK,KAAK,QAAQ,QAAQ,MAAM;AAAA,IACxC,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU,QAAQ,WAAW,SAAS,SAAS;AAAA,IAC/C,QAAQ,QAAQ,WAAW,SAAS,WAAW;AAAA,IAC/C,QAAQ;AAAA,IACR,aAAa,EAAE,iBAAiB,QAAQ,gBAA0D;AAAA,IAClG;AAAA,EACF;AACF;AAWO,SAAS,2BAA2B,SAAqD;AAC9F,QAAM,SAAiC,CAAC;AACxC,MAAI,QAAQ,OAAO,MAAM;AACvB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,GAAG;AACtD,aAAO,gBAAgB,GAAG,IAAI,IAAI,KAAK,UAAU,KAAK;AAAA,IACxD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB,QAAQ,KAAK,KAAK,QAAQ,QAAQ,MAAM;AAAA,IACxC,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN,IAAI;AAAA,IACN;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,aAAa,EAAE,iBAAiB,QAAQ,gBAA0D;AAAA,EACpG;AACF;AAQO,SAAS,0BAA0B,QAAsD;AAC9F,SAAO,WAAW,SAAS,SAAS;AACtC;AAgBO,SAAS,mCAAmC,QAA0B;AAC3E,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,UAAU,oBAAI,IAAY;AAEhC,QAAM,UAAU,KAAK,MAAM,aAAa,KAAK,KAAK,QAAQ,cAAc,GAAG,OAAO,CAAC;AACnF,aAAW,OAAO,OAAO,KAAK,QAAQ,gBAAgB,CAAC,CAAC,GAAG;AACzD,yBAAqB,KAAK,QAAQ,UAAU,OAAO;AAAA,EACrD;AAEA,SAAO,CAAC,GAAG,QAAQ;AACrB;AAEA,SAAS,qBAAqB,SAAiB,YAAoB,UAAuB,SAA4B;AACpH,MAAI,QAAQ,IAAI,OAAO,EAAG;AAC1B,UAAQ,IAAI,OAAO;AAEnB,QAAM,MAAM,cAAc,KAAK,KAAK,YAAY,SAAS,CAAC;AAE1D,MAAI;AACJ,MAAI;AACF,kBAAc,IAAI,QAAQ,GAAG,OAAO,eAAe;AAAA,EACrD,QAAQ;AACN;AAAA,EACF;AAEA,QAAM,SAAS,KAAK,QAAQ,WAAW;AACvC,QAAM,UAAU,KAAK,MAAM,aAAa,aAAa,OAAO,CAAC;AAE7D,MAAI,QAAQ,wBAAwB,MAAM;AACxC,UAAM,WAAW,QAAQ,oBAAoB,CAAC;AAC9C,UAAM,SAAS,cAAc,KAAK,KAAK,QAAQ,SAAS,CAAC;AACzD,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,QAAQ,oBAAoB,GAAG;AACvE,UAAI,KAAK,aAAa,QAAQ,QAAQ,UAAU;AAC9C,YAAI;AACF,iBAAO,QAAQ,IAAI;AAAA,QACrB,QAAQ;AACN,mBAAS,IAAI,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,OAAO,OAAO,KAAK,QAAQ,gBAAgB,CAAC,CAAC,GAAG;AACzD,yBAAqB,KAAK,QAAQ,UAAU,OAAO;AAAA,EACrD;AACF;AAYO,SAAS,6BAA6B,QAA0B;AACrE,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,UAAU,oBAAI,IAAY;AAEhC,QAAM,UAAU,KAAK,MAAM,aAAa,KAAK,KAAK,QAAQ,cAAc,GAAG,OAAO,CAAC;AACnF,aAAW,OAAO,OAAO,KAAK,QAAQ,gBAAgB,CAAC,CAAC,GAAG;AACzD,sBAAkB,KAAK,QAAQ,UAAU,OAAO;AAAA,EAClD;AAEA,SAAO,CAAC,GAAG,QAAQ;AACrB;AAEA,SAAS,kBAAkB,SAAiB,YAAoB,UAAuB,SAA4B;AACjH,MAAI,QAAQ,IAAI,OAAO,EAAG;AAC1B,UAAQ,IAAI,OAAO;AAEnB,QAAM,MAAM,cAAc,KAAK,KAAK,YAAY,SAAS,CAAC;AAE1D,MAAI;AACJ,MAAI;AACF,kBAAc,IAAI,QAAQ,GAAG,OAAO,eAAe;AAAA,EACrD,QAAQ;AACN;AAAA,EACF;AAEA,QAAM,SAAS,KAAK,QAAQ,WAAW;AAGvC,MAAI,WAAW,KAAK,KAAK,QAAQ,aAAa,CAAC,GAAG;AAChD,aAAS,IAAI,OAAO;AAAA,EACtB;AAGA,QAAM,aAAa,KAAK,MAAM,aAAa,aAAa,OAAO,CAAC;AAChE,aAAW,OAAO,OAAO,KAAK,WAAW,gBAAgB,CAAC,CAAC,GAAG;AAC5D,sBAAkB,KAAK,QAAQ,UAAU,OAAO;AAAA,EAClD;AACF;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/listr-manager.ts"],
4
- "sourcesContent": ["import { EventEmitter } from \"node:events\";\nimport { Listr } from \"listr2\";\nimport type { consola } from \"consola\";\n\n/**\n * RebuildListrManager \uC774\uBCA4\uD2B8 \uD0C0\uC785\n */\ninterface RebuildListrManagerEvents {\n batchComplete: [];\n}\n\n/**\n * \uB9AC\uBE4C\uB4DC \uC2DC Listr \uC2E4\uD589\uC744 \uAD00\uB9AC\uD558\uB294 \uD074\uB798\uC2A4\n *\n * \uC5EC\uB7EC Worker\uAC00 \uB3D9\uC2DC\uC5D0 buildStart\uB97C \uBC1C\uC0DD\uC2DC\uD0AC \uB54C, \uD55C \uBC88\uC5D0 \uD558\uB098\uC758 Listr\uB9CC \uC2E4\uD589\uB418\uB3C4\uB85D \uBCF4\uC7A5\uD569\uB2C8\uB2E4.\n * \uC2E4\uD589 \uC911\uC5D0 \uB4E4\uC5B4\uC628 \uBE4C\uB4DC \uC694\uCCAD\uC740 pending\uC5D0 \uBAA8\uC544\uB450\uC5C8\uB2E4\uAC00 \uD604\uC7AC \uBC30\uCE58\uAC00 \uC644\uB8CC\uB418\uBA74 \uB2E4\uC74C \uBC30\uCE58\uB85C \uC2E4\uD589\uD569\uB2C8\uB2E4.\n *\n * EventEmitter\uB97C \uD655\uC7A5\uD558\uC5EC \uBC30\uCE58 \uC644\uB8CC \uC2DC `batchComplete` \uC774\uBCA4\uD2B8\uB97C \uBC1C\uC0DD\uC2DC\uD0B5\uB2C8\uB2E4.\n */\nexport class RebuildListrManager extends EventEmitter<RebuildListrManagerEvents> {\n private _isRunning = false;\n private readonly _pendingBuilds = new Map<string, { title: string; promise: Promise<void>; resolver: () => void }>();\n\n constructor(private readonly _logger: ReturnType<typeof consola.withTag>) {\n super();\n }\n\n /**\n * \uBE4C\uB4DC\uB97C \uB4F1\uB85D\uD558\uACE0 resolver \uD568\uC218\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\n *\n * @param key - \uBE4C\uB4DC\uB97C \uC2DD\uBCC4\uD558\uB294 \uACE0\uC720 \uD0A4 (\uC608: \"core-common:build\")\n * @param title - Listr\uC5D0 \uD45C\uC2DC\uD560 \uC81C\uBAA9 (\uC608: \"core-common (node)\")\n * @returns \uC6CC\uCEE4\uAC00 \uBE4C\uB4DC \uC644\uB8CC \uC2DC \uD638\uCD9C\uD560 resolver \uD568\uC218\n */\n registerBuild(key: string, title: string): () => void {\n let resolver!: () => void;\n const promise = new Promise<void>((resolve) => {\n resolver = resolve;\n });\n\n this._pendingBuilds.set(key, { title, promise, resolver });\n\n // Listr\uAC00 \uC2E4\uD589 \uC911\uC774 \uC544\uB2C8\uBA74 \uB2E4\uC74C tick\uC5D0 \uBC30\uCE58 \uC2E4\uD589\n if (!this._isRunning) {\n void Promise.resolve().then(() => void this._runBatch());\n }\n\n return resolver;\n }\n\n /**\n * pending\uC5D0 \uC788\uB294 \uBE4C\uB4DC\uB4E4\uC744 \uBAA8\uC544\uC11C \uD558\uB098\uC758 Listr\uB85C \uC2E4\uD589\uD569\uB2C8\uB2E4.\n * \uC2E4\uD589 \uC911\uC5D0 \uB4E4\uC5B4\uC628 \uC0C8 \uBE4C\uB4DC\uB294 \uB2E4\uC74C \uBC30\uCE58\uB85C \uB118\uC5B4\uAC11\uB2C8\uB2E4.\n */\n private async _runBatch(): Promise<void> {\n if (this._isRunning || this._pendingBuilds.size === 0) {\n return;\n }\n\n this._isRunning = true;\n\n // \uD604\uC7AC pending\uC744 \uC2A4\uB0C5\uC0F7\uC73C\uB85C \uAC00\uC838\uC634\n const batchBuilds = new Map(this._pendingBuilds);\n this._pendingBuilds.clear();\n\n // Listr \uD0DC\uC2A4\uD06C \uC0DD\uC131\n const tasks = Array.from(batchBuilds.entries()).map(([, { title, promise }]) => ({\n title,\n task: () => promise,\n }));\n\n const listr = new Listr(tasks, { concurrent: true });\n\n try {\n await listr.run();\n // \uBC30\uCE58 \uC644\uB8CC \uC774\uBCA4\uD2B8 \uBC1C\uC0DD\n this.emit(\"batchComplete\");\n } catch (err) {\n this._logger.error(\"listr \uC2E4\uD589 \uC911 \uC624\uB958 \uBC1C\uC0DD\", { error: String(err) });\n }\n\n this._isRunning = false;\n\n // \uC2E4\uD589 \uC911 \uC0C8\uB85C \uB4E4\uC5B4\uC628 pending\uC774 \uC788\uC73C\uBA74 \uB2E4\uC74C \uBC30\uCE58 \uC2E4\uD589\n if (this._pendingBuilds.size > 0) {\n void this._runBatch();\n }\n }\n}\n"],
5
4
  "mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,aAAa;AAkBf,MAAM,4BAA4B,aAAwC;AAAA,EAI/E,YAA6B,SAA6C;AACxE,UAAM;AADqB;AAAA,EAE7B;AAAA,EALQ,aAAa;AAAA,EACJ,iBAAiB,oBAAI,IAA6E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAanH,cAAc,KAAa,OAA2B;AACpD,QAAI;AACJ,UAAM,UAAU,IAAI,QAAc,CAAC,YAAY;AAC7C,iBAAW;AAAA,IACb,CAAC;AAED,SAAK,eAAe,IAAI,KAAK,EAAE,OAAO,SAAS,SAAS,CAAC;AAGzD,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,QAAQ,QAAQ,EAAE,KAAK,MAAM,KAAK,KAAK,UAAU,CAAC;AAAA,IACzD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,YAA2B;AACvC,QAAI,KAAK,cAAc,KAAK,eAAe,SAAS,GAAG;AACrD;AAAA,IACF;AAEA,SAAK,aAAa;AAGlB,UAAM,cAAc,IAAI,IAAI,KAAK,cAAc;AAC/C,SAAK,eAAe,MAAM;AAG1B,UAAM,QAAQ,MAAM,KAAK,YAAY,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,OAAO,QAAQ,CAAC,OAAO;AAAA,MAC/E;AAAA,MACA,MAAM,MAAM;AAAA,IACd,EAAE;AAEF,UAAM,QAAQ,IAAI,MAAM,OAAO,EAAE,YAAY,KAAK,CAAC;AAEnD,QAAI;AACF,YAAM,MAAM,IAAI;AAEhB,WAAK,KAAK,eAAe;AAAA,IAC3B,SAAS,KAAK;AACZ,WAAK,QAAQ,MAAM,uDAAoB,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA,IAC/D;AAEA,SAAK,aAAa;AAGlB,QAAI,KAAK,eAAe,OAAO,GAAG;AAChC,WAAK,KAAK,UAAU;AAAA,IACtB;AAAA,EACF;AACF;",
6
5
  "names": []
7
6
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/output-utils.ts"],
4
- "sourcesContent": ["import { consola } from \"consola\";\nimport type { BuildResult } from \"../infra/ResultCollector\";\nimport type { PackageResult } from \"./package-utils\";\n\n/**\n * printErrors\uC5D0\uC11C \uC0AC\uC6A9\uB418\uB294 \uACB0\uACFC \uD0C0\uC785\n * PackageResult\uC640 BuildResult \uBAA8\uB450 \uC9C0\uC6D0\n */\ntype ErrorResult = PackageResult | BuildResult;\n\n/**\n * \uC5D0\uB7EC\uB9CC \uCD9C\uB825\uD55C\uB2E4.\n * \uC131\uACF5\uD55C \uBE4C\uB4DC\uB294 listr\uC758 \uCCB4\uD06C\uB9C8\uD06C\uB85C \uC774\uBBF8 \uD45C\uC2DC\uB418\uBBC0\uB85C \uBCC4\uB3C4 \uCD9C\uB825\uD558\uC9C0 \uC54A\uC74C.\n * @param results \uD328\uD0A4\uC9C0\uBCC4 \uBE4C\uB4DC \uACB0\uACFC \uC0C1\uD0DC\n */\nexport function printErrors(results: Map<string, ErrorResult>): void {\n for (const result of results.values()) {\n if (result.status === \"error\") {\n const typeLabel = result.type === \"dts\" ? \"dts\" : result.target;\n const errorLines: string[] = [`${result.name} (${typeLabel})`];\n if (result.message != null && result.message !== \"\") {\n for (const line of result.message.split(\"\\n\")) {\n errorLines.push(` \u2192 ${line}`);\n }\n }\n consola.error(errorLines.join(\"\\n\"));\n }\n }\n}\n\n/**\n * \uC11C\uBC84 URL\uB9CC \uCD9C\uB825\uD55C\uB2E4.\n * @param results \uD328\uD0A4\uC9C0\uBCC4 \uBE4C\uB4DC \uACB0\uACFC \uC0C1\uD0DC\n * @param serverClientsMap \uC11C\uBC84\uBCC4 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8 \uBAA9\uB85D\n */\nexport function printServers(results: Map<string, PackageResult>, serverClientsMap?: Map<string, string[]>): void {\n // \uC11C\uBC84 \uC815\uBCF4 \uC218\uC9D1\n const servers = [...results.values()].filter((r) => r.status === \"server\" && r.port != null);\n\n // \uC11C\uBC84 \uC815\uBCF4 \uCD9C\uB825 (\uC788\uC73C\uBA74 \uC55E\uC5D0 \uBE48 \uC904 \uCD94\uAC00)\n if (servers.length > 0) {\n process.stdout.write(\"\\n\");\n for (const server of servers) {\n if (server.target === \"server\") {\n // \uC11C\uBC84\uC5D0 \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uC788\uC73C\uBA74 \uD074\uB77C\uC774\uC5B8\uD2B8 URL\uB9CC \uCD9C\uB825\n const clients = serverClientsMap?.get(server.name) ?? [];\n if (clients.length > 0) {\n for (const clientName of clients) {\n consola.info(`[server] http://localhost:${server.port}/${clientName}/`);\n }\n } else {\n // \uC5F0\uACB0\uB41C \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uC5C6\uC73C\uBA74 \uC11C\uBC84 \uB8E8\uD2B8 URL \uCD9C\uB825\n consola.info(`[server] http://localhost:${server.port}/`);\n }\n } else {\n // standalone client\uB294 \uC774\uB984 \uD3EC\uD568\uD574\uC11C \uCD9C\uB825\n consola.info(`[server] http://localhost:${server.port}/${server.name}/`);\n }\n }\n }\n}\n"],
5
4
  "mappings": "AAAA,SAAS,eAAe;AAejB,SAAS,YAAY,SAAyC;AACnE,aAAW,UAAU,QAAQ,OAAO,GAAG;AACrC,QAAI,OAAO,WAAW,SAAS;AAC7B,YAAM,YAAY,OAAO,SAAS,QAAQ,QAAQ,OAAO;AACzD,YAAM,aAAuB,CAAC,GAAG,OAAO,IAAI,KAAK,SAAS,GAAG;AAC7D,UAAI,OAAO,WAAW,QAAQ,OAAO,YAAY,IAAI;AACnD,mBAAW,QAAQ,OAAO,QAAQ,MAAM,IAAI,GAAG;AAC7C,qBAAW,KAAK,YAAO,IAAI,EAAE;AAAA,QAC/B;AAAA,MACF;AACA,cAAQ,MAAM,WAAW,KAAK,IAAI,CAAC;AAAA,IACrC;AAAA,EACF;AACF;AAOO,SAAS,aAAa,SAAqC,kBAAgD;AAEhH,QAAM,UAAU,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY,EAAE,QAAQ,IAAI;AAG3F,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,OAAO,MAAM,IAAI;AACzB,eAAW,UAAU,SAAS;AAC5B,UAAI,OAAO,WAAW,UAAU;AAE9B,cAAM,UAAU,kBAAkB,IAAI,OAAO,IAAI,KAAK,CAAC;AACvD,YAAI,QAAQ,SAAS,GAAG;AACtB,qBAAW,cAAc,SAAS;AAChC,oBAAQ,KAAK,6BAA6B,OAAO,IAAI,IAAI,UAAU,GAAG;AAAA,UACxE;AAAA,QACF,OAAO;AAEL,kBAAQ,KAAK,6BAA6B,OAAO,IAAI,GAAG;AAAA,QAC1D;AAAA,MACF,OAAO;AAEL,gBAAQ,KAAK,6BAA6B,OAAO,IAAI,IAAI,OAAO,IAAI,GAAG;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AACF;",
6
5
  "names": []
7
6
  }