@simplysm/sd-cli 14.0.65 → 14.0.69
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/dist/commands/init/generators/client-common.d.ts +3 -0
- package/dist/commands/init/generators/client-common.d.ts.map +1 -0
- package/dist/commands/init/generators/client-common.js +17 -0
- package/dist/commands/init/generators/client-common.js.map +1 -0
- package/dist/commands/init/generators/client.d.ts +3 -0
- package/dist/commands/init/generators/client.d.ts.map +1 -0
- package/dist/commands/init/generators/client.js +20 -0
- package/dist/commands/init/generators/client.js.map +1 -0
- package/dist/commands/init/generators/common.d.ts +3 -0
- package/dist/commands/init/generators/common.d.ts.map +1 -0
- package/dist/commands/init/generators/common.js +14 -0
- package/dist/commands/init/generators/common.js.map +1 -0
- package/dist/commands/init/generators/root.d.ts +3 -0
- package/dist/commands/init/generators/root.d.ts.map +1 -0
- package/dist/commands/init/generators/root.js +28 -0
- package/dist/commands/init/generators/root.js.map +1 -0
- package/dist/commands/init/generators/server.d.ts +3 -0
- package/dist/commands/init/generators/server.d.ts.map +1 -0
- package/dist/commands/init/generators/server.js +12 -0
- package/dist/commands/init/generators/server.js.map +1 -0
- package/dist/commands/init/init.d.ts +5 -0
- package/dist/commands/init/init.d.ts.map +1 -0
- package/dist/commands/init/init.js +44 -0
- package/dist/commands/init/init.js.map +1 -0
- package/dist/commands/init/normalize.d.ts +3 -0
- package/dist/commands/init/normalize.d.ts.map +1 -0
- package/dist/commands/init/normalize.js +42 -0
- package/dist/commands/init/normalize.js.map +1 -0
- package/dist/commands/init/prompts.d.ts +3 -0
- package/dist/commands/init/prompts.d.ts.map +1 -0
- package/dist/commands/init/prompts.js +89 -0
- package/dist/commands/init/prompts.js.map +1 -0
- package/dist/commands/init/render.d.ts +4 -0
- package/dist/commands/init/render.d.ts.map +1 -0
- package/dist/commands/init/render.js +20 -0
- package/dist/commands/init/render.js.map +1 -0
- package/dist/commands/init/template-paths.d.ts +2 -0
- package/dist/commands/init/template-paths.d.ts.map +1 -0
- package/dist/commands/init/template-paths.js +7 -0
- package/dist/commands/init/template-paths.js.map +1 -0
- package/dist/commands/init/types.d.ts +47 -0
- package/dist/commands/init/types.d.ts.map +1 -0
- package/dist/commands/init/types.js +2 -0
- package/dist/commands/init/types.js.map +1 -0
- package/dist/commands/init/validate.d.ts +4 -0
- package/dist/commands/init/validate.d.ts.map +1 -0
- package/dist/commands/init/validate.js +31 -0
- package/dist/commands/init/validate.js.map +1 -0
- package/dist/sd-cli-entry.d.ts.map +1 -1
- package/dist/sd-cli-entry.js +14 -1
- package/dist/sd-cli-entry.js.map +1 -1
- package/package.json +14 -13
- package/src/commands/init/generators/client-common.ts +29 -0
- package/src/commands/init/generators/client.ts +29 -0
- package/src/commands/init/generators/common.ts +22 -0
- package/src/commands/init/generators/root.ts +32 -0
- package/src/commands/init/generators/server.ts +16 -0
- package/src/commands/init/init.ts +54 -0
- package/src/commands/init/normalize.ts +46 -0
- package/src/commands/init/prompts.ts +101 -0
- package/src/commands/init/render.ts +25 -0
- package/src/commands/init/template-paths.ts +8 -0
- package/src/commands/init/templates/client/ngsw-config.json +27 -0
- package/src/commands/init/templates/client/package.json.hbs +29 -0
- package/src/commands/init/templates/client/src/AppPage.ts.hbs +18 -0
- package/src/commands/init/templates/client/src/index.html.hbs +12 -0
- package/src/commands/init/templates/client/src/main.ts.hbs +28 -0
- package/src/commands/init/templates/client/src/polyfills.ts +2 -0
- package/src/commands/init/templates/client/src/routes.ts +3 -0
- package/src/commands/init/templates/client/src/styles.scss +1 -0
- package/src/commands/init/templates/client/tsconfig.json +20 -0
- package/src/commands/init/templates/client-common/package.json.hbs +20 -0
- package/src/commands/init/templates/client-common/src/index.ts.hbs +11 -0
- package/src/commands/init/templates/client-common/src/providers/AppOrmProvider.ts.hbs +36 -0
- package/src/commands/init/templates/client-common/src/providers/AppServiceProvider.ts +27 -0
- package/src/commands/init/templates/client-common/tsconfig.json +20 -0
- package/src/commands/init/templates/common/package.json.hbs +10 -0
- package/src/commands/init/templates/common/src/MainDbContext.ts +4 -0
- package/src/commands/init/templates/common/src/index.ts.hbs +5 -0
- package/src/commands/init/templates/common/tsconfig.json +8 -0
- package/src/commands/init/templates/server/package.json.hbs +23 -0
- package/src/commands/init/templates/server/src/index.ts +1 -0
- package/src/commands/init/templates/server/src/main.ts.hbs +25 -0
- package/src/commands/init/templates/server/tsconfig.json +8 -0
- package/src/commands/init/templates/workspace-root/.prettierignore +1 -0
- package/src/commands/init/templates/workspace-root/.prettierrc.yaml +12 -0
- package/src/commands/init/templates/workspace-root/eslint.config.ts +4 -0
- package/src/commands/init/templates/workspace-root/mise.toml.hbs +7 -0
- package/src/commands/init/templates/workspace-root/package.json.hbs +43 -0
- package/src/commands/init/templates/workspace-root/pnpm-workspace.yaml +17 -0
- package/src/commands/init/templates/workspace-root/sd.config.ts.hbs +63 -0
- package/src/commands/init/templates/workspace-root/tsconfig.json.hbs +30 -0
- package/src/commands/init/templates/workspace-root/vitest.config.ts.hbs +72 -0
- package/src/commands/init/types.ts +51 -0
- package/src/commands/init/validate.ts +41 -0
- package/src/sd-cli-entry.ts +19 -1
- package/tests/init/__snapshots__/render.spec.ts.snap +213 -0
- package/tests/init/normalize.spec.ts +114 -0
- package/tests/init/render.spec.ts +216 -0
- package/tests/init/validate.spec.ts +80 -0
package/dist/sd-cli-entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-cli-entry.js","sourceRoot":"","sources":["../src/sd-cli-entry.ts"],"names":[],"mappings":";AACA,+BAA+B;AAE/B,kDAAkD;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,KAAK,EAAE,EAAa,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAkB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;AAEhD,KAAK,CAAC,eAAe,GAAG,QAAQ,CAAC;AACjC,YAAY,CAAC,mBAAmB,GAAG,GAAG,CAAC;AAEvC,MAAM,aAAa,GAAG,
|
|
1
|
+
{"version":3,"file":"sd-cli-entry.js","sourceRoot":"","sources":["../src/sd-cli-entry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/sd-cli",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.69",
|
|
4
4
|
"description": "Simplysm package - CLI tool",
|
|
5
5
|
"author": "simplysm",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
],
|
|
20
20
|
"sideEffects": false,
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@angular/build": "^21.2.
|
|
23
|
-
"@angular/compiler-cli": "^21.2.
|
|
22
|
+
"@angular/build": "^21.2.11",
|
|
23
|
+
"@angular/compiler-cli": "^21.2.13",
|
|
24
24
|
"@fastify/http-proxy": "^11.4.4",
|
|
25
|
-
"@inquirer/prompts": "^8.4.
|
|
25
|
+
"@inquirer/prompts": "^8.4.3",
|
|
26
26
|
"acorn": "^8.16.0",
|
|
27
27
|
"acorn-walk": "^8.3.5",
|
|
28
28
|
"browserslist-to-esbuild": "^2.1.1",
|
|
@@ -31,29 +31,30 @@
|
|
|
31
31
|
"esbuild": "^0.28.0",
|
|
32
32
|
"eslint": "^9.39.4",
|
|
33
33
|
"glob": "^13.0.6",
|
|
34
|
-
"
|
|
34
|
+
"handlebars": "^4.7.9",
|
|
35
|
+
"jiti": "^2.7.0",
|
|
35
36
|
"lmdb": "^3.5.4",
|
|
36
37
|
"mime": "^4.1.0",
|
|
37
|
-
"postcss": "^8.5.
|
|
38
|
+
"postcss": "^8.5.14",
|
|
38
39
|
"sass": "^1.99.0",
|
|
39
|
-
"semver": "^7.
|
|
40
|
+
"semver": "^7.8.0",
|
|
40
41
|
"sharp": "^0.34.5",
|
|
41
42
|
"smol-toml": "^1.6.1",
|
|
42
43
|
"ssh2": "^1.17.0",
|
|
43
44
|
"typescript": "^5.9.3",
|
|
44
|
-
"ws": "^8.20.
|
|
45
|
-
"yaml": "^2.
|
|
45
|
+
"ws": "^8.20.1",
|
|
46
|
+
"yaml": "^2.9.0",
|
|
46
47
|
"yargs": "^18.0.0",
|
|
47
|
-
"@simplysm/core-common": "14.0.
|
|
48
|
-
"@simplysm/
|
|
49
|
-
"@simplysm/
|
|
48
|
+
"@simplysm/core-common": "14.0.69",
|
|
49
|
+
"@simplysm/storage": "14.0.69",
|
|
50
|
+
"@simplysm/core-node": "14.0.69"
|
|
50
51
|
},
|
|
51
52
|
"devDependencies": {
|
|
52
53
|
"@types/semver": "^7.7.1",
|
|
53
54
|
"@types/ssh2": "^1.15.5",
|
|
54
55
|
"@types/ws": "^8.18.1",
|
|
55
56
|
"@types/yargs": "^17.0.35",
|
|
56
|
-
"vite": "^7.3.
|
|
57
|
+
"vite": "^7.3.3",
|
|
57
58
|
"vite-tsconfig-paths": "^6.1.1"
|
|
58
59
|
},
|
|
59
60
|
"bin": {
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { copyFixed, renderToFile } from "../render";
|
|
3
|
+
import { TEMPLATES_ROOT } from "../template-paths";
|
|
4
|
+
import type { RenderData } from "../types";
|
|
5
|
+
|
|
6
|
+
const TPL = path.join(TEMPLATES_ROOT, "client-common");
|
|
7
|
+
|
|
8
|
+
export async function generateClientCommon(cwd: string, data: RenderData): Promise<void> {
|
|
9
|
+
const out = path.resolve(cwd, "packages/client-common");
|
|
10
|
+
|
|
11
|
+
await copyFixed(path.join(TPL, "tsconfig.json"), path.join(out, "tsconfig.json"));
|
|
12
|
+
|
|
13
|
+
await renderToFile(path.join(TPL, "package.json.hbs"), path.join(out, "package.json"), data);
|
|
14
|
+
await renderToFile(path.join(TPL, "src/index.ts.hbs"), path.join(out, "src/index.ts"), data);
|
|
15
|
+
|
|
16
|
+
if (data.hasServer) {
|
|
17
|
+
await copyFixed(
|
|
18
|
+
path.join(TPL, "src/providers/AppServiceProvider.ts"),
|
|
19
|
+
path.join(out, "src/providers/AppServiceProvider.ts"),
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
if (data.hasDb) {
|
|
23
|
+
await renderToFile(
|
|
24
|
+
path.join(TPL, "src/providers/AppOrmProvider.ts.hbs"),
|
|
25
|
+
path.join(out, "src/providers/AppOrmProvider.ts"),
|
|
26
|
+
data,
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { copyFixed, renderToFile } from "../render";
|
|
3
|
+
import { TEMPLATES_ROOT } from "../template-paths";
|
|
4
|
+
import type { ClientSpec, RenderData } from "../types";
|
|
5
|
+
|
|
6
|
+
const TPL = path.join(TEMPLATES_ROOT, "client");
|
|
7
|
+
|
|
8
|
+
export async function generateClient(
|
|
9
|
+
cwd: string,
|
|
10
|
+
base: RenderData,
|
|
11
|
+
client: ClientSpec,
|
|
12
|
+
): Promise<void> {
|
|
13
|
+
const out = path.resolve(cwd, "packages", client.name);
|
|
14
|
+
const data = { ...base, client };
|
|
15
|
+
|
|
16
|
+
await copyFixed(path.join(TPL, "tsconfig.json"), path.join(out, "tsconfig.json"));
|
|
17
|
+
await copyFixed(path.join(TPL, "ngsw-config.json"), path.join(out, "ngsw-config.json"));
|
|
18
|
+
await copyFixed(path.join(TPL, "src/polyfills.ts"), path.join(out, "src/polyfills.ts"));
|
|
19
|
+
await copyFixed(path.join(TPL, "src/styles.scss"), path.join(out, "src/styles.scss"));
|
|
20
|
+
|
|
21
|
+
await renderToFile(path.join(TPL, "package.json.hbs"), path.join(out, "package.json"), data);
|
|
22
|
+
await renderToFile(path.join(TPL, "src/main.ts.hbs"), path.join(out, "src/main.ts"), data);
|
|
23
|
+
await renderToFile(path.join(TPL, "src/AppPage.ts.hbs"), path.join(out, "src/AppPage.ts"), data);
|
|
24
|
+
await renderToFile(path.join(TPL, "src/index.html.hbs"), path.join(out, "src/index.html"), data);
|
|
25
|
+
|
|
26
|
+
if (client.hasRouter) {
|
|
27
|
+
await copyFixed(path.join(TPL, "src/routes.ts"), path.join(out, "src/routes.ts"));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { copyFixed, renderToFile } from "../render";
|
|
3
|
+
import { TEMPLATES_ROOT } from "../template-paths";
|
|
4
|
+
import type { RenderData } from "../types";
|
|
5
|
+
|
|
6
|
+
const TPL = path.join(TEMPLATES_ROOT, "common");
|
|
7
|
+
|
|
8
|
+
export async function generateCommon(cwd: string, data: RenderData): Promise<void> {
|
|
9
|
+
const out = path.resolve(cwd, "packages/common");
|
|
10
|
+
|
|
11
|
+
await copyFixed(path.join(TPL, "tsconfig.json"), path.join(out, "tsconfig.json"));
|
|
12
|
+
|
|
13
|
+
await renderToFile(path.join(TPL, "package.json.hbs"), path.join(out, "package.json"), data);
|
|
14
|
+
await renderToFile(path.join(TPL, "src/index.ts.hbs"), path.join(out, "src/index.ts"), data);
|
|
15
|
+
|
|
16
|
+
if (data.hasDb) {
|
|
17
|
+
await copyFixed(
|
|
18
|
+
path.join(TPL, "src/MainDbContext.ts"),
|
|
19
|
+
path.join(out, "src/MainDbContext.ts"),
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { copyFixed, renderToFile } from "../render";
|
|
3
|
+
import { TEMPLATES_ROOT } from "../template-paths";
|
|
4
|
+
import type { RenderData } from "../types";
|
|
5
|
+
|
|
6
|
+
const TPL = path.join(TEMPLATES_ROOT, "workspace-root");
|
|
7
|
+
|
|
8
|
+
const FIXED = [
|
|
9
|
+
".gitignore",
|
|
10
|
+
".npmrc",
|
|
11
|
+
".prettierignore",
|
|
12
|
+
".prettierrc.yaml",
|
|
13
|
+
"eslint.config.ts",
|
|
14
|
+
"pnpm-workspace.yaml",
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const HBS = [
|
|
18
|
+
"mise.toml",
|
|
19
|
+
"package.json",
|
|
20
|
+
"tsconfig.json",
|
|
21
|
+
"sd.config.ts",
|
|
22
|
+
"vitest.config.ts",
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
export async function generateRoot(cwd: string, data: RenderData): Promise<void> {
|
|
26
|
+
for (const name of FIXED) {
|
|
27
|
+
await copyFixed(path.join(TPL, name), path.join(cwd, name));
|
|
28
|
+
}
|
|
29
|
+
for (const name of HBS) {
|
|
30
|
+
await renderToFile(path.join(TPL, `${name}.hbs`), path.join(cwd, name), data);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { copyFixed, renderToFile } from "../render";
|
|
3
|
+
import { TEMPLATES_ROOT } from "../template-paths";
|
|
4
|
+
import type { RenderData } from "../types";
|
|
5
|
+
|
|
6
|
+
const TPL = path.join(TEMPLATES_ROOT, "server");
|
|
7
|
+
|
|
8
|
+
export async function generateServer(cwd: string, data: RenderData): Promise<void> {
|
|
9
|
+
const out = path.resolve(cwd, "packages/server");
|
|
10
|
+
|
|
11
|
+
await copyFixed(path.join(TPL, "tsconfig.json"), path.join(out, "tsconfig.json"));
|
|
12
|
+
await copyFixed(path.join(TPL, "src/index.ts"), path.join(out, "src/index.ts"));
|
|
13
|
+
|
|
14
|
+
await renderToFile(path.join(TPL, "package.json.hbs"), path.join(out, "package.json"), data);
|
|
15
|
+
await renderToFile(path.join(TPL, "src/main.ts.hbs"), path.join(out, "src/main.ts"), data);
|
|
16
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import crypto from "crypto";
|
|
2
|
+
import { createLazyLogger } from "../../runtime/lazy-logger";
|
|
3
|
+
import { generateClient } from "./generators/client";
|
|
4
|
+
import { generateClientCommon } from "./generators/client-common";
|
|
5
|
+
import { generateCommon } from "./generators/common";
|
|
6
|
+
import { generateRoot } from "./generators/root";
|
|
7
|
+
import { generateServer } from "./generators/server";
|
|
8
|
+
import { normalize } from "./normalize";
|
|
9
|
+
import { promptInit } from "./prompts";
|
|
10
|
+
import type { RenderData } from "./types";
|
|
11
|
+
import { validateBeforePrompt, validateInput } from "./validate";
|
|
12
|
+
|
|
13
|
+
const logger = createLazyLogger("sd:cli:init");
|
|
14
|
+
|
|
15
|
+
export interface InitOptions {
|
|
16
|
+
cwd: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function runInit(opts: InitOptions): Promise<void> {
|
|
20
|
+
await validateBeforePrompt(opts.cwd);
|
|
21
|
+
|
|
22
|
+
const input = await promptInit();
|
|
23
|
+
validateInput(input);
|
|
24
|
+
|
|
25
|
+
const normalized = normalize(input);
|
|
26
|
+
const data: RenderData = {
|
|
27
|
+
...normalized,
|
|
28
|
+
jwtSecret: crypto.randomBytes(32).toString("hex"),
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
logger.info(`워크스페이스 부트스트랩 시작: ${opts.cwd}`);
|
|
32
|
+
|
|
33
|
+
await generateRoot(opts.cwd, data);
|
|
34
|
+
if (data.hasServer) await generateServer(opts.cwd, data);
|
|
35
|
+
if (data.hasCommon) await generateCommon(opts.cwd, data);
|
|
36
|
+
if (data.hasClientCommon) await generateClientCommon(opts.cwd, data);
|
|
37
|
+
for (const client of data.clients) {
|
|
38
|
+
await generateClient(opts.cwd, data, client);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
logger.info("워크스페이스 부트스트랩 완료.");
|
|
42
|
+
|
|
43
|
+
const steps: string[] = ["pnpm install"];
|
|
44
|
+
if (data.hasDb) {
|
|
45
|
+
steps.push("sd.config.ts 의 configs.orm.MAIN 접속 정보 (host/port/user/password/database) 를 실제 값으로 수정");
|
|
46
|
+
}
|
|
47
|
+
if (data.hasMobile) {
|
|
48
|
+
steps.push(`(prod 빌드 필요 시) capacitor 키스토어를 packages/${data.firstMobileClientName!}/res/ 에 배치 후 sd.config.ts 의 capacitor.platform.android.sign 블록 수동 추가`);
|
|
49
|
+
}
|
|
50
|
+
steps.push("CLAUDE.md 가 필요하면 Claude Code 내장 /init 으로 작성");
|
|
51
|
+
|
|
52
|
+
logger.info("다음 단계:");
|
|
53
|
+
steps.forEach((s, i) => logger.info(` ${i + 1}. ${s}`));
|
|
54
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ClientSpec, InitInput, NormalizedInput } from "./types";
|
|
2
|
+
|
|
3
|
+
const DB_PORTS: Record<NonNullable<InitInput["dbDialect"]>, number> = {
|
|
4
|
+
mysql: 3306,
|
|
5
|
+
postgres: 5432,
|
|
6
|
+
mssql: 1433,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export function normalize(input: InitInput): NormalizedInput {
|
|
10
|
+
const clients: ClientSpec[] = input.clients.map((c) => {
|
|
11
|
+
const name = c.name.startsWith("client-") ? c.name : `client-${c.name}`;
|
|
12
|
+
const isMobile = c.type === "mobile";
|
|
13
|
+
return {
|
|
14
|
+
name,
|
|
15
|
+
type: c.type,
|
|
16
|
+
hasRouter: isMobile ? false : c.hasRouter,
|
|
17
|
+
isMobile,
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const hasDb = input.hasServer && input.hasDb;
|
|
22
|
+
const hasCommon = input.hasServer;
|
|
23
|
+
const hasClientCommon = input.hasServer || clients.length >= 2;
|
|
24
|
+
const hasMobile = clients.some((c) => c.isMobile);
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
workspaceName: input.workspaceName,
|
|
28
|
+
workspaceNameUpper: input.workspaceName.toUpperCase().replace(/-/g, "_"),
|
|
29
|
+
description: input.description,
|
|
30
|
+
hasServer: input.hasServer,
|
|
31
|
+
hasDb,
|
|
32
|
+
dbDialect: hasDb ? input.dbDialect : undefined,
|
|
33
|
+
dbPort: hasDb && input.dbDialect != null ? DB_PORTS[input.dbDialect] : 0,
|
|
34
|
+
isMysql: hasDb && input.dbDialect === "mysql",
|
|
35
|
+
isPostgres: hasDb && input.dbDialect === "postgres",
|
|
36
|
+
isMssql: hasDb && input.dbDialect === "mssql",
|
|
37
|
+
serverPort: input.serverPort ?? 40080,
|
|
38
|
+
mobileAppId: hasMobile ? input.mobileAppId : undefined,
|
|
39
|
+
firstMobileClientName: clients.find((c) => c.isMobile)?.name,
|
|
40
|
+
clients,
|
|
41
|
+
hasCommon,
|
|
42
|
+
hasClientCommon,
|
|
43
|
+
hasMobile,
|
|
44
|
+
hasAnyClient: clients.length > 0,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { confirm, input, select } from "@inquirer/prompts";
|
|
2
|
+
import type { ClientInputSpec, ClientType, DbDialect, InitInput } from "./types";
|
|
3
|
+
|
|
4
|
+
const KEBAB_CASE_RE = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
|
|
5
|
+
const APPID_RE = /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/;
|
|
6
|
+
|
|
7
|
+
export async function promptInit(): Promise<InitInput> {
|
|
8
|
+
const workspaceName = await input({
|
|
9
|
+
message: "워크스페이스 이름 (영문 kebab-case, 예: my-project):",
|
|
10
|
+
validate: (v) => KEBAB_CASE_RE.test(v) || "영문 kebab-case 만 허용됩니다.",
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const description = await input({
|
|
14
|
+
message: "한 줄 설명:",
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const hasServer = await confirm({
|
|
18
|
+
message: "server 패키지를 만들까요?",
|
|
19
|
+
default: true,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
let hasDb = false;
|
|
23
|
+
let dbDialect: DbDialect | undefined;
|
|
24
|
+
let serverPort: number | undefined;
|
|
25
|
+
if (hasServer) {
|
|
26
|
+
hasDb = await confirm({
|
|
27
|
+
message: "DB 를 사용할까요? (ORM 부트스트랩 포함)",
|
|
28
|
+
default: true,
|
|
29
|
+
});
|
|
30
|
+
if (hasDb) {
|
|
31
|
+
dbDialect = await select<DbDialect>({
|
|
32
|
+
message: "DB dialect 를 선택하세요:",
|
|
33
|
+
choices: [
|
|
34
|
+
{ name: "MySQL", value: "mysql" },
|
|
35
|
+
{ name: "PostgreSQL", value: "postgres" },
|
|
36
|
+
{ name: "MSSQL", value: "mssql" },
|
|
37
|
+
],
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const portStr = await input({
|
|
42
|
+
message: "server port (dev/prod 동일):",
|
|
43
|
+
default: "40080",
|
|
44
|
+
validate: (v) => {
|
|
45
|
+
const n = Number(v);
|
|
46
|
+
return (Number.isInteger(n) && n > 0 && n < 65536) || "유효한 포트 번호 (1-65535)";
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
serverPort = Number(portStr);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const clients: ClientInputSpec[] = [];
|
|
53
|
+
for (;;) {
|
|
54
|
+
const shouldAdd =
|
|
55
|
+
clients.length === 0
|
|
56
|
+
? await confirm({ message: "client 를 추가할까요?", default: true })
|
|
57
|
+
: await confirm({ message: "다른 client 를 더 추가할까요?", default: false });
|
|
58
|
+
if (!shouldAdd) break;
|
|
59
|
+
|
|
60
|
+
const clientName = await input({
|
|
61
|
+
message: "client 이름 (예: admin → 자동으로 client-admin):",
|
|
62
|
+
validate: (v) => KEBAB_CASE_RE.test(v) || "영문 kebab-case 만 허용됩니다.",
|
|
63
|
+
});
|
|
64
|
+
const clientType = await select<ClientType>({
|
|
65
|
+
message: "client 타입:",
|
|
66
|
+
choices: [
|
|
67
|
+
{ name: "일반 웹", value: "web" },
|
|
68
|
+
{ name: "모바일 (capacitor)", value: "mobile" },
|
|
69
|
+
],
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
let hasRouter = false;
|
|
73
|
+
if (clientType !== "mobile") {
|
|
74
|
+
hasRouter = await confirm({
|
|
75
|
+
message: `${clientName}: 라우팅 (@angular/router) 을 쓸까요?`,
|
|
76
|
+
default: true,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
clients.push({ name: clientName, type: clientType, hasRouter });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
let mobileAppId: string | undefined;
|
|
84
|
+
if (clients.some((c) => c.type === "mobile")) {
|
|
85
|
+
mobileAppId = await input({
|
|
86
|
+
message: "capacitor appId (reverse-DNS, 예: kr.co.example.app):",
|
|
87
|
+
validate: (v) => APPID_RE.test(v) || "reverse-DNS 형식이어야 합니다.",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
workspaceName,
|
|
93
|
+
description,
|
|
94
|
+
hasServer,
|
|
95
|
+
clients,
|
|
96
|
+
hasDb,
|
|
97
|
+
dbDialect,
|
|
98
|
+
mobileAppId,
|
|
99
|
+
serverPort,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import Handlebars from "handlebars";
|
|
2
|
+
import { fsx } from "@simplysm/core-node";
|
|
3
|
+
|
|
4
|
+
type Compiled = ReturnType<typeof Handlebars.compile>;
|
|
5
|
+
|
|
6
|
+
const compileCache = new Map<string, Compiled>();
|
|
7
|
+
|
|
8
|
+
export async function renderTemplate(tplPath: string, data: unknown): Promise<string> {
|
|
9
|
+
let tpl = compileCache.get(tplPath);
|
|
10
|
+
if (tpl == null) {
|
|
11
|
+
const source = await fsx.read(tplPath);
|
|
12
|
+
tpl = Handlebars.compile(source, { noEscape: true });
|
|
13
|
+
compileCache.set(tplPath, tpl);
|
|
14
|
+
}
|
|
15
|
+
return tpl(data);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function renderToFile(tplPath: string, outPath: string, data: unknown): Promise<void> {
|
|
19
|
+
const rendered = await renderTemplate(tplPath, data);
|
|
20
|
+
await fsx.write(outPath, rendered);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function copyFixed(sourcePath: string, outPath: string): Promise<void> {
|
|
24
|
+
await fsx.copy(sourcePath, outPath);
|
|
25
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
|
|
4
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
const isProd = here.includes(`${path.sep}dist${path.sep}`);
|
|
6
|
+
const pkgRoot = path.resolve(here, isProd ? "../../.." : "../../..");
|
|
7
|
+
|
|
8
|
+
export const TEMPLATES_ROOT = path.join(pkgRoot, "src", "commands", "init", "templates");
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./node_modules/@angular/service-worker/config/schema.json",
|
|
3
|
+
"index": "/index.html",
|
|
4
|
+
"assetGroups": [
|
|
5
|
+
{
|
|
6
|
+
"name": "app",
|
|
7
|
+
"installMode": "prefetch",
|
|
8
|
+
"resources": {
|
|
9
|
+
"files": [
|
|
10
|
+
"/*.html",
|
|
11
|
+
"/*.css",
|
|
12
|
+
"/*.js"
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "assets",
|
|
18
|
+
"installMode": "lazy",
|
|
19
|
+
"updateMode": "prefetch",
|
|
20
|
+
"resources": {
|
|
21
|
+
"files": [
|
|
22
|
+
"/**/*.{png,jpg,svg,ico,woff2,webmanifest}"
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@{{workspaceName}}/{{client.name}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "{{description}} - {{client.name}}",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"private": true,
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"@angular/common": "^21.2.0",
|
|
10
|
+
"@angular/core": "^21.2.0",
|
|
11
|
+
"@angular/platform-browser": "^21.2.0",
|
|
12
|
+
"@simplysm/angular": "^14.0.0",
|
|
13
|
+
"@simplysm/core-browser": "^14.0.0",
|
|
14
|
+
"@simplysm/core-common": "^14.0.0"{{#if hasClientCommon}},
|
|
15
|
+
"@{{workspaceName}}/client-common": "workspace:*"{{/if}}{{#if hasServer}},
|
|
16
|
+
"@simplysm/service-client": "^14.0.0",
|
|
17
|
+
"@simplysm/service-common": "^14.0.0"{{/if}}{{#if client.hasRouter}},
|
|
18
|
+
"@angular/router": "^21.2.0"{{/if}}{{#if hasDb}},
|
|
19
|
+
"@{{workspaceName}}/common": "workspace:*",
|
|
20
|
+
"@simplysm/orm-common": "^14.0.0"{{/if}}{{#if client.isMobile}},
|
|
21
|
+
"@capacitor/core": "^7.0.0",
|
|
22
|
+
"@capacitor/device": "^7.0.0",
|
|
23
|
+
"@capacitor/haptics": "^7.0.0"{{/if}}
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@angular/compiler": "^21.2.0",
|
|
27
|
+
"@angular/platform-browser-dynamic": "^21.2.0"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ViewEncapsulation } from "@angular/core";
|
|
2
|
+
{{#if client.hasRouter}}
|
|
3
|
+
import { RouterOutlet } from "@angular/router";
|
|
4
|
+
{{/if}}
|
|
5
|
+
|
|
6
|
+
@Component({
|
|
7
|
+
selector: "app-root",
|
|
8
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
9
|
+
encapsulation: ViewEncapsulation.None,
|
|
10
|
+
standalone: true,
|
|
11
|
+
{{#if client.hasRouter}}
|
|
12
|
+
imports: [RouterOutlet],
|
|
13
|
+
template: `<router-outlet />`,
|
|
14
|
+
{{else}}
|
|
15
|
+
template: `<div></div>`,
|
|
16
|
+
{{/if}}
|
|
17
|
+
})
|
|
18
|
+
export class AppPage {}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="ko">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="initial-scale=1, width=device-width, viewport-fit=cover" />
|
|
6
|
+
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
|
|
7
|
+
<title>{{description}}</title>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<app-root></app-root>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { enableProdMode } from "@angular/core";
|
|
2
|
+
import { bootstrapApplication } from "@angular/platform-browser";
|
|
3
|
+
import { provideHttpClient, withFetch } from "@angular/common/http";
|
|
4
|
+
{{#if client.hasRouter}}
|
|
5
|
+
import { provideRouter, withHashLocation } from "@angular/router";
|
|
6
|
+
{{/if}}
|
|
7
|
+
import { provideSdAngular } from "@simplysm/angular";
|
|
8
|
+
import { AppPage } from "./AppPage";
|
|
9
|
+
{{#if client.hasRouter}}
|
|
10
|
+
import { routes } from "./routes";
|
|
11
|
+
{{/if}}
|
|
12
|
+
import "./styles.scss";
|
|
13
|
+
|
|
14
|
+
if (typeof ngDevMode !== "undefined" && !ngDevMode) {
|
|
15
|
+
enableProdMode();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
bootstrapApplication(AppPage, {
|
|
19
|
+
providers: [
|
|
20
|
+
provideHttpClient(withFetch()),
|
|
21
|
+
{{#if client.hasRouter}}
|
|
22
|
+
provideRouter(routes, withHashLocation()),
|
|
23
|
+
{{/if}}
|
|
24
|
+
provideSdAngular({ clientName: "{{client.name}}" }),
|
|
25
|
+
],
|
|
26
|
+
}).catch((err: unknown) => {
|
|
27
|
+
console.error(err);
|
|
28
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@use "@simplysm/angular/scss/styles";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"lib": ["ESNext", "DOM", "DOM.Iterable"],
|
|
5
|
+
"outDir": "./dist",
|
|
6
|
+
"typeRoots": ["./node_modules/@types"],
|
|
7
|
+
"customConditions": ["browser"]
|
|
8
|
+
},
|
|
9
|
+
"angularCompilerOptions": {
|
|
10
|
+
"strictTemplates": true,
|
|
11
|
+
"strictInjectionParameters": true,
|
|
12
|
+
"strictInputAccessModifiers": true,
|
|
13
|
+
"strictStandalone": true,
|
|
14
|
+
"typeCheckHostBindings": true,
|
|
15
|
+
"enableI18nLegacyMessageIdFormat": false,
|
|
16
|
+
"extendedDiagnostics": {
|
|
17
|
+
"defaultCategory": "error"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@{{workspaceName}}/client-common",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"private": true,
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"@angular/common": "^21.2.0",
|
|
8
|
+
"@angular/core": "^21.2.0",
|
|
9
|
+
"@simplysm/angular": "^14.0.0",
|
|
10
|
+
"@simplysm/core-common": "^14.0.0"{{#if hasServer}},
|
|
11
|
+
"@{{workspaceName}}/common": "workspace:*",
|
|
12
|
+
"@simplysm/service-client": "^14.0.0",
|
|
13
|
+
"@simplysm/service-common": "^14.0.0"{{/if}}{{#if hasDb}},
|
|
14
|
+
"@simplysm/orm-common": "^14.0.0"{{/if}}
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@angular/compiler": "^21.2.0",
|
|
18
|
+
"@angular/platform-browser": "^21.2.0"
|
|
19
|
+
}
|
|
20
|
+
}
|