@simplysm/sd-cli 13.0.0-beta.45 → 13.0.0-beta.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/builders/BaseBuilder.js.map +0 -1
- package/dist/builders/DtsBuilder.js.map +0 -1
- package/dist/builders/LibraryBuilder.js.map +0 -1
- package/dist/builders/index.js.map +0 -1
- package/dist/builders/types.js.map +0 -1
- package/dist/capacitor/capacitor.js.map +0 -1
- package/dist/commands/add-client.js.map +0 -1
- package/dist/commands/add-server.js.map +0 -1
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/device.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/lint.js.map +0 -1
- package/dist/commands/publish.js.map +0 -1
- package/dist/commands/typecheck.js.map +0 -1
- package/dist/commands/watch.js.map +0 -1
- package/dist/electron/electron.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/infra/ResultCollector.js.map +0 -1
- package/dist/infra/SignalHandler.js.map +0 -1
- package/dist/infra/WorkerManager.js.map +0 -1
- package/dist/infra/index.js.map +0 -1
- package/dist/orchestrators/WatchOrchestrator.js.map +0 -1
- package/dist/orchestrators/index.js.map +0 -1
- package/dist/sd-cli.js.map +0 -1
- package/dist/sd-config.types.js.map +0 -1
- package/dist/utils/build-env.js.map +0 -1
- package/dist/utils/config-editor.js.map +0 -1
- package/dist/utils/copy-src.js.map +0 -1
- package/dist/utils/esbuild-config.d.ts +1 -0
- package/dist/utils/esbuild-config.d.ts.map +1 -1
- package/dist/utils/esbuild-config.js +13 -2
- package/dist/utils/esbuild-config.js.map +1 -2
- package/dist/utils/listr-manager.js.map +0 -1
- package/dist/utils/output-utils.js.map +0 -1
- package/dist/utils/package-utils.js.map +0 -1
- package/dist/utils/replace-deps.js.map +0 -1
- package/dist/utils/sd-config.js.map +0 -1
- package/dist/utils/spawn.js.map +0 -1
- package/dist/utils/tailwind-config-deps.js.map +0 -1
- package/dist/utils/template.js.map +0 -1
- package/dist/utils/tsconfig.js.map +0 -1
- package/dist/utils/typecheck-serialization.js.map +0 -1
- package/dist/utils/vite-config.js.map +0 -1
- package/dist/utils/worker-events.js.map +0 -1
- package/dist/workers/client.worker.js.map +0 -1
- package/dist/workers/dts.worker.js.map +0 -1
- package/dist/workers/library.worker.js.map +0 -1
- package/dist/workers/server-runtime.worker.js.map +0 -1
- package/dist/workers/server.worker.js.map +0 -1
- package/package.json +6 -4
- package/src/builders/BaseBuilder.ts +141 -0
- package/src/builders/DtsBuilder.ts +138 -0
- package/src/builders/LibraryBuilder.ts +161 -0
- package/src/builders/index.ts +4 -0
- package/src/builders/types.ts +55 -0
- package/src/capacitor/capacitor.ts +827 -0
- package/src/commands/add-client.ts +135 -0
- package/src/commands/add-server.ts +150 -0
- package/src/commands/build.ts +475 -0
- package/src/commands/dev.ts +602 -0
- package/src/commands/device.ts +151 -0
- package/src/commands/init.ts +104 -0
- package/src/commands/lint.ts +216 -0
- package/src/commands/publish.ts +836 -0
- package/src/commands/typecheck.ts +329 -0
- package/src/commands/watch.ts +38 -0
- package/src/electron/electron.ts +329 -0
- package/src/index.ts +1 -0
- package/src/infra/ResultCollector.ts +81 -0
- package/src/infra/SignalHandler.ts +52 -0
- package/src/infra/WorkerManager.ts +65 -0
- package/src/infra/index.ts +3 -0
- package/src/orchestrators/WatchOrchestrator.ts +211 -0
- package/src/orchestrators/index.ts +1 -0
- package/src/sd-cli.ts +307 -0
- package/src/sd-config.types.ts +271 -0
- package/src/utils/build-env.ts +12 -0
- package/src/utils/config-editor.ts +131 -0
- package/src/utils/copy-src.ts +60 -0
- package/src/utils/esbuild-config.ts +263 -0
- package/src/utils/listr-manager.ts +89 -0
- package/src/utils/output-utils.ts +61 -0
- package/src/utils/package-utils.ts +63 -0
- package/src/utils/replace-deps.ts +163 -0
- package/src/utils/sd-config.ts +44 -0
- package/src/utils/spawn.ts +79 -0
- package/src/utils/tailwind-config-deps.ts +95 -0
- package/src/utils/template.ts +51 -0
- package/src/utils/tsconfig.ts +111 -0
- package/src/utils/typecheck-serialization.ts +82 -0
- package/src/utils/vite-config.ts +184 -0
- package/src/utils/worker-events.ts +102 -0
- package/src/workers/client.worker.ts +236 -0
- package/src/workers/dts.worker.ts +416 -0
- package/src/workers/library.worker.ts +245 -0
- package/src/workers/server-runtime.worker.ts +154 -0
- package/src/workers/server.worker.ts +435 -0
- package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
- package/templates/add-server/__SERVER__/package.json.hbs +2 -2
- package/templates/init/package.json.hbs +3 -3
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/package-utils.ts"],
|
|
4
|
-
"sourcesContent": ["import type { SdPackageConfig } from \"../sd-config.types\";\n\n/**\n * \uD328\uD0A4\uC9C0\uBA85\uC5D0\uC11C watch scope \uBAA9\uB85D\uC744 \uC0DD\uC131\uD55C\uB2E4.\n * - \uD328\uD0A4\uC9C0\uBA85\uC758 scope (\uC608: \"@myapp/root\" \u2192 \"@myapp\")\n * - @simplysm (\uD56D\uC0C1 \uD3EC\uD568)\n * @param packageName \uB8E8\uD2B8 package.json\uC758 name \uD544\uB4DC\n * @returns scope \uBC30\uC5F4 (\uC911\uBCF5 \uC81C\uAC70)\n */\nexport function getWatchScopes(packageName: string): string[] {\n const scopes = new Set([\"@simplysm\"]);\n const match = packageName.match(/^(@[^/]+)\\//);\n if (match != null) {\n scopes.add(match[1]);\n }\n return [...scopes];\n}\n\n/**\n * \uD328\uD0A4\uC9C0 \uACB0\uACFC \uC0C1\uD0DC\n */\nexport interface PackageResult {\n name: string;\n target: string;\n type: \"build\" | \"dts\" | \"server\" | \"capacitor\";\n status: \"success\" | \"error\" | \"server\";\n message?: string;\n port?: number;\n}\n\n/**\n * \uD328\uD0A4\uC9C0 \uC124\uC815\uC5D0\uC11C targets \uD544\uD130\uB9C1 (scripts \uD0C0\uAC9F \uC81C\uC678)\n * @param packages \uD328\uD0A4\uC9C0 \uC124\uC815 \uB9F5\n * @param targets \uD544\uD130\uB9C1\uD560 \uD328\uD0A4\uC9C0 \uC774\uB984 \uBAA9\uB85D. \uBE48 \uBC30\uC5F4\uC774\uBA74 scripts\uB97C \uC81C\uC678\uD55C \uBAA8\uB4E0 \uD328\uD0A4\uC9C0 \uBC18\uD658\n * @returns \uD544\uD130\uB9C1\uB41C \uD328\uD0A4\uC9C0 \uC124\uC815 \uB9F5\n * @internal \uD14C\uC2A4\uD2B8\uC6A9\uC73C\uB85C export\n */\nexport function filterPackagesByTargets(\n packages: Record<string, SdPackageConfig | undefined>,\n targets: string[],\n): Record<string, SdPackageConfig> {\n const result: Record<string, SdPackageConfig> = {};\n\n for (const [name, config] of Object.entries(packages)) {\n if (config == null) continue;\n\n // scripts \uD0C0\uAC9F\uC740 watch/dev \uB300\uC0C1\uC5D0\uC11C \uC81C\uC678\n if (config.target === \"scripts\") continue;\n\n // targets\uAC00 \uBE44\uC5B4\uC788\uC73C\uBA74 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0 \uD3EC\uD568\n if (targets.length === 0) {\n result[name] = config;\n continue;\n }\n\n // targets\uC5D0 \uD3EC\uD568\uB41C \uD328\uD0A4\uC9C0\uB9CC \uD544\uD130\uB9C1\n if (targets.includes(name)) {\n result[name] = config;\n }\n }\n\n return result;\n}\n"],
|
|
5
4
|
"mappings": "AASO,SAAS,eAAe,aAA+B;AAC5D,QAAM,SAAS,oBAAI,IAAI,CAAC,WAAW,CAAC;AACpC,QAAM,QAAQ,YAAY,MAAM,aAAa;AAC7C,MAAI,SAAS,MAAM;AACjB,WAAO,IAAI,MAAM,CAAC,CAAC;AAAA,EACrB;AACA,SAAO,CAAC,GAAG,MAAM;AACnB;AAqBO,SAAS,wBACd,UACA,SACiC;AACjC,QAAM,SAA0C,CAAC;AAEjD,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACrD,QAAI,UAAU,KAAM;AAGpB,QAAI,OAAO,WAAW,UAAW;AAGjC,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO,IAAI,IAAI;AACf;AAAA,IACF;AAGA,QAAI,QAAQ,SAAS,IAAI,GAAG;AAC1B,aAAO,IAAI,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/replace-deps.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from \"fs\";\nimport path from \"path\";\nimport { glob } from \"glob\";\nimport { consola } from \"consola\";\n\n/**\n * replaceDeps \uC124\uC815\uC758 glob \uD328\uD134\uACFC \uB300\uC0C1 \uD328\uD0A4\uC9C0 \uBAA9\uB85D\uC744 \uB9E4\uCE6D\uD558\uC5EC\n * { targetName, sourcePath } \uC30D\uC744 \uBC18\uD658\uD55C\uB2E4.\n *\n * @param replaceDeps - sd.config.ts\uC758 replaceDeps \uC124\uC815 (\uD0A4: glob \uD328\uD134, \uAC12: \uC18C\uC2A4 \uACBD\uB85C)\n * @param targetNames - node_modules\uC5D0\uC11C \uCC3E\uC740 \uD328\uD0A4\uC9C0 \uC774\uB984 \uBAA9\uB85D (\uC608: [\"@simplysm/solid\", ...])\n * @returns \uB9E4\uCE6D\uB41C { targetName, sourcePath } \uBC30\uC5F4\n */\nexport function resolveReplaceDepEntries(\n replaceDeps: Record<string, string>,\n targetNames: string[],\n): Array<{ targetName: string; sourcePath: string }> {\n const results: Array<{ targetName: string; sourcePath: string }> = [];\n\n for (const [pattern, sourceTemplate] of Object.entries(replaceDeps)) {\n // glob \uD328\uD134\uC744 \uC815\uADDC\uC2DD\uC73C\uB85C \uBCC0\uD658: * \u2192 (.*), . \u2192 \\., / \u2192 [\\\\/]\n const regexpText = pattern.replace(/[\\\\/.+*]/g, (ch) => {\n if (ch === \"*\") return \"(.*)\";\n if (ch === \".\") return \"\\\\.\";\n if (ch === \"/\" || ch === \"\\\\\") return \"[\\\\\\\\/]\";\n if (ch === \"+\") return \"\\\\+\";\n return ch;\n });\n const regex = new RegExp(`^${regexpText}$`);\n const hasWildcard = pattern.includes(\"*\");\n\n for (const targetName of targetNames) {\n const match = regex.exec(targetName);\n if (match == null) continue;\n\n // \uCEA1\uCC98 \uADF8\uB8F9\uC774 \uC788\uC73C\uBA74 \uC18C\uC2A4 \uACBD\uB85C\uC758 *\uC5D0 \uCE58\uD658\n const sourcePath = hasWildcard ? sourceTemplate.replace(/\\*/g, match[1]) : sourceTemplate;\n\n results.push({ targetName, sourcePath });\n }\n }\n\n return results;\n}\n\n/**\n * pnpm-workspace.yaml \uB0B4\uC6A9\uC744 \uD30C\uC2F1\uD558\uC5EC workspace packages glob \uBC30\uC5F4\uC744 \uBC18\uD658\uD55C\uB2E4.\n * \uBCC4\uB3C4 YAML \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC5C6\uC774 \uAC04\uB2E8\uD55C \uB77C\uC778 \uD30C\uC2F1\uC73C\uB85C \uCC98\uB9AC\uD55C\uB2E4.\n *\n * @param content - pnpm-workspace.yaml \uD30C\uC77C \uB0B4\uC6A9\n * @returns glob \uD328\uD134 \uBC30\uC5F4 (\uC608: [\"packages/*\", \"tools/*\"])\n */\nexport function parseWorkspaceGlobs(content: string): string[] {\n const lines = content.split(\"\\n\");\n const globs: string[] = [];\n let inPackages = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed === \"packages:\") {\n inPackages = true;\n continue;\n }\n\n // packages \uC139\uC158 \uB0B4\uC758 \uB9AC\uC2A4\uD2B8 \uD56D\uBAA9\n if (inPackages && trimmed.startsWith(\"- \")) {\n const value = trimmed\n .slice(2)\n .trim()\n .replace(/^[\"']|[\"']$/g, \"\");\n globs.push(value);\n continue;\n }\n\n // \uB2E4\uB978 \uC139\uC158\uC774 \uC2DC\uC791\uB418\uBA74 \uC885\uB8CC\n if (inPackages && trimmed !== \"\" && !trimmed.startsWith(\"#\")) {\n break;\n }\n }\n\n return globs;\n}\n\n/**\n * replaceDeps \uC124\uC815\uC5D0 \uB530\uB77C node_modules \uB0B4 \uD328\uD0A4\uC9C0\uB97C \uC18C\uC2A4 \uB514\uB809\uD1A0\uB9AC\uB85C symlink \uAD50\uCCB4\uD55C\uB2E4.\n *\n * 1. pnpm-workspace.yaml \uD30C\uC2F1 \u2192 workspace \uD328\uD0A4\uC9C0 \uACBD\uB85C \uBAA9\uB85D\n * 2. [\uB8E8\uD2B8, ...workspace \uD328\uD0A4\uC9C0]\uC758 node_modules\uC5D0\uC11C \uB9E4\uCE6D\uB418\uB294 \uD328\uD0A4\uC9C0 \uCC3E\uAE30\n * 3. \uAE30\uC874 symlink/\uB514\uB809\uD1A0\uB9AC \uC81C\uAC70 \u2192 \uC18C\uC2A4 \uACBD\uB85C\uB85C symlink \uC0DD\uC131\n *\n * @param projectRoot - \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uACBD\uB85C\n * @param replaceDeps - sd.config.ts\uC758 replaceDeps \uC124\uC815\n */\nexport async function setupReplaceDeps(projectRoot: string, replaceDeps: Record<string, string>): Promise<void> {\n const logger = consola.withTag(\"sd:cli:replace-deps\");\n\n // 1. Workspace \uD328\uD0A4\uC9C0 \uACBD\uB85C \uBAA9\uB85D \uC218\uC9D1\n const searchRoots = [projectRoot];\n\n const workspaceYamlPath = path.join(projectRoot, \"pnpm-workspace.yaml\");\n try {\n const yamlContent = await fs.promises.readFile(workspaceYamlPath, \"utf-8\");\n const workspaceGlobs = parseWorkspaceGlobs(yamlContent);\n\n for (const pattern of workspaceGlobs) {\n const dirs = await glob(pattern, { cwd: projectRoot, absolute: true });\n searchRoots.push(...dirs);\n }\n } catch {\n // pnpm-workspace.yaml\uAC00 \uC5C6\uC73C\uBA74 \uB8E8\uD2B8\uB9CC \uCC98\uB9AC\n }\n\n // 2. \uAC01 searchRoot\uC758 node_modules\uC5D0\uC11C \uB9E4\uCE6D\uB418\uB294 \uD328\uD0A4\uC9C0 \uCC3E\uAE30\n for (const searchRoot of searchRoots) {\n const nodeModulesDir = path.join(searchRoot, \"node_modules\");\n\n try {\n await fs.promises.access(nodeModulesDir);\n } catch {\n continue; // node_modules \uC5C6\uC73C\uBA74 \uC2A4\uD0B5\n }\n\n // replaceDeps\uC758 \uAC01 glob \uD328\uD134\uC73C\uB85C node_modules \uB0B4 \uB514\uB809\uD1A0\uB9AC \uD0D0\uC0C9\n const targetNames: string[] = [];\n for (const pattern of Object.keys(replaceDeps)) {\n const matches = await glob(pattern, { cwd: nodeModulesDir });\n targetNames.push(...matches);\n }\n\n if (targetNames.length === 0) continue;\n\n // \uD328\uD134 \uB9E4\uCE6D \uBC0F \uACBD\uB85C \uD574\uC11D\n const entries = resolveReplaceDepEntries(replaceDeps, targetNames);\n\n // 3. Symlink \uAD50\uCCB4\n for (const { targetName, sourcePath } of entries) {\n const targetPath = path.join(nodeModulesDir, targetName);\n const resolvedSourcePath = path.resolve(projectRoot, sourcePath);\n\n // \uC18C\uC2A4 \uACBD\uB85C \uC874\uC7AC \uD655\uC778\n try {\n await fs.promises.access(resolvedSourcePath);\n } catch {\n logger.warn(`\uC18C\uC2A4 \uACBD\uB85C\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC544 \uC2A4\uD0B5\uD569\uB2C8\uB2E4: ${resolvedSourcePath}`);\n continue;\n }\n\n try {\n // \uAE30\uC874 symlink/\uB514\uB809\uD1A0\uB9AC \uC81C\uAC70\n await fs.promises.rm(targetPath, { recursive: true, force: true });\n\n // \uC0C1\uB300 \uACBD\uB85C\uB85C symlink \uC0DD\uC131\n const relativePath = path.relative(path.dirname(targetPath), resolvedSourcePath);\n await fs.promises.symlink(relativePath, targetPath, \"dir\");\n\n logger.info(`${targetName} \u2192 ${sourcePath}`);\n } catch (err) {\n logger.error(`symlink \uAD50\uCCB4 \uC2E4\uD328 (${targetName}): ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n}\n"],
|
|
5
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/utils/sd-config.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport { createJiti } from \"jiti\";\nimport { SdError } from \"@simplysm/core-common\";\nimport { fsExists } from \"@simplysm/core-node\";\nimport type { SdConfig } from \"../sd-config.types\";\n\n/**\n * sd.config.ts \uB85C\uB4DC\n * @returns SdConfig \uAC1D\uCCB4\n * @throws sd.config.ts\uAC00 \uC5C6\uAC70\uB098 \uD615\uC2DD\uC774 \uC798\uBABB\uB41C \uACBD\uC6B0\n */\nexport async function loadSdConfig(params: { cwd: string; dev: boolean; opt: string[] }): Promise<SdConfig> {\n const sdConfigPath = path.resolve(params.cwd, \"sd.config.ts\");\n\n if (!(await fsExists(sdConfigPath))) {\n throw new SdError(`sd.config.ts \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${sdConfigPath}`);\n }\n\n const jiti = createJiti(import.meta.url);\n const sdConfigModule = await jiti.import(sdConfigPath);\n\n if (\n sdConfigModule == null ||\n typeof sdConfigModule !== \"object\" ||\n !(\"default\" in sdConfigModule) ||\n typeof sdConfigModule.default !== \"function\"\n ) {\n throw new SdError(`sd.config.ts\uB294 \uD568\uC218\uB97C default export\uD574\uC57C \uD569\uB2C8\uB2E4: ${sdConfigPath}`);\n }\n\n const config = await sdConfigModule.default(params);\n\n if (\n config == null ||\n typeof config !== \"object\" ||\n !(\"packages\" in config) ||\n config.packages == null ||\n typeof config.packages !== \"object\" ||\n Array.isArray(config.packages)\n ) {\n throw new SdError(`sd.config.ts\uC758 \uBC18\uD658\uAC12\uC774 \uC62C\uBC14\uB978 \uD615\uC2DD\uC774 \uC544\uB2D9\uB2C8\uB2E4: ${sdConfigPath}`);\n }\n return config as SdConfig;\n}\n"],
|
|
5
4
|
"mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,gBAAgB;AAQzB,eAAsB,aAAa,QAAyE;AAC1G,QAAM,eAAe,KAAK,QAAQ,OAAO,KAAK,cAAc;AAE5D,MAAI,CAAE,MAAM,SAAS,YAAY,GAAI;AACnC,UAAM,IAAI,QAAQ,iFAA+B,YAAY,EAAE;AAAA,EACjE;AAEA,QAAM,OAAO,WAAW,YAAY,GAAG;AACvC,QAAM,iBAAiB,MAAM,KAAK,OAAO,YAAY;AAErD,MACE,kBAAkB,QAClB,OAAO,mBAAmB,YAC1B,EAAE,aAAa,mBACf,OAAO,eAAe,YAAY,YAClC;AACA,UAAM,IAAI,QAAQ,wFAA2C,YAAY,EAAE;AAAA,EAC7E;AAEA,QAAM,SAAS,MAAM,eAAe,QAAQ,MAAM;AAElD,MACE,UAAU,QACV,OAAO,WAAW,YAClB,EAAE,cAAc,WAChB,OAAO,YAAY,QACnB,OAAO,OAAO,aAAa,YAC3B,MAAM,QAAQ,OAAO,QAAQ,GAC7B;AACA,UAAM,IAAI,QAAQ,+GAAoC,YAAY,EAAE;AAAA,EACtE;AACA,SAAO;AACT;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
package/dist/utils/spawn.js.map
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/spawn.ts"],
|
|
4
|
-
"sourcesContent": ["import { spawn as cpSpawn, type SpawnOptions as CpSpawnOptions } from \"child_process\";\n\n/**\n * spawn \uC635\uC158\n */\nexport interface SpawnOptions {\n /** \uC791\uC5C5 \uB514\uB809\uD1A0\uB9AC */\n cwd?: string;\n /** \uD658\uACBD\uBCC0\uC218 (process.env\uC640 \uBCD1\uD569) */\n env?: Record<string, string | undefined>;\n /** \uC0C9\uC0C1 \uCD9C\uB825 \uAC15\uC81C \uC5EC\uBD80 (\uAE30\uBCF8\uAC12: NO_COLOR \uD658\uACBD\uBCC0\uC218 \uC874\uC911) */\n forceColor?: boolean;\n}\n\n/**\n * child_process.spawn\uC744 Promise\uB85C \uB798\uD551\uD55C \uD568\uC218.\n *\n * - stdout/stderr\uB97C \uCEA1\uCC98\uD558\uC5EC \uBC18\uD658\n * - NO_COLOR \uD658\uACBD\uBCC0\uC218 \uC874\uC911 (forceColor\uB85C \uC624\uBC84\uB77C\uC774\uB4DC \uAC00\uB2A5)\n * - \uC885\uB8CC \uCF54\uB4DC\uAC00 0\uC774 \uC544\uB2C8\uBA74 \uC5D0\uB7EC throw\n * - Windows\uC5D0\uC11C\uB3C4 shell \uC5C6\uC774 \uC2E4\uD589 (\uBCF4\uC548\uC0C1 shell: true \uC0AC\uC6A9 \uC548 \uD568)\n *\n * @param cmd - \uC2E4\uD589\uD560 \uBA85\uB839\uC5B4\n * @param args - \uBA85\uB839\uC5B4 \uC778\uC790\n * @param options - \uC2E4\uD589 \uC635\uC158\n * @returns stdout \uCD9C\uB825 (stderr\uB294 stdout\uC5D0 \uBCD1\uD569\uB428)\n */\nexport async function spawn(cmd: string, args: string[], options?: SpawnOptions): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n // NO_COLOR \uD658\uACBD\uBCC0\uC218 \uC874\uC911 (https://no-color.org/)\n const noColor = process.env[\"NO_COLOR\"] != null;\n const useColor = options?.forceColor ?? !noColor;\n\n const colorEnv = useColor\n ? {\n FORCE_COLOR: \"1\",\n CLICOLOR_FORCE: \"1\",\n COLORTERM: \"truecolor\",\n }\n : {};\n\n const spawnOptions: CpSpawnOptions = {\n cwd: options?.cwd,\n env: {\n ...process.env,\n ...colorEnv,\n ...options?.env,\n },\n // shell: false for security (avoid shell injection)\n // Windows .bat/.cmd files are handled by calling cmd.exe explicitly in capacitor.ts\n shell: false,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n };\n\n const child = cpSpawn(cmd, args, spawnOptions);\n\n let output = \"\";\n\n child.stdout?.on(\"data\", (data: Buffer) => {\n output += data.toString();\n });\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n output += data.toString();\n });\n\n child.on(\"error\", (err) => {\n reject(new Error(`spawn \uC2E4\uD328 (${cmd}): ${err.message}`));\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(output);\n } else {\n reject(new Error(`\uBA85\uB839\uC5B4 \uC2E4\uD328 (${cmd} ${args.join(\" \")})\\n\uC885\uB8CC \uCF54\uB4DC: ${code}\\n\uCD9C\uB825:\\n${output}`));\n }\n });\n });\n}\n"],
|
|
5
4
|
"mappings": "AAAA,SAAS,SAAS,eAAoD;AA2BtE,eAAsB,MAAM,KAAa,MAAgB,SAAyC;AAChG,SAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAE9C,UAAM,UAAU,QAAQ,IAAI,UAAU,KAAK;AAC3C,UAAM,WAAW,SAAS,cAAc,CAAC;AAEzC,UAAM,WAAW,WACb;AAAA,MACE,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,WAAW;AAAA,IACb,IACA,CAAC;AAEL,UAAM,eAA+B;AAAA,MACnC,KAAK,SAAS;AAAA,MACd,KAAK;AAAA,QACH,GAAG,QAAQ;AAAA,QACX,GAAG;AAAA,QACH,GAAG,SAAS;AAAA,MACd;AAAA;AAAA;AAAA,MAGA,OAAO;AAAA,MACP,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC;AAEA,UAAM,QAAQ,QAAQ,KAAK,MAAM,YAAY;AAE7C,QAAI,SAAS;AAEb,UAAM,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AACzC,gBAAU,KAAK,SAAS;AAAA,IAC1B,CAAC;AAED,UAAM,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AACzC,gBAAU,KAAK,SAAS;AAAA,IAC1B,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,aAAO,IAAI,MAAM,uBAAa,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;AAAA,IACvD,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACd,gBAAQ,MAAM;AAAA,MAChB,OAAO;AACL,eAAO,IAAI,MAAM,oCAAW,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;AAAA,6BAAa,IAAI;AAAA;AAAA,EAAU,MAAM,EAAE,CAAC;AAAA,MACvF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/tailwind-config-deps.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from \"fs\";\nimport path from \"path\";\n\nconst jsExtensions = [\".js\", \".cjs\", \".mjs\"];\n\nconst jsResolutionOrder = [\"\", \".js\", \".cjs\", \".mjs\", \".ts\", \".cts\", \".mts\", \".jsx\", \".tsx\"];\nconst tsResolutionOrder = [\"\", \".ts\", \".cts\", \".mts\", \".tsx\", \".js\", \".cjs\", \".mjs\", \".jsx\"];\n\nfunction resolveWithExtension(file: string, extensions: string[]): string | null {\n for (const ext of extensions) {\n const full = `${file}${ext}`;\n if (fs.existsSync(full) && fs.statSync(full).isFile()) {\n return full;\n }\n }\n for (const ext of extensions) {\n const full = `${file}/index${ext}`;\n if (fs.existsSync(full) && fs.statSync(full).isFile()) {\n return full;\n }\n }\n return null;\n}\n\nfunction resolvePackageFile(specifier: string, fromDir: string): string | null {\n const parts = specifier.split(\"/\");\n const pkgName = specifier.startsWith(\"@\") ? parts.slice(0, 2).join(\"/\") : parts[0];\n const subPath = specifier.startsWith(\"@\") ? parts.slice(2).join(\"/\") : parts.slice(1).join(\"/\");\n\n let searchDir = fromDir;\n while (true) {\n const candidate = path.join(searchDir, \"node_modules\", pkgName);\n if (fs.existsSync(candidate)) {\n const realDir = fs.realpathSync(candidate);\n if (subPath) {\n return resolveWithExtension(path.join(realDir, subPath), tsResolutionOrder);\n }\n return resolveWithExtension(path.join(realDir, \"index\"), tsResolutionOrder);\n }\n const parent = path.dirname(searchDir);\n if (parent === searchDir) break;\n searchDir = parent;\n }\n return null;\n}\n\n/**\n * Tailwind config \uD30C\uC77C\uC758 \uC758\uC874\uC131\uC744 \uC7AC\uADC0\uC801\uC73C\uB85C \uC218\uC9D1\uD55C\uB2E4.\n *\n * Tailwind \uB0B4\uC7A5 `getModuleDependencies`\uB294 \uC0C1\uB300 \uACBD\uB85C import\uB9CC \uCD94\uC801\uD558\uC9C0\uB9CC,\n * \uC774 \uD568\uC218\uB294 \uC9C0\uC815\uB41C scope\uC758 \uD328\uD0A4\uC9C0 \uACBD\uB85C\uB3C4 `node_modules` symlink\uB97C \uD480\uC5B4 \uC2E4\uC81C \uD30C\uC77C\uC744 \uCD94\uC801\uD55C\uB2E4.\n */\nexport function getTailwindConfigDeps(configPath: string, scopes: string[]): string[] {\n const scopePrefixes = scopes.map((s) => (s.endsWith(\"/\") ? s : s + \"/\"));\n const seen = new Set<string>();\n\n function walk(absoluteFile: string): void {\n if (seen.has(absoluteFile)) return;\n if (!fs.existsSync(absoluteFile)) return;\n seen.add(absoluteFile);\n\n const base = path.dirname(absoluteFile);\n const ext = path.extname(absoluteFile);\n const extensions = jsExtensions.includes(ext) ? jsResolutionOrder : tsResolutionOrder;\n\n let contents: string;\n try {\n contents = fs.readFileSync(absoluteFile, \"utf-8\");\n } catch {\n return;\n }\n\n for (const match of [\n ...contents.matchAll(/import[\\s\\S]*?['\"](.{3,}?)['\"]/gi),\n ...contents.matchAll(/import[\\s\\S]*from[\\s\\S]*?['\"](.{3,}?)['\"]/gi),\n ...contents.matchAll(/require\\(['\"`](.+)['\"`]\\)/gi),\n ]) {\n const specifier = match[1];\n let resolved: string | null = null;\n\n if (specifier.startsWith(\".\")) {\n resolved = resolveWithExtension(path.resolve(base, specifier), extensions);\n } else if (scopePrefixes.some((p) => specifier.startsWith(p))) {\n resolved = resolvePackageFile(specifier, base);\n }\n\n if (resolved != null) {\n walk(resolved);\n }\n }\n }\n\n walk(path.resolve(configPath));\n return [...seen];\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/utils/template.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport Handlebars from \"handlebars\";\nimport { fsCopy, fsMkdir, fsRead, fsReaddir, fsStat, fsWrite } from \"@simplysm/core-node\";\n\n/**\n * \uD15C\uD50C\uB9BF \uB514\uB809\uD1A0\uB9AC\uB97C \uC7AC\uADC0\uC801\uC73C\uB85C \uC21C\uD68C\uD558\uBA70 Handlebars \uB80C\uB354\uB9C1 \uD6C4 \uD30C\uC77C\uC744 \uC0DD\uC131\uD55C\uB2E4.\n *\n * - `.hbs` \uD655\uC7A5\uC790 \uD30C\uC77C: Handlebars \uCEF4\uD30C\uC77C \u2192 `.hbs` \uC81C\uAC70\uD55C \uC774\uB984\uC73C\uB85C \uC800\uC7A5\n * - `.hbs` \uACB0\uACFC\uAC00 \uBE48 \uBB38\uC790\uC5F4/\uACF5\uBC31\uB9CC\uC774\uBA74: \uD30C\uC77C \uC0DD\uC131 \uC2A4\uD0B5\n * - \uB098\uBA38\uC9C0 \uD30C\uC77C: \uBC14\uC774\uB108\uB9AC\uB85C \uADF8\uB300\uB85C \uBCF5\uC0AC\n *\n * @param srcDir - \uD15C\uD50C\uB9BF \uC18C\uC2A4 \uB514\uB809\uD1A0\uB9AC\n * @param destDir - \uCD9C\uB825 \uB300\uC0C1 \uB514\uB809\uD1A0\uB9AC\n * @param context - Handlebars \uD15C\uD50C\uB9BF \uBCC0\uC218\n * @param dirReplacements - \uB514\uB809\uD1A0\uB9AC \uC774\uB984 \uCE58\uD658 \uB9F5 (\uC608: `{ __CLIENT__: \"client-admin\" }`)\n */\nexport async function renderTemplateDir(\n srcDir: string,\n destDir: string,\n context: Record<string, unknown>,\n dirReplacements?: Record<string, string>,\n): Promise<void> {\n await fsMkdir(destDir);\n\n const entries = await fsReaddir(srcDir);\n\n for (const entry of entries) {\n const srcPath = path.join(srcDir, entry);\n const stat = await fsStat(srcPath);\n\n if (stat.isDirectory()) {\n // \uB514\uB809\uD1A0\uB9AC \uC774\uB984 \uCE58\uD658 \uC801\uC6A9\n const destName = dirReplacements?.[entry] ?? entry;\n await renderTemplateDir(path.join(srcDir, entry), path.join(destDir, destName), context, dirReplacements);\n } else if (entry.endsWith(\".hbs\")) {\n // Handlebars \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n const source = await fsRead(srcPath);\n const template = Handlebars.compile(source, { noEscape: true });\n const result = template(context);\n\n // \uBE48 \uACB0\uACFC\uBA74 \uD30C\uC77C \uC0DD\uC131 \uC2A4\uD0B5\n if (result.trim().length === 0) continue;\n\n const destFileName = entry.slice(0, -4); // .hbs \uC81C\uAC70\n await fsWrite(path.join(destDir, destFileName), result);\n } else {\n // \uBC14\uC774\uB108\uB9AC \uD30C\uC77C\uC740 \uADF8\uB300\uB85C \uBCF5\uC0AC\n await fsCopy(srcPath, path.join(destDir, entry));\n }\n }\n}\n"],
|
|
5
4
|
"mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,gBAAgB;AACvB,SAAS,QAAQ,SAAS,QAAQ,WAAW,QAAQ,eAAe;AAcpE,eAAsB,kBACpB,QACA,SACA,SACA,iBACe;AACf,QAAM,QAAQ,OAAO;AAErB,QAAM,UAAU,MAAM,UAAU,MAAM;AAEtC,aAAW,SAAS,SAAS;AAC3B,UAAM,UAAU,KAAK,KAAK,QAAQ,KAAK;AACvC,UAAM,OAAO,MAAM,OAAO,OAAO;AAEjC,QAAI,KAAK,YAAY,GAAG;AAEtB,YAAM,WAAW,kBAAkB,KAAK,KAAK;AAC7C,YAAM,kBAAkB,KAAK,KAAK,QAAQ,KAAK,GAAG,KAAK,KAAK,SAAS,QAAQ,GAAG,SAAS,eAAe;AAAA,IAC1G,WAAW,MAAM,SAAS,MAAM,GAAG;AAEjC,YAAM,SAAS,MAAM,OAAO,OAAO;AACnC,YAAM,WAAW,WAAW,QAAQ,QAAQ,EAAE,UAAU,KAAK,CAAC;AAC9D,YAAM,SAAS,SAAS,OAAO;AAG/B,UAAI,OAAO,KAAK,EAAE,WAAW,EAAG;AAEhC,YAAM,eAAe,MAAM,MAAM,GAAG,EAAE;AACtC,YAAM,QAAQ,KAAK,KAAK,SAAS,YAAY,GAAG,MAAM;AAAA,IACxD,OAAO;AAEL,YAAM,OAAO,SAAS,KAAK,KAAK,SAAS,KAAK,CAAC;AAAA,IACjD;AAAA,EACF;AACF;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/tsconfig.ts"],
|
|
4
|
-
"sourcesContent": ["import ts from \"typescript\";\nimport path from \"path\";\nimport { fsExists, fsReadJson } from \"@simplysm/core-node\";\nimport { SdError } from \"@simplysm/core-common\";\n\n/**\n * DOM \uAD00\uB828 lib \uD328\uD134 - \uBE0C\uB77C\uC6B0\uC800 API\uB97C \uD3EC\uD568\uD558\uB294 lib\uB4E4\n * node \uD658\uACBD\uC5D0\uC11C \uC81C\uC678\uB418\uC5B4\uC57C \uD558\uB294 lib\uC744 \uD544\uD130\uB9C1\uD560 \uB54C \uC0AC\uC6A9 (lib.dom.d.ts, lib.webworker.d.ts \uB4F1)\n */\nconst DOM_LIB_PATTERNS = [\"dom\", \"webworker\"] as const;\n\n/**\n * \uD328\uD0A4\uC9C0\uC758 package.json\uC5D0\uC11C @types/* devDependencies\uB97C \uC77D\uC5B4 types \uBAA9\uB85D\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4.\n */\nexport async function getTypesFromPackageJson(packageDir: string): Promise<string[]> {\n const packageJsonPath = path.join(packageDir, \"package.json\");\n if (!(await fsExists(packageJsonPath))) {\n return [];\n }\n\n const packageJson = await fsReadJson<{ devDependencies?: Record<string, string> }>(packageJsonPath);\n const devDeps = packageJson.devDependencies ?? {};\n\n return Object.keys(devDeps)\n .filter((dep) => dep.startsWith(\"@types/\"))\n .map((dep) => dep.replace(\"@types/\", \"\"));\n}\n\n/**\n * \uD0C0\uC785\uCCB4\uD06C \uD658\uACBD\n * - node: DOM lib \uC81C\uAC70 + node \uD0C0\uC785 \uCD94\uAC00\n * - browser: node \uD0C0\uC785 \uC81C\uAC70\n * - neutral: DOM lib \uC720\uC9C0 + node \uD0C0\uC785 \uCD94\uAC00 (Node/\uBE0C\uB77C\uC6B0\uC800 \uACF5\uC6A9 \uD328\uD0A4\uC9C0\uC6A9)\n */\nexport type TypecheckEnv = \"node\" | \"browser\" | \"neutral\";\n\n/**\n * \uD328\uD0A4\uC9C0\uC6A9 \uCEF4\uD30C\uC77C\uB7EC \uC635\uC158 \uC0DD\uC131\n *\n * @param baseOptions \uB8E8\uD2B8 tsconfig\uC758 \uCEF4\uD30C\uC77C\uB7EC \uC635\uC158\n * @param env \uD0C0\uC785\uCCB4\uD06C \uD658\uACBD (node: DOM lib \uC81C\uAC70 + node \uD0C0\uC785 \uCD94\uAC00, browser: node \uD0C0\uC785 \uC81C\uAC70)\n * @param packageDir \uD328\uD0A4\uC9C0 \uB514\uB809\uD1A0\uB9AC \uACBD\uB85C\n *\n * @remarks\n * types \uC635\uC158\uC740 baseOptions.types\uB97C \uBB34\uC2DC\uD558\uACE0 \uD328\uD0A4\uC9C0\uBCC4\uB85C \uC0C8\uB85C \uAD6C\uC131\uD55C\uB2E4.\n * \uC774\uB294 \uB8E8\uD2B8 tsconfig\uC758 \uC804\uC5ED \uD0C0\uC785\uC774 \uD328\uD0A4\uC9C0 \uD658\uACBD\uC5D0 \uB9DE\uC9C0 \uC54A\uC744 \uC218 \uC788\uAE30 \uB54C\uBB38\uC774\uB2E4.\n * (\uC608: browser \uD328\uD0A4\uC9C0\uC5D0 node \uD0C0\uC785\uC774 \uD3EC\uD568\uB418\uB294 \uAC83\uC744 \uBC29\uC9C0)\n */\nexport async function getCompilerOptionsForPackage(\n baseOptions: ts.CompilerOptions,\n env: TypecheckEnv,\n packageDir: string,\n): Promise<ts.CompilerOptions> {\n const options = { ...baseOptions };\n const packageTypes = await getTypesFromPackageJson(packageDir);\n\n // pnpm \uD658\uACBD: \uD328\uD0A4\uC9C0\uBCC4 node_modules/@types\uC640 \uB8E8\uD2B8 node_modules/@types \uBAA8\uB450 \uAC80\uC0C9\n options.typeRoots = [\n path.join(packageDir, \"node_modules\", \"@types\"),\n path.join(process.cwd(), \"node_modules\", \"@types\"),\n ];\n\n switch (env) {\n case \"node\":\n options.lib = options.lib?.filter(\n (lib) => !DOM_LIB_PATTERNS.some((pattern) => lib.toLowerCase().includes(pattern)),\n );\n options.types = [...new Set([...packageTypes, \"node\"])];\n break;\n case \"browser\":\n options.types = packageTypes.filter((t) => t !== \"node\");\n break;\n case \"neutral\":\n options.types = [...new Set([...packageTypes, \"node\"])];\n break;\n }\n\n return options;\n}\n\n/**\n * \uB8E8\uD2B8 tsconfig \uD30C\uC2F1\n * @throws tsconfig.json\uC744 \uC77D\uAC70\uB098 \uD30C\uC2F1\uD560 \uC218 \uC5C6\uB294 \uACBD\uC6B0\n */\nexport function parseRootTsconfig(cwd: string): ts.ParsedCommandLine {\n const tsconfigPath = path.join(cwd, \"tsconfig.json\");\n const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile);\n\n if (configFile.error) {\n const message = ts.flattenDiagnosticMessageText(configFile.error.messageText, \"\\n\");\n throw new SdError(`tsconfig.json \uC77D\uAE30 \uC2E4\uD328: ${message}`);\n }\n\n const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, cwd);\n\n if (parsed.errors.length > 0) {\n const messages = parsed.errors.map((e) => ts.flattenDiagnosticMessageText(e.messageText, \"\\n\"));\n throw new SdError(`tsconfig.json \uD30C\uC2F1 \uC2E4\uD328: ${messages.join(\"; \")}`);\n }\n\n return parsed;\n}\n\n/**\n * \uD328\uD0A4\uC9C0\uC758 \uC18C\uC2A4 \uD30C\uC77C \uBAA9\uB85D \uAC00\uC838\uC624\uAE30 (tsconfig \uAE30\uBC18)\n */\nexport function getPackageSourceFiles(pkgDir: string, parsedConfig: ts.ParsedCommandLine): string[] {\n // \uACBD\uB85C \uAD6C\uBD84\uC790\uAE4C\uC9C0 \uD3EC\uD568\uD558\uC5EC \uBE44\uAD50 (packages/core\uC640 packages/core-common \uAD6C\uBD84)\n const pkgSrcPrefix = path.join(pkgDir, \"src\") + path.sep;\n return parsedConfig.fileNames.filter((f) => f.startsWith(pkgSrcPrefix));\n}\n"],
|
|
5
4
|
"mappings": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,UAAU,kBAAkB;AACrC,SAAS,eAAe;AAMxB,MAAM,mBAAmB,CAAC,OAAO,WAAW;AAK5C,eAAsB,wBAAwB,YAAuC;AACnF,QAAM,kBAAkB,KAAK,KAAK,YAAY,cAAc;AAC5D,MAAI,CAAE,MAAM,SAAS,eAAe,GAAI;AACtC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cAAc,MAAM,WAAyD,eAAe;AAClG,QAAM,UAAU,YAAY,mBAAmB,CAAC;AAEhD,SAAO,OAAO,KAAK,OAAO,EACvB,OAAO,CAAC,QAAQ,IAAI,WAAW,SAAS,CAAC,EACzC,IAAI,CAAC,QAAQ,IAAI,QAAQ,WAAW,EAAE,CAAC;AAC5C;AAsBA,eAAsB,6BACpB,aACA,KACA,YAC6B;AAC7B,QAAM,UAAU,EAAE,GAAG,YAAY;AACjC,QAAM,eAAe,MAAM,wBAAwB,UAAU;AAG7D,UAAQ,YAAY;AAAA,IAClB,KAAK,KAAK,YAAY,gBAAgB,QAAQ;AAAA,IAC9C,KAAK,KAAK,QAAQ,IAAI,GAAG,gBAAgB,QAAQ;AAAA,EACnD;AAEA,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,cAAQ,MAAM,QAAQ,KAAK;AAAA,QACzB,CAAC,QAAQ,CAAC,iBAAiB,KAAK,CAAC,YAAY,IAAI,YAAY,EAAE,SAAS,OAAO,CAAC;AAAA,MAClF;AACA,cAAQ,QAAQ,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,cAAc,MAAM,CAAC,CAAC;AACtD;AAAA,IACF,KAAK;AACH,cAAQ,QAAQ,aAAa,OAAO,CAAC,MAAM,MAAM,MAAM;AACvD;AAAA,IACF,KAAK;AACH,cAAQ,QAAQ,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,cAAc,MAAM,CAAC,CAAC;AACtD;AAAA,EACJ;AAEA,SAAO;AACT;AAMO,SAAS,kBAAkB,KAAmC;AACnE,QAAM,eAAe,KAAK,KAAK,KAAK,eAAe;AACnD,QAAM,aAAa,GAAG,eAAe,cAAc,GAAG,IAAI,QAAQ;AAElE,MAAI,WAAW,OAAO;AACpB,UAAM,UAAU,GAAG,6BAA6B,WAAW,MAAM,aAAa,IAAI;AAClF,UAAM,IAAI,QAAQ,4CAAwB,OAAO,EAAE;AAAA,EACrD;AAEA,QAAM,SAAS,GAAG,2BAA2B,WAAW,QAAQ,GAAG,KAAK,GAAG;AAE3E,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,UAAM,WAAW,OAAO,OAAO,IAAI,CAAC,MAAM,GAAG,6BAA6B,EAAE,aAAa,IAAI,CAAC;AAC9F,UAAM,IAAI,QAAQ,4CAAwB,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,EACjE;AAEA,SAAO;AACT;AAKO,SAAS,sBAAsB,QAAgB,cAA8C;AAElG,QAAM,eAAe,KAAK,KAAK,QAAQ,KAAK,IAAI,KAAK;AACrD,SAAO,aAAa,UAAU,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY,CAAC;AACxE;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/typecheck-serialization.ts"],
|
|
4
|
-
"sourcesContent": ["import ts from \"typescript\";\nimport { fsExistsSync, fsReadSync } from \"@simplysm/core-node\";\n\n/**\n * Worker\uB85C \uC804\uB2EC \uAC00\uB2A5\uD55C \uC9C1\uB82C\uD654\uB41C Diagnostic\n */\nexport interface SerializedDiagnostic {\n category: number;\n code: number;\n messageText: string;\n file?: {\n fileName: string;\n };\n start?: number;\n length?: number;\n}\n\n/**\n * Diagnostic\uC744 \uC9C1\uB82C\uD654 \uAC00\uB2A5\uD55C \uD615\uD0DC\uB85C \uBCC0\uD658\n * (Worker thread \uAC04 structured clone \uD1B5\uC2E0\uC744 \uC704\uD574 \uC21C\uD658 \uCC38\uC870/\uD568\uC218 \uC81C\uAC70)\n */\nexport function serializeDiagnostic(diagnostic: ts.Diagnostic): SerializedDiagnostic {\n // DiagnosticMessageChain\uC778 \uACBD\uC6B0 \uC804\uCCB4 \uCCB4\uC778\uC744 \uD3C9\uD0C4\uD654\uD558\uC5EC \uBAA8\uB4E0 \uCEE8\uD14D\uC2A4\uD2B8 \uC815\uBCF4 \uBCF4\uC874\n const messageText = ts.flattenDiagnosticMessageText(diagnostic.messageText, \"\\n\");\n\n return {\n category: diagnostic.category,\n code: diagnostic.code,\n messageText,\n file: diagnostic.file\n ? {\n fileName: diagnostic.file.fileName,\n }\n : undefined,\n start: diagnostic.start,\n length: diagnostic.length,\n };\n}\n\n/**\n * \uD30C\uC77C\uBA85\uC5D0\uC11C TypeScript ScriptKind \uACB0\uC815\n */\nfunction getScriptKind(fileName: string): ts.ScriptKind {\n if (fileName.endsWith(\".tsx\")) return ts.ScriptKind.TSX;\n if (fileName.endsWith(\".jsx\")) return ts.ScriptKind.JSX;\n if (fileName.endsWith(\".js\") || fileName.endsWith(\".mjs\") || fileName.endsWith(\".cjs\")) return ts.ScriptKind.JS;\n return ts.ScriptKind.TS;\n}\n\n/**\n * SerializedDiagnostic\uC744 ts.Diagnostic\uC73C\uB85C \uBCF5\uC6D0\n * \uC2E4\uC81C \uD30C\uC77C \uB0B4\uC6A9\uC744 \uC77D\uC5B4 formatDiagnosticsWithColorAndContext\uC5D0\uC11C \uC18C\uC2A4 \uCF54\uB4DC \uCEE8\uD14D\uC2A4\uD2B8\uAC00 \uD45C\uC2DC\uB418\uB3C4\uB85D \uD568\n * @param serialized \uC9C1\uB82C\uD654\uB41C \uC9C4\uB2E8 \uC815\uBCF4\n * @param fileCache \uD30C\uC77C \uB0B4\uC6A9 \uCE90\uC2DC (\uB3D9\uC77C \uD30C\uC77C \uC911\uBCF5 \uC77D\uAE30 \uBC29\uC9C0)\n * @returns \uBCF5\uC6D0\uB41C ts.Diagnostic \uAC1D\uCCB4\n */\nexport function deserializeDiagnostic(serialized: SerializedDiagnostic, fileCache: Map<string, string>): ts.Diagnostic {\n let file: ts.SourceFile | undefined;\n if (serialized.file != null) {\n const fileName = serialized.file.fileName;\n\n // \uCE90\uC2DC\uB41C \uD30C\uC77C \uB0B4\uC6A9 \uAC00\uC838\uC624\uAE30 (\uC5C6\uC73C\uBA74 \uC77D\uC5B4\uC11C \uCE90\uC2DC)\n // \uD30C\uC77C\uC774 \uC0AD\uC81C\uB418\uC5C8\uAC70\uB098 \uC811\uADFC \uBD88\uAC00\uB2A5\uD55C \uACBD\uC6B0 \uBE48 \uB0B4\uC6A9\uC73C\uB85C \uCC98\uB9AC\n // (\uC18C\uC2A4 \uCF54\uB4DC \uCEE8\uD14D\uC2A4\uD2B8\uB294 \uD45C\uC2DC\uB418\uC9C0 \uC54A\uC9C0\uB9CC \uC9C4\uB2E8 \uBA54\uC2DC\uC9C0\uB294 \uC815\uC0C1 \uCD9C\uB825\uB428)\n if (!fileCache.has(fileName)) {\n fileCache.set(fileName, fsExistsSync(fileName) ? fsReadSync(fileName) : \"\");\n }\n const content = fileCache.get(fileName)!;\n\n const scriptKind = getScriptKind(fileName);\n file = ts.createSourceFile(fileName, content, ts.ScriptTarget.Latest, false, scriptKind);\n }\n\n return {\n category: serialized.category,\n code: serialized.code,\n messageText: serialized.messageText,\n file,\n start: serialized.start,\n length: serialized.length,\n };\n}\n"],
|
|
5
4
|
"mappings": "AAAA,OAAO,QAAQ;AACf,SAAS,cAAc,kBAAkB;AAoBlC,SAAS,oBAAoB,YAAiD;AAEnF,QAAM,cAAc,GAAG,6BAA6B,WAAW,aAAa,IAAI;AAEhF,SAAO;AAAA,IACL,UAAU,WAAW;AAAA,IACrB,MAAM,WAAW;AAAA,IACjB;AAAA,IACA,MAAM,WAAW,OACb;AAAA,MACE,UAAU,WAAW,KAAK;AAAA,IAC5B,IACA;AAAA,IACJ,OAAO,WAAW;AAAA,IAClB,QAAQ,WAAW;AAAA,EACrB;AACF;AAKA,SAAS,cAAc,UAAiC;AACtD,MAAI,SAAS,SAAS,MAAM,EAAG,QAAO,GAAG,WAAW;AACpD,MAAI,SAAS,SAAS,MAAM,EAAG,QAAO,GAAG,WAAW;AACpD,MAAI,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,MAAM,EAAG,QAAO,GAAG,WAAW;AAC7G,SAAO,GAAG,WAAW;AACvB;AASO,SAAS,sBAAsB,YAAkC,WAA+C;AACrH,MAAI;AACJ,MAAI,WAAW,QAAQ,MAAM;AAC3B,UAAM,WAAW,WAAW,KAAK;AAKjC,QAAI,CAAC,UAAU,IAAI,QAAQ,GAAG;AAC5B,gBAAU,IAAI,UAAU,aAAa,QAAQ,IAAI,WAAW,QAAQ,IAAI,EAAE;AAAA,IAC5E;AACA,UAAM,UAAU,UAAU,IAAI,QAAQ;AAEtC,UAAM,aAAa,cAAc,QAAQ;AACzC,WAAO,GAAG,iBAAiB,UAAU,SAAS,GAAG,aAAa,QAAQ,OAAO,UAAU;AAAA,EACzF;AAEA,SAAO;AAAA,IACL,UAAU,WAAW;AAAA,IACrB,MAAM,WAAW;AAAA,IACjB,aAAa,WAAW;AAAA,IACxB;AAAA,IACA,OAAO,WAAW;AAAA,IAClB,QAAQ,WAAW;AAAA,EACrB;AACF;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/vite-config.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from \"fs\";\nimport { createRequire } from \"module\";\nimport path from \"path\";\nimport type { Plugin, UserConfig as ViteUserConfig } from \"vite\";\nimport tsconfigPaths from \"vite-tsconfig-paths\";\nimport solidPlugin from \"vite-plugin-solid\";\nimport { VitePWA } from \"vite-plugin-pwa\";\nimport tailwindcss from \"tailwindcss\";\nimport type esbuild from \"esbuild\";\nimport { getTailwindConfigDeps } from \"./tailwind-config-deps.js\";\n\n/**\n * Tailwind config\uC758 scope \uD328\uD0A4\uC9C0 \uC758\uC874\uC131\uC744 watch\uD558\uB294 Vite \uD50C\uB7EC\uADF8\uC778.\n *\n * Tailwind CSS\uC758 \uB0B4\uC7A5 \uC758\uC874\uC131 \uCD94\uC801\uC740 \uC0C1\uB300 \uACBD\uB85C import\uB9CC \uCC98\uB9AC\uD558\uBBC0\uB85C,\n * preset \uB4F1\uC73C\uB85C \uCC38\uC870\uD558\uB294 scope \uD328\uD0A4\uC9C0\uC758 config \uBCC0\uACBD\uC744 \uAC10\uC9C0\uD558\uC9C0 \uBABB\uD55C\uB2E4.\n * \uC774 \uD50C\uB7EC\uADF8\uC778\uC774 \uD574\uB2F9 \uD30C\uC77C\uB4E4\uC744 watch\uD558\uACE0, \uBCC0\uACBD \uC2DC Tailwind \uCE90\uC2DC\uB97C \uBB34\uD6A8\uD654\uD55C\uB2E4.\n */\nfunction sdTailwindConfigDepsPlugin(pkgDir: string): Plugin {\n return {\n name: \"sd-tailwind-config-deps\",\n configureServer(server) {\n const configPath = path.join(pkgDir, \"tailwind.config.ts\");\n if (!fs.existsSync(configPath)) return;\n\n // \uD604\uC7AC \uD328\uD0A4\uC9C0\uC758 scope + @simplysm \uC744 \uD56D\uC0C1 \uD3EC\uD568\n const pkgJsonPath = path.join(pkgDir, \"package.json\");\n const pkgName = JSON.parse(fs.readFileSync(pkgJsonPath, \"utf-8\")).name as string;\n const pkgScope = pkgName.match(/^(@[^/]+)\\//)?.[1];\n const scopes = new Set([\"@simplysm\"]);\n if (pkgScope != null) {\n scopes.add(pkgScope);\n }\n\n const allDeps = getTailwindConfigDeps(configPath, [...scopes]);\n const configAbsolute = path.resolve(configPath);\n const externalDeps = allDeps.filter((d) => d !== configAbsolute);\n if (externalDeps.length === 0) return;\n\n for (const dep of externalDeps) {\n server.watcher.add(dep);\n }\n\n server.watcher.on(\"change\", (changed) => {\n if (externalDeps.some((d) => path.normalize(d) === path.normalize(changed))) {\n // jiti (Tailwind\uC758 config \uB85C\uB354)\uAC00 \uC0AC\uC6A9\uD558\uB294 require \uCE90\uC2DC\uB97C \uC815\uB9AC\uD558\uC5EC\n // config \uC7AC\uB85C\uB4DC \uC2DC \uBCC0\uACBD\uB41C \uD30C\uC77C\uC774 \uC0C8\uB85C \uC77D\uD788\uB3C4\uB85D \uD55C\uB2E4\n const _require = createRequire(import.meta.url);\n for (const dep of allDeps) {\n delete _require.cache[dep];\n }\n\n // Tailwind \uCE90\uC2DC \uBB34\uD6A8\uD654: config\uC758 mtime\uC744 \uAC31\uC2E0\uD558\uC5EC \uC7AC\uB85C\uB4DC \uC720\uB3C4\n const now = new Date();\n fs.utimesSync(configPath, now, now);\n server.ws.send({ type: \"full-reload\" });\n }\n });\n },\n };\n}\n\n/**\n * scope \uD328\uD0A4\uC9C0\uC758 dist \uB514\uB809\uD1A0\uB9AC \uBCC0\uACBD\uC744 \uAC10\uC9C0\uD558\uB294 Vite \uD50C\uB7EC\uADF8\uC778.\n *\n * Vite\uB294 node_modules\uB97C \uAE30\uBCF8\uC801\uC73C\uB85C watch\uC5D0\uC11C \uC81C\uC678\uD558\uBBC0\uB85C,\n * scope \uD328\uD0A4\uC9C0\uC758 dist \uD30C\uC77C\uC774 \uBCC0\uACBD\uB418\uC5B4\uB3C4 HMR/\uB9AC\uBE4C\uB4DC\uAC00 \uD2B8\uB9AC\uAC70\uB418\uC9C0 \uC54A\uB294\uB2E4.\n * \uC774 \uD50C\uB7EC\uADF8\uC778\uC740 scope \uD328\uD0A4\uC9C0\uC758 dist \uB514\uB809\uD1A0\uB9AC\uB97C watcher\uC5D0 \uBA85\uC2DC\uC801\uC73C\uB85C \uCD94\uAC00\uD558\uACE0,\n * optimizeDeps\uC5D0\uC11C \uC81C\uC678\uD558\uC5EC pre-bundled \uCE90\uC2DC\uB85C \uC778\uD55C \uBCC0\uACBD \uBB34\uC2DC\uB97C \uBC29\uC9C0\uD55C\uB2E4.\n */\nfunction sdScopeWatchPlugin(pkgDir: string, scopes: string[]): Plugin {\n return {\n name: \"sd-scope-watch\",\n config() {\n return {\n optimizeDeps: {\n exclude: scopes.flatMap((s) => {\n // scope \uD328\uD0A4\uC9C0\uB97C pre-bundling\uC5D0\uC11C \uC81C\uC678\uD558\uC5EC \uC18C\uC2A4 \uCF54\uB4DC\uB85C \uCDE8\uAE09\n const scopeDir = path.join(pkgDir, \"node_modules\", s);\n if (!fs.existsSync(scopeDir)) return [];\n return fs.readdirSync(scopeDir).map((name) => `${s}/${name}`);\n }),\n },\n };\n },\n configureServer(server) {\n for (const scope of scopes) {\n const scopeDir = path.join(pkgDir, \"node_modules\", scope);\n if (!fs.existsSync(scopeDir)) continue;\n\n for (const pkgName of fs.readdirSync(scopeDir)) {\n const distDir = path.join(scopeDir, pkgName, \"dist\");\n if (fs.existsSync(distDir)) {\n server.watcher.add(distDir);\n }\n }\n }\n },\n };\n}\n\n/**\n * Vite \uC124\uC815 \uC0DD\uC131 \uC635\uC158\n */\nexport interface ViteConfigOptions {\n pkgDir: string;\n name: string;\n tsconfigPath: string;\n compilerOptions: Record<string, unknown>;\n env?: Record<string, string>;\n mode: \"build\" | \"dev\";\n /** dev \uBAA8\uB4DC\uC77C \uB54C \uC11C\uBC84 \uD3EC\uD2B8 (0\uC774\uBA74 \uC790\uB3D9 \uD560\uB2F9) */\n serverPort?: number;\n /** watch \uB300\uC0C1 scope \uBAA9\uB85D (\uC608: [\"@myapp\", \"@simplysm\"]) */\n watchScopes?: string[];\n}\n\n/**\n * Vite \uC124\uC815 \uC0DD\uC131\n *\n * SolidJS + TailwindCSS \uAE30\uBC18\uC758 client \uD328\uD0A4\uC9C0 \uBE4C\uB4DC/\uAC1C\uBC1C \uC11C\uBC84\uC6A9 \uC124\uC815\uC785\uB2C8\uB2E4.\n * - build \uBAA8\uB4DC: production \uBE4C\uB4DC (logLevel: silent)\n * - dev \uBAA8\uB4DC: dev server (define\uC73C\uB85C env \uCE58\uD658, server \uC124\uC815)\n */\nexport function createViteConfig(options: ViteConfigOptions): ViteUserConfig {\n const { pkgDir, name, tsconfigPath, compilerOptions, env, mode, serverPort, watchScopes } = options;\n\n // Read package.json to extract app name for PWA manifest\n const pkgJsonPath = path.join(pkgDir, \"package.json\");\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, \"utf-8\")) as { name: string };\n const appName = pkgJson.name.replace(/^@[^/]+\\//, \"\");\n\n // process.env \uCE58\uD658 (dev \uBAA8\uB4DC\uC5D0\uC11C\uB9CC \uC0AC\uC6A9, build \uBAA8\uB4DC\uB294 inline\uC73C\uB85C \uCC98\uB9AC\uB428)\n const envDefine: Record<string, string> = {};\n if (env != null) {\n envDefine[\"process.env\"] = JSON.stringify(env);\n }\n\n const config: ViteUserConfig = {\n root: pkgDir,\n base: `/${name}/`,\n plugins: [\n tsconfigPaths({ projects: [tsconfigPath] }),\n solidPlugin(),\n VitePWA({\n registerType: \"prompt\",\n injectRegister: \"script\",\n manifest: {\n name: appName,\n short_name: appName,\n display: \"standalone\",\n theme_color: \"#ffffff\",\n background_color: \"#ffffff\",\n },\n workbox: {\n globPatterns: [\"**/*.{js,css,html,ico,png,svg,woff2}\"],\n },\n }),\n sdTailwindConfigDepsPlugin(pkgDir),\n ...(watchScopes != null && watchScopes.length > 0 ? [sdScopeWatchPlugin(pkgDir, watchScopes)] : []),\n ],\n css: {\n postcss: {\n plugins: [tailwindcss({ config: path.join(pkgDir, \"tailwind.config.ts\") })],\n },\n },\n esbuild: {\n tsconfigRaw: { compilerOptions: compilerOptions as esbuild.TsconfigRaw[\"compilerOptions\"] },\n },\n };\n\n if (mode === \"build\") {\n config.logLevel = \"silent\";\n } else {\n // dev \uBAA8\uB4DC\n config.define = envDefine;\n config.server = {\n port: serverPort === 0 ? undefined : serverPort,\n strictPort: serverPort !== 0 && serverPort !== undefined,\n };\n }\n\n return config;\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/utils/worker-events.ts"],
|
|
4
|
-
"sourcesContent": ["import type { PackageResult } from \"./package-utils\";\nimport type { SdPackageConfig } from \"../sd-config.types\";\nimport type { RebuildListrManager } from \"./listr-manager\";\n\n/** Worker \uBE4C\uB4DC \uC644\uB8CC \uC774\uBCA4\uD2B8 \uB370\uC774\uD130 */\nexport interface BuildEventData {\n success: boolean;\n errors?: string[];\n}\n\n/** Worker \uC5D0\uB7EC \uC774\uBCA4\uD2B8 \uB370\uC774\uD130 */\nexport interface ErrorEventData {\n message: string;\n}\n\n/** Worker \uC11C\uBC84 \uC900\uBE44 \uC774\uBCA4\uD2B8 \uB370\uC774\uD130 */\nexport interface ServerReadyEventData {\n port: number;\n}\n\n/** Server Build \uC644\uB8CC \uC774\uBCA4\uD2B8 \uB370\uC774\uD130 */\nexport interface ServerBuildEventData {\n success: boolean;\n mainJsPath: string;\n errors?: string[];\n}\n\n/**\n * \uAE30\uBCF8 Worker \uC815\uBCF4 \uD0C0\uC785\n */\nexport interface BaseWorkerInfo {\n name: string;\n config: SdPackageConfig;\n worker: { on: (event: string, handler: (data: unknown) => void) => void };\n isInitialBuild: boolean;\n buildResolver: (() => void) | undefined;\n}\n\n/**\n * Worker \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uC635\uC158\n */\nexport interface WorkerEventHandlerOptions {\n resultKey: string;\n listrTitle: string;\n resultType: \"build\" | \"dts\";\n}\n\n/**\n * \uACF5\uD1B5 Worker \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC \uB4F1\uB85D (buildStart, build, error\uB9CC - serverReady\uB294 \uD3EC\uD568\uD558\uC9C0 \uC54A\uC74C)\n *\n * @param workerInfo Worker \uC815\uBCF4\n * @param opts \uD578\uB4E4\uB7EC \uC635\uC158\n * @param results \uACB0\uACFC \uB9F5\n * @param rebuildManager \uB9AC\uBE4C\uB4DC \uB9E4\uB2C8\uC800\n * @returns completeTask \uD568\uC218 (\uACB0\uACFC\uB97C \uC800\uC7A5\uD558\uACE0 \uBE4C\uB4DC \uC644\uB8CC\uB97C \uC54C\uB9BC)\n */\nexport function registerWorkerEventHandlers<T extends BaseWorkerInfo>(\n workerInfo: T,\n opts: WorkerEventHandlerOptions,\n results: Map<string, PackageResult>,\n rebuildManager: RebuildListrManager,\n): (result: PackageResult) => void {\n const completeTask = (result: PackageResult): void => {\n results.set(opts.resultKey, result);\n workerInfo.buildResolver?.();\n workerInfo.buildResolver = undefined;\n workerInfo.isInitialBuild = false;\n };\n\n // \uBE4C\uB4DC \uC2DC\uC791 (\uB9AC\uBE4C\uB4DC \uC2DC)\n workerInfo.worker.on(\"buildStart\", () => {\n if (!workerInfo.isInitialBuild) {\n workerInfo.buildResolver = rebuildManager.registerBuild(opts.resultKey, opts.listrTitle);\n }\n });\n\n // \uBE4C\uB4DC \uC644\uB8CC\n workerInfo.worker.on(\"build\", (data) => {\n const event = data as BuildEventData;\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: opts.resultType,\n status: event.success ? \"success\" : \"error\",\n message: event.errors?.join(\"\\n\"),\n });\n });\n\n // \uC5D0\uB7EC\n workerInfo.worker.on(\"error\", (data) => {\n const event = data as ErrorEventData;\n completeTask({\n name: workerInfo.name,\n target: workerInfo.config.target,\n type: opts.resultType,\n status: \"error\",\n message: event.message,\n });\n });\n\n return completeTask;\n}\n"],
|
|
5
4
|
"mappings": "AAwDO,SAAS,4BACd,YACA,MACA,SACA,gBACiC;AACjC,QAAM,eAAe,CAAC,WAAgC;AACpD,YAAQ,IAAI,KAAK,WAAW,MAAM;AAClC,eAAW,gBAAgB;AAC3B,eAAW,gBAAgB;AAC3B,eAAW,iBAAiB;AAAA,EAC9B;AAGA,aAAW,OAAO,GAAG,cAAc,MAAM;AACvC,QAAI,CAAC,WAAW,gBAAgB;AAC9B,iBAAW,gBAAgB,eAAe,cAAc,KAAK,WAAW,KAAK,UAAU;AAAA,IACzF;AAAA,EACF,CAAC;AAGD,aAAW,OAAO,GAAG,SAAS,CAAC,SAAS;AACtC,UAAM,QAAQ;AACd,iBAAa;AAAA,MACX,MAAM,WAAW;AAAA,MACjB,QAAQ,WAAW,OAAO;AAAA,MAC1B,MAAM,KAAK;AAAA,MACX,QAAQ,MAAM,UAAU,YAAY;AAAA,MACpC,SAAS,MAAM,QAAQ,KAAK,IAAI;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AAGD,aAAW,OAAO,GAAG,SAAS,CAAC,SAAS;AACtC,UAAM,QAAQ;AACd,iBAAa;AAAA,MACX,MAAM,WAAW;AAAA,MACjB,QAAQ,WAAW,OAAO;AAAA,MAC1B,MAAM,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/workers/client.worker.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport { build as viteBuild, createServer, type ViteDevServer } from \"vite\";\nimport { createWorker } from \"@simplysm/core-node\";\nimport { consola } from \"consola\";\nimport type { SdClientPackageConfig } from \"../sd-config.types\";\nimport { parseRootTsconfig, getCompilerOptionsForPackage } from \"../utils/tsconfig\";\nimport { createViteConfig } from \"../utils/vite-config\";\n\n//#region Types\n\n/**\n * Client \uBE4C\uB4DC \uC815\uBCF4 (\uC77C\uD68C\uC131 \uBE4C\uB4DC\uC6A9)\n */\nexport interface ClientBuildInfo {\n name: string;\n config: SdClientPackageConfig;\n cwd: string;\n pkgDir: string;\n}\n\n/**\n * Client \uBE4C\uB4DC \uACB0\uACFC\n */\nexport interface ClientBuildResult {\n success: boolean;\n errors?: string[];\n}\n\n/**\n * Client Watch \uC815\uBCF4\n */\nexport interface ClientWatchInfo {\n name: string;\n config: SdClientPackageConfig;\n cwd: string;\n pkgDir: string;\n /** watch \uB300\uC0C1 scope \uBAA9\uB85D */\n watchScopes?: string[];\n}\n\n/**\n * \uBE4C\uB4DC \uC774\uBCA4\uD2B8\n */\nexport interface ClientBuildEvent {\n success: boolean;\n errors?: string[];\n}\n\n/**\n * \uC11C\uBC84 \uC900\uBE44 \uC774\uBCA4\uD2B8\n */\nexport interface ClientServerReadyEvent {\n port: number;\n}\n\n/**\n * \uC5D0\uB7EC \uC774\uBCA4\uD2B8\n */\nexport interface ClientErrorEvent {\n message: string;\n}\n\n/**\n * Worker \uC774\uBCA4\uD2B8 \uD0C0\uC785\n */\nexport interface ClientWorkerEvents extends Record<string, unknown> {\n buildStart: Record<string, never>;\n build: ClientBuildEvent;\n serverReady: ClientServerReadyEvent;\n error: ClientErrorEvent;\n}\n\n//#endregion\n\n//#region \uB9AC\uC18C\uC2A4 \uAD00\uB9AC\n\nconst logger = consola.withTag(\"sd:cli:client:worker\");\n\n/** Vite dev server (\uC815\uB9AC \uB300\uC0C1) */\nlet viteServer: ViteDevServer | undefined;\n\n/**\n * \uB9AC\uC18C\uC2A4 \uC815\uB9AC\n */\nasync function cleanup(): Promise<void> {\n // \uC804\uC5ED \uBCC0\uC218\uB97C \uC784\uC2DC \uBCC0\uC218\uB85C \uCEA1\uCC98 \uD6C4 \uCD08\uAE30\uD654\n // (Promise.all \uB300\uAE30 \uC911 \uB2E4\uB978 \uD638\uCD9C\uC5D0\uC11C \uC804\uC5ED \uBCC0\uC218\uB97C \uC218\uC815\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C)\n const serverToClose = viteServer;\n viteServer = undefined;\n\n if (serverToClose != null) {\n await serverToClose.close();\n }\n}\n\n// \uD504\uB85C\uC138\uC2A4 \uC885\uB8CC \uC804 \uB9AC\uC18C\uC2A4 \uC815\uB9AC (SIGTERM/SIGINT)\n// \uC8FC\uC758: worker.terminate()\uB294 \uC774 \uD578\uB4E4\uB7EC\uB4E4\uC744 \uD638\uCD9C\uD558\uC9C0 \uC54A\uACE0 \uC989\uC2DC \uC885\uB8CC\uB428.\n// \uADF8\uB7EC\uB098 watch \uBAA8\uB4DC\uC5D0\uC11C \uC815\uC0C1 \uC885\uB8CC\uB294 \uBA54\uC778 \uD504\uB85C\uC138\uC2A4\uC758 SIGINT/SIGTERM\uC744 \uD1B5\uD574 \uC774\uB8E8\uC5B4\uC9C0\uBBC0\uB85C \uBB38\uC81C\uC5C6\uC74C.\nprocess.on(\"SIGTERM\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\nprocess.on(\"SIGINT\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\n//#endregion\n\n//#region Worker\n\n/**\n * \uC77C\uD68C\uC131 \uBE4C\uB4DC\n */\nasync function build(info: ClientBuildInfo): Promise<ClientBuildResult> {\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const tsconfigPath = path.join(info.cwd, \"tsconfig.json\");\n\n // browser \uD0C0\uAC9F\uC6A9 compilerOptions \uC0DD\uC131\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, \"browser\", info.pkgDir);\n\n // Vite \uC124\uC815 \uC0DD\uC131 \uBC0F \uBE4C\uB4DC\n const viteConfig = createViteConfig({\n pkgDir: info.pkgDir,\n name: info.name,\n tsconfigPath,\n compilerOptions,\n env: info.config.env,\n mode: \"build\",\n });\n\n await viteBuild(viteConfig);\n\n // Generate .config.json\n const confDistPath = path.join(info.pkgDir, \"dist\", \".config.json\");\n fs.writeFileSync(confDistPath, JSON.stringify(info.config.configs ?? {}, undefined, 2));\n\n return { success: true };\n } catch (err) {\n return {\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n };\n }\n}\n\n/** startWatch \uD638\uCD9C \uC5EC\uBD80 \uD50C\uB798\uADF8 */\nlet isWatchStarted = false;\n\n/**\n * watch \uC2DC\uC791 (Vite dev server)\n * @remarks \uC774 \uD568\uC218\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.\n * @throws \uC774\uBBF8 watch\uAC00 \uC2DC\uC791\uB41C \uACBD\uC6B0\n */\nasync function startWatch(info: ClientWatchInfo): Promise<void> {\n if (isWatchStarted) {\n throw new Error(\"startWatch\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\");\n }\n isWatchStarted = true;\n\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const tsconfigPath = path.join(info.cwd, \"tsconfig.json\");\n\n // browser \uD0C0\uAC9F\uC6A9 compilerOptions \uC0DD\uC131\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, \"browser\", info.pkgDir);\n\n // server\uAC00 0\uC774\uBA74 \uC790\uB3D9 \uD3EC\uD2B8 \uD560\uB2F9 (\uC11C\uBC84 \uC5F0\uACB0 \uD074\uB77C\uC774\uC5B8\uD2B8)\n // server\uAC00 \uC22B\uC790\uBA74 \uD574\uB2F9 \uD3EC\uD2B8\uB85C \uACE0\uC815 (standalone \uD074\uB77C\uC774\uC5B8\uD2B8)\n const serverPort = typeof info.config.server === \"number\" ? info.config.server : 0;\n\n // Vite \uC124\uC815 \uC0DD\uC131\n const viteConfig = createViteConfig({\n pkgDir: info.pkgDir,\n name: info.name,\n tsconfigPath,\n compilerOptions,\n env: info.config.env,\n mode: \"dev\",\n serverPort,\n watchScopes: info.watchScopes,\n });\n\n // Vite dev server \uC2DC\uC791\n viteServer = await createServer(viteConfig);\n await viteServer.listen();\n\n // Generate .config.json\n const confDistPath = path.join(info.pkgDir, \"dist\", \".config.json\");\n fs.mkdirSync(path.dirname(confDistPath), { recursive: true });\n fs.writeFileSync(confDistPath, JSON.stringify(info.config.configs ?? {}, undefined, 2));\n\n // \uC2E4\uC81C \uD560\uB2F9\uB41C \uD3EC\uD2B8 \uBC18\uD658\n sender.send(\"serverReady\", { port: viteServer.config.server.port });\n } catch (err) {\n sender.send(\"error\", {\n message: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * watch \uC911\uC9C0\n * @remarks Vite dev server\uB97C \uC815\uB9AC\uD569\uB2C8\uB2E4.\n */\nasync function stopWatch(): Promise<void> {\n await cleanup();\n}\n\nconst sender = createWorker<\n { build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },\n ClientWorkerEvents\n>({\n build,\n startWatch,\n stopWatch,\n});\n\nexport default sender;\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/workers/dts.worker.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport ts from \"typescript\";\nimport { createWorker } from \"@simplysm/core-node\";\nimport { consola } from \"consola\";\nimport {\n getCompilerOptionsForPackage,\n getPackageSourceFiles,\n parseRootTsconfig,\n type TypecheckEnv,\n} from \"../utils/tsconfig\";\nimport { serializeDiagnostic, type SerializedDiagnostic } from \"../utils/typecheck-serialization\";\n\n//#region Types\n\n/**\n * DTS watch \uC2DC\uC791 \uC815\uBCF4\n */\nexport interface DtsWatchInfo {\n name: string;\n cwd: string;\n pkgDir: string;\n env: TypecheckEnv;\n}\n\n/**\n * DTS \uC77C\uD68C\uC131 \uBE4C\uB4DC \uC815\uBCF4\n */\nexport interface DtsBuildInfo {\n name: string;\n cwd: string;\n pkgDir: string;\n env: TypecheckEnv;\n /** true\uBA74 .d.ts \uC0DD\uC131 + \uD0C0\uC785\uCCB4\uD06C, false\uBA74 \uD0C0\uC785\uCCB4\uD06C\uB9CC (\uAE30\uBCF8\uAC12: true) */\n emit?: boolean;\n}\n\n/**\n * DTS \uC77C\uD68C\uC131 \uBE4C\uB4DC \uACB0\uACFC\n */\nexport interface DtsBuildResult {\n success: boolean;\n errors?: string[];\n diagnostics: SerializedDiagnostic[];\n errorCount: number;\n warningCount: number;\n}\n\n/**\n * \uBE4C\uB4DC \uC774\uBCA4\uD2B8\n */\nexport interface DtsBuildEvent {\n success: boolean;\n errors?: string[];\n}\n\n/**\n * \uC5D0\uB7EC \uC774\uBCA4\uD2B8\n */\nexport interface DtsErrorEvent {\n message: string;\n}\n\n/**\n * Worker \uC774\uBCA4\uD2B8 \uD0C0\uC785\n */\nexport interface DtsWorkerEvents extends Record<string, unknown> {\n buildStart: Record<string, never>;\n build: DtsBuildEvent;\n error: DtsErrorEvent;\n}\n\n//#endregion\n\n//#region \uB9AC\uC18C\uC2A4 \uAD00\uB9AC\n\nconst logger = consola.withTag(\"sd:cli:dts:worker\");\n\n/** tsc watch program (\uC815\uB9AC \uB300\uC0C1) */\nlet tscWatchProgram: ts.WatchOfFilesAndCompilerOptions<ts.EmitAndSemanticDiagnosticsBuilderProgram> | undefined;\n\n/**\n * \uB9AC\uC18C\uC2A4 \uC815\uB9AC\n */\nfunction cleanup(): void {\n if (tscWatchProgram != null) {\n tscWatchProgram.close();\n tscWatchProgram = undefined;\n }\n}\n\nprocess.on(\"SIGTERM\", () => {\n try {\n cleanup();\n } catch (err) {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n }\n process.exit(0);\n});\n\nprocess.on(\"SIGINT\", () => {\n try {\n cleanup();\n } catch (err) {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n }\n process.exit(0);\n});\n\n//#endregion\n\n//#region DTS \uCD9C\uB825 \uACBD\uB85C \uC7AC\uC791\uC131\n\n/**\n * .d.ts.map \uD30C\uC77C\uC758 sources \uACBD\uB85C\uB97C \uC0C8 \uC704\uCE58 \uAE30\uC900\uC73C\uB85C \uC870\uC815\n */\nfunction adjustDtsMapSources(content: string, originalDir: string, newDir: string): string {\n if (originalDir === newDir) return content;\n try {\n const map = JSON.parse(content) as { sources?: string[] };\n if (Array.isArray(map.sources)) {\n map.sources = map.sources.map((source) => {\n const absoluteSource = path.resolve(originalDir, source);\n return path.relative(newDir, absoluteSource);\n });\n }\n return JSON.stringify(map);\n } catch {\n return content;\n }\n}\n\n/**\n * DTS writeFile\uC6A9 \uACBD\uB85C \uC7AC\uC791\uC131 \uD568\uC218 \uC0DD\uC131\n *\n * TypeScript\uB294 path alias(@simplysm/*)\uB85C \uCC38\uC870\uB41C \uB2E4\uB978 \uD328\uD0A4\uC9C0 \uC18C\uC2A4\uAE4C\uC9C0 rootDir \uACC4\uC0B0\uC5D0\n * \uD3EC\uD568\uD558\uBBC0\uB85C, \uCD9C\uB825\uC774 dist/{pkgName}/src/... \uD615\uD0DC\uC758 \uC911\uCCA9 \uAD6C\uC870\uB85C \uC0DD\uC131\uB41C\uB2E4.\n * \uBC18\uD658\uB41C \uD568\uC218\uB294 \uD604\uC7AC \uD328\uD0A4\uC9C0\uC758 .d.ts\uB9CC flat \uAD6C\uC870(dist/...)\uB85C \uC7AC\uC791\uC131\uD558\uACE0,\n * \uB2E4\uB978 \uD328\uD0A4\uC9C0\uC758 .d.ts\uB294 \uBB34\uC2DC\uD55C\uB2E4.\n *\n * @returns (fileName, content) => [newPath, newContent] | null (null\uC774\uBA74 \uC4F0\uAE30 \uBB34\uC2DC)\n */\nfunction createDtsPathRewriter(pkgDir: string): (fileName: string, content: string) => [string, string] | null {\n const pkgName = path.basename(pkgDir);\n const distDir = path.join(pkgDir, \"dist\");\n const distPrefix = distDir + path.sep;\n // \uC911\uCCA9 \uAD6C\uC870\uC5D0\uC11C \uD604\uC7AC \uD328\uD0A4\uC9C0\uC758 \uC811\uB450\uC0AC: dist/{pkgName}/src/\n const ownNestedPrefix = path.join(distDir, pkgName, \"src\") + path.sep;\n\n return (fileName, content) => {\n if (!fileName.startsWith(distPrefix)) return null;\n\n if (fileName.startsWith(ownNestedPrefix)) {\n // \uC911\uCCA9 \uACBD\uB85C\uB97C flat\uC73C\uB85C \uC7AC\uC791\uC131: dist/{pkgName}/src/... \u2192 dist/...\n const flatPath = path.join(distDir, fileName.slice(ownNestedPrefix.length));\n if (fileName.endsWith(\".d.ts.map\")) {\n content = adjustDtsMapSources(content, path.dirname(fileName), path.dirname(flatPath));\n }\n return [flatPath, content];\n }\n\n // \uB2E4\uB978 \uD328\uD0A4\uC9C0\uC758 \uC911\uCCA9 \uCD9C\uB825 (dist/{otherPkg}/src/...) \u2192 \uBB34\uC2DC\n const relFromDist = fileName.slice(distPrefix.length);\n const segments = relFromDist.split(path.sep);\n if (segments.length >= 3 && segments[1] === \"src\") {\n return null;\n }\n\n // \uC774\uBBF8 flat \uAD6C\uC870 (\uC758\uC874\uC131 \uC5C6\uB294 \uD328\uD0A4\uC9C0) \u2192 \uADF8\uB300\uB85C \uCD9C\uB825\n return [fileName, content];\n };\n}\n\n//#endregion\n\n//#region buildDts (\uC77C\uD68C\uC131 \uBE4C\uB4DC)\n\n/**\n * DTS \uC77C\uD68C\uC131 \uBE4C\uB4DC (\uD0C0\uC785\uCCB4\uD06C + dts \uC0DD\uC131)\n */\nasync function buildDts(info: DtsBuildInfo): Promise<DtsBuildResult> {\n try {\n const parsedConfig = parseRootTsconfig(info.cwd);\n const rootFiles = getPackageSourceFiles(info.pkgDir, parsedConfig);\n const baseOptions = await getCompilerOptionsForPackage(parsedConfig.options, info.env, info.pkgDir);\n\n // \uD574\uB2F9 \uD328\uD0A4\uC9C0 \uACBD\uB85C (\uD544\uD130\uB9C1\uC6A9)\n const pkgSrcPrefix = path.join(info.pkgDir, \"src\") + path.sep;\n\n // emit \uC5EC\uBD80 \uACB0\uC815 (\uAE30\uBCF8\uAC12: true)\n const shouldEmit = info.emit !== false;\n\n const options: ts.CompilerOptions = {\n ...baseOptions,\n sourceMap: false,\n incremental: true,\n tsBuildInfoFile: path.join(\n info.pkgDir,\n \".cache\",\n shouldEmit ? \"dts.tsbuildinfo\" : `typecheck-${info.env}.tsbuildinfo`,\n ),\n };\n\n // emit \uC5EC\uBD80\uC5D0 \uB530\uB77C \uAD00\uB828 \uC635\uC158 \uC124\uC815\n if (shouldEmit) {\n // dts \uC0DD\uC131 + \uD0C0\uC785\uCCB4\uD06C\n options.noEmit = false;\n options.emitDeclarationOnly = true;\n options.declaration = true;\n options.declarationMap = true;\n options.outDir = path.join(info.pkgDir, \"dist\");\n options.declarationDir = path.join(info.pkgDir, \"dist\");\n } else {\n // \uD0C0\uC785\uCCB4\uD06C\uB9CC \uC218\uD589 (dts \uC0DD\uC131 \uC548 \uD568)\n options.noEmit = true;\n options.emitDeclarationOnly = false;\n options.declaration = false;\n options.declarationMap = false;\n // emit \uC548 \uD560 \uB54C outDir/declarationDir \uBD88\uD544\uC694\n }\n\n // incremental program \uC0DD\uC131\n const host = ts.createIncrementalCompilerHost(options);\n\n // \uD604\uC7AC \uD328\uD0A4\uC9C0\uC758 .d.ts\uB9CC flat \uACBD\uB85C\uB85C \uCD9C\uB825 (\uB2E4\uB978 \uD328\uD0A4\uC9C0 .d.ts \uC0DD\uC131 \uBC29\uC9C0 + \uC911\uCCA9 \uACBD\uB85C \uC7AC\uC791\uC131)\n if (shouldEmit) {\n const rewritePath = createDtsPathRewriter(info.pkgDir);\n const originalWriteFile = host.writeFile;\n host.writeFile = (fileName, content, writeByteOrderMark, onError, sourceFiles, data) => {\n const result = rewritePath(fileName, content);\n if (result != null) {\n originalWriteFile(result[0], result[1], writeByteOrderMark, onError, sourceFiles, data);\n }\n };\n }\n\n const program = ts.createIncrementalProgram({\n rootNames: rootFiles,\n options,\n host,\n });\n\n // emit (noEmit\uC77C \uACBD\uC6B0\uC5D0\uB3C4 \uD638\uCD9C\uD574\uC57C diagnostics\uAC00 \uC218\uC9D1\uB428)\n const emitResult = program.emit();\n\n // diagnostics \uC218\uC9D1\n const allDiagnostics = [\n ...program.getConfigFileParsingDiagnostics(),\n ...program.getSyntacticDiagnostics(),\n ...program.getOptionsDiagnostics(),\n ...program.getGlobalDiagnostics(),\n ...program.getSemanticDiagnostics(),\n ...emitResult.diagnostics,\n ];\n\n // \uD574\uB2F9 \uD328\uD0A4\uC9C0 src \uD3F4\uB354 \uB0B4 \uD30C\uC77C\uB9CC \uC5D0\uB7EC \uC218\uC9D1 (\uB2E4\uB978 \uD328\uD0A4\uC9C0 \uC5D0\uB7EC \uBB34\uC2DC)\n const filteredDiagnostics = allDiagnostics.filter(\n (d) => d.file == null || d.file.fileName.startsWith(pkgSrcPrefix),\n );\n\n const serializedDiagnostics = filteredDiagnostics.map(serializeDiagnostic);\n const errorCount = filteredDiagnostics.filter((d) => d.category === ts.DiagnosticCategory.Error).length;\n const warningCount = filteredDiagnostics.filter((d) => d.category === ts.DiagnosticCategory.Warning).length;\n\n // \uC5D0\uB7EC \uBA54\uC2DC\uC9C0 \uBB38\uC790\uC5F4 \uBC30\uC5F4 (\uD558\uC704 \uD638\uD658\uC6A9)\n const errors = filteredDiagnostics\n .filter((d) => d.category === ts.DiagnosticCategory.Error)\n .map((d) => {\n const message = ts.flattenDiagnosticMessageText(d.messageText, \"\\n\");\n if (d.file != null && d.start != null) {\n const { line, character } = d.file.getLineAndCharacterOfPosition(d.start);\n return `${d.file.fileName}:${line + 1}:${character + 1}: TS${d.code}: ${message}`;\n }\n return `TS${d.code}: ${message}`;\n });\n\n return {\n success: errorCount === 0,\n errors: errors.length > 0 ? errors : undefined,\n diagnostics: serializedDiagnostics,\n errorCount,\n warningCount,\n };\n } catch (err) {\n return {\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n diagnostics: [],\n errorCount: 1,\n warningCount: 0,\n };\n }\n}\n\n//#endregion\n\n//#region startDtsWatch (watch \uBAA8\uB4DC)\n\n/** startDtsWatch \uD638\uCD9C \uC5EC\uBD80 \uD50C\uB798\uADF8 */\nlet isWatchStarted = false;\n\n/**\n * DTS watch \uC2DC\uC791\n * @remarks \uC774 \uD568\uC218\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.\n * @throws \uC774\uBBF8 watch\uAC00 \uC2DC\uC791\uB41C \uACBD\uC6B0\n */\nasync function startDtsWatch(info: DtsWatchInfo): Promise<void> {\n if (isWatchStarted) {\n throw new Error(\"startDtsWatch\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\");\n }\n isWatchStarted = true;\n\n try {\n const parsedConfig = parseRootTsconfig(info.cwd);\n const rootFiles = getPackageSourceFiles(info.pkgDir, parsedConfig);\n const baseOptions = await getCompilerOptionsForPackage(parsedConfig.options, info.env, info.pkgDir);\n\n // \uD574\uB2F9 \uD328\uD0A4\uC9C0 \uACBD\uB85C (\uD544\uD130\uB9C1\uC6A9)\n const pkgSrcPrefix = path.join(info.pkgDir, \"src\") + path.sep;\n\n const options: ts.CompilerOptions = {\n ...baseOptions,\n emitDeclarationOnly: true,\n declaration: true,\n declarationMap: true,\n outDir: path.join(info.pkgDir, \"dist\"),\n declarationDir: path.join(info.pkgDir, \"dist\"),\n sourceMap: false,\n noEmit: false,\n incremental: true,\n tsBuildInfoFile: path.join(info.pkgDir, \".cache\", \"dts.tsbuildinfo\"),\n };\n\n let isFirstBuild = true;\n const collectedErrors: string[] = [];\n\n const reportDiagnostic: ts.DiagnosticReporter = (diagnostic) => {\n if (diagnostic.category === ts.DiagnosticCategory.Error) {\n // \uD574\uB2F9 \uD328\uD0A4\uC9C0 src \uD3F4\uB354 \uB0B4 \uD30C\uC77C\uB9CC \uC5D0\uB7EC \uC218\uC9D1 (\uB2E4\uB978 \uD328\uD0A4\uC9C0 \uC5D0\uB7EC \uBB34\uC2DC)\n if (diagnostic.file != null && !diagnostic.file.fileName.startsWith(pkgSrcPrefix)) {\n return;\n }\n\n const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, \"\\n\");\n\n // \uD30C\uC77C \uC704\uCE58 \uC815\uBCF4\uAC00 \uC788\uC73C\uBA74 \uD3EC\uD568 (\uC808\uB300\uACBD\uB85C:\uB77C\uC778:\uCEEC\uB7FC \uD615\uC2DD - IDE \uB9C1\uD06C \uC9C0\uC6D0)\n if (diagnostic.file != null && diagnostic.start != null) {\n const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);\n collectedErrors.push(\n `${diagnostic.file.fileName}:${line + 1}:${character + 1}: TS${diagnostic.code}: ${message}`,\n );\n } else {\n collectedErrors.push(`TS${diagnostic.code}: ${message}`);\n }\n }\n };\n\n // \uD604\uC7AC \uD328\uD0A4\uC9C0\uC758 .d.ts\uB9CC flat \uACBD\uB85C\uB85C \uCD9C\uB825 (\uB2E4\uB978 \uD328\uD0A4\uC9C0 .d.ts \uC0DD\uC131 \uBC29\uC9C0 + \uC911\uCCA9 \uACBD\uB85C \uC7AC\uC791\uC131)\n // TypeScript watch \uBAA8\uB4DC\uB294 import\uB41C \uBAA8\uB4E0 \uBAA8\uB4C8\uC758 .d.ts\uB97C \uC0DD\uC131\uD558\uB824\uACE0 \uC2DC\uB3C4\uD568.\n // \uBAA8\uB178\uB808\uD3EC\uC5D0\uC11C \uB2E4\uB978 \uD328\uD0A4\uC9C0\uC758 .d.ts\uAE4C\uC9C0 \uB36E\uC5B4\uC4F0\uB294 \uAC83\uC744 \uBC29\uC9C0\uD558\uACE0,\n // \uC911\uCCA9 \uACBD\uB85C(dist/{pkgName}/src/...)\uB97C flat \uACBD\uB85C(dist/...)\uB85C \uC7AC\uC791\uC131\uD55C\uB2E4.\n const rewritePath = createDtsPathRewriter(info.pkgDir);\n const originalWriteFile = ts.sys.writeFile;\n const customSys: ts.System = {\n ...ts.sys,\n writeFile: (filePath, content, writeByteOrderMark) => {\n const result = rewritePath(filePath, content);\n if (result != null) {\n originalWriteFile(result[0], result[1], writeByteOrderMark);\n }\n },\n };\n\n const host = ts.createWatchCompilerHost(\n rootFiles,\n options,\n customSys,\n ts.createEmitAndSemanticDiagnosticsBuilderProgram,\n reportDiagnostic,\n () => {}, // watchStatusReporter - \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC74C\n );\n\n const originalAfterProgramCreate = host.afterProgramCreate;\n host.afterProgramCreate = (program) => {\n originalAfterProgramCreate?.(program);\n\n if (!isFirstBuild) {\n sender.send(\"buildStart\", {});\n }\n\n program.emit();\n\n sender.send(\"build\", {\n success: collectedErrors.length === 0,\n errors: collectedErrors.length > 0 ? [...collectedErrors] : undefined,\n });\n\n collectedErrors.length = 0;\n isFirstBuild = false;\n };\n\n tscWatchProgram = ts.createWatchProgram(host);\n } catch (err) {\n sender.send(\"error\", {\n message: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\nconst sender = createWorker<{ startDtsWatch: typeof startDtsWatch; buildDts: typeof buildDts }, DtsWorkerEvents>({\n startDtsWatch,\n buildDts,\n});\n\nexport default sender;\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/workers/library.worker.ts"],
|
|
4
|
-
"sourcesContent": ["import esbuild from \"esbuild\";\nimport { createWorker } from \"@simplysm/core-node\";\nimport { consola } from \"consola\";\nimport type { SdBuildPackageConfig } from \"../sd-config.types\";\nimport { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from \"../utils/tsconfig\";\nimport { createLibraryEsbuildOptions, getTypecheckEnvFromTarget } from \"../utils/esbuild-config\";\n\n//#region Types\n\n/**\n * Library \uBE4C\uB4DC \uC815\uBCF4 (\uC77C\uD68C\uC131 \uBE4C\uB4DC\uC6A9)\n */\nexport interface LibraryBuildInfo {\n name: string;\n config: SdBuildPackageConfig;\n cwd: string;\n pkgDir: string;\n}\n\n/**\n * Library \uBE4C\uB4DC \uACB0\uACFC\n */\nexport interface LibraryBuildResult {\n success: boolean;\n errors?: string[];\n}\n\n/**\n * Library Watch \uC815\uBCF4\n */\nexport interface LibraryWatchInfo {\n name: string;\n config: SdBuildPackageConfig;\n cwd: string;\n pkgDir: string;\n}\n\n/**\n * \uBE4C\uB4DC \uC774\uBCA4\uD2B8\n */\nexport interface LibraryBuildEvent {\n success: boolean;\n errors?: string[];\n}\n\n/**\n * \uC5D0\uB7EC \uC774\uBCA4\uD2B8\n */\nexport interface LibraryErrorEvent {\n message: string;\n}\n\n/**\n * Worker \uC774\uBCA4\uD2B8 \uD0C0\uC785\n */\nexport interface LibraryWorkerEvents extends Record<string, unknown> {\n buildStart: Record<string, never>;\n build: LibraryBuildEvent;\n error: LibraryErrorEvent;\n}\n\n//#endregion\n\n//#region \uB9AC\uC18C\uC2A4 \uAD00\uB9AC\n\nconst logger = consola.withTag(\"sd:cli:library:worker\");\n\n/** esbuild build context (\uC815\uB9AC \uB300\uC0C1) */\nlet esbuildContext: esbuild.BuildContext | undefined;\n\n/**\n * \uB9AC\uC18C\uC2A4 \uC815\uB9AC\n */\nasync function cleanup(): Promise<void> {\n // \uC804\uC5ED \uBCC0\uC218\uB97C \uC784\uC2DC \uBCC0\uC218\uB85C \uCEA1\uCC98 \uD6C4 \uCD08\uAE30\uD654\n // (Promise.all \uB300\uAE30 \uC911 \uB2E4\uB978 \uD638\uCD9C\uC5D0\uC11C \uC804\uC5ED \uBCC0\uC218\uB97C \uC218\uC815\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C)\n const contextToDispose = esbuildContext;\n esbuildContext = undefined;\n\n if (contextToDispose != null) {\n await contextToDispose.dispose();\n }\n}\n\n// \uD504\uB85C\uC138\uC2A4 \uC885\uB8CC \uC804 \uB9AC\uC18C\uC2A4 \uC815\uB9AC (SIGTERM/SIGINT)\n// \uC8FC\uC758: worker.terminate()\uB294 \uC774 \uD578\uB4E4\uB7EC\uB4E4\uC744 \uD638\uCD9C\uD558\uC9C0 \uC54A\uACE0 \uC989\uC2DC \uC885\uB8CC\uB428.\n// \uADF8\uB7EC\uB098 watch \uBAA8\uB4DC\uC5D0\uC11C \uC815\uC0C1 \uC885\uB8CC\uB294 \uBA54\uC778 \uD504\uB85C\uC138\uC2A4\uC758 SIGINT/SIGTERM\uC744 \uD1B5\uD574 \uC774\uB8E8\uC5B4\uC9C0\uBBC0\uB85C \uBB38\uC81C\uC5C6\uC74C.\nprocess.on(\"SIGTERM\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\nprocess.on(\"SIGINT\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\n//#endregion\n\n//#region Worker\n\n/**\n * \uC77C\uD68C\uC131 \uBE4C\uB4DC\n */\nasync function build(info: LibraryBuildInfo): Promise<LibraryBuildResult> {\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);\n\n // \uD0C0\uAC9F\uBCC4 compilerOptions \uC0DD\uC131\n const env = getTypecheckEnvFromTarget(info.config.target);\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, env, info.pkgDir);\n\n // esbuild \uC77C\uD68C\uC131 \uBE4C\uB4DC\n const esbuildOptions = createLibraryEsbuildOptions({\n pkgDir: info.pkgDir,\n entryPoints,\n target: info.config.target,\n compilerOptions,\n });\n\n const result = await esbuild.build(esbuildOptions);\n\n const errors = result.errors.map((e) => e.text);\n return {\n success: result.errors.length === 0,\n errors: errors.length > 0 ? errors : undefined,\n };\n } catch (err) {\n return {\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n };\n }\n}\n\n/** startWatch \uD638\uCD9C \uC5EC\uBD80 \uD50C\uB798\uADF8 */\nlet isWatchStarted = false;\n\n/**\n * watch \uC2DC\uC791\n * @remarks \uC774 \uD568\uC218\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.\n * @throws \uC774\uBBF8 watch\uAC00 \uC2DC\uC791\uB41C \uACBD\uC6B0\n */\nasync function startWatch(info: LibraryWatchInfo): Promise<void> {\n if (isWatchStarted) {\n throw new Error(\"startWatch\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\");\n }\n isWatchStarted = true;\n\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);\n\n // \uD0C0\uAC9F\uBCC4 compilerOptions \uC0DD\uC131\n const env = getTypecheckEnvFromTarget(info.config.target);\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, env, info.pkgDir);\n\n // \uCCAB \uBC88\uC9F8 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30\uB97C \uC704\uD55C Promise\n let resolveFirstBuild!: () => void;\n const firstBuildPromise = new Promise<void>((resolve) => {\n resolveFirstBuild = resolve;\n });\n\n let isFirstBuild = true;\n\n // esbuild \uAE30\uBCF8 \uC635\uC158 \uC0DD\uC131\n const baseOptions = createLibraryEsbuildOptions({\n pkgDir: info.pkgDir,\n entryPoints,\n target: info.config.target,\n compilerOptions,\n });\n\n // watch\uC6A9 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\n esbuildContext = await esbuild.context({\n ...baseOptions,\n plugins: [\n ...(baseOptions.plugins ?? []),\n {\n name: \"watch-notify\",\n setup(pluginBuild) {\n pluginBuild.onStart(() => {\n sender.send(\"buildStart\", {});\n });\n\n pluginBuild.onEnd((result) => {\n const errors = result.errors.map((e) => e.text);\n const success = result.errors.length === 0;\n\n sender.send(\"build\", { success, errors: errors.length > 0 ? errors : undefined });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n resolveFirstBuild();\n }\n });\n },\n },\n ],\n });\n\n await esbuildContext.watch();\n\n // \uCCAB \uBC88\uC9F8 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30\n await firstBuildPromise;\n } catch (err) {\n sender.send(\"error\", {\n message: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * watch \uC911\uC9C0\n * @remarks esbuild context\uB97C \uC815\uB9AC\uD569\uB2C8\uB2E4.\n */\nasync function stopWatch(): Promise<void> {\n await cleanup();\n}\n\nconst sender = createWorker<\n { build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },\n LibraryWorkerEvents\n>({\n build,\n startWatch,\n stopWatch,\n});\n\nexport default sender;\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/workers/server-runtime.worker.ts"],
|
|
4
|
-
"sourcesContent": ["import proxy from \"@fastify/http-proxy\";\nimport { createWorker } from \"@simplysm/core-node\";\nimport { consola } from \"consola\";\nimport net from \"net\";\n\n//#region Types\n\n/**\n * Server Runtime \uC2DC\uC791 \uC815\uBCF4\n */\nexport interface ServerRuntimeStartInfo {\n mainJsPath: string;\n clientPorts: Record<string, number>;\n}\n\n/**\n * \uC11C\uBC84 \uC900\uBE44 \uC774\uBCA4\uD2B8\n */\nexport interface ServerRuntimeReadyEvent {\n port: number;\n}\n\n/**\n * \uC5D0\uB7EC \uC774\uBCA4\uD2B8\n */\nexport interface ServerRuntimeErrorEvent {\n message: string;\n}\n\n/**\n * Worker \uC774\uBCA4\uD2B8 \uD0C0\uC785\n */\nexport interface ServerRuntimeWorkerEvents extends Record<string, unknown> {\n serverReady: ServerRuntimeReadyEvent;\n error: ServerRuntimeErrorEvent;\n}\n\n//#endregion\n\nconst logger = consola.withTag(\"sd:cli:server-runtime:worker\");\n\n/** \uC11C\uBC84 \uC778\uC2A4\uD134\uC2A4 (\uC815\uB9AC \uB300\uC0C1) */\nlet serverInstance: { close: () => Promise<void> } | undefined;\n\n/**\n * \uB9AC\uC18C\uC2A4 \uC815\uB9AC\n */\nasync function cleanup(): Promise<void> {\n const server = serverInstance;\n if (server != null) {\n await server.close();\n }\n serverInstance = undefined;\n}\n\nprocess.on(\"SIGTERM\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\nprocess.on(\"SIGINT\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\n/**\n * \uD3EC\uD2B8\uAC00 \uC0AC\uC6A9 \uAC00\uB2A5\uD55C\uC9C0 \uD655\uC778\n */\nfunction isPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.once(\"error\", () => resolve(false));\n server.once(\"listening\", () => {\n server.close(() => resolve(true));\n });\n server.listen(port, \"0.0.0.0\");\n });\n}\n\n/**\n * \uC2DC\uC791 \uD3EC\uD2B8\uBD80\uD130 \uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uD3EC\uD2B8\uB97C \uCC3E\uC544 \uBC18\uD658\n */\nasync function findAvailablePort(startPort: number, maxRetries = 20): Promise<number> {\n for (let i = 0; i < maxRetries; i++) {\n const port = startPort + i;\n if (await isPortAvailable(port)) {\n return port;\n }\n }\n return startPort;\n}\n\n/**\n * Server Runtime \uC2DC\uC791\n * main.js\uB97C import\uD558\uACE0, Vite proxy\uB97C \uC124\uC815\uD55C \uD6C4 listen\n */\nasync function start(info: ServerRuntimeStartInfo): Promise<void> {\n try {\n // main.js import (server \uC778\uC2A4\uD134\uC2A4\uB97C export\uD574\uC57C \uD568)\n const module = await import(info.mainJsPath);\n const server = module.server;\n\n if (server == null) {\n throw new Error(\"main.js\uC5D0\uC11C server \uC778\uC2A4\uD134\uC2A4\uB97C export\uD574\uC57C \uD569\uB2C8\uB2E4.\");\n }\n\n // \uC11C\uBC84 \uC778\uC2A4\uD134\uC2A4 \uC800\uC7A5 (cleanup\uC6A9)\n serverInstance = server;\n\n // \uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uD3EC\uD2B8 \uD0D0\uC0C9 (\uD3EC\uD2B8 \uCDA9\uB3CC \uC2DC \uC790\uB3D9 \uC99D\uAC00)\n const originalPort = server.options.port;\n const availablePort = await findAvailablePort(originalPort);\n if (availablePort !== originalPort) {\n logger.info(`\uD3EC\uD2B8 ${originalPort} \uC0AC\uC6A9 \uC911 \u2192 ${availablePort}\uB85C \uBCC0\uACBD`);\n server.options.port = availablePort;\n }\n\n // Vite proxy \uC124\uC815 (clientPorts\uAC00 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n for (const [name, port] of Object.entries(info.clientPorts)) {\n await server.fastify.register(proxy, {\n prefix: `/${name}`,\n upstream: `http://127.0.0.1:${port}`,\n rewritePrefix: `/${name}`,\n websocket: true,\n });\n }\n\n // \uC11C\uBC84 \uC2DC\uC791\n await server.listen();\n\n sender.send(\"serverReady\", { port: server.options.port });\n } catch (err) {\n logger.error(\"Server Runtime \uC2DC\uC791 \uC2E4\uD328\", err);\n sender.send(\"error\", {\n message: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\nconst sender = createWorker<{ start: typeof start }, ServerRuntimeWorkerEvents>({\n start,\n});\n\nexport default sender;\n"],
|
|
5
4
|
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AACxB,OAAO,SAAS;AAoChB,MAAM,SAAS,QAAQ,QAAQ,8BAA8B;AAG7D,IAAI;AAKJ,eAAe,UAAyB;AACtC,QAAM,SAAS;AACf,MAAI,UAAU,MAAM;AAClB,UAAM,OAAO,MAAM;AAAA,EACrB;AACA,mBAAiB;AACnB;AAEA,QAAQ,GAAG,WAAW,MAAM;AAC1B,UAAQ,EACL,MAAM,CAAC,QAAQ;AACd,WAAO,MAAM,wBAAc,GAAG;AAAA,EAChC,CAAC,EACA,QAAQ,MAAM;AACb,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACL,CAAC;AAED,QAAQ,GAAG,UAAU,MAAM;AACzB,UAAQ,EACL,MAAM,CAAC,QAAQ;AACd,WAAO,MAAM,wBAAc,GAAG;AAAA,EAChC,CAAC,EACA,QAAQ,MAAM;AACb,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACL,CAAC;AAKD,SAAS,gBAAgB,MAAgC;AACvD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,SAAS,IAAI,aAAa;AAChC,WAAO,KAAK,SAAS,MAAM,QAAQ,KAAK,CAAC;AACzC,WAAO,KAAK,aAAa,MAAM;AAC7B,aAAO,MAAM,MAAM,QAAQ,IAAI,CAAC;AAAA,IAClC,CAAC;AACD,WAAO,OAAO,MAAM,SAAS;AAAA,EAC/B,CAAC;AACH;AAKA,eAAe,kBAAkB,WAAmB,aAAa,IAAqB;AACpF,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,UAAM,OAAO,YAAY;AACzB,QAAI,MAAM,gBAAgB,IAAI,GAAG;AAC/B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAMA,eAAe,MAAM,MAA6C;AAChE,MAAI;AAEF,UAAM,SAAS,MAAM,OAAO,KAAK;AACjC,UAAM,SAAS,OAAO;AAEtB,QAAI,UAAU,MAAM;AAClB,YAAM,IAAI,MAAM,kGAAsC;AAAA,IACxD;AAGA,qBAAiB;AAGjB,UAAM,eAAe,OAAO,QAAQ;AACpC,UAAM,gBAAgB,MAAM,kBAAkB,YAAY;AAC1D,QAAI,kBAAkB,cAAc;AAClC,aAAO,KAAK,gBAAM,YAAY,+BAAW,aAAa,qBAAM;AAC5D,aAAO,QAAQ,OAAO;AAAA,IACxB;AAGA,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,KAAK,WAAW,GAAG;AAC3D,YAAM,OAAO,QAAQ,SAAS,OAAO;AAAA,QACnC,QAAQ,IAAI,IAAI;AAAA,QAChB,UAAU,oBAAoB,IAAI;AAAA,QAClC,eAAe,IAAI,IAAI;AAAA,QACvB,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAGA,UAAM,OAAO,OAAO;AAEpB,WAAO,KAAK,eAAe,EAAE,MAAM,OAAO,QAAQ,KAAK,CAAC;AAAA,EAC1D,SAAS,KAAK;AACZ,WAAO,MAAM,4CAAwB,GAAG;AACxC,WAAO,KAAK,SAAS;AAAA,MACnB,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC1D,CAAC;AAAA,EACH;AACF;AAEA,MAAM,SAAS,aAAiE;AAAA,EAC9E;AACF,CAAC;AAED,IAAO,gCAAQ;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/workers/server.worker.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport cp from \"child_process\";\nimport esbuild from \"esbuild\";\nimport { createWorker } from \"@simplysm/core-node\";\nimport { consola } from \"consola\";\nimport { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from \"../utils/tsconfig\";\nimport {\n createServerEsbuildOptions,\n collectUninstalledOptionalPeerDeps,\n collectNativeModuleExternals,\n} from \"../utils/esbuild-config\";\n\n//#region Types\n\n/**\n * Server \uBE4C\uB4DC \uC815\uBCF4 (\uC77C\uD68C\uC131 \uBE4C\uB4DC\uC6A9)\n */\nexport interface ServerBuildInfo {\n name: string;\n cwd: string;\n pkgDir: string;\n /** \uBE4C\uB4DC \uC2DC \uCE58\uD658\uD560 \uD658\uACBD\uBCC0\uC218 */\n env?: Record<string, string>;\n /** \uB7F0\uD0C0\uC784 \uC124\uC815 (dist/.config.json\uC5D0 \uAE30\uB85D) */\n configs?: Record<string, unknown>;\n /** sd.config.ts\uC5D0\uC11C \uC218\uB3D9 \uC9C0\uC815\uD55C external \uBAA8\uB4C8 */\n externals?: string[];\n /** PM2 \uC124\uC815 (\uC9C0\uC815 \uC2DC dist/pm2.config.cjs \uC0DD\uC131) */\n pm2?: {\n name?: string;\n ignoreWatchPaths?: string[];\n };\n /** Package manager to use (affects mise.toml or volta settings generation) */\n packageManager?: \"volta\" | \"mise\";\n}\n\n/**\n * Server \uBE4C\uB4DC \uACB0\uACFC\n */\nexport interface ServerBuildResult {\n success: boolean;\n mainJsPath: string;\n errors?: string[];\n}\n\n/**\n * Server Watch \uC815\uBCF4\n */\nexport interface ServerWatchInfo {\n name: string;\n cwd: string;\n pkgDir: string;\n /** \uBE4C\uB4DC \uC2DC \uCE58\uD658\uD560 \uD658\uACBD\uBCC0\uC218 */\n env?: Record<string, string>;\n /** \uB7F0\uD0C0\uC784 \uC124\uC815 (dist/.config.json\uC5D0 \uAE30\uB85D) */\n configs?: Record<string, unknown>;\n /** sd.config.ts\uC5D0\uC11C \uC218\uB3D9 \uC9C0\uC815\uD55C external \uBAA8\uB4C8 */\n externals?: string[];\n}\n\n/**\n * \uBE4C\uB4DC \uC774\uBCA4\uD2B8\n */\nexport interface ServerBuildEvent {\n success: boolean;\n mainJsPath: string;\n errors?: string[];\n}\n\n/**\n * \uC5D0\uB7EC \uC774\uBCA4\uD2B8\n */\nexport interface ServerErrorEvent {\n message: string;\n}\n\n/**\n * Worker \uC774\uBCA4\uD2B8 \uD0C0\uC785\n */\nexport interface ServerWorkerEvents extends Record<string, unknown> {\n buildStart: Record<string, never>;\n build: ServerBuildEvent;\n error: ServerErrorEvent;\n}\n\n//#endregion\n\n//#region \uB9AC\uC18C\uC2A4 \uAD00\uB9AC\n\nconst logger = consola.withTag(\"sd:cli:server:worker\");\n\n/** esbuild build context (\uC815\uB9AC \uB300\uC0C1) */\nlet esbuildContext: esbuild.BuildContext | undefined;\n\n/**\n * \uB9AC\uC18C\uC2A4 \uC815\uB9AC\n */\nasync function cleanup(): Promise<void> {\n // \uC804\uC5ED \uBCC0\uC218\uB97C \uC784\uC2DC \uBCC0\uC218\uB85C \uCEA1\uCC98 \uD6C4 \uCD08\uAE30\uD654\n // (Promise.all \uB300\uAE30 \uC911 \uB2E4\uB978 \uD638\uCD9C\uC5D0\uC11C \uC804\uC5ED \uBCC0\uC218\uB97C \uC218\uC815\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C)\n const contextToDispose = esbuildContext;\n esbuildContext = undefined;\n\n if (contextToDispose != null) {\n await contextToDispose.dispose();\n }\n}\n\n/**\n * \uC138 \uAC00\uC9C0 \uC18C\uC2A4\uC5D0\uC11C external \uBAA8\uB4C8\uC744 \uC218\uC9D1\uD558\uC5EC \uD569\uCE5C\uB2E4.\n * 1. \uBBF8\uC124\uCE58 optional peer deps\n * 2. binding.gyp \uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8\n * 3. sd.config.ts \uC218\uB3D9 \uC9C0\uC815\n */\nfunction collectAllExternals(pkgDir: string, manualExternals?: string[]): string[] {\n const optionalPeerDeps = collectUninstalledOptionalPeerDeps(pkgDir);\n const nativeModules = collectNativeModuleExternals(pkgDir);\n const manual = manualExternals ?? [];\n\n const merged = [...new Set([...optionalPeerDeps, ...nativeModules, ...manual])];\n\n if (optionalPeerDeps.length > 0) {\n logger.debug(\"\uBBF8\uC124\uCE58 optional peer deps (external):\", optionalPeerDeps);\n }\n if (nativeModules.length > 0) {\n logger.debug(\"\uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8 (external):\", nativeModules);\n }\n if (manual.length > 0) {\n logger.debug(\"\uC218\uB3D9 \uC9C0\uC815 (external):\", manual);\n }\n\n return merged;\n}\n\n/**\n * \uD504\uB85C\uB355\uC158 \uBC30\uD3EC\uC6A9 \uD30C\uC77C \uC0DD\uC131 (\uC77C\uD68C\uC131 \uBE4C\uB4DC\uC5D0\uC11C\uB9CC \uD638\uCD9C)\n *\n * - dist/package.json: external \uBAA8\uB4C8\uC744 dependencies\uB85C \uD3EC\uD568 (volta \uC0AC\uC6A9 \uC2DC volta \uD544\uB4DC \uCD94\uAC00)\n * - dist/mise.toml: Node \uBC84\uC804 \uC9C0\uC815 (packageManager === \"mise\"\uC77C \uB54C\uB9CC)\n * - dist/openssl.cnf: \uB808\uAC70\uC2DC OpenSSL \uD504\uB85C\uBC14\uC774\uB354 \uD65C\uC131\uD654\n * - dist/pm2.config.cjs: PM2 \uD504\uB85C\uC138\uC2A4 \uC124\uC815 (pm2 \uC635\uC158\uC774 \uC788\uC744 \uB54C\uB9CC)\n */\nfunction generateProductionFiles(info: ServerBuildInfo, externals: string[]): void {\n const distDir = path.join(info.pkgDir, \"dist\");\n const pkgJson = JSON.parse(fs.readFileSync(path.join(info.pkgDir, \"package.json\"), \"utf-8\"));\n\n // dist/package.json\n logger.debug(\"GEN package.json...\");\n const distPkgJson: Record<string, unknown> = {\n name: pkgJson.name,\n version: pkgJson.version,\n type: pkgJson.type,\n };\n if (externals.length > 0) {\n const deps: Record<string, string> = {};\n for (const ext of externals) {\n deps[ext] = \"*\";\n }\n distPkgJson[\"dependencies\"] = deps;\n }\n if (info.packageManager === \"volta\") {\n const nodeVersion = cp.execSync(\"node -v\").toString().trim();\n distPkgJson[\"volta\"] = { node: nodeVersion };\n }\n fs.writeFileSync(path.join(distDir, \"package.json\"), JSON.stringify(distPkgJson, undefined, 2));\n\n // dist/mise.toml (packageManager === \"mise\"\uC77C \uB54C\uB9CC)\n if (info.packageManager === \"mise\") {\n logger.debug(\"GEN mise.toml...\");\n const rootMiseTomlPath = path.join(info.cwd, \"mise.toml\");\n let nodeVersion = \"20\";\n if (fs.existsSync(rootMiseTomlPath)) {\n const miseContent = fs.readFileSync(rootMiseTomlPath, \"utf-8\");\n const match = /node\\s*=\\s*\"([^\"]+)\"/.exec(miseContent);\n if (match != null) {\n nodeVersion = match[1];\n }\n }\n fs.writeFileSync(path.join(distDir, \"mise.toml\"), `[tools]\\nnode = \"${nodeVersion}\"\\n`);\n }\n\n // dist/openssl.cnf\n logger.debug(\"GEN openssl.cnf...\");\n fs.writeFileSync(\n path.join(distDir, \"openssl.cnf\"),\n [\n \"nodejs_conf = openssl_init\",\n \"\",\n \"[openssl_init]\",\n \"providers = provider_sect\",\n \"ssl_conf = ssl_sect\",\n \"\",\n \"[provider_sect]\",\n \"default = default_sect\",\n \"legacy = legacy_sect\",\n \"\",\n \"[default_sect]\",\n \"activate = 1\",\n \"\",\n \"[legacy_sect]\",\n \"activate = 1\",\n \"\",\n \"[ssl_sect]\",\n \"system_default = system_default_sect\",\n \"\",\n \"[system_default_sect]\",\n \"Options = UnsafeLegacyRenegotiation\",\n ].join(\"\\n\"),\n );\n\n // dist/pm2.config.cjs (pm2 \uC124\uC815\uC774 \uC788\uC744 \uB54C\uB9CC)\n if (info.pm2 != null) {\n logger.debug(\"GEN pm2.config.cjs...\");\n\n const pm2Name = info.pm2.name ?? pkgJson.name.replace(/@/g, \"\").replace(/[/\\\\]/g, \"-\");\n const ignoreWatch = JSON.stringify([\"node_modules\", \"www\", ...(info.pm2.ignoreWatchPaths ?? [])]);\n const envObj: Record<string, string> = {\n NODE_ENV: \"production\",\n TZ: \"Asia/Seoul\",\n ...(info.env ?? {}),\n };\n const envStr = JSON.stringify(envObj, undefined, 4);\n\n const interpreterLine =\n info.packageManager === \"volta\" ? \"\" : ` interpreter: cp.execSync(\"mise which node\").toString().trim(),\\n`;\n\n const pm2Config = [\n `const cp = require(\"child_process\");`,\n ``,\n `module.exports = {`,\n ` name: ${JSON.stringify(pm2Name)},`,\n ` script: \"main.js\",`,\n ` watch: true,`,\n ` watch_delay: 2000,`,\n ` ignore_watch: ${ignoreWatch},`,\n interpreterLine.trimEnd(),\n ` interpreter_args: \"--openssl-config=openssl.cnf\",`,\n ` env: ${envStr.replace(/\\n/g, \"\\n \")},`,\n ` arrayProcess: \"concat\",`,\n ` useDelTargetNull: true,`,\n `};`,\n ]\n .filter((line) => line !== \"\")\n .join(\"\\n\");\n\n fs.writeFileSync(path.join(distDir, \"pm2.config.cjs\"), pm2Config);\n }\n}\n\n// \uD504\uB85C\uC138\uC2A4 \uC885\uB8CC \uC804 \uB9AC\uC18C\uC2A4 \uC815\uB9AC (SIGTERM/SIGINT)\n// \uC8FC\uC758: worker.terminate()\uB294 \uC774 \uD578\uB4E4\uB7EC\uB4E4\uC744 \uD638\uCD9C\uD558\uC9C0 \uC54A\uACE0 \uC989\uC2DC \uC885\uB8CC\uB428.\n// \uADF8\uB7EC\uB098 watch \uBAA8\uB4DC\uC5D0\uC11C \uC815\uC0C1 \uC885\uB8CC\uB294 \uBA54\uC778 \uD504\uB85C\uC138\uC2A4\uC758 SIGINT/SIGTERM\uC744 \uD1B5\uD574 \uC774\uB8E8\uC5B4\uC9C0\uBBC0\uB85C \uBB38\uC81C\uC5C6\uC74C.\nprocess.on(\"SIGTERM\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\nprocess.on(\"SIGINT\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\n//#endregion\n\n//#region Worker\n\n/**\n * \uC77C\uD68C\uC131 \uBE4C\uB4DC\n */\nasync function build(info: ServerBuildInfo): Promise<ServerBuildResult> {\n const mainJsPath = path.join(info.pkgDir, \"dist\", \"main.js\");\n\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);\n\n // \uC11C\uBC84\uB294 node \uD658\uACBD\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, \"node\", info.pkgDir);\n\n // \uBAA8\uB4E0 external \uC218\uC9D1 (optional peer deps + native modules + manual)\n const external = collectAllExternals(info.pkgDir, info.externals);\n\n // esbuild \uC77C\uD68C\uC131 \uBE4C\uB4DC\n const esbuildOptions = createServerEsbuildOptions({\n pkgDir: info.pkgDir,\n entryPoints,\n compilerOptions,\n env: info.env,\n external,\n });\n\n const result = await esbuild.build(esbuildOptions);\n\n // Generate .config.json\n const confDistPath = path.join(info.pkgDir, \"dist\", \".config.json\");\n fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));\n\n // Generate production files (package.json, mise.toml, openssl.cnf, pm2.config.cjs)\n generateProductionFiles(info, external);\n\n const errors = result.errors.map((e) => e.text);\n return {\n success: result.errors.length === 0,\n mainJsPath,\n errors: errors.length > 0 ? errors : undefined,\n };\n } catch (err) {\n return {\n success: false,\n mainJsPath,\n errors: [err instanceof Error ? err.message : String(err)],\n };\n }\n}\n\n/** startWatch \uD638\uCD9C \uC5EC\uBD80 \uD50C\uB798\uADF8 */\nlet isWatchStarted = false;\n\n/**\n * watch \uC2DC\uC791\n * @remarks \uC774 \uD568\uC218\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.\n * @throws \uC774\uBBF8 watch\uAC00 \uC2DC\uC791\uB41C \uACBD\uC6B0\n */\nasync function startWatch(info: ServerWatchInfo): Promise<void> {\n if (isWatchStarted) {\n throw new Error(\"startWatch\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\");\n }\n isWatchStarted = true;\n\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);\n\n // \uC11C\uBC84\uB294 node \uD658\uACBD\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, \"node\", info.pkgDir);\n\n const mainJsPath = path.join(info.pkgDir, \"dist\", \"main.js\");\n\n // \uCCAB \uBC88\uC9F8 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30\uB97C \uC704\uD55C Promise\n let resolveFirstBuild!: () => void;\n const firstBuildPromise = new Promise<void>((resolve) => {\n resolveFirstBuild = resolve;\n });\n\n let isFirstBuild = true;\n\n // \uBAA8\uB4E0 external \uC218\uC9D1 (optional peer deps + native modules + manual)\n const external = collectAllExternals(info.pkgDir, info.externals);\n\n // esbuild \uAE30\uBCF8 \uC635\uC158 \uC0DD\uC131\n const baseOptions = createServerEsbuildOptions({\n pkgDir: info.pkgDir,\n entryPoints,\n compilerOptions,\n env: info.env,\n external,\n });\n\n // watch\uC6A9 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\n esbuildContext = await esbuild.context({\n ...baseOptions,\n plugins: [\n {\n name: \"watch-notify\",\n setup(pluginBuild) {\n pluginBuild.onStart(() => {\n sender.send(\"buildStart\", {});\n });\n\n pluginBuild.onEnd((result) => {\n const errors = result.errors.map((e) => e.text);\n const success = result.errors.length === 0;\n\n // Generate .config.json on first successful build\n if (isFirstBuild && success) {\n const confDistPath = path.join(info.pkgDir, \"dist\", \".config.json\");\n fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));\n }\n\n sender.send(\"build\", { success, mainJsPath, errors: errors.length > 0 ? errors : undefined });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n resolveFirstBuild();\n }\n });\n },\n },\n ],\n });\n\n await esbuildContext.watch();\n\n // \uCCAB \uBC88\uC9F8 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30\n await firstBuildPromise;\n } catch (err) {\n sender.send(\"error\", {\n message: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * watch \uC911\uC9C0\n * @remarks esbuild context\uB97C \uC815\uB9AC\uD569\uB2C8\uB2E4.\n */\nasync function stopWatch(): Promise<void> {\n await cleanup();\n}\n\nconst sender = createWorker<\n { build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },\n ServerWorkerEvents\n>({\n build,\n startWatch,\n stopWatch,\n});\n\nexport default sender;\n\n//#endregion\n"],
|
|
5
4
|
"mappings": "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",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/sd-cli",
|
|
3
3
|
"sideEffects": false,
|
|
4
|
-
"version": "13.0.0-beta.
|
|
4
|
+
"version": "13.0.0-beta.47",
|
|
5
5
|
"description": "심플리즘 패키지 - CLI 도구",
|
|
6
6
|
"author": "김석래",
|
|
7
7
|
"repository": {
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"types": "./dist/index.d.ts",
|
|
16
16
|
"files": [
|
|
17
17
|
"dist",
|
|
18
|
+
"src",
|
|
18
19
|
"templates"
|
|
19
20
|
],
|
|
20
21
|
"bin": {
|
|
@@ -25,6 +26,7 @@
|
|
|
25
26
|
"@inquirer/prompts": "^8.2.0",
|
|
26
27
|
"consola": "^3.4.2",
|
|
27
28
|
"esbuild": "^0.27.3",
|
|
29
|
+
"esbuild-plugin-solid": "^0.6.0",
|
|
28
30
|
"eslint": "^9.39.2",
|
|
29
31
|
"glob": "^13.0.2",
|
|
30
32
|
"handlebars": "^4.7.8",
|
|
@@ -42,9 +44,9 @@
|
|
|
42
44
|
"vite-plugin-solid": "^2.11.10",
|
|
43
45
|
"vite-tsconfig-paths": "^6.1.0",
|
|
44
46
|
"yargs": "^18.0.0",
|
|
45
|
-
"@simplysm/core-common": "13.0.0-beta.
|
|
46
|
-
"@simplysm/
|
|
47
|
-
"@simplysm/
|
|
47
|
+
"@simplysm/core-common": "13.0.0-beta.47",
|
|
48
|
+
"@simplysm/core-node": "13.0.0-beta.47",
|
|
49
|
+
"@simplysm/storage": "13.0.0-beta.47"
|
|
48
50
|
},
|
|
49
51
|
"devDependencies": {
|
|
50
52
|
"@types/semver": "^7.7.1",
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { WorkerManager } from "../infra/WorkerManager";
|
|
2
|
+
import type { ResultCollector } from "../infra/ResultCollector";
|
|
3
|
+
import type { RebuildListrManager } from "../utils/listr-manager";
|
|
4
|
+
import type { IBuilder, PackageInfo } from "./types";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Builder 추상 베이스 클래스
|
|
8
|
+
*
|
|
9
|
+
* 모든 Builder의 공통 로직을 제공하고,
|
|
10
|
+
* 서브클래스에서 구현해야 할 추상 메서드를 정의한다.
|
|
11
|
+
*/
|
|
12
|
+
export abstract class BaseBuilder implements IBuilder {
|
|
13
|
+
protected readonly workerManager: WorkerManager;
|
|
14
|
+
protected readonly resultCollector: ResultCollector;
|
|
15
|
+
protected readonly rebuildManager: RebuildListrManager | undefined;
|
|
16
|
+
protected readonly packages: PackageInfo[];
|
|
17
|
+
protected readonly cwd: string;
|
|
18
|
+
protected isWatchMode = false;
|
|
19
|
+
|
|
20
|
+
/** 초기 빌드 Promise (패키지별) */
|
|
21
|
+
protected readonly initialBuildPromises = new Map<string, Promise<void>>();
|
|
22
|
+
/** 초기 빌드 resolver (패키지별) */
|
|
23
|
+
protected readonly buildResolvers = new Map<string, () => void>();
|
|
24
|
+
|
|
25
|
+
constructor(options: {
|
|
26
|
+
cwd: string;
|
|
27
|
+
packages: PackageInfo[];
|
|
28
|
+
resultCollector: ResultCollector;
|
|
29
|
+
rebuildManager?: RebuildListrManager;
|
|
30
|
+
}) {
|
|
31
|
+
this.cwd = options.cwd;
|
|
32
|
+
this.packages = options.packages;
|
|
33
|
+
this.resultCollector = options.resultCollector;
|
|
34
|
+
this.rebuildManager = options.rebuildManager;
|
|
35
|
+
this.workerManager = new WorkerManager();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Builder 초기화
|
|
40
|
+
*/
|
|
41
|
+
initialize(): Promise<void> {
|
|
42
|
+
// 초기 빌드 Promise 생성
|
|
43
|
+
for (const pkg of this.packages) {
|
|
44
|
+
const key = this.getPackageKey(pkg);
|
|
45
|
+
this.initialBuildPromises.set(
|
|
46
|
+
key,
|
|
47
|
+
new Promise<void>((resolve) => {
|
|
48
|
+
this.buildResolvers.set(key, resolve);
|
|
49
|
+
}),
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Worker 생성
|
|
54
|
+
this.createWorkers();
|
|
55
|
+
|
|
56
|
+
// 이벤트 핸들러 등록
|
|
57
|
+
this.registerEventHandlers();
|
|
58
|
+
|
|
59
|
+
return Promise.resolve();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 일회성 빌드 (프로덕션)
|
|
64
|
+
*/
|
|
65
|
+
async build(): Promise<void> {
|
|
66
|
+
await Promise.all(this.packages.map((pkg) => this.buildPackage(pkg)));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Watch 모드 시작
|
|
71
|
+
*/
|
|
72
|
+
async startWatch(): Promise<void> {
|
|
73
|
+
this.isWatchMode = true;
|
|
74
|
+
|
|
75
|
+
// 모든 패키지의 watch 시작 (await 없이 - 백그라운드 실행)
|
|
76
|
+
for (const pkg of this.packages) {
|
|
77
|
+
this.startWatchPackage(pkg);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// 초기 빌드 완료까지 대기
|
|
81
|
+
await Promise.all(this.initialBuildPromises.values());
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Builder 종료
|
|
86
|
+
*/
|
|
87
|
+
async shutdown(): Promise<void> {
|
|
88
|
+
await this.workerManager.terminateAll();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* 초기 빌드 Promise 맵 반환
|
|
93
|
+
*/
|
|
94
|
+
getInitialBuildPromises(): Map<string, Promise<void>> {
|
|
95
|
+
return this.initialBuildPromises;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 패키지 키 생성 (결과 저장용)
|
|
100
|
+
*/
|
|
101
|
+
protected getPackageKey(pkg: PackageInfo): string {
|
|
102
|
+
return `${pkg.name}:${this.getBuilderType()}`;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 빌드 완료 처리
|
|
107
|
+
*/
|
|
108
|
+
protected completeBuild(pkg: PackageInfo): void {
|
|
109
|
+
const key = this.getPackageKey(pkg);
|
|
110
|
+
const resolver = this.buildResolvers.get(key);
|
|
111
|
+
if (resolver != null) {
|
|
112
|
+
resolver();
|
|
113
|
+
this.buildResolvers.delete(key);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Builder 타입 (결과 키 생성용)
|
|
119
|
+
*/
|
|
120
|
+
protected abstract getBuilderType(): string;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Worker 생성
|
|
124
|
+
*/
|
|
125
|
+
protected abstract createWorkers(): void;
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 이벤트 핸들러 등록
|
|
129
|
+
*/
|
|
130
|
+
protected abstract registerEventHandlers(): void;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* 단일 패키지 빌드 (프로덕션)
|
|
134
|
+
*/
|
|
135
|
+
protected abstract buildPackage(pkg: PackageInfo): Promise<void>;
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 단일 패키지 watch 시작
|
|
139
|
+
*/
|
|
140
|
+
protected abstract startWatchPackage(pkg: PackageInfo): void;
|
|
141
|
+
}
|