@simplysm/sd-cli 13.0.12 → 13.0.13
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 +42 -2
- package/dist/utils/esbuild-config.d.ts +8 -0
- package/dist/utils/esbuild-config.d.ts.map +1 -1
- package/dist/utils/esbuild-config.js +23 -28
- package/dist/utils/esbuild-config.js.map +1 -1
- package/dist/utils/vite-config.d.ts.map +1 -1
- package/dist/utils/vite-config.js +18 -2
- package/dist/utils/vite-config.js.map +1 -1
- package/dist/workers/library.worker.d.ts.map +1 -1
- package/dist/workers/library.worker.js +12 -2
- package/dist/workers/library.worker.js.map +1 -1
- package/package.json +4 -4
- package/src/utils/esbuild-config.ts +31 -33
- package/src/utils/vite-config.ts +31 -3
- package/src/workers/library.worker.ts +14 -3
- package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
- package/templates/add-server/__SERVER__/package.json.hbs +2 -2
- package/templates/init/package.json.hbs +3 -3
package/README.md
CHANGED
|
@@ -272,6 +272,25 @@ After collecting inputs, it:
|
|
|
272
272
|
sd-cli add server
|
|
273
273
|
```
|
|
274
274
|
|
|
275
|
+
### replace-deps
|
|
276
|
+
|
|
277
|
+
Sets up local dependency replacement according to `replaceDeps` configuration in `sd.config.ts`. Useful for local development of dependent packages across separate repositories.
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
# Set up replacements (symlink or copy mode based on config)
|
|
281
|
+
sd-cli replace-deps
|
|
282
|
+
|
|
283
|
+
# With additional options
|
|
284
|
+
sd-cli replace-deps -o key=value
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
**Options:**
|
|
288
|
+
|
|
289
|
+
| Option | Description | Default |
|
|
290
|
+
| ----------------- | ---------------------------------------------------------- | ------- |
|
|
291
|
+
| `--options`, `-o` | Additional options to pass to sd.config.ts (multi-use) | `[]` |
|
|
292
|
+
| `--debug` | Output debug logs | `false` |
|
|
293
|
+
|
|
275
294
|
### device
|
|
276
295
|
|
|
277
296
|
Runs Capacitor app on Android device. Only available for `client` target packages with `capacitor` config in `sd.config.ts`.
|
|
@@ -293,9 +312,9 @@ sd-cli device -p my-app -u http://192.168.0.10:3000
|
|
|
293
312
|
| `--options`, `-o` | Additional options to pass to sd.config.ts (multi-use) | `[]` |
|
|
294
313
|
| `--debug` | Output debug logs | `false` |
|
|
295
314
|
|
|
296
|
-
## Exported Types
|
|
315
|
+
## Exported Types and Utilities
|
|
297
316
|
|
|
298
|
-
This package exports configuration types for `sd.config.ts
|
|
317
|
+
This package exports configuration types for `sd.config.ts` and Vite utilities. All are importable from `@simplysm/sd-cli`.
|
|
299
318
|
|
|
300
319
|
```typescript
|
|
301
320
|
import type {
|
|
@@ -318,7 +337,9 @@ import type {
|
|
|
318
337
|
SdCapacitorPermission,
|
|
319
338
|
SdCapacitorIntentFilter,
|
|
320
339
|
SdElectronConfig,
|
|
340
|
+
ViteConfigOptions,
|
|
321
341
|
} from "@simplysm/sd-cli";
|
|
342
|
+
import { createViteConfig } from "@simplysm/sd-cli";
|
|
322
343
|
```
|
|
323
344
|
|
|
324
345
|
| Type | Description |
|
|
@@ -342,6 +363,25 @@ import type {
|
|
|
342
363
|
| `SdCapacitorPermission` | Android permission entry (`name`, `maxSdkVersion?`, `ignore?`) |
|
|
343
364
|
| `SdCapacitorIntentFilter` | Android intent filter entry (`action?`, `category?`) |
|
|
344
365
|
| `SdElectronConfig` | Electron desktop app build config |
|
|
366
|
+
| `ViteConfigOptions` | Vite config options for `createViteConfig()` utility function |
|
|
367
|
+
|
|
368
|
+
## Vite Utilities
|
|
369
|
+
|
|
370
|
+
The package exports `createViteConfig()` utility function for creating Vite configuration in client packages:
|
|
371
|
+
|
|
372
|
+
```typescript
|
|
373
|
+
import { createViteConfig, type ViteConfigOptions } from "@simplysm/sd-cli";
|
|
374
|
+
|
|
375
|
+
export default createViteConfig({
|
|
376
|
+
// Vite config options
|
|
377
|
+
});
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
The `createViteConfig()` function creates a pre-configured Vite config for Simplysm client packages, including:
|
|
381
|
+
- Development server configuration
|
|
382
|
+
- Production build optimization
|
|
383
|
+
- Asset handling
|
|
384
|
+
- Environment variable substitution support
|
|
345
385
|
|
|
346
386
|
## Configuration (sd.config.ts)
|
|
347
387
|
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import type esbuild from "esbuild";
|
|
2
2
|
import type { TypecheckEnv } from "./tsconfig";
|
|
3
|
+
/**
|
|
4
|
+
* esbuild outputFiles 중 실제로 변경된 파일만 디스크에 쓴다.
|
|
5
|
+
*
|
|
6
|
+
* - .js 파일: ESM 상대 import 경로에 .js 확장자를 추가한 후 비교
|
|
7
|
+
* - 그 외 파일(.js.map 등): 원본 그대로 비교
|
|
8
|
+
* - 기존 파일과 내용이 동일하면 쓰기를 건너뛰어 타임스탬프를 유지한다.
|
|
9
|
+
*/
|
|
10
|
+
export declare function writeChangedOutputFiles(outputFiles: esbuild.OutputFile[]): Promise<void>;
|
|
3
11
|
/**
|
|
4
12
|
* Library 빌드용 esbuild 옵션
|
|
5
13
|
* - bundle: false (개별 파일 트랜스파일)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esbuild-config.d.ts","sourceRoot":"","sources":["../../src/utils/esbuild-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"esbuild-config.d.ts","sourceRoot":"","sources":["../../src/utils/esbuild-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB9F;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAWD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAoBhG;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAuB9F;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAE9F;AAUD;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAU3E;AAyCD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAUrE"}
|
|
@@ -2,33 +2,26 @@ import path from "path";
|
|
|
2
2
|
import { readFileSync, existsSync } from "fs";
|
|
3
3
|
import fs from "fs/promises";
|
|
4
4
|
import { createRequire } from "module";
|
|
5
|
-
import { glob } from "glob";
|
|
6
5
|
import { solidPlugin } from "esbuild-plugin-solid";
|
|
7
|
-
function
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
})
|
|
28
|
-
);
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
};
|
|
6
|
+
async function writeChangedOutputFiles(outputFiles) {
|
|
7
|
+
await Promise.all(
|
|
8
|
+
outputFiles.map(async (file) => {
|
|
9
|
+
const finalText = file.path.endsWith(".js") ? file.text.replace(
|
|
10
|
+
/((?:from|import)\s*["'])(\.\.?\/[^"']*?)(["'])/g,
|
|
11
|
+
(_match, prefix, importPath, suffix) => {
|
|
12
|
+
if (/\.(js|mjs|cjs|json|css|wasm|node)$/i.test(importPath)) return _match;
|
|
13
|
+
return `${prefix}${importPath}.js${suffix}`;
|
|
14
|
+
}
|
|
15
|
+
) : file.text;
|
|
16
|
+
try {
|
|
17
|
+
const existing = await fs.readFile(file.path, "utf-8");
|
|
18
|
+
if (existing === finalText) return;
|
|
19
|
+
} catch {
|
|
20
|
+
}
|
|
21
|
+
await fs.mkdir(path.dirname(file.path), { recursive: true });
|
|
22
|
+
await fs.writeFile(file.path, finalText);
|
|
23
|
+
})
|
|
24
|
+
);
|
|
32
25
|
}
|
|
33
26
|
function hasSolidDependency(pkgDir) {
|
|
34
27
|
const pkgJson = JSON.parse(readFileSync(path.join(pkgDir, "package.json"), "utf-8"));
|
|
@@ -36,7 +29,7 @@ function hasSolidDependency(pkgDir) {
|
|
|
36
29
|
return "solid-js" in allDeps;
|
|
37
30
|
}
|
|
38
31
|
function createLibraryEsbuildOptions(options) {
|
|
39
|
-
const plugins = [
|
|
32
|
+
const plugins = [];
|
|
40
33
|
if (hasSolidDependency(options.pkgDir)) {
|
|
41
34
|
plugins.unshift(solidPlugin());
|
|
42
35
|
}
|
|
@@ -49,6 +42,7 @@ function createLibraryEsbuildOptions(options) {
|
|
|
49
42
|
platform: options.target === "node" ? "node" : "browser",
|
|
50
43
|
target: options.target === "node" ? "node20" : "chrome84",
|
|
51
44
|
bundle: false,
|
|
45
|
+
write: false,
|
|
52
46
|
tsconfigRaw: { compilerOptions: options.compilerOptions },
|
|
53
47
|
plugins
|
|
54
48
|
};
|
|
@@ -150,6 +144,7 @@ export {
|
|
|
150
144
|
collectUninstalledOptionalPeerDeps,
|
|
151
145
|
createLibraryEsbuildOptions,
|
|
152
146
|
createServerEsbuildOptions,
|
|
153
|
-
getTypecheckEnvFromTarget
|
|
147
|
+
getTypecheckEnvFromTarget,
|
|
148
|
+
writeChangedOutputFiles
|
|
154
149
|
};
|
|
155
150
|
//# sourceMappingURL=esbuild-config.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/esbuild-config.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,cAAc,kBAAkB;AACzC,OAAO,QAAQ;AACf,SAAS,qBAAqB;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-config.d.ts","sourceRoot":"","sources":["../../src/utils/vite-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,UAAU,IAAI,cAAc,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"vite-config.d.ts","sourceRoot":"","sources":["../../src/utils/vite-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,UAAU,IAAI,cAAc,EAAE,MAAM,MAAM,CAAC;AA4MjE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IACtB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CA2D3E"}
|
|
@@ -6,6 +6,7 @@ import solidPlugin from "vite-plugin-solid";
|
|
|
6
6
|
import { VitePWA } from "vite-plugin-pwa";
|
|
7
7
|
import tailwindcss from "tailwindcss";
|
|
8
8
|
import { getTailwindConfigDeps } from "./tailwind-config-deps.js";
|
|
9
|
+
import { FsWatcher } from "@simplysm/core-node";
|
|
9
10
|
function sdTailwindConfigDepsPlugin(pkgDir) {
|
|
10
11
|
return {
|
|
11
12
|
name: "sd-tailwind-config-deps",
|
|
@@ -92,17 +93,32 @@ function sdScopeWatchPlugin(pkgDir, scopes) {
|
|
|
92
93
|
}
|
|
93
94
|
};
|
|
94
95
|
},
|
|
95
|
-
configureServer(server) {
|
|
96
|
+
async configureServer(server) {
|
|
97
|
+
const distDirs = [];
|
|
96
98
|
for (const scope of scopes) {
|
|
97
99
|
const scopeDir = path.join(pkgDir, "node_modules", scope);
|
|
98
100
|
if (!fs.existsSync(scopeDir)) continue;
|
|
99
101
|
for (const pkgName of fs.readdirSync(scopeDir)) {
|
|
100
102
|
const distDir = path.join(scopeDir, pkgName, "dist");
|
|
101
103
|
if (fs.existsSync(distDir)) {
|
|
102
|
-
|
|
104
|
+
distDirs.push(distDir);
|
|
103
105
|
}
|
|
104
106
|
}
|
|
105
107
|
}
|
|
108
|
+
if (distDirs.length === 0) return;
|
|
109
|
+
const scopeWatcher = await FsWatcher.watch(distDirs);
|
|
110
|
+
scopeWatcher.onChange({ delay: 300 }, (changeInfos) => {
|
|
111
|
+
for (const { path: changedPath } of changeInfos) {
|
|
112
|
+
let realPath;
|
|
113
|
+
try {
|
|
114
|
+
realPath = fs.realpathSync(changedPath);
|
|
115
|
+
} catch {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
server.watcher.emit("change", realPath);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
server.httpServer?.on("close", () => void scopeWatcher.close());
|
|
106
122
|
}
|
|
107
123
|
};
|
|
108
124
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/vite-config.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,QAAQ;AACf,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AAEjB,OAAO,mBAAmB;AAC1B,OAAO,iBAAiB;AACxB,SAAS,eAAe;AACxB,OAAO,iBAAiB;AAExB,SAAS,6BAA6B;
|
|
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":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,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;AAW/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;AAsCD;;GAEG;AACH,iBAAe,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiCxE;AAwED;;;;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"}
|
|
@@ -3,7 +3,11 @@ import esbuild from "esbuild";
|
|
|
3
3
|
import { createWorker, FsWatcher } from "@simplysm/core-node";
|
|
4
4
|
import { consola } from "consola";
|
|
5
5
|
import { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from "../utils/tsconfig.js";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
createLibraryEsbuildOptions,
|
|
8
|
+
getTypecheckEnvFromTarget,
|
|
9
|
+
writeChangedOutputFiles
|
|
10
|
+
} from "../utils/esbuild-config.js";
|
|
7
11
|
import { registerCleanupHandlers } from "../utils/worker-utils.js";
|
|
8
12
|
const logger = consola.withTag("sd:cli:library:worker");
|
|
9
13
|
let esbuildContext;
|
|
@@ -29,6 +33,9 @@ async function build(info) {
|
|
|
29
33
|
compilerOptions
|
|
30
34
|
});
|
|
31
35
|
const result = await esbuild.build(esbuildOptions);
|
|
36
|
+
if (result.outputFiles) {
|
|
37
|
+
await writeChangedOutputFiles(result.outputFiles);
|
|
38
|
+
}
|
|
32
39
|
const errors = result.errors.map((e) => e.text);
|
|
33
40
|
return {
|
|
34
41
|
success: result.errors.length === 0,
|
|
@@ -64,7 +71,10 @@ async function createAndBuildContext(pkgDir, cwd, config, isFirstBuild, resolveF
|
|
|
64
71
|
pluginBuild.onStart(() => {
|
|
65
72
|
sender.send("buildStart", {});
|
|
66
73
|
});
|
|
67
|
-
pluginBuild.onEnd((result) => {
|
|
74
|
+
pluginBuild.onEnd(async (result) => {
|
|
75
|
+
if (result.outputFiles) {
|
|
76
|
+
await writeChangedOutputFiles(result.outputFiles);
|
|
77
|
+
}
|
|
68
78
|
const errors = result.errors.map((e) => e.text);
|
|
69
79
|
const success = result.errors.length === 0;
|
|
70
80
|
sender.send("build", { success, errors: errors.length > 0 ? errors : void 0 });
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/workers/library.worker.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,aAAa;AACpB,SAAS,cAAc,iBAAiB;AACxC,SAAS,eAAe;AAExB,SAAS,mBAAmB,uBAAuB,oCAAoC;AACvF,
|
|
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.
|
|
4
|
+
"version": "13.0.13",
|
|
5
5
|
"description": "심플리즘 패키지 - CLI 도구",
|
|
6
6
|
"author": "김석래",
|
|
7
7
|
"repository": {
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
"vite-plugin-solid": "^2.11.10",
|
|
45
45
|
"vite-tsconfig-paths": "^6.1.1",
|
|
46
46
|
"yargs": "^18.0.0",
|
|
47
|
-
"@simplysm/core-common": "13.0.
|
|
48
|
-
"@simplysm/core-node": "13.0.
|
|
49
|
-
"@simplysm/storage": "13.0.
|
|
47
|
+
"@simplysm/core-common": "13.0.13",
|
|
48
|
+
"@simplysm/core-node": "13.0.13",
|
|
49
|
+
"@simplysm/storage": "13.0.13"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/semver": "^7.7.1",
|
|
@@ -2,45 +2,42 @@ import path from "path";
|
|
|
2
2
|
import { readFileSync, existsSync } from "fs";
|
|
3
3
|
import fs from "fs/promises";
|
|
4
4
|
import { createRequire } from "module";
|
|
5
|
-
import { glob } from "glob";
|
|
6
5
|
import type esbuild from "esbuild";
|
|
7
6
|
import { solidPlugin } from "esbuild-plugin-solid";
|
|
8
7
|
import type { TypecheckEnv } from "./tsconfig";
|
|
9
8
|
|
|
10
9
|
/**
|
|
11
|
-
*
|
|
10
|
+
* esbuild outputFiles 중 실제로 변경된 파일만 디스크에 쓴다.
|
|
12
11
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* - .js 파일: ESM 상대 import 경로에 .js 확장자를 추가한 후 비교
|
|
13
|
+
* - 그 외 파일(.js.map 등): 원본 그대로 비교
|
|
14
|
+
* - 기존 파일과 내용이 동일하면 쓰기를 건너뛰어 타임스탬프를 유지한다.
|
|
15
15
|
*/
|
|
16
|
-
function
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
});
|
|
42
|
-
},
|
|
43
|
-
};
|
|
16
|
+
export async function writeChangedOutputFiles(outputFiles: esbuild.OutputFile[]): Promise<void> {
|
|
17
|
+
await Promise.all(
|
|
18
|
+
outputFiles.map(async (file) => {
|
|
19
|
+
const finalText = file.path.endsWith(".js")
|
|
20
|
+
? file.text.replace(
|
|
21
|
+
/((?:from|import)\s*["'])(\.\.?\/[^"']*?)(["'])/g,
|
|
22
|
+
(_match, prefix: string, importPath: string, suffix: string) => {
|
|
23
|
+
if (/\.(js|mjs|cjs|json|css|wasm|node)$/i.test(importPath)) return _match;
|
|
24
|
+
return `${prefix}${importPath}.js${suffix}`;
|
|
25
|
+
},
|
|
26
|
+
)
|
|
27
|
+
: file.text;
|
|
28
|
+
|
|
29
|
+
// Compare with existing file — skip write if unchanged
|
|
30
|
+
try {
|
|
31
|
+
const existing = await fs.readFile(file.path, "utf-8");
|
|
32
|
+
if (existing === finalText) return;
|
|
33
|
+
} catch {
|
|
34
|
+
// File doesn't exist yet
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
await fs.mkdir(path.dirname(file.path), { recursive: true });
|
|
38
|
+
await fs.writeFile(file.path, finalText);
|
|
39
|
+
}),
|
|
40
|
+
);
|
|
44
41
|
}
|
|
45
42
|
|
|
46
43
|
/**
|
|
@@ -86,7 +83,7 @@ function hasSolidDependency(pkgDir: string): boolean {
|
|
|
86
83
|
* - target: node면 node20, 그 외는 chrome84
|
|
87
84
|
*/
|
|
88
85
|
export function createLibraryEsbuildOptions(options: LibraryEsbuildOptions): esbuild.BuildOptions {
|
|
89
|
-
const plugins: esbuild.Plugin[] = [
|
|
86
|
+
const plugins: esbuild.Plugin[] = [];
|
|
90
87
|
|
|
91
88
|
if (hasSolidDependency(options.pkgDir)) {
|
|
92
89
|
plugins.unshift(solidPlugin());
|
|
@@ -101,6 +98,7 @@ export function createLibraryEsbuildOptions(options: LibraryEsbuildOptions): esb
|
|
|
101
98
|
platform: options.target === "node" ? "node" : "browser",
|
|
102
99
|
target: options.target === "node" ? "node20" : "chrome84",
|
|
103
100
|
bundle: false,
|
|
101
|
+
write: false,
|
|
104
102
|
tsconfigRaw: { compilerOptions: options.compilerOptions as esbuild.TsconfigRaw["compilerOptions"] },
|
|
105
103
|
plugins,
|
|
106
104
|
};
|
package/src/utils/vite-config.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { VitePWA } from "vite-plugin-pwa";
|
|
|
8
8
|
import tailwindcss from "tailwindcss";
|
|
9
9
|
import type esbuild from "esbuild";
|
|
10
10
|
import { getTailwindConfigDeps } from "./tailwind-config-deps.js";
|
|
11
|
+
import { FsWatcher } from "@simplysm/core-node";
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* Tailwind config의 scope 패키지 의존성을 watch하는 Vite 플러그인.
|
|
@@ -95,7 +96,8 @@ function isSubpathOnlyPackage(pkgJsonPath: string): boolean {
|
|
|
95
96
|
*
|
|
96
97
|
* Vite는 node_modules를 기본적으로 watch에서 제외하므로,
|
|
97
98
|
* scope 패키지의 dist 파일이 변경되어도 HMR/리빌드가 트리거되지 않는다.
|
|
98
|
-
* 이 플러그인은 scope 패키지의 dist 디렉토리를
|
|
99
|
+
* 이 플러그인은 별도의 FsWatcher로 scope 패키지의 dist 디렉토리를 감시하고,
|
|
100
|
+
* 변경 시 Vite의 내부 HMR 파이프라인을 트리거한다.
|
|
99
101
|
* optimizeDeps에서 제외하여 pre-bundled 캐시로 인한 변경 무시를 방지한다.
|
|
100
102
|
*/
|
|
101
103
|
function sdScopeWatchPlugin(pkgDir: string, scopes: string[]): Plugin {
|
|
@@ -161,7 +163,9 @@ function sdScopeWatchPlugin(pkgDir: string, scopes: string[]): Plugin {
|
|
|
161
163
|
},
|
|
162
164
|
};
|
|
163
165
|
},
|
|
164
|
-
configureServer(server) {
|
|
166
|
+
async configureServer(server) {
|
|
167
|
+
const distDirs: string[] = [];
|
|
168
|
+
|
|
165
169
|
for (const scope of scopes) {
|
|
166
170
|
const scopeDir = path.join(pkgDir, "node_modules", scope);
|
|
167
171
|
if (!fs.existsSync(scopeDir)) continue;
|
|
@@ -169,10 +173,34 @@ function sdScopeWatchPlugin(pkgDir: string, scopes: string[]): Plugin {
|
|
|
169
173
|
for (const pkgName of fs.readdirSync(scopeDir)) {
|
|
170
174
|
const distDir = path.join(scopeDir, pkgName, "dist");
|
|
171
175
|
if (fs.existsSync(distDir)) {
|
|
172
|
-
|
|
176
|
+
distDirs.push(distDir);
|
|
173
177
|
}
|
|
174
178
|
}
|
|
175
179
|
}
|
|
180
|
+
|
|
181
|
+
if (distDirs.length === 0) return;
|
|
182
|
+
|
|
183
|
+
// Vite의 기본 watcher는 **/node_modules/**를 ignore하고
|
|
184
|
+
// server.watcher.add()로는 이 패턴을 override할 수 없다.
|
|
185
|
+
// 별도의 FsWatcher로 scope 패키지의 dist 디렉토리를 감시한다.
|
|
186
|
+
const scopeWatcher = await FsWatcher.watch(distDirs);
|
|
187
|
+
scopeWatcher.onChange({ delay: 300 }, (changeInfos) => {
|
|
188
|
+
for (const { path: changedPath } of changeInfos) {
|
|
189
|
+
// pnpm symlink → real path 변환 (Vite module graph은 real path 사용)
|
|
190
|
+
let realPath: string;
|
|
191
|
+
try {
|
|
192
|
+
realPath = fs.realpathSync(changedPath);
|
|
193
|
+
} catch {
|
|
194
|
+
continue; // 삭제된 파일
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Vite의 내부 HMR 파이프라인 트리거
|
|
198
|
+
server.watcher.emit("change", realPath);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
// 서버 종료 시 watcher 정리
|
|
203
|
+
server.httpServer?.on("close", () => void scopeWatcher.close());
|
|
176
204
|
},
|
|
177
205
|
};
|
|
178
206
|
}
|
|
@@ -4,7 +4,11 @@ import { createWorker, FsWatcher } from "@simplysm/core-node";
|
|
|
4
4
|
import { consola } from "consola";
|
|
5
5
|
import type { SdBuildPackageConfig } from "../sd-config.types";
|
|
6
6
|
import { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from "../utils/tsconfig";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
createLibraryEsbuildOptions,
|
|
9
|
+
getTypecheckEnvFromTarget,
|
|
10
|
+
writeChangedOutputFiles,
|
|
11
|
+
} from "../utils/esbuild-config";
|
|
8
12
|
import { registerCleanupHandlers } from "../utils/worker-utils";
|
|
9
13
|
|
|
10
14
|
//#region Types
|
|
@@ -119,7 +123,9 @@ async function build(info: LibraryBuildInfo): Promise<LibraryBuildResult> {
|
|
|
119
123
|
});
|
|
120
124
|
|
|
121
125
|
const result = await esbuild.build(esbuildOptions);
|
|
122
|
-
|
|
126
|
+
if (result.outputFiles) {
|
|
127
|
+
await writeChangedOutputFiles(result.outputFiles);
|
|
128
|
+
}
|
|
123
129
|
const errors = result.errors.map((e) => e.text);
|
|
124
130
|
return {
|
|
125
131
|
success: result.errors.length === 0,
|
|
@@ -176,7 +182,12 @@ async function createAndBuildContext(
|
|
|
176
182
|
sender.send("buildStart", {});
|
|
177
183
|
});
|
|
178
184
|
|
|
179
|
-
pluginBuild.onEnd((result) => {
|
|
185
|
+
pluginBuild.onEnd(async (result) => {
|
|
186
|
+
// Write only changed files to disk
|
|
187
|
+
if (result.outputFiles) {
|
|
188
|
+
await writeChangedOutputFiles(result.outputFiles);
|
|
189
|
+
}
|
|
190
|
+
|
|
180
191
|
const errors = result.errors.map((e) => e.text);
|
|
181
192
|
const success = result.errors.length === 0;
|
|
182
193
|
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"vitest": "vitest"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@simplysm/sd-cli": "~13.0.
|
|
19
|
-
"@simplysm/claude": "~13.0.
|
|
20
|
-
"@simplysm/lint": "~13.0.
|
|
18
|
+
"@simplysm/sd-cli": "~13.0.13",
|
|
19
|
+
"@simplysm/claude": "~13.0.13",
|
|
20
|
+
"@simplysm/lint": "~13.0.13",
|
|
21
21
|
"@types/node": "^20.19.33",
|
|
22
22
|
"eslint": "^9.39.2",
|
|
23
23
|
"prettier": "^3.8.1",
|