@simplysm/sd-cli 13.0.0-beta.51 → 13.0.2

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 +1 @@
1
- {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAKA,OAAO,uBAAuB,CAAC;AAM/B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,+CAA+C;IAC/C,MAAM,EAAE,OAAO,CAAC;CACjB;AAkCD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA+BvE;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyGjE"}
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAKA,OAAO,uBAAuB,CAAC;AAO/B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,+CAA+C;IAC/C,MAAM,EAAE,OAAO,CAAC;CACjB;AAgDD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA+BvE;AAgBD;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+LjE"}
@@ -6,7 +6,16 @@ import { fsExists, fsGlob, pathFilterByTargets } from "@simplysm/core-node";
6
6
  import "@simplysm/core-common";
7
7
  import { SdError } from "@simplysm/core-common";
8
8
  import { consola, LogLevels } from "consola";
9
+ import stylelint from "stylelint";
9
10
  const ESLINT_CONFIG_FILES = ["eslint.config.ts", "eslint.config.mts", "eslint.config.js", "eslint.config.mjs"];
11
+ const STYLELINT_CONFIG_FILES = [
12
+ "stylelint.config.ts",
13
+ "stylelint.config.mts",
14
+ "stylelint.config.js",
15
+ "stylelint.config.mjs",
16
+ ".stylelintrc.json",
17
+ ".stylelintrc.yml"
18
+ ];
10
19
  function isGlobalIgnoresConfig(item) {
11
20
  if (item == null || typeof item !== "object") return false;
12
21
  if (!("ignores" in item)) return false;
@@ -42,6 +51,12 @@ async function loadIgnorePatterns(cwd) {
42
51
  }
43
52
  return configs.filter(isGlobalIgnoresConfig).flatMap((item) => item.ignores);
44
53
  }
54
+ async function hasStylelintConfig(cwd) {
55
+ for (const f of STYLELINT_CONFIG_FILES) {
56
+ if (await fsExists(path.join(cwd, f))) return true;
57
+ }
58
+ return false;
59
+ }
45
60
  async function runLint(options) {
46
61
  const { targets, fix, timing } = options;
47
62
  const cwd = process.cwd();
@@ -102,6 +117,57 @@ async function runLint(options) {
102
117
  await ESLint.outputFixes(ctx2.results);
103
118
  logger.debug("\uC790\uB3D9 \uC218\uC815 \uC801\uC6A9 \uC644\uB8CC");
104
119
  }
120
+ },
121
+ {
122
+ title: "Stylelint \uC124\uC815 \uD655\uC778",
123
+ task: async (ctx2, task) => {
124
+ ctx2.hasStylelintConfig = await hasStylelintConfig(cwd);
125
+ if (!ctx2.hasStylelintConfig) {
126
+ task.skip("stylelint.config \uD30C\uC77C \uC5C6\uC74C");
127
+ }
128
+ }
129
+ },
130
+ {
131
+ title: "CSS \uD30C\uC77C \uC218\uC9D1",
132
+ enabled: (ctx2) => ctx2.hasStylelintConfig === true,
133
+ task: async (ctx2, task) => {
134
+ let cssFiles = await fsGlob("**/*.css", {
135
+ cwd,
136
+ ignore: ctx2.ignorePatterns,
137
+ nodir: true,
138
+ absolute: true
139
+ });
140
+ cssFiles = pathFilterByTargets(cssFiles, targets, cwd);
141
+ ctx2.cssFiles = cssFiles;
142
+ task.title = `CSS \uD30C\uC77C \uC218\uC9D1 (${cssFiles.length}\uAC1C)`;
143
+ if (cssFiles.length === 0) {
144
+ task.skip("\uB9B0\uD2B8\uD560 CSS \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.");
145
+ }
146
+ }
147
+ },
148
+ {
149
+ title: "Stylelint \uC2E4\uD589",
150
+ enabled: (ctx2) => (ctx2.cssFiles?.length ?? 0) > 0,
151
+ task: async (ctx2, task) => {
152
+ const cssFiles = ctx2.cssFiles;
153
+ task.title = `Stylelint \uC2E4\uD589 \uC911... (${cssFiles.length}\uAC1C \uD30C\uC77C)`;
154
+ let configFile;
155
+ for (const f of STYLELINT_CONFIG_FILES) {
156
+ const configPath = path.join(cwd, f);
157
+ if (await fsExists(configPath)) {
158
+ configFile = configPath;
159
+ break;
160
+ }
161
+ }
162
+ const result = await stylelint.lint({
163
+ files: cssFiles,
164
+ configFile,
165
+ fix,
166
+ cache: true,
167
+ cacheLocation: path.join(cwd, ".cache", "stylelint.cache")
168
+ });
169
+ ctx2.stylelintResult = result;
170
+ }
105
171
  }
106
172
  ],
