@simplysm/sd-cli 13.0.0-beta.16 → 13.0.0-beta.18

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.
@@ -1,4 +1,4 @@
1
- import { WorkerManager } from "../infra/WorkerManager";
1
+ import { WorkerManager } from "../infra/WorkerManager.js";
2
2
  class BaseBuilder {
3
3
  workerManager;
4
4
  resultCollector;
@@ -1,5 +1,5 @@
1
1
  import path from "path";
2
- import { BaseBuilder } from "./BaseBuilder";
2
+ import { BaseBuilder } from "./BaseBuilder.js";
3
3
  class DtsBuilder extends BaseBuilder {
4
4
  _workerPath;
5
5
  constructor(options) {
@@ -1,5 +1,5 @@
1
1
  import path from "path";
2
- import { BaseBuilder } from "./BaseBuilder";
2
+ import { BaseBuilder } from "./BaseBuilder.js";
3
3
  class LibraryBuilder extends BaseBuilder {
4
4
  _workerPath;
5
5
  constructor(options) {
@@ -1,6 +1,6 @@
1
- import { BaseBuilder } from "./BaseBuilder";
2
- import { LibraryBuilder } from "./LibraryBuilder";
3
- import { DtsBuilder } from "./DtsBuilder";
1
+ import { BaseBuilder } from "./BaseBuilder.js";
2
+ import { LibraryBuilder } from "./LibraryBuilder.js";
3
+ import { DtsBuilder } from "./DtsBuilder.js";
4
4
  export {
5
5
  BaseBuilder,
6
6
  DtsBuilder,
@@ -3,7 +3,7 @@ import { fsExists, fsMkdir, fsRead, fsReadJson, fsWrite, fsWriteJson, fsGlob, fs
3
3
  import { env } from "@simplysm/core-common";
4
4
  import { consola } from "consola";
5
5
  import sharp from "sharp";
6
- import { spawn } from "../utils/spawn";
6
+ import { spawn } from "../utils/spawn.js";
7
7
  class CapacitorConfigError extends Error {
8
8
  constructor(message) {
9
9
  super(message);
@@ -2,9 +2,9 @@ import path from "path";
2
2
  import fs from "fs";
3
3
  import { input, confirm } from "@inquirer/prompts";
4
4
  import { consola } from "consola";
5
- import { renderTemplateDir } from "../utils/template";
6
- import { addPackageToSdConfig, addTailwindToEslintConfig } from "../utils/config-editor";
7
- import { spawn } from "../utils/spawn";
5
+ import { renderTemplateDir } from "../utils/template.js";
6
+ import { addPackageToSdConfig, addTailwindToEslintConfig } from "../utils/config-editor.js";
7
+ import { spawn } from "../utils/spawn.js";
8
8
  function findPackageRoot(startDir) {
9
9
  let dir = startDir;
10
10
  while (!fs.existsSync(path.join(dir, "package.json"))) {
@@ -2,9 +2,9 @@ import path from "path";
2
2
  import fs from "fs";
3
3
  import { input, checkbox } from "@inquirer/prompts";
4
4
  import { consola } from "consola";
5
- import { renderTemplateDir } from "../utils/template";
6
- import { addPackageToSdConfig, setClientServerInSdConfig } from "../utils/config-editor";
7
- import { spawn } from "../utils/spawn";
5
+ import { renderTemplateDir } from "../utils/template.js";
6
+ import { addPackageToSdConfig, setClientServerInSdConfig } from "../utils/config-editor.js";
7
+ import { spawn } from "../utils/spawn.js";
8
8
  function findPackageRoot(startDir) {
9
9
  let dir = startDir;
10
10
  while (!fs.existsSync(path.join(dir, "package.json"))) {
@@ -4,12 +4,12 @@ import { Listr } from "listr2";
4
4
  import { Worker, fsRm } from "@simplysm/core-node";
5
5
  import "@simplysm/core-common";
6
6
  import { consola, LogLevels } from "consola";
7
- import { loadSdConfig } from "../utils/sd-config";
8
- import { getVersion } from "../utils/build-env";
9
- import { deserializeDiagnostic } from "../utils/typecheck-serialization";
10
- import { runLint } from "./lint";
11
- import { Capacitor } from "../capacitor/capacitor";
12
- import { Electron } from "../electron/electron";
7
+ import { loadSdConfig } from "../utils/sd-config.js";
8
+ import { getVersion } from "../utils/build-env.js";
9
+ import { deserializeDiagnostic } from "../utils/typecheck-serialization.js";
10
+ import { runLint } from "./lint.js";
11
+ import { Capacitor } from "../capacitor/capacitor.js";
12
+ import { Electron } from "../electron/electron.js";
13
13
  function classifyPackages(packages, targets) {
14
14
  const buildPackages = [];
15
15
  const clientPackages = [];
@@ -3,15 +3,15 @@ import path from "path";
3
3
  import { Listr } from "listr2";
4
4
  import { Worker } from "@simplysm/core-node";
5
5
  import { consola } from "consola";
6
- import { loadSdConfig } from "../utils/sd-config";
7
- import { getVersion } from "../utils/build-env";
8
- import { Capacitor } from "../capacitor/capacitor";
9
- import { filterPackagesByTargets, getWatchScopes } from "../utils/package-utils";
10
- import { printErrors, printServers } from "../utils/output-utils";
11
- import { RebuildListrManager } from "../utils/listr-manager";
6
+ import { loadSdConfig } from "../utils/sd-config.js";
7
+ import { getVersion } from "../utils/build-env.js";
8
+ import { Capacitor } from "../capacitor/capacitor.js";
9
+ import { filterPackagesByTargets, getWatchScopes } from "../utils/package-utils.js";
10
+ import { printErrors, printServers } from "../utils/output-utils.js";
11
+ import { RebuildListrManager } from "../utils/listr-manager.js";
12
12
  import {
13
13
  registerWorkerEventHandlers
14
- } from "../utils/worker-events";
14
+ } from "../utils/worker-events.js";
15
15
  async function runDev(options) {
16
16
  const { targets } = options;
17
17
  const cwd = process.cwd();
@@ -2,9 +2,9 @@ import path from "path";
2
2
  import { Listr } from "listr2";
3
3
  import { fsExists } from "@simplysm/core-node";
4
4
  import { consola } from "consola";
5
- import { loadSdConfig } from "../utils/sd-config";
6
- import { Capacitor } from "../capacitor/capacitor";
7
- import { Electron } from "../electron/electron";
5
+ import { loadSdConfig } from "../utils/sd-config.js";
6
+ import { Capacitor } from "../capacitor/capacitor.js";
7
+ import { Electron } from "../electron/electron.js";
8
8
  async function runDevice(options) {
9
9
  const { package: packageName, url } = options;
10
10
  const cwd = process.cwd();
@@ -1,8 +1,8 @@
1
1
  import path from "path";
2
2
  import fs from "fs";
3
3
  import { consola } from "consola";
4
- import { renderTemplateDir } from "../utils/template";
5
- import { spawn } from "../utils/spawn";
4
+ import { renderTemplateDir } from "../utils/template.js";
5
+ import { spawn } from "../utils/spawn.js";
6
6
  function findPackageRoot(startDir) {
7
7
  let dir = startDir;
8
8
  while (!fs.existsSync(path.join(dir, "package.json"))) {
@@ -18,7 +18,7 @@ function isValidScopeName(name) {
18
18
  async function runInit(_options) {
19
19
  const cwd = process.cwd();
20
20
  const logger = consola.withTag("sd:cli:init");
21
- const entries = fs.readdirSync(cwd);
21
+ const entries = fs.readdirSync(cwd).filter((e) => !e.startsWith("."));
22
22
  if (entries.length > 0) {
23
23
  consola.error("\uB514\uB809\uD1A0\uB9AC\uAC00 \uBE44\uC5B4\uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uBE48 \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C \uC2E4\uD589\uD574\uC8FC\uC138\uC694.");
24
24
  process.exitCode = 1;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/init.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport { consola } from \"consola\";\nimport { renderTemplateDir } from \"../utils/template\";\nimport { spawn } from \"../utils/spawn\";\n\n//#region Types\n\n/**\n * Init \uBA85\uB839 \uC635\uC158\n */\nexport interface InitOptions {}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * import.meta.dirname\uC5D0\uC11C \uC0C1\uC704\uB85C \uC62C\uB77C\uAC00\uBA70 package.json\uC744 \uCC3E\uC544 \uD328\uD0A4\uC9C0 \uB8E8\uD2B8\uB97C \uBC18\uD658\uD55C\uB2E4.\n */\nfunction findPackageRoot(startDir: string): string {\n let dir = startDir;\n while (!fs.existsSync(path.join(dir, \"package.json\"))) {\n const parent = path.dirname(dir);\n if (parent === dir) throw new Error(\"package.json\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n dir = parent;\n }\n return dir;\n}\n\n/**\n * npm \uC2A4\uCF54\uD504 \uC774\uB984 \uC720\uD6A8\uC131 \uAC80\uC99D\n */\nfunction isValidScopeName(name: string): boolean {\n return /^[a-z][a-z0-9-]*$/.test(name);\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uC0C8 Simplysm \uD504\uB85C\uC81D\uD2B8\uB97C \uD604\uC7AC \uB514\uB809\uD1A0\uB9AC\uC5D0 \uCD08\uAE30\uD654\uD55C\uB2E4.\n *\n * 1. \uB514\uB809\uD1A0\uB9AC \uBE44\uC5B4\uC788\uB294\uC9C0 \uD655\uC778\n * 2. \uD504\uB85C\uC81D\uD2B8\uBA85(\uD3F4\uB354\uBA85) \uAC80\uC99D\n * 3. Handlebars \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n * 4. pnpm install + sd-cli install \uC2E4\uD589\n */\nexport async function runInit(_options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:init\");\n\n // 1. \uB514\uB809\uD1A0\uB9AC \uBE44\uC5B4\uC788\uB294\uC9C0 \uD655\uC778\n const entries = fs.readdirSync(cwd);\n if (entries.length > 0) {\n consola.error(\"\uB514\uB809\uD1A0\uB9AC\uAC00 \uBE44\uC5B4\uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uBE48 \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C \uC2E4\uD589\uD574\uC8FC\uC138\uC694.\");\n process.exitCode = 1;\n return;\n }\n\n // 2. \uD504\uB85C\uC81D\uD2B8\uBA85 \uAC80\uC99D\n const projectName = path.basename(cwd);\n if (!isValidScopeName(projectName)) {\n consola.error(`\uD504\uB85C\uC81D\uD2B8 \uC774\uB984 \"${projectName}\"\uC774(\uAC00) \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC18C\uBB38\uC790, \uC22B\uC790, \uD558\uC774\uD508\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4.`);\n process.exitCode = 1;\n return;\n }\n\n // 3. \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n const pkgRoot = findPackageRoot(import.meta.dirname);\n const templateDir = path.join(pkgRoot, \"templates\", \"init\");\n\n const context = { projectName };\n\n logger.info(\"\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C \uC0DD\uC131 \uC911...\");\n await renderTemplateDir(templateDir, cwd, context);\n logger.success(\"\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C \uC0DD\uC131 \uC644\uB8CC\");\n\n // 4. pnpm install\n logger.info(\"pnpm install \uC2E4\uD589 \uC911...\");\n await spawn(\"pnpm\", [\"install\"], { cwd });\n logger.success(\"pnpm install \uC644\uB8CC\");\n\n // 5. sd-claude install\n logger.info(\"sd-claude install \uC2E4\uD589 \uC911...\");\n await spawn(\"sd-claude\", [\"install\"], { cwd });\n logger.success(\"sd-claude install \uC644\uB8CC\");\n\n // 6. \uC644\uB8CC \uBA54\uC2DC\uC9C0\n consola.box(\n [\n \"\uD504\uB85C\uC81D\uD2B8\uAC00 \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4!\",\n \"\",\n \"\uB2E4\uC74C \uB2E8\uACC4:\",\n \" sd-cli add client \uD074\uB77C\uC774\uC5B8\uD2B8 \uD328\uD0A4\uC9C0 \uCD94\uAC00\",\n \" sd-cli add server \uC11C\uBC84 \uD328\uD0A4\uC9C0 \uCD94\uAC00\",\n ].join(\"\\n\"),\n );\n}\n\n//#endregion\n"],
5
- "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,aAAa;AAgBtB,SAAS,gBAAgB,UAA0B;AACjD,MAAI,MAAM;AACV,SAAO,CAAC,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,GAAG;AACrD,UAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK,OAAM,IAAI,MAAM,kEAA0B;AAC9D,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAKA,SAAS,iBAAiB,MAAuB;AAC/C,SAAO,oBAAoB,KAAK,IAAI;AACtC;AAcA,eAAsB,QAAQ,UAAsC;AAClE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,aAAa;AAG5C,QAAM,UAAU,GAAG,YAAY,GAAG;AAClC,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,MAAM,qKAAmC;AACjD,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,cAAc,KAAK,SAAS,GAAG;AACrC,MAAI,CAAC,iBAAiB,WAAW,GAAG;AAClC,YAAQ,MAAM,0CAAY,WAAW,4KAA0C;AAC/E,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,UAAU,gBAAgB,YAAY,OAAO;AACnD,QAAM,cAAc,KAAK,KAAK,SAAS,aAAa,MAAM;AAE1D,QAAM,UAAU,EAAE,YAAY;AAE9B,SAAO,KAAK,8DAAiB;AAC7B,QAAM,kBAAkB,aAAa,KAAK,OAAO;AACjD,SAAO,QAAQ,iEAAe;AAG9B,SAAO,KAAK,qCAAsB;AAClC,QAAM,MAAM,QAAQ,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC;AACxC,SAAO,QAAQ,2BAAiB;AAGhC,SAAO,KAAK,0CAA2B;AACvC,QAAM,MAAM,aAAa,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC;AAC7C,SAAO,QAAQ,gCAAsB;AAGrC,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;",
4
+ "sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport { consola } from \"consola\";\nimport { renderTemplateDir } from \"../utils/template\";\nimport { spawn } from \"../utils/spawn\";\n\n//#region Types\n\n/**\n * Init \uBA85\uB839 \uC635\uC158\n */\nexport interface InitOptions {}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * import.meta.dirname\uC5D0\uC11C \uC0C1\uC704\uB85C \uC62C\uB77C\uAC00\uBA70 package.json\uC744 \uCC3E\uC544 \uD328\uD0A4\uC9C0 \uB8E8\uD2B8\uB97C \uBC18\uD658\uD55C\uB2E4.\n */\nfunction findPackageRoot(startDir: string): string {\n let dir = startDir;\n while (!fs.existsSync(path.join(dir, \"package.json\"))) {\n const parent = path.dirname(dir);\n if (parent === dir) throw new Error(\"package.json\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n dir = parent;\n }\n return dir;\n}\n\n/**\n * npm \uC2A4\uCF54\uD504 \uC774\uB984 \uC720\uD6A8\uC131 \uAC80\uC99D\n */\nfunction isValidScopeName(name: string): boolean {\n return /^[a-z][a-z0-9-]*$/.test(name);\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uC0C8 Simplysm \uD504\uB85C\uC81D\uD2B8\uB97C \uD604\uC7AC \uB514\uB809\uD1A0\uB9AC\uC5D0 \uCD08\uAE30\uD654\uD55C\uB2E4.\n *\n * 1. \uB514\uB809\uD1A0\uB9AC \uBE44\uC5B4\uC788\uB294\uC9C0 \uD655\uC778\n * 2. \uD504\uB85C\uC81D\uD2B8\uBA85(\uD3F4\uB354\uBA85) \uAC80\uC99D\n * 3. Handlebars \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n * 4. pnpm install + sd-cli install \uC2E4\uD589\n */\nexport async function runInit(_options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:init\");\n\n // 1. \uB514\uB809\uD1A0\uB9AC \uBE44\uC5B4\uC788\uB294\uC9C0 \uD655\uC778 (dotfile/dotfolder \uC81C\uC678)\n const entries = fs.readdirSync(cwd).filter((e) => !e.startsWith(\".\"));\n if (entries.length > 0) {\n consola.error(\"\uB514\uB809\uD1A0\uB9AC\uAC00 \uBE44\uC5B4\uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uBE48 \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C \uC2E4\uD589\uD574\uC8FC\uC138\uC694.\");\n process.exitCode = 1;\n return;\n }\n\n // 2. \uD504\uB85C\uC81D\uD2B8\uBA85 \uAC80\uC99D\n const projectName = path.basename(cwd);\n if (!isValidScopeName(projectName)) {\n consola.error(`\uD504\uB85C\uC81D\uD2B8 \uC774\uB984 \"${projectName}\"\uC774(\uAC00) \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC18C\uBB38\uC790, \uC22B\uC790, \uD558\uC774\uD508\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4.`);\n process.exitCode = 1;\n return;\n }\n\n // 3. \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n const pkgRoot = findPackageRoot(import.meta.dirname);\n const templateDir = path.join(pkgRoot, \"templates\", \"init\");\n\n const context = { projectName };\n\n logger.info(\"\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C \uC0DD\uC131 \uC911...\");\n await renderTemplateDir(templateDir, cwd, context);\n logger.success(\"\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C \uC0DD\uC131 \uC644\uB8CC\");\n\n // 4. pnpm install\n logger.info(\"pnpm install \uC2E4\uD589 \uC911...\");\n await spawn(\"pnpm\", [\"install\"], { cwd });\n logger.success(\"pnpm install \uC644\uB8CC\");\n\n // 5. sd-claude install\n logger.info(\"sd-claude install \uC2E4\uD589 \uC911...\");\n await spawn(\"sd-claude\", [\"install\"], { cwd });\n logger.success(\"sd-claude install \uC644\uB8CC\");\n\n // 6. \uC644\uB8CC \uBA54\uC2DC\uC9C0\n consola.box(\n [\n \"\uD504\uB85C\uC81D\uD2B8\uAC00 \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4!\",\n \"\",\n \"\uB2E4\uC74C \uB2E8\uACC4:\",\n \" sd-cli add client \uD074\uB77C\uC774\uC5B8\uD2B8 \uD328\uD0A4\uC9C0 \uCD94\uAC00\",\n \" sd-cli add server \uC11C\uBC84 \uD328\uD0A4\uC9C0 \uCD94\uAC00\",\n ].join(\"\\n\"),\n );\n}\n\n//#endregion\n"],
5
+ "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,aAAa;AAgBtB,SAAS,gBAAgB,UAA0B;AACjD,MAAI,MAAM;AACV,SAAO,CAAC,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,GAAG;AACrD,UAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK,OAAM,IAAI,MAAM,kEAA0B;AAC9D,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAKA,SAAS,iBAAiB,MAAuB;AAC/C,SAAO,oBAAoB,KAAK,IAAI;AACtC;AAcA,eAAsB,QAAQ,UAAsC;AAClE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,aAAa;AAG5C,QAAM,UAAU,GAAG,YAAY,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACpE,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,MAAM,qKAAmC;AACjD,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,cAAc,KAAK,SAAS,GAAG;AACrC,MAAI,CAAC,iBAAiB,WAAW,GAAG;AAClC,YAAQ,MAAM,0CAAY,WAAW,4KAA0C;AAC/E,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,UAAU,gBAAgB,YAAY,OAAO;AACnD,QAAM,cAAc,KAAK,KAAK,SAAS,aAAa,MAAM;AAE1D,QAAM,UAAU,EAAE,YAAY;AAE9B,SAAO,KAAK,8DAAiB;AAC7B,QAAM,kBAAkB,aAAa,KAAK,OAAO;AACjD,SAAO,QAAQ,iEAAe;AAG9B,SAAO,KAAK,qCAAsB;AAClC,QAAM,MAAM,QAAQ,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC;AACxC,SAAO,QAAQ,2BAAiB;AAGhC,SAAO,KAAK,0CAA2B;AACvC,QAAM,MAAM,aAAa,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC;AAC7C,SAAO,QAAQ,gCAAsB;AAGrC,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;",
6
6
  "names": []
7
7
  }
@@ -6,9 +6,9 @@ import { StorageFactory } from "@simplysm/storage";
6
6
  import { fsExists, fsRead, fsReadJson, fsWrite, fsGlob, fsCopy } from "@simplysm/core-node";
7
7
  import { env, jsonStringify } from "@simplysm/core-common";
8
8
  import "@simplysm/core-common";
9
- import { loadSdConfig } from "../utils/sd-config";
10
- import { spawn } from "../utils/spawn";
11
- import { runBuild } from "./build";
9
+ import { loadSdConfig } from "../utils/sd-config.js";
10
+ import { spawn } from "../utils/spawn.js";
11
+ import { runBuild } from "./build.js";
12
12
  function replaceEnvVariables(str, version, projectPath) {
13
13
  const result = str.replace(/%([^%]+)%/g, (match, envName) => {
14
14
  if (envName === "VER") {
@@ -5,9 +5,9 @@ import { Listr } from "listr2";
5
5
  import { pathPosix, pathFilterByTargets, Worker } from "@simplysm/core-node";
6
6
  import "@simplysm/core-common";
7
7
  import { consola, LogLevels } from "consola";
8
- import { parseRootTsconfig } from "../utils/tsconfig";
9
- import { loadSdConfig } from "../utils/sd-config";
10
- import { deserializeDiagnostic } from "../utils/typecheck-serialization";
8
+ import { parseRootTsconfig } from "../utils/tsconfig.js";
9
+ import { loadSdConfig } from "../utils/sd-config.js";
10
+ import { deserializeDiagnostic } from "../utils/typecheck-serialization.js";
11
11
  const PATH_PATTERNS = {
12
12
  /** packages/{pkg}/... */
13
13
  PACKAGE: /^packages\/([^/]+)\//
@@ -1,4 +1,4 @@
1
- import { WatchOrchestrator } from "../orchestrators/WatchOrchestrator";
1
+ import { WatchOrchestrator } from "../orchestrators/WatchOrchestrator.js";
2
2
  async function runWatch(options) {
3
3
  const orchestratorOptions = {
4
4
  targets: options.targets,
@@ -4,7 +4,7 @@ import fs from "fs";
4
4
  import module from "module";
5
5
  import { fsExists, fsMkdir, fsCopy, fsReaddir, fsReadJson, fsWriteJson } from "@simplysm/core-node";
6
6
  import { consola } from "consola";
7
- import { spawn } from "../utils/spawn";
7
+ import { spawn } from "../utils/spawn.js";
8
8
  class Electron {
9
9
  constructor(_pkgPath, _config, npmConfig) {
10
10
  this._pkgPath = _pkgPath;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export * from "./sd-config.types";
1
+ export * from "./sd-config.types.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
- import { ResultCollector } from "./ResultCollector";
2
- import { SignalHandler } from "./SignalHandler";
3
- import { WorkerManager } from "./WorkerManager";
1
+ import { ResultCollector } from "./ResultCollector.js";
2
+ import { SignalHandler } from "./SignalHandler.js";
3
+ import { WorkerManager } from "./WorkerManager.js";
4
4
  export {
5
5
  ResultCollector,
6
6
  SignalHandler,
@@ -1,14 +1,14 @@
1
1
  import path from "path";
2
2
  import { Listr } from "listr2";
3
3
  import { consola } from "consola";
4
- import { loadSdConfig } from "../utils/sd-config";
5
- import { filterPackagesByTargets } from "../utils/package-utils";
6
- import { printErrors } from "../utils/output-utils";
7
- import { RebuildListrManager } from "../utils/listr-manager";
8
- import { ResultCollector } from "../infra/ResultCollector";
9
- import { SignalHandler } from "../infra/SignalHandler";
10
- import { LibraryBuilder } from "../builders/LibraryBuilder";
11
- import { DtsBuilder } from "../builders/DtsBuilder";
4
+ import { loadSdConfig } from "../utils/sd-config.js";
5
+ import { filterPackagesByTargets } from "../utils/package-utils.js";
6
+ import { printErrors } from "../utils/output-utils.js";
7
+ import { RebuildListrManager } from "../utils/listr-manager.js";
8
+ import { ResultCollector } from "../infra/ResultCollector.js";
9
+ import { SignalHandler } from "../infra/SignalHandler.js";
10
+ import { LibraryBuilder } from "../builders/LibraryBuilder.js";
11
+ import { DtsBuilder } from "../builders/DtsBuilder.js";
12
12
  class WatchOrchestrator {
13
13
  _cwd;
14
14
  _options;
@@ -1,4 +1,4 @@
1
- import { WatchOrchestrator } from "./WatchOrchestrator";
1
+ import { WatchOrchestrator } from "./WatchOrchestrator.js";
2
2
  export {
3
3
  WatchOrchestrator
4
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"esbuild-config.d.ts","sourceRoot":"","sources":["../../../../src/utils/esbuild-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAWhG;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAsB9F;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAE9F"}
1
+ {"version":3,"file":"esbuild-config.d.ts","sourceRoot":"","sources":["../../../../src/utils/esbuild-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAsC/C;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAYhG;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAsB9F;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAE9F"}
@@ -1 +1 @@
1
- {"version":3,"file":"library.worker.d.ts","sourceRoot":"","sources":["../../../../src/workers/library.worker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAM/D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAClE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAoDD;;GAEG;AACH,iBAAe,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+BxE;AAKD;;;;GAIG;AACH,iBAAe,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE/D;AAED;;;GAGG;AACH,iBAAe,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAExC;AAED,QAAA,MAAM,MAAM;;;eACD,OAAO,KAAK;oBAAc,OAAO,UAAU;mBAAa,OAAO,SAAS;;;CAMjF,CAAC;AAEH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"library.worker.d.ts","sourceRoot":"","sources":["../../../../src/workers/library.worker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAM/D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAClE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAoDD;;GAEG;AACH,iBAAe,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+BxE;AAKD;;;;GAIG;AACH,iBAAe,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoE/D;AAED;;;GAGG;AACH,iBAAe,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAExC;AAED,QAAA,MAAM,MAAM;;;eACD,OAAO,KAAK;oBAAc,OAAO,UAAU;mBAAa,OAAO,SAAS;;;CAMjF,CAAC;AAEH,eAAe,MAAM,CAAC"}
package/dist/sd-cli.js CHANGED
@@ -2,13 +2,13 @@
2
2
  import "@simplysm/core-common";
3
3
  import yargs, {} from "yargs";
4
4
  import { hideBin } from "yargs/helpers";
5
- import { runLint } from "./commands/lint";
6
- import { runTypecheck } from "./commands/typecheck";
7
- import { runWatch } from "./commands/watch";
8
- import { runDev } from "./commands/dev";
9
- import { runBuild } from "./commands/build";
10
- import { runPublish } from "./commands/publish";
11
- import { runDevice } from "./commands/device";
5
+ import { runLint } from "./commands/lint.js";
6
+ import { runTypecheck } from "./commands/typecheck.js";
7
+ import { runWatch } from "./commands/watch.js";
8
+ import { runDev } from "./commands/dev.js";
9
+ import { runBuild } from "./commands/build.js";
10
+ import { runPublish } from "./commands/publish.js";
11
+ import { runDevice } from "./commands/device.js";
12
12
  import path from "path";
13
13
  import { fileURLToPath } from "url";
14
14
  import { EventEmitter } from "node:events";
@@ -1,4 +1,32 @@
1
1
  import path from "path";
2
+ import fs from "fs/promises";
3
+ import { glob } from "glob";
4
+ function esmRelativeImportPlugin(outdir) {
5
+ return {
6
+ name: "esm-relative-import",
7
+ setup(build) {
8
+ build.onEnd(async () => {
9
+ const files = await glob("**/*.js", { cwd: outdir });
10
+ await Promise.all(
11
+ files.map(async (file) => {
12
+ const filePath = path.join(outdir, file);
13
+ const content = await fs.readFile(filePath, "utf-8");
14
+ const rewritten = content.replace(
15
+ /((?:from|import)\s*["'])(\.\.?\/[^"']*?)(["'])/g,
16
+ (_match, prefix, importPath, suffix) => {
17
+ if (/\.(js|mjs|cjs|json|css|wasm|node)$/i.test(importPath)) return _match;
18
+ return `${prefix}${importPath}.js${suffix}`;
19
+ }
20
+ );
21
+ if (rewritten !== content) {
22
+ await fs.writeFile(filePath, rewritten);
23
+ }
24
+ })
25
+ );
26
+ });
27
+ }
28
+ };
29
+ }
2
30
  function createLibraryEsbuildOptions(options) {
3
31
  return {
4
32
  entryPoints: options.entryPoints,
@@ -8,7 +36,8 @@ function createLibraryEsbuildOptions(options) {
8
36
  platform: options.target === "node" ? "node" : "browser",
9
37
  target: options.target === "node" ? "node20" : "chrome84",
10
38
  bundle: false,
11
- tsconfigRaw: { compilerOptions: options.compilerOptions }
39
+ tsconfigRaw: { compilerOptions: options.compilerOptions },
40
+ plugins: [esmRelativeImportPlugin(path.join(options.pkgDir, "dist"))]
12
41
  };
13
42
  }
14
43
  function createServerEsbuildOptions(options) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/esbuild-config.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport type esbuild from \"esbuild\";\nimport type { TypecheckEnv } from \"./tsconfig\";\n\n/**\n * Library \uBE4C\uB4DC\uC6A9 esbuild \uC635\uC158\n * - bundle: false (\uAC1C\uBCC4 \uD30C\uC77C \uD2B8\uB79C\uC2A4\uD30C\uC77C)\n * - platform: target\uC5D0 \uB530\uB77C node \uB610\uB294 browser\n */\nexport interface LibraryEsbuildOptions {\n pkgDir: string;\n entryPoints: string[];\n target: \"node\" | \"browser\" | \"neutral\";\n compilerOptions: Record<string, unknown>;\n}\n\n/**\n * Server \uBE4C\uB4DC\uC6A9 esbuild \uC635\uC158\n * - bundle: true (\uBAA8\uB4E0 \uC758\uC874\uC131 \uD3EC\uD568\uD55C \uB2E8\uC77C \uBC88\uB4E4)\n */\nexport interface ServerEsbuildOptions {\n pkgDir: string;\n entryPoints: string[];\n compilerOptions: Record<string, unknown>;\n env?: Record<string, string>;\n}\n\n/**\n * Library\uC6A9 esbuild \uC124\uC815 \uC0DD\uC131\n *\n * node/browser/neutral \uD0C0\uAC9F\uC758 \uB77C\uC774\uBE0C\uB7EC\uB9AC \uD328\uD0A4\uC9C0 \uBE4C\uB4DC\uC5D0 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * - bundle: false (\uAC1C\uBCC4 \uD30C\uC77C\uC744 \uAC01\uAC01 \uD2B8\uB79C\uC2A4\uD30C\uC77C)\n * - platform: target\uC774 node\uBA74 node, \uADF8 \uC678\uB294 browser\n * - target: node\uBA74 node20, \uADF8 \uC678\uB294 chrome84\n */\nexport function createLibraryEsbuildOptions(options: LibraryEsbuildOptions): esbuild.BuildOptions {\n return {\n entryPoints: options.entryPoints,\n outdir: path.join(options.pkgDir, \"dist\"),\n format: \"esm\",\n sourcemap: true,\n platform: options.target === \"node\" ? \"node\" : \"browser\",\n target: options.target === \"node\" ? \"node20\" : \"chrome84\",\n bundle: false,\n tsconfigRaw: { compilerOptions: options.compilerOptions as esbuild.TsconfigRaw[\"compilerOptions\"] },\n };\n}\n\n/**\n * Server\uC6A9 esbuild \uC124\uC815 \uC0DD\uC131\n *\n * \uC11C\uBC84 \uD328\uD0A4\uC9C0 \uBE4C\uB4DC\uC5D0 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * - bundle: true (\uBAA8\uB4E0 \uC758\uC874\uC131 \uD3EC\uD568\uD55C \uB2E8\uC77C \uBC88\uB4E4)\n * - banner: CJS \uD328\uD0A4\uC9C0\uC758 require() \uC9C0\uC6D0\uC744 \uC704\uD55C createRequire shim\n * - env\uB97C define \uC635\uC158\uC73C\uB85C \uCE58\uD658 (process.env[\"KEY\"] \uD615\uD0DC)\n */\nexport function createServerEsbuildOptions(options: ServerEsbuildOptions): esbuild.BuildOptions {\n const define: Record<string, string> = {};\n if (options.env != null) {\n for (const [key, value] of Object.entries(options.env)) {\n define[`process.env[\"${key}\"]`] = JSON.stringify(value);\n }\n }\n\n return {\n entryPoints: options.entryPoints,\n outdir: path.join(options.pkgDir, \"dist\"),\n format: \"esm\",\n sourcemap: true,\n platform: \"node\",\n target: \"node20\",\n bundle: true,\n banner: {\n js: \"import { createRequire } from 'module'; const require = createRequire(import.meta.url);\",\n },\n define,\n tsconfigRaw: { compilerOptions: options.compilerOptions as esbuild.TsconfigRaw[\"compilerOptions\"] },\n };\n}\n\n/**\n * \uBE4C\uB4DC \uD0C0\uAC9F\uC5D0\uC11C TypecheckEnv \uCD94\uCD9C\n *\n * \uBE4C\uB4DC\uC6A9\uC774\uBBC0\uB85C neutral\uC740 browser\uB85C \uCC98\uB9AC\uD569\uB2C8\uB2E4.\n * (neutral \uD328\uD0A4\uC9C0\uB294 Node/\uBE0C\uB77C\uC6B0\uC800 \uACF5\uC6A9\uC774\uC9C0\uB9CC, \uBE4C\uB4DC \uC2DC\uC5D0\uB294 browser \uD658\uACBD \uAE30\uC900\uC73C\uB85C \uCC98\uB9AC)\n */\nexport function getTypecheckEnvFromTarget(target: \"node\" | \"browser\" | \"neutral\"): TypecheckEnv {\n return target === \"node\" ? \"node\" : \"browser\";\n}\n"],
5
- "mappings": "AAAA,OAAO,UAAU;AAmCV,SAAS,4BAA4B,SAAsD;AAChG,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB,QAAQ,KAAK,KAAK,QAAQ,QAAQ,MAAM;AAAA,IACxC,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU,QAAQ,WAAW,SAAS,SAAS;AAAA,IAC/C,QAAQ,QAAQ,WAAW,SAAS,WAAW;AAAA,IAC/C,QAAQ;AAAA,IACR,aAAa,EAAE,iBAAiB,QAAQ,gBAA0D;AAAA,EACpG;AACF;AAUO,SAAS,2BAA2B,SAAqD;AAC9F,QAAM,SAAiC,CAAC;AACxC,MAAI,QAAQ,OAAO,MAAM;AACvB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,GAAG;AACtD,aAAO,gBAAgB,GAAG,IAAI,IAAI,KAAK,UAAU,KAAK;AAAA,IACxD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB,QAAQ,KAAK,KAAK,QAAQ,QAAQ,MAAM;AAAA,IACxC,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN,IAAI;AAAA,IACN;AAAA,IACA;AAAA,IACA,aAAa,EAAE,iBAAiB,QAAQ,gBAA0D;AAAA,EACpG;AACF;AAQO,SAAS,0BAA0B,QAAsD;AAC9F,SAAO,WAAW,SAAS,SAAS;AACtC;",
4
+ "sourcesContent": ["import path from \"path\";\nimport fs from \"fs/promises\";\nimport { glob } from \"glob\";\nimport type esbuild from \"esbuild\";\nimport type { TypecheckEnv } from \"./tsconfig\";\n\n/**\n * ESM \uC0C1\uB300 import \uACBD\uB85C\uC5D0 .js \uD655\uC7A5\uC790\uB97C \uCD94\uAC00\uD558\uB294 esbuild \uD50C\uB7EC\uADF8\uC778.\n *\n * bundle: false \uBAA8\uB4DC\uC5D0\uC11C esbuild\uB294 import \uACBD\uB85C\uB97C \uADF8\uB300\uB85C \uC720\uC9C0\uD558\uBBC0\uB85C,\n * Node.js ESM\uC5D0\uC11C \uC9C1\uC811 \uC2E4\uD589 \uC2DC \uD655\uC7A5\uC790 \uB204\uB77D\uC73C\uB85C \uBAA8\uB4C8\uC744 \uCC3E\uC9C0 \uBABB\uD558\uB294 \uBB38\uC81C\uB97C \uD574\uACB0\uD55C\uB2E4.\n */\nfunction esmRelativeImportPlugin(outdir: string): esbuild.Plugin {\n return {\n name: \"esm-relative-import\",\n setup(build) {\n build.onEnd(async () => {\n const files = await glob(\"**/*.js\", { cwd: outdir });\n\n await Promise.all(\n files.map(async (file) => {\n const filePath = path.join(outdir, file);\n const content = await fs.readFile(filePath, \"utf-8\");\n\n const rewritten = content.replace(\n /((?:from|import)\\s*[\"'])(\\.\\.?\\/[^\"']*?)([\"'])/g,\n (_match, prefix: string, importPath: string, suffix: string) => {\n if (/\\.(js|mjs|cjs|json|css|wasm|node)$/i.test(importPath)) return _match;\n return `${prefix}${importPath}.js${suffix}`;\n },\n );\n\n if (rewritten !== content) {\n await fs.writeFile(filePath, rewritten);\n }\n }),\n );\n });\n },\n };\n}\n\n/**\n * Library \uBE4C\uB4DC\uC6A9 esbuild \uC635\uC158\n * - bundle: false (\uAC1C\uBCC4 \uD30C\uC77C \uD2B8\uB79C\uC2A4\uD30C\uC77C)\n * - platform: target\uC5D0 \uB530\uB77C node \uB610\uB294 browser\n */\nexport interface LibraryEsbuildOptions {\n pkgDir: string;\n entryPoints: string[];\n target: \"node\" | \"browser\" | \"neutral\";\n compilerOptions: Record<string, unknown>;\n}\n\n/**\n * Server \uBE4C\uB4DC\uC6A9 esbuild \uC635\uC158\n * - bundle: true (\uBAA8\uB4E0 \uC758\uC874\uC131 \uD3EC\uD568\uD55C \uB2E8\uC77C \uBC88\uB4E4)\n */\nexport interface ServerEsbuildOptions {\n pkgDir: string;\n entryPoints: string[];\n compilerOptions: Record<string, unknown>;\n env?: Record<string, string>;\n}\n\n/**\n * Library\uC6A9 esbuild \uC124\uC815 \uC0DD\uC131\n *\n * node/browser/neutral \uD0C0\uAC9F\uC758 \uB77C\uC774\uBE0C\uB7EC\uB9AC \uD328\uD0A4\uC9C0 \uBE4C\uB4DC\uC5D0 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * - bundle: false (\uAC1C\uBCC4 \uD30C\uC77C\uC744 \uAC01\uAC01 \uD2B8\uB79C\uC2A4\uD30C\uC77C)\n * - platform: target\uC774 node\uBA74 node, \uADF8 \uC678\uB294 browser\n * - target: node\uBA74 node20, \uADF8 \uC678\uB294 chrome84\n */\nexport function createLibraryEsbuildOptions(options: LibraryEsbuildOptions): esbuild.BuildOptions {\n return {\n entryPoints: options.entryPoints,\n outdir: path.join(options.pkgDir, \"dist\"),\n format: \"esm\",\n sourcemap: true,\n platform: options.target === \"node\" ? \"node\" : \"browser\",\n target: options.target === \"node\" ? \"node20\" : \"chrome84\",\n bundle: false,\n tsconfigRaw: { compilerOptions: options.compilerOptions as esbuild.TsconfigRaw[\"compilerOptions\"] },\n plugins: [esmRelativeImportPlugin(path.join(options.pkgDir, \"dist\"))],\n };\n}\n\n/**\n * Server\uC6A9 esbuild \uC124\uC815 \uC0DD\uC131\n *\n * \uC11C\uBC84 \uD328\uD0A4\uC9C0 \uBE4C\uB4DC\uC5D0 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * - bundle: true (\uBAA8\uB4E0 \uC758\uC874\uC131 \uD3EC\uD568\uD55C \uB2E8\uC77C \uBC88\uB4E4)\n * - banner: CJS \uD328\uD0A4\uC9C0\uC758 require() \uC9C0\uC6D0\uC744 \uC704\uD55C createRequire shim\n * - env\uB97C define \uC635\uC158\uC73C\uB85C \uCE58\uD658 (process.env[\"KEY\"] \uD615\uD0DC)\n */\nexport function createServerEsbuildOptions(options: ServerEsbuildOptions): esbuild.BuildOptions {\n const define: Record<string, string> = {};\n if (options.env != null) {\n for (const [key, value] of Object.entries(options.env)) {\n define[`process.env[\"${key}\"]`] = JSON.stringify(value);\n }\n }\n\n return {\n entryPoints: options.entryPoints,\n outdir: path.join(options.pkgDir, \"dist\"),\n format: \"esm\",\n sourcemap: true,\n platform: \"node\",\n target: \"node20\",\n bundle: true,\n banner: {\n js: \"import { createRequire } from 'module'; const require = createRequire(import.meta.url);\",\n },\n define,\n tsconfigRaw: { compilerOptions: options.compilerOptions as esbuild.TsconfigRaw[\"compilerOptions\"] },\n };\n}\n\n/**\n * \uBE4C\uB4DC \uD0C0\uAC9F\uC5D0\uC11C TypecheckEnv \uCD94\uCD9C\n *\n * \uBE4C\uB4DC\uC6A9\uC774\uBBC0\uB85C neutral\uC740 browser\uB85C \uCC98\uB9AC\uD569\uB2C8\uB2E4.\n * (neutral \uD328\uD0A4\uC9C0\uB294 Node/\uBE0C\uB77C\uC6B0\uC800 \uACF5\uC6A9\uC774\uC9C0\uB9CC, \uBE4C\uB4DC \uC2DC\uC5D0\uB294 browser \uD658\uACBD \uAE30\uC900\uC73C\uB85C \uCC98\uB9AC)\n */\nexport function getTypecheckEnvFromTarget(target: \"node\" | \"browser\" | \"neutral\"): TypecheckEnv {\n return target === \"node\" ? \"node\" : \"browser\";\n}\n"],
5
+ "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,YAAY;AAUrB,SAAS,wBAAwB,QAAgC;AAC/D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,OAAO;AACX,YAAM,MAAM,YAAY;AACtB,cAAM,QAAQ,MAAM,KAAK,WAAW,EAAE,KAAK,OAAO,CAAC;AAEnD,cAAM,QAAQ;AAAA,UACZ,MAAM,IAAI,OAAO,SAAS;AACxB,kBAAM,WAAW,KAAK,KAAK,QAAQ,IAAI;AACvC,kBAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AAEnD,kBAAM,YAAY,QAAQ;AAAA,cACxB;AAAA,cACA,CAAC,QAAQ,QAAgB,YAAoB,WAAmB;AAC9D,oBAAI,sCAAsC,KAAK,UAAU,EAAG,QAAO;AACnE,uBAAO,GAAG,MAAM,GAAG,UAAU,MAAM,MAAM;AAAA,cAC3C;AAAA,YACF;AAEA,gBAAI,cAAc,SAAS;AACzB,oBAAM,GAAG,UAAU,UAAU,SAAS;AAAA,YACxC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAiCO,SAAS,4BAA4B,SAAsD;AAChG,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB,QAAQ,KAAK,KAAK,QAAQ,QAAQ,MAAM;AAAA,IACxC,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU,QAAQ,WAAW,SAAS,SAAS;AAAA,IAC/C,QAAQ,QAAQ,WAAW,SAAS,WAAW;AAAA,IAC/C,QAAQ;AAAA,IACR,aAAa,EAAE,iBAAiB,QAAQ,gBAA0D;AAAA,IAClG,SAAS,CAAC,wBAAwB,KAAK,KAAK,QAAQ,QAAQ,MAAM,CAAC,CAAC;AAAA,EACtE;AACF;AAUO,SAAS,2BAA2B,SAAqD;AAC9F,QAAM,SAAiC,CAAC;AACxC,MAAI,QAAQ,OAAO,MAAM;AACvB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,GAAG;AACtD,aAAO,gBAAgB,GAAG,IAAI,IAAI,KAAK,UAAU,KAAK;AAAA,IACxD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB,QAAQ,KAAK,KAAK,QAAQ,QAAQ,MAAM;AAAA,IACxC,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN,IAAI;AAAA,IACN;AAAA,IACA;AAAA,IACA,aAAa,EAAE,iBAAiB,QAAQ,gBAA0D;AAAA,EACpG;AACF;AAQO,SAAS,0BAA0B,QAAsD;AAC9F,SAAO,WAAW,SAAS,SAAS;AACtC;",
6
6
  "names": []
7
7
  }
@@ -2,8 +2,8 @@ import path from "path";
2
2
  import { build as viteBuild, createServer } from "vite";
3
3
  import { createWorker } from "@simplysm/core-node";
4
4
  import { consola } from "consola";
5
- import { parseRootTsconfig, getCompilerOptionsForPackage } from "../utils/tsconfig";
6
- import { createViteConfig } from "../utils/vite-config";
5
+ import { parseRootTsconfig, getCompilerOptionsForPackage } from "../utils/tsconfig.js";
6
+ import { createViteConfig } from "../utils/vite-config.js";
7
7
  const logger = consola.withTag("sd:cli:client:worker");
8
8
  let viteServer;
9
9
  async function cleanup() {
@@ -6,8 +6,8 @@ import {
6
6
  getCompilerOptionsForPackage,
7
7
  getPackageSourceFiles,
8
8
  parseRootTsconfig
9
- } from "../utils/tsconfig";
10
- import { serializeDiagnostic } from "../utils/typecheck-serialization";
9
+ } from "../utils/tsconfig.js";
10
+ import { serializeDiagnostic } from "../utils/typecheck-serialization.js";
11
11
  const logger = consola.withTag("sd:cli:dts:worker");
12
12
  let tscWatchProgram;
13
13
  function cleanup() {
@@ -1,8 +1,8 @@
1
1
  import esbuild from "esbuild";
2
2
  import { createWorker } from "@simplysm/core-node";
3
3
  import { consola } from "consola";
4
- import { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from "../utils/tsconfig";
5
- import { createLibraryEsbuildOptions, getTypecheckEnvFromTarget } from "../utils/esbuild-config";
4
+ import { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from "../utils/tsconfig.js";
5
+ import { createLibraryEsbuildOptions, getTypecheckEnvFromTarget } from "../utils/esbuild-config.js";
6
6
  const logger = consola.withTag("sd:cli:library:worker");
7
7
  let esbuildContext;
8
8
  async function cleanup() {
@@ -76,6 +76,7 @@ async function startWatch(info) {
76
76
  esbuildContext = await esbuild.context({
77
77
  ...baseOptions,
78
78
  plugins: [
79
+ ...baseOptions.plugins ?? [],
79
80
  {
80
81
  name: "watch-notify",
81
82
  setup(pluginBuild) {
@@ -1,7 +1,7 @@
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 {\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
- "mappings": "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",
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
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,8 +2,8 @@ import path from "path";
2
2
  import esbuild from "esbuild";
3
3
  import { createWorker } from "@simplysm/core-node";
4
4
  import { consola } from "consola";
5
- import { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from "../utils/tsconfig";
6
- import { createServerEsbuildOptions } from "../utils/esbuild-config";
5
+ import { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from "../utils/tsconfig.js";
6
+ import { createServerEsbuildOptions } from "../utils/esbuild-config.js";
7
7
  const logger = consola.withTag("sd:cli:server:worker");
8
8
  let esbuildContext;
9
9
  async function cleanup() {
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.16",
4
+ "version": "13.0.0-beta.18",
5
5
  "description": "심플리즘 패키지 - CLI 도구",
6
6
  "author": "김석래",
7
7
  "repository": {
@@ -40,9 +40,9 @@
40
40
  "vite-plugin-solid": "^2.11.10",
41
41
  "vite-tsconfig-paths": "^6.1.0",
42
42
  "yargs": "^18.0.0",
43
- "@simplysm/core-common": "13.0.0-beta.16",
44
- "@simplysm/core-node": "13.0.0-beta.16",
45
- "@simplysm/storage": "13.0.0-beta.16"
43
+ "@simplysm/core-common": "13.0.0-beta.18",
44
+ "@simplysm/core-node": "13.0.0-beta.18",
45
+ "@simplysm/storage": "13.0.0-beta.18"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@types/semver": "^7.7.1",
@@ -4,7 +4,7 @@
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
7
- "@simplysm/solid": "~13.0.0-beta.16",
7
+ "@simplysm/solid": "~13.0.0-beta.18",
8
8
  {{#if router}}
9
9
  "@solidjs/router": "^0.15.4",
10
10
  {{/if}}
@@ -4,6 +4,6 @@
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
7
- "@simplysm/service-server": "~13.0.0-beta.16"
7
+ "@simplysm/service-server": "~13.0.0-beta.18"
8
8
  }
9
9
  }
@@ -14,9 +14,9 @@
14
14
  "lint:fix": "sd-cli lint --fix"
15
15
  },
16
16
  "devDependencies": {
17
- "@simplysm/sd-cli": "~13.0.0-beta.16",
18
- "@simplysm/sd-claude": "~13.0.0-beta.16",
19
- "@simplysm/eslint-plugin": "~13.0.0-beta.16",
17
+ "@simplysm/sd-cli": "~13.0.0-beta.18",
18
+ "@simplysm/sd-claude": "~13.0.0-beta.18",
19
+ "@simplysm/eslint-plugin": "~13.0.0-beta.18",
20
20
  "@types/node": "^20.19.33",
21
21
  "eslint": "^9.39.2",
22
22
  "prettier": "^3.8.1",