@simplysm/sd-cli 13.0.0-beta.21 → 13.0.0-beta.23
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 +78 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +5 -3
- package/dist/commands/init.js.map +2 -2
- package/package.json +4 -4
- package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
- package/templates/add-server/__SERVER__/package.json.hbs +1 -1
- package/templates/add-server/__SERVER__/src/main.ts.hbs +5 -2
- package/templates/init/package.json.hbs +8 -5
- package/templates/init/pnpm-workspace.yaml.hbs +1 -0
- package/templates/init/vitest.config.ts.hbs +18 -0
package/README.md
CHANGED
|
@@ -211,7 +211,7 @@ sd-cli init
|
|
|
211
211
|
|
|
212
212
|
After initialization, use `sd-cli add client` and `sd-cli add server` to add packages.
|
|
213
213
|
|
|
214
|
-
> **Note**:
|
|
214
|
+
> **Note**: Claude Code skills/agents are automatically installed via `@simplysm/claude` postinstall.
|
|
215
215
|
|
|
216
216
|
### add client
|
|
217
217
|
|
|
@@ -270,6 +270,56 @@ sd-cli device -p my-app -u http://192.168.0.10:3000
|
|
|
270
270
|
| `--options`, `-o` | Additional options to pass to sd.config.ts (multi-use) | `[]` |
|
|
271
271
|
| `--debug` | Output debug logs | `false` |
|
|
272
272
|
|
|
273
|
+
## Exported Types
|
|
274
|
+
|
|
275
|
+
This package exports configuration types for `sd.config.ts`. All types are importable from `@simplysm/sd-cli`.
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
import type {
|
|
279
|
+
SdConfigFn,
|
|
280
|
+
SdConfigParams,
|
|
281
|
+
SdConfig,
|
|
282
|
+
SdPackageConfig,
|
|
283
|
+
BuildTarget,
|
|
284
|
+
SdBuildPackageConfig,
|
|
285
|
+
SdClientPackageConfig,
|
|
286
|
+
SdServerPackageConfig,
|
|
287
|
+
SdScriptsPackageConfig,
|
|
288
|
+
SdPublishConfig,
|
|
289
|
+
SdLocalDirectoryPublishConfig,
|
|
290
|
+
SdStoragePublishConfig,
|
|
291
|
+
SdPostPublishScriptConfig,
|
|
292
|
+
SdCapacitorConfig,
|
|
293
|
+
SdCapacitorAndroidConfig,
|
|
294
|
+
SdCapacitorSignConfig,
|
|
295
|
+
SdCapacitorPermission,
|
|
296
|
+
SdCapacitorIntentFilter,
|
|
297
|
+
SdElectronConfig,
|
|
298
|
+
} from "@simplysm/sd-cli";
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
| Type | Description |
|
|
302
|
+
|------|-------------|
|
|
303
|
+
| `SdConfigFn` | Function type for `sd.config.ts` default export: `(params: SdConfigParams) => SdConfig \| Promise<SdConfig>` |
|
|
304
|
+
| `SdConfigParams` | Parameters passed to the config function (`cwd`, `dev`, `opt`) |
|
|
305
|
+
| `SdConfig` | Root configuration object (`packages`, `replaceDeps?`, `postPublish?`) |
|
|
306
|
+
| `SdPackageConfig` | Union of all package config types |
|
|
307
|
+
| `BuildTarget` | Library build target: `"node" \| "browser" \| "neutral"` |
|
|
308
|
+
| `SdBuildPackageConfig` | Config for library packages (`node`/`browser`/`neutral` targets) |
|
|
309
|
+
| `SdClientPackageConfig` | Config for client packages (`client` target) |
|
|
310
|
+
| `SdServerPackageConfig` | Config for server packages (`server` target) |
|
|
311
|
+
| `SdScriptsPackageConfig` | Config for scripts-only packages (`scripts` target) |
|
|
312
|
+
| `SdPublishConfig` | Deployment config: `"npm" \| SdLocalDirectoryPublishConfig \| SdStoragePublishConfig` |
|
|
313
|
+
| `SdLocalDirectoryPublishConfig` | Local directory deployment config (`type: "local-directory"`, `path`) |
|
|
314
|
+
| `SdStoragePublishConfig` | FTP/FTPS/SFTP deployment config (`type`, `host`, `port?`, `path?`, `user?`, `pass?`) |
|
|
315
|
+
| `SdPostPublishScriptConfig` | Post-publish script config (`type: "script"`, `cmd`, `args`) |
|
|
316
|
+
| `SdCapacitorConfig` | Capacitor config for Android app builds |
|
|
317
|
+
| `SdCapacitorAndroidConfig` | Android platform-specific Capacitor config |
|
|
318
|
+
| `SdCapacitorSignConfig` | APK/AAB signing config (`keystore`, `storePassword`, `alias`, `password`) |
|
|
319
|
+
| `SdCapacitorPermission` | Android permission entry (`name`, `maxSdkVersion?`, `ignore?`) |
|
|
320
|
+
| `SdCapacitorIntentFilter` | Android intent filter entry (`action?`, `category?`) |
|
|
321
|
+
| `SdElectronConfig` | Electron desktop app build config |
|
|
322
|
+
|
|
273
323
|
## Configuration (sd.config.ts)
|
|
274
324
|
|
|
275
325
|
Create an `sd.config.ts` file in the project root to define build targets and deployment settings per package. Used by `typecheck`, `watch`, `dev`, `build`, `publish`, and `device` commands.
|
|
@@ -411,11 +461,36 @@ Environment variable substitution is supported in `path` for local directory and
|
|
|
411
461
|
},
|
|
412
462
|
```
|
|
413
463
|
|
|
464
|
+
### Dependency Replacement (replaceDeps)
|
|
465
|
+
|
|
466
|
+
Replace `node_modules` packages with local source directories via symlinks. Useful for local development of dependent packages across separate repositories.
|
|
467
|
+
|
|
468
|
+
The key is a glob pattern to match packages in `node_modules`, and the value is the local source directory path. The `*` wildcard in the key is substituted into the `*` in the value.
|
|
469
|
+
|
|
470
|
+
```typescript
|
|
471
|
+
import type { SdConfigFn } from "@simplysm/sd-cli";
|
|
472
|
+
|
|
473
|
+
const config: SdConfigFn = () => ({
|
|
474
|
+
packages: {
|
|
475
|
+
"my-app": { target: "client", server: "my-server" },
|
|
476
|
+
},
|
|
477
|
+
replaceDeps: {
|
|
478
|
+
// Replaces @simplysm/* packages in node_modules
|
|
479
|
+
// with symlinks to ../simplysm/packages/*/dist
|
|
480
|
+
"@simplysm/*": "../simplysm/packages/*",
|
|
481
|
+
},
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
export default config;
|
|
485
|
+
```
|
|
486
|
+
|
|
414
487
|
### postPublish Scripts
|
|
415
488
|
|
|
416
489
|
You can define scripts to run after deployment completes. Supports environment variable substitution (`%VER%`, `%PROJECT%`). On script failure, only a warning is printed and execution continues.
|
|
417
490
|
|
|
418
491
|
```typescript
|
|
492
|
+
import type { SdConfigFn } from "@simplysm/sd-cli";
|
|
493
|
+
|
|
419
494
|
const config: SdConfigFn = () => ({
|
|
420
495
|
packages: {
|
|
421
496
|
/* ... */
|
|
@@ -428,6 +503,8 @@ const config: SdConfigFn = () => ({
|
|
|
428
503
|
},
|
|
429
504
|
],
|
|
430
505
|
});
|
|
506
|
+
|
|
507
|
+
export default config;
|
|
431
508
|
```
|
|
432
509
|
|
|
433
510
|
### Capacitor Configuration (SdCapacitorConfig)
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export interface InitOptions {
|
|
|
9
9
|
* 1. 디렉토리 비어있는지 확인
|
|
10
10
|
* 2. 프로젝트명(폴더명) 검증
|
|
11
11
|
* 3. Handlebars 템플릿 렌더링
|
|
12
|
-
* 4. pnpm install
|
|
12
|
+
* 4. pnpm install 실행
|
|
13
13
|
*/
|
|
14
14
|
export declare function runInit(_options: InitOptions): Promise<void>;
|
|
15
15
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,WAAW;CAAG;AA8B/B;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,WAAW;CAAG;AA8B/B;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDlE"}
|
package/dist/commands/init.js
CHANGED
|
@@ -39,9 +39,11 @@ async function runInit(_options) {
|
|
|
39
39
|
logger.info("pnpm install \uC2E4\uD589 \uC911...");
|
|
40
40
|
await spawn("pnpm", ["install"], { cwd });
|
|
41
41
|
logger.success("pnpm install \uC644\uB8CC");
|
|
42
|
-
logger.info("
|
|
43
|
-
await spawn("
|
|
44
|
-
|
|
42
|
+
logger.info("git \uC800\uC7A5\uC18C \uCD08\uAE30\uD654 \uC911...");
|
|
43
|
+
await spawn("git", ["init"], { cwd });
|
|
44
|
+
await spawn("git", ["add", "."], { cwd });
|
|
45
|
+
await spawn("git", ["commit", "-m", "init"], { cwd });
|
|
46
|
+
logger.success("git \uC800\uC7A5\uC18C \uCD08\uAE30\uD654 \uC644\uB8CC");
|
|
45
47
|
consola.box(
|
|
46
48
|
[
|
|
47
49
|
"\uD504\uB85C\uC81D\uD2B8\uAC00 \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4!",
|
|
@@ -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
|
|
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,
|
|
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 \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. git \uCD08\uAE30\uD654\n logger.info(\"git \uC800\uC7A5\uC18C \uCD08\uAE30\uD654 \uC911...\");\n await spawn(\"git\", [\"init\"], { cwd });\n await spawn(\"git\", [\"add\", \".\"], { cwd });\n await spawn(\"git\", [\"commit\", \"-m\", \"init\"], { cwd });\n logger.success(\"git \uC800\uC7A5\uC18C \uCD08\uAE30\uD654 \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,qDAAkB;AAC9B,QAAM,MAAM,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC;AACpC,QAAM,MAAM,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,IAAI,CAAC;AACxC,QAAM,MAAM,OAAO,CAAC,UAAU,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC;AACpD,SAAO,QAAQ,wDAAgB;AAG/B,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
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/sd-cli",
|
|
3
3
|
"sideEffects": false,
|
|
4
|
-
"version": "13.0.0-beta.
|
|
4
|
+
"version": "13.0.0-beta.23",
|
|
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/
|
|
44
|
-
"@simplysm/core-node": "13.0.0-beta.
|
|
45
|
-
"@simplysm/
|
|
43
|
+
"@simplysm/storage": "13.0.0-beta.23",
|
|
44
|
+
"@simplysm/core-node": "13.0.0-beta.23",
|
|
45
|
+
"@simplysm/core-common": "13.0.0-beta.23"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/semver": "^7.7.1",
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import { env } from "@simplysm/core-common";
|
|
1
2
|
import { ServiceServer } from "@simplysm/service-server";
|
|
2
3
|
|
|
3
|
-
const server = new ServiceServer({
|
|
4
|
+
export const server = new ServiceServer({
|
|
4
5
|
rootPath: process.cwd(),
|
|
5
6
|
port: {{port}},
|
|
6
7
|
services: [],
|
|
7
8
|
});
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
// 프로덕션 모드: 정적 파일 서빙 포함하여 직접 listen
|
|
11
|
+
// Watch 모드 (env.DEV): Server Runtime Worker가 proxy 설정 후 listen 호출
|
|
12
|
+
if (!env.DEV) {
|
|
10
13
|
await server.listen();
|
|
11
14
|
}
|
|
@@ -11,15 +11,18 @@
|
|
|
11
11
|
"---": "",
|
|
12
12
|
"typecheck": "sd-cli typecheck",
|
|
13
13
|
"lint": "sd-cli lint",
|
|
14
|
-
"lint:fix": "sd-cli lint --fix"
|
|
14
|
+
"lint:fix": "sd-cli lint --fix",
|
|
15
|
+
"vitest": "vitest"
|
|
15
16
|
},
|
|
16
17
|
"devDependencies": {
|
|
17
|
-
"@simplysm/sd-cli": "~13.0.0-beta.
|
|
18
|
-
"@simplysm/
|
|
19
|
-
"@simplysm/eslint-plugin": "~13.0.0-beta.
|
|
18
|
+
"@simplysm/sd-cli": "~13.0.0-beta.23",
|
|
19
|
+
"@simplysm/claude": "~13.0.0-beta.23",
|
|
20
|
+
"@simplysm/eslint-plugin": "~13.0.0-beta.23",
|
|
20
21
|
"@types/node": "^20.19.33",
|
|
21
22
|
"eslint": "^9.39.2",
|
|
22
23
|
"prettier": "^3.8.1",
|
|
23
|
-
"typescript": "^5.9.3"
|
|
24
|
+
"typescript": "^5.9.3",
|
|
25
|
+
"vite-tsconfig-paths": "^6.1.0",
|
|
26
|
+
"vitest": "^4.0.18"
|
|
24
27
|
}
|
|
25
28
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineConfig } from "vitest/config";
|
|
2
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
define: {
|
|
6
|
+
"process.env.DEV": JSON.stringify("true"),
|
|
7
|
+
"process.env.VER": JSON.stringify("1.0.0-test"),
|
|
8
|
+
},
|
|
9
|
+
plugins: [tsconfigPaths()],
|
|
10
|
+
test: {
|
|
11
|
+
globals: true,
|
|
12
|
+
environment: "node",
|
|
13
|
+
include: ["packages/*/tests/**/*.spec.{ts,tsx,js}"],
|
|
14
|
+
coverage: {
|
|
15
|
+
reportsDirectory: "./.coverage",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
});
|