107
173
  {
@@ -130,6 +196,32 @@ async function runLint(options) {
130
196
  if (errorCount > 0) {
131
197
  process.exitCode = 1;
132
198
  }
199
+ if (ctx.stylelintResult != null && ctx.stylelintResult.results.length > 0) {
200
+ const stylelintErrorCount = ctx.stylelintResult.results.sum(
201
+ (r) => r.warnings.filter((w) => w.severity === "error").length
202
+ );
203
+ const stylelintWarningCount = ctx.stylelintResult.results.sum(
204
+ (r) => r.warnings.filter((w) => w.severity === "warning").length
205
+ );
206
+ if (stylelintErrorCount > 0) {
207
+ logger.error("Stylelint \uC5D0\uB7EC \uBC1C\uC0DD", { errorCount: stylelintErrorCount, warningCount: stylelintWarningCount });
208
+ } else if (stylelintWarningCount > 0) {
209
+ logger.info("Stylelint \uC644\uB8CC (\uACBD\uACE0 \uC788\uC74C)", {
210
+ errorCount: stylelintErrorCount,
211
+ warningCount: stylelintWarningCount
212
+ });
213
+ } else {
214
+ logger.info("Stylelint \uC644\uB8CC", { errorCount: stylelintErrorCount, warningCount: stylelintWarningCount });
215
+ }
216
+ const stylelintFormatter = await stylelint.formatters.string;
217
+ const stylelintOutput = stylelintFormatter(ctx.stylelintResult.results, ctx.stylelintResult);
218
+ if (stylelintOutput) {
219
+ process.stdout.write(stylelintOutput);
220
+ }
221
+ if (stylelintErrorCount > 0) {
222
+ process.exitCode = 1;
223
+ }
224
+ }
133
225
  }
134
226
  export {
135
227
  loadIgnorePatterns,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/lint.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["ctx"]
6
6
  }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * replace-deps 명령 옵션
3
+ */
4
+ export interface ReplaceDepsOptions {
5
+ /** sd.config.ts에 전달할 추가 옵션 */
6
+ options: string[];
7
+ }
8
+ /**
9
+ * sd.config.ts의 replaceDeps 설정에 따라 node_modules 패키지를 로컬 소스로 symlink 교체한다.
10
+ */
11
+ export declare function runReplaceDeps(opts: ReplaceDepsOptions): Promise<void>;
12
+ //# sourceMappingURL=replace-deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-deps.d.ts","sourceRoot":"","sources":["../../src/commands/replace-deps.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5E"}
@@ -0,0 +1,16 @@
1
+ import { consola } from "consola";
2
+ import { loadSdConfig } from "../utils/sd-config.js";
3
+ import { setupReplaceDeps } from "../utils/replace-deps.js";
4
+ async function runReplaceDeps(opts) {
5
+ const cwd = process.cwd();
6
+ const sdConfig = await loadSdConfig({ cwd, dev: false, opt: opts.options });
7
+ if (sdConfig.replaceDeps == null) {
8
+ consola.warn("sd.config.ts\uC5D0 replaceDeps \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.");
9
+ return;
10
+ }
11
+ await setupReplaceDeps(cwd, sdConfig.replaceDeps);
12
+ }
13
+ export {
14
+ runReplaceDeps
15
+ };
16
+ //# sourceMappingURL=replace-deps.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/replace-deps.ts"],
4
+ "mappings": "AAAA,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AAajC,eAAsB,eAAe,MAAyC;AAC5E,QAAM,MAAM,QAAQ,IAAI;AAExB,QAAM,WAAW,MAAM,aAAa,EAAE,KAAK,KAAK,OAAO,KAAK,KAAK,QAAQ,CAAC;AAE1E,MAAI,SAAS,eAAe,MAAM;AAChC,YAAQ,KAAK,6EAAqC;AAClD;AAAA,EACF;AAEA,QAAM,iBAAiB,KAAK,SAAS,WAAW;AAClD;",
5
+ "names": []
6
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"sd-cli.d.ts","sourceRoot":"","sources":["../src/sd-cli.ts"],"names":[],"mappings":";AAGA,OAAO,uBAAuB,CAAC;AAC/B,OAAc,EAAE,KAAK,IAAI,EAAE,MAAM,OAAO,CAAC;AAkBzC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiRpD"}
1
+ {"version":3,"file":"sd-cli.d.ts","sourceRoot":"","sources":["../src/sd-cli.ts"],"names":[],"mappings":";AAGA,OAAO,uBAAuB,CAAC;AAC/B,OAAc,EAAE,KAAK,IAAI,EAAE,MAAM,OAAO,CAAC;AAmBzC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuSpD"}
package/dist/sd-cli.js CHANGED
@@ -8,6 +8,7 @@ import { runWatch } from "./commands/watch.js";
8
8
  import { runDev } from "./commands/dev.js";
9
9
  import { runBuild } from "./commands/build.js";
10
10
  import { runPublish } from "./commands/publish.js";
11
+ import { runReplaceDeps } from "./commands/replace-deps.js";
11
12
  import { runDevice } from "./commands/device.js";
12
13
  import path from "path";
13
14
  import fs from "fs";
@@ -26,7 +27,7 @@ function createCliParser(argv) {
26
27
  if (args.debug) consola.level = LogLevels.debug;
27
28
  }).command(
28
29
  "lint [targets..]",
29
- "ESLint\uB97C \uC2E4\uD589\uD55C\uB2E4.",
30
+ "ESLint + Stylelint\uB97C \uC2E4\uD589\uD55C\uB2E4.",
30
31
  (cmd) => cmd.version(false).hide("help").positional("targets", {
31
32
  type: "string",
32
33
  array: true,
@@ -236,6 +237,23 @@ function createCliParser(argv) {
236
237
  options: args.options
237
238
  });
238
239
  }
240
+ ).command(
241
+ "replace-deps",
242
+ "sd.config.ts\uC758 replaceDeps \uC124\uC815\uC5D0 \uB530\uB77C node_modules \uD328\uD0A4\uC9C0\uB97C \uB85C\uCEEC \uC18C\uC2A4\uB85C symlink \uAD50\uCCB4\uD55C\uB2E4.",
243
+ (cmd) => cmd.version(false).hide("help").options({
244
+ options: {
245
+ type: "string",
246
+ array: true,
247
+ alias: "o",
248
+ description: "sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)",
249
+ default: []
250
+ }
251
+ }),
252
+ async (args) => {
253
+ await runReplaceDeps({
254
+ options: args.options
255
+ });
256
+ }
239
257
  ).demandCommand(1, "\uBA85\uB839\uC5B4\uB97C \uC9C0\uC815\uD574\uC8FC\uC138\uC694.").strict();
240
258
  }
241
259
  const cliEntryPath = process.argv.at(1);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/sd-cli.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -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,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"}
1
+ {"version":3,"file":"library.worker.d.ts","sourceRoot":"","sources":["../../src/workers/library.worker.ts"],"names":[],"mappings":"AAIA,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;AAwDD;;GAEG;AACH,iBAAe,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+BxE;AAmED;;;;GAIG;AACH,iBAAe,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD/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,16 +1,18 @@
1
+ import path from "path";
1
2
  import esbuild from "esbuild";
2
- import { createWorker } from "@simplysm/core-node";
3
+ import { createWorker, FsWatcher } from "@simplysm/core-node";
3
4
  import { consola } from "consola";
4
5
  import { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from "../utils/tsconfig.js";
5
6
  import { createLibraryEsbuildOptions, getTypecheckEnvFromTarget } from "../utils/esbuild-config.js";
6
7
  const logger = consola.withTag("sd:cli:library:worker");
7
8
  let esbuildContext;
9
+ let fsWatcher;
8
10
  async function cleanup() {
9
11
  const contextToDispose = esbuildContext;
10
12
  esbuildContext = void 0;
11
- if (contextToDispose != null) {
12
- await contextToDispose.dispose();
13
- }
13
+ const watcherToClose = fsWatcher;
14
+ fsWatcher = void 0;
15
+ await Promise.all([contextToDispose?.dispose(), watcherToClose?.close()]);
14
16
  }
15
17
  process.on("SIGTERM", () => {
16
18
  cleanup().catch((err) => {
@@ -52,52 +54,79 @@ async function build(info) {
52
54
  }
53
55
  }
54
56
  let isWatchStarted = false;
57
+ async function createAndBuildContext(pkgDir, cwd, config, isFirstBuild, resolveFirstBuild) {
58
+ const parsedConfig = parseRootTsconfig(cwd);
59
+ const entryPoints = getPackageSourceFiles(pkgDir, parsedConfig);
60
+ const env = getTypecheckEnvFromTarget(config.target);
61
+ const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, env, pkgDir);
62
+ const baseOptions = createLibraryEsbuildOptions({
63
+ pkgDir,
64
+ entryPoints,
65
+ target: config.target,
66
+ compilerOptions
67
+ });
68
+ let isBuildFirstTime = isFirstBuild;
69
+ const context = await esbuild.context({
70
+ ...baseOptions,
71
+ plugins: [
72
+ ...baseOptions.plugins ?? [],
73
+ {
74
+ name: "watch-notify",
75
+ setup(pluginBuild) {
76
+ pluginBuild.onStart(() => {
77
+ sender.send("buildStart", {});
78
+ });
79
+ pluginBuild.onEnd((result) => {
80
+ const errors = result.errors.map((e) => e.text);
81
+ const success = result.errors.length === 0;
82
+ sender.send("build", { success, errors: errors.length > 0 ? errors : void 0 });
83
+ if (isBuildFirstTime) {
84
+ isBuildFirstTime = false;
85
+ resolveFirstBuild?.();
86
+ }
87
+ });
88
+ }
89
+ }
90
+ ]
91
+ });
92
+ await context.rebuild();
93
+ return context;
94
+ }
55
95
  async function startWatch(info) {
56
96
  if (isWatchStarted) {
57
97
  throw new Error("startWatch\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.");
58
98
  }
59
99
  isWatchStarted = true;
60
100
  try {
61
- const parsedConfig = parseRootTsconfig(info.cwd);
62
- const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);
63
- const env = getTypecheckEnvFromTarget(info.config.target);
64
- const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, env, info.pkgDir);
65
101
  let resolveFirstBuild;
66
102
  const firstBuildPromise = new Promise((resolve) => {
67
103
  resolveFirstBuild = resolve;
68
104
  });
69
- let isFirstBuild = true;
70
- const baseOptions = createLibraryEsbuildOptions({
71
- pkgDir: info.pkgDir,
72
- entryPoints,
73
- target: info.config.target,
74
- compilerOptions
75
- });
76
- esbuildContext = await esbuild.context({
77
- ...baseOptions,
78
- plugins: [
79
- ...baseOptions.plugins ?? [],
80
- {
81
- name: "watch-notify",
82
- setup(pluginBuild) {
83
- pluginBuild.onStart(() => {
84
- sender.send("buildStart", {});
85
- });
86
- pluginBuild.onEnd((result) => {
87
- const errors = result.errors.map((e) => e.text);
88
- const success = result.errors.length === 0;
89
- sender.send("build", { success, errors: errors.length > 0 ? errors : void 0 });
90
- if (isFirstBuild) {
91
- isFirstBuild = false;
92
- resolveFirstBuild();
93
- }
94
- });
105
+ esbuildContext = await createAndBuildContext(info.pkgDir, info.cwd, info.config, true, resolveFirstBuild);
106
+ await firstBuildPromise;
107
+ const srcPattern = path.join(info.pkgDir, "src", "**", "*.{ts,tsx}");
108
+ fsWatcher = await FsWatcher.watch([srcPattern]);
109
+ fsWatcher.onChange({ delay: 300 }, async (changes) => {
110
+ try {
111
+ const hasAddOrUnlink = changes.some((c) => c.event === "add" || c.event === "unlink");
112
+ if (hasAddOrUnlink) {
113
+ logger.debug("\uD30C\uC77C \uCD94\uAC00/\uC0AD\uC81C \uAC10\uC9C0, context \uC7AC\uC0DD\uC131");
114
+ const oldContext = esbuildContext;
115
+ esbuildContext = await createAndBuildContext(info.pkgDir, info.cwd, info.config, false);
116
+ if (oldContext != null) {
117
+ await oldContext.dispose();
118
+ }
119
+ } else {
120
+ if (esbuildContext != null) {
121
+ await esbuildContext.rebuild();
95
122
  }
96
123
  }
97
- ]
124
+ } catch (err) {
125
+ sender.send("error", {
126
+ message: err instanceof Error ? err.message : String(err)
127
+ });
128
+ }
98
129
  });
99
- await esbuildContext.watch();
100
- await firstBuildPromise;
101
130
  } catch (err) {
102
131
  sender.send("error", {
103
132
  message: err instanceof Error ? err.message : String(err)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/workers/library.worker.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
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.51",
4
+ "version": "13.0.2",
5
5
  "description": "심플리즘 패키지 - CLI 도구",
6
6
  "author": "김석래",
7
7
  "repository": {
@@ -36,6 +36,7 @@
36
36
  "sharp": "^0.34.5",
37
37
  "solid-js": "^1.9.11",
38
38
  "ssh2": "^1.17.0",
39
+ "stylelint": "^16.26.1",
39
40
  "tailwindcss": "^3.4.19",
40
41
  "ts-morph": "^27.0.2",
41
42
  "typescript": "^5.9.3",
@@ -44,9 +45,9 @@
44
45
  "vite-plugin-solid": "^2.11.10",
45
46
  "vite-tsconfig-paths": "^6.1.0",
46
47
  "yargs": "^18.0.0",
47
- "@simplysm/core-common": "13.0.0-beta.51",
48
- "@simplysm/core-node": "13.0.0-beta.51",
49
- "@simplysm/storage": "13.0.0-beta.51"
48
+ "@simplysm/core-common": "13.0.2",
49
+ "@simplysm/storage": "13.0.2",
50
+ "@simplysm/core-node": "13.0.2"
50
51
  },
51
52
  "devDependencies": {
52
53
  "@types/semver": "^7.7.1",
@@ -6,6 +6,7 @@ import { fsExists, fsGlob, pathFilterByTargets } from "@simplysm/core-node";
6
6
  import "@simplysm/core-common";
7
7
  import { SdError } from "@simplysm/core-common";
8
8
  import { consola, LogLevels } from "consola";
9
+ import stylelint from "stylelint";
9
10
 
10
11
  //#region Types
11
12
 
@@ -32,6 +33,10 @@ interface LintContext {
32
33
  eslint?: ESLint;
33
34
  /** 린트 대상 파일이 있을 때만 초기화됨 */
34
35
  results?: ESLint.LintResult[];
36
+ // Stylelint
37
+ hasStylelintConfig?: boolean;
38
+ cssFiles?: string[];
39
+ stylelintResult?: stylelint.LinterResult;
35
40
  }
36
41
 
37
42
  //#endregion
@@ -41,6 +46,16 @@ interface LintContext {
41
46
  /** ESLint 설정 파일 탐색 순서 */
42
47
  const ESLINT_CONFIG_FILES = ["eslint.config.ts", "eslint.config.mts", "eslint.config.js", "eslint.config.mjs"] as const;
43
48
 
49
+ /** Stylelint 설정 파일 탐색 순서 */
50
+ const STYLELINT_CONFIG_FILES = [
51
+ "stylelint.config.ts",
52
+ "stylelint.config.mts",
53
+ "stylelint.config.js",
54
+ "stylelint.config.mjs",
55
+ ".stylelintrc.json",
56
+ ".stylelintrc.yml",
57
+ ] as const;
58
+
44
59
  /**
45
60
  * ignores 속성만 가진 ESLint 설정 객체인지 검사하는 타입 가드
46
61
  */
@@ -91,6 +106,16 @@ export async function loadIgnorePatterns(cwd: string): Promise<string[]> {
91
106
  return configs.filter(isGlobalIgnoresConfig).flatMap((item) => item.ignores);
92
107
  }
93
108
 
109
+ /**
110
+ * Stylelint 설정 파일이 존재하는지 확인한다.
111
+ */
112
+ async function hasStylelintConfig(cwd: string): Promise<boolean> {
113
+ for (const f of STYLELINT_CONFIG_FILES) {
114
+ if (await fsExists(path.join(cwd, f))) return true;
115
+ }
116
+ return false;
117
+ }
118
+
94
119
  //#endregion
95
120
 
96
121
  //#region Main
@@ -174,6 +199,60 @@ export async function runLint(options: LintOptions): Promise<void> {
174
199
  logger.debug("자동 수정 적용 완료");
175
200
  },
176
201
  },
202
+ {
203
+ title: "Stylelint 설정 확인",
204
+ task: async (ctx, task) => {
205
+ ctx.hasStylelintConfig = await hasStylelintConfig(cwd);
206
+ if (!ctx.hasStylelintConfig) {
207
+ task.skip("stylelint.config 파일 없음");
208
+ }
209
+ },
210
+ },
211
+ {
212
+ title: "CSS 파일 수집",
213
+ enabled: (ctx) => ctx.hasStylelintConfig === true,
214
+ task: async (ctx, task) => {
215
+ let cssFiles = await fsGlob("**/*.css", {
216
+ cwd,
217
+ ignore: ctx.ignorePatterns,
218
+ nodir: true,
219
+ absolute: true,
220
+ });
221
+ cssFiles = pathFilterByTargets(cssFiles, targets, cwd);
222
+ ctx.cssFiles = cssFiles;
223
+ task.title = `CSS 파일 수집 (${cssFiles.length}개)`;
224
+ if (cssFiles.length === 0) {
225
+ task.skip("린트할 CSS 파일이 없습니다.");
226
+ }
227
+ },
228
+ },
229
+ {
230
+ title: "Stylelint 실행",
231
+ enabled: (ctx) => (ctx.cssFiles?.length ?? 0) > 0,
232
+ task: async (ctx, task) => {
233
+ const cssFiles = ctx.cssFiles!;
234
+ task.title = `Stylelint 실행 중... (${cssFiles.length}개 파일)`;
235
+
236
+ // Stylelint 설정 파일 경로 찾기
237
+ let configFile: string | undefined;
238
+ for (const f of STYLELINT_CONFIG_FILES) {
239
+ const configPath = path.join(cwd, f);
240
+ if (await fsExists(configPath)) {
241
+ configFile = configPath;
242
+ break;
243
+ }
244
+ }
245
+
246
+ const result = await stylelint.lint({
247
+ files: cssFiles,
248
+ configFile,
249
+ fix,
250
+ cache: true,
251
+ cacheLocation: path.join(cwd, ".cache", "stylelint.cache"),
252
+ });
253
+ ctx.stylelintResult = result;
254
+ },
255
+ },
177
256
  ],
178
257
  {
179
258
  renderer: consola.level >= LogLevels.debug ? "verbose" : "default",
@@ -211,6 +290,38 @@ export async function runLint(options: LintOptions): Promise<void> {
211
290
  if (errorCount > 0) {
212
291
  process.exitCode = 1;
213
292
  }
293
+
294
+ // Stylelint 결과 출력
295
+ if (ctx.stylelintResult != null && ctx.stylelintResult.results.length > 0) {
296
+ const stylelintErrorCount = ctx.stylelintResult.results.sum(
297
+ (r) => r.warnings.filter((w) => w.severity === "error").length,
298
+ );
299
+ const stylelintWarningCount = ctx.stylelintResult.results.sum(
300
+ (r) => r.warnings.filter((w) => w.severity === "warning").length,
301
+ );
302
+
303
+ if (stylelintErrorCount > 0) {
304
+ logger.error("Stylelint 에러 발생", { errorCount: stylelintErrorCount, warningCount: stylelintWarningCount });
305
+ } else if (stylelintWarningCount > 0) {
306
+ logger.info("Stylelint 완료 (경고 있음)", {
307
+ errorCount: stylelintErrorCount,
308
+ warningCount: stylelintWarningCount,
309
+ });
310
+ } else {
311
+ logger.info("Stylelint 완료", { errorCount: stylelintErrorCount, warningCount: stylelintWarningCount });
312
+ }
313
+
314
+ // Stylelint formatter 출력
315
+ const stylelintFormatter = await stylelint.formatters.string;
316
+ const stylelintOutput = stylelintFormatter(ctx.stylelintResult.results, ctx.stylelintResult);
317
+ if (stylelintOutput) {
318
+ process.stdout.write(stylelintOutput);
319
+ }
320
+
321
+ if (stylelintErrorCount > 0) {
322
+ process.exitCode = 1;
323
+ }
324
+ }
214
325
  }
215
326
 
216
327
  //#endregion
@@ -0,0 +1,27 @@
1
+ import { consola } from "consola";
2
+ import { loadSdConfig } from "../utils/sd-config";
3
+ import { setupReplaceDeps } from "../utils/replace-deps";
4
+
5
+ /**
6
+ * replace-deps 명령 옵션
7
+ */
8
+ export interface ReplaceDepsOptions {
9
+ /** sd.config.ts에 전달할 추가 옵션 */
10
+ options: string[];
11
+ }
12
+
13
+ /**
14
+ * sd.config.ts의 replaceDeps 설정에 따라 node_modules 패키지를 로컬 소스로 symlink 교체한다.
15
+ */
16
+ export async function runReplaceDeps(opts: ReplaceDepsOptions): Promise<void> {
17
+ const cwd = process.cwd();
18
+
19
+ const sdConfig = await loadSdConfig({ cwd, dev: false, opt: opts.options });
20
+
21
+ if (sdConfig.replaceDeps == null) {
22
+ consola.warn("sd.config.ts에 replaceDeps 설정이 없습니다.");
23
+ return;
24
+ }
25
+
26
+ await setupReplaceDeps(cwd, sdConfig.replaceDeps);
27
+ }
package/src/sd-cli.ts CHANGED
@@ -10,6 +10,7 @@ import { runWatch } from "./commands/watch";
10
10
  import { runDev } from "./commands/dev";
11
11
  import { runBuild } from "./commands/build";
12
12
  import { runPublish } from "./commands/publish";
13
+ import { runReplaceDeps } from "./commands/replace-deps";
13
14
  import { runDevice } from "./commands/device";
14
15
  import path from "path";
15
16
  import fs from "fs";
@@ -39,7 +40,7 @@ export function createCliParser(argv: string[]): Argv {
39
40
  })
40
41
  .command(
41
42
  "lint [targets..]",
42
- "ESLint를 실행한다.",
43
+ "ESLint + Stylelint를 실행한다.",
43
44
  (cmd) =>
44
45
  cmd
45
46
  .version(false)
@@ -295,6 +296,28 @@ export function createCliParser(argv: string[]): Argv {
295
296
  });
296
297
  },
297
298
  )
299
+ .command(
300
+ "replace-deps",
301
+ "sd.config.ts의 replaceDeps 설정에 따라 node_modules 패키지를 로컬 소스로 symlink 교체한다.",
302
+ (cmd) =>
303
+ cmd
304
+ .version(false)
305
+ .hide("help")
306
+ .options({
307
+ options: {
308
+ type: "string",
309
+ array: true,
310
+ alias: "o",
311
+ description: "sd.config.ts에 전달할 옵션 (예: -o key=value)",
312
+ default: [] as string[],
313
+ },
314
+ }),
315
+ async (args) => {
316
+ await runReplaceDeps({
317
+ options: args.options,
318
+ });
319
+ },
320
+ )
298
321
  .demandCommand(1, "명령어를 지정해주세요.")
299
322
  .strict();
300
323
  }
@@ -1,5 +1,6 @@
1
+ import path from "path";
1
2
  import esbuild from "esbuild";
2
- import { createWorker } from "@simplysm/core-node";
3
+ import { createWorker, FsWatcher } from "@simplysm/core-node";
3
4
  import { consola } from "consola";
4
5
  import type { SdBuildPackageConfig } from "../sd-config.types";
5
6
  import { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from "../utils/tsconfig";
@@ -68,6 +69,9 @@ const logger = consola.withTag("sd:cli:library:worker");
68
69
  /** esbuild build context (정리 대상) */
69
70
  let esbuildContext: esbuild.BuildContext | undefined;
70
71
 
72
+ /** FsWatcher (정리 대상) */
73
+ let fsWatcher: FsWatcher | undefined;
74
+
71
75
  /**
72
76
  * 리소스 정리
73
77
  */
@@ -77,9 +81,10 @@ async function cleanup(): Promise<void> {
77
81
  const contextToDispose = esbuildContext;
78
82
  esbuildContext = undefined;
79
83
 
80
- if (contextToDispose != null) {
81
- await contextToDispose.dispose();
82
- }
84
+ const watcherToClose = fsWatcher;
85
+ fsWatcher = undefined;
86
+
87
+ await Promise.all([contextToDispose?.dispose(), watcherToClose?.close()]);
83
88
  }
84
89
 
85
90
  // 프로세스 종료 전 리소스 정리 (SIGTERM/SIGINT)
@@ -148,6 +153,68 @@ async function build(info: LibraryBuildInfo): Promise<LibraryBuildResult> {
148
153
  /** startWatch 호출 여부 플래그 */
149
154
  let isWatchStarted = false;
150
155
 
156
+ /**
157
+ * esbuild context 생성 및 초기 빌드 수행
158
+ */
159
+ async function createAndBuildContext(
160
+ pkgDir: string,
161
+ cwd: string,
162
+ config: SdBuildPackageConfig,
163
+ isFirstBuild: boolean,
164
+ resolveFirstBuild?: () => void,
165
+ ): Promise<esbuild.BuildContext> {
166
+ // tsconfig 파싱
167
+ const parsedConfig = parseRootTsconfig(cwd);
168
+ const entryPoints = getPackageSourceFiles(pkgDir, parsedConfig);
169
+
170
+ // 타겟별 compilerOptions 생성
171
+ const env = getTypecheckEnvFromTarget(config.target);
172
+ const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, env, pkgDir);
173
+
174
+ // esbuild 옵션 생성
175
+ const baseOptions = createLibraryEsbuildOptions({
176
+ pkgDir,
177
+ entryPoints,
178
+ target: config.target,
179
+ compilerOptions,
180
+ });
181
+
182
+ let isBuildFirstTime = isFirstBuild;
183
+
184
+ // context 생성 + watch-notify 플러그인 추가
185
+ const context = await esbuild.context({
186
+ ...baseOptions,
187
+ plugins: [
188
+ ...(baseOptions.plugins ?? []),
189
+ {
190
+ name: "watch-notify",
191
+ setup(pluginBuild) {
192
+ pluginBuild.onStart(() => {
193
+ sender.send("buildStart", {});
194
+ });
195
+
196
+ pluginBuild.onEnd((result) => {
197
+ const errors = result.errors.map((e) => e.text);
198
+ const success = result.errors.length === 0;
199
+
200
+ sender.send("build", { success, errors: errors.length > 0 ? errors : undefined });
201
+
202
+ if (isBuildFirstTime) {
203
+ isBuildFirstTime = false;
204
+ resolveFirstBuild?.();
205
+ }
206
+ });
207
+ },
208
+ },
209
+ ],
210
+ });
211
+
212
+ // 초기 빌드
213
+ await context.rebuild();
214
+
215
+ return context;
216
+ }
217
+
151
218
  /**
152
219
  * watch 시작
153
220
  * @remarks 이 함수는 Worker당 한 번만 호출되어야 합니다.
@@ -160,62 +227,50 @@ async function startWatch(info: LibraryWatchInfo): Promise<void> {
160
227
  isWatchStarted = true;
161
228
 
162
229
  try {
163
- // tsconfig 파싱
164
- const parsedConfig = parseRootTsconfig(info.cwd);
165
- const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);
166
-
167
- // 타겟별 compilerOptions 생성
168
- const env = getTypecheckEnvFromTarget(info.config.target);
169
- const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, env, info.pkgDir);
170
-
171
230
  // 첫 번째 빌드 완료 대기를 위한 Promise
172
231
  let resolveFirstBuild!: () => void;
173
232
  const firstBuildPromise = new Promise<void>((resolve) => {
174
233
  resolveFirstBuild = resolve;
175
234
  });
176
235
 
177
- let isFirstBuild = true;
178
-
179
- // esbuild 기본 옵션 생성
180
- const baseOptions = createLibraryEsbuildOptions({
181
- pkgDir: info.pkgDir,
182
- entryPoints,
183
- target: info.config.target,
184
- compilerOptions,
185
- });
186
-
187
- // watch용 플러그인 추가
188
- esbuildContext = await esbuild.context({
189
- ...baseOptions,
190
- plugins: [
191
- ...(baseOptions.plugins ?? []),
192
- {
193
- name: "watch-notify",
194
- setup(pluginBuild) {
195
- pluginBuild.onStart(() => {
196
- sender.send("buildStart", {});
197
- });
198
-
199
- pluginBuild.onEnd((result) => {
200
- const errors = result.errors.map((e) => e.text);
201
- const success = result.errors.length === 0;
202
-
203
- sender.send("build", { success, errors: errors.length > 0 ? errors : undefined });
204
-
205
- if (isFirstBuild) {
206
- isFirstBuild = false;
207
- resolveFirstBuild();
208
- }
209
- });
210
- },
211
- },
212
- ],
213
- });
214
-
215
- await esbuildContext.watch();
236
+ // 초기 esbuild context 생성 및 빌드
237
+ esbuildContext = await createAndBuildContext(info.pkgDir, info.cwd, info.config, true, resolveFirstBuild);
216
238
 
217
239
  // 첫 번째 빌드 완료 대기
218
240
  await firstBuildPromise;
241
+
242
+ // FsWatcher 시작 (src/**/*.{ts,tsx} 감시)
243
+ const srcPattern = path.join(info.pkgDir, "src", "**", "*.{ts,tsx}");
244
+ fsWatcher = await FsWatcher.watch([srcPattern]);
245
+
246
+ // 파일 변경 감지 시 처리
247
+ fsWatcher.onChange({ delay: 300 }, async (changes) => {
248
+ try {
249
+ // add 또는 unlink 이벤트가 있는지 확인
250
+ const hasAddOrUnlink = changes.some((c) => c.event === "add" || c.event === "unlink");
251
+
252
+ if (hasAddOrUnlink) {
253
+ // entry points 변경이 있으므로 context 재생성
254
+ logger.debug("파일 추가/삭제 감지, context 재생성");
255
+
256
+ const oldContext = esbuildContext;
257
+ esbuildContext = await createAndBuildContext(info.pkgDir, info.cwd, info.config, false);
258
+
259
+ if (oldContext != null) {
260
+ await oldContext.dispose();
261
+ }
262
+ } else {
263
+ // 파일 내용만 변경 (change 이벤트)
264
+ if (esbuildContext != null) {
265
+ await esbuildContext.rebuild();
266
+ }
267
+ }
268
+ } catch (err) {
269
+ sender.send("error", {
270
+ message: err instanceof Error ? err.message : String(err),
271
+ });
272
+ }
273
+ });
219
274
  } catch (err) {
220
275
  sender.send("error", {
221
276
  message: err instanceof Error ? err.message : String(err),
@@ -4,7 +4,7 @@
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
7
- "@simplysm/solid": "~13.0.0-beta.51",
7
+ "@simplysm/solid": "~13.0.2",
8
8
  {{#if router}}
9
9
  "@solidjs/router": "^0.15.4",
10
10
  {{/if}}
@@ -4,7 +4,7 @@
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
7
- "@simplysm/core-common": "~13.0.0-beta.51",
8
- "@simplysm/service-server": "~13.0.0-beta.51"
7
+ "@simplysm/core-common": "~13.0.2",
8
+ "@simplysm/service-server": "~13.0.2"
9
9
  }
10
10
  }
@@ -1,7 +1,7 @@
1
1
  import { env } from "@simplysm/core-common";
2
- import { ServiceServer } from "@simplysm/service-server";
2
+ import { createServiceServer } from "@simplysm/service-server";
3
3
 
4
- export const server = new ServiceServer({
4
+ export const server = createServiceServer({
5
5
  rootPath: process.cwd(),
6
6
  port: {{port}},
7
7
  services: [],
@@ -1,5 +1,5 @@
1
- import simplysmPlugin from "@simplysm/eslint-plugin";
1
+ import simplysmEslintRecommended from "@simplysm/lint/eslint-recommended";
2
2
 
3
3
  export default [
4
- ...simplysmPlugin.configs.recommended,
4
+ ...simplysmEslintRecommended,
5
5
  ];
@@ -15,12 +15,13 @@
15
15
  "vitest": "vitest"
16
16
  },
17
17
  "devDependencies": {
18
- "@simplysm/sd-cli": "~13.0.0-beta.51",
19
- "@simplysm/claude": "~13.0.0-beta.51",
20
- "@simplysm/eslint-plugin": "~13.0.0-beta.51",
18
+ "@simplysm/sd-cli": "~13.0.2",
19
+ "@simplysm/claude": "~13.0.2",
20
+ "@simplysm/lint": "~13.0.2",
21
21
  "@types/node": "^20.19.33",
22
22
  "eslint": "^9.39.2",
23
23
  "prettier": "^3.8.1",
24
+ "stylelint": "^16.13.0",
24
25
  "typescript": "^5.9.3",
25
26
  "vite-tsconfig-paths": "^6.1.0",
26
27
  "vitest": "^4.0.18"
@@ -0,0 +1 @@
1
+ export { default } from "@simplysm/lint/stylelint-recommended";