@simplysm/sd-cli 14.0.98 → 14.0.100

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.
Files changed (60) hide show
  1. package/dist/commands/init/generators/client.d.ts.map +1 -1
  2. package/dist/commands/init/generators/client.js +2 -1
  3. package/dist/commands/init/generators/client.js.map +1 -1
  4. package/dist/commands/init/init-client.d.ts +5 -0
  5. package/dist/commands/init/init-client.d.ts.map +1 -0
  6. package/dist/commands/init/init-client.js +117 -0
  7. package/dist/commands/init/init-client.js.map +1 -0
  8. package/dist/commands/init/normalize.d.ts.map +1 -1
  9. package/dist/commands/init/normalize.js +3 -1
  10. package/dist/commands/init/normalize.js.map +1 -1
  11. package/dist/commands/init/patch.d.ts +16 -0
  12. package/dist/commands/init/patch.d.ts.map +1 -0
  13. package/dist/commands/init/patch.js +247 -0
  14. package/dist/commands/init/patch.js.map +1 -0
  15. package/dist/commands/init/prompts.d.ts +6 -1
  16. package/dist/commands/init/prompts.d.ts.map +1 -1
  17. package/dist/commands/init/prompts.js +46 -31
  18. package/dist/commands/init/prompts.js.map +1 -1
  19. package/dist/commands/init/recover.d.ts +12 -0
  20. package/dist/commands/init/recover.d.ts.map +1 -0
  21. package/dist/commands/init/recover.js +183 -0
  22. package/dist/commands/init/recover.js.map +1 -0
  23. package/dist/commands/init/ts-ast.d.ts +8 -0
  24. package/dist/commands/init/ts-ast.d.ts.map +1 -0
  25. package/dist/commands/init/ts-ast.js +39 -0
  26. package/dist/commands/init/ts-ast.js.map +1 -0
  27. package/dist/commands/init/types.d.ts +2 -0
  28. package/dist/commands/init/types.d.ts.map +1 -1
  29. package/dist/commands/init/validate.d.ts +3 -1
  30. package/dist/commands/init/validate.d.ts.map +1 -1
  31. package/dist/commands/init/validate.js +15 -0
  32. package/dist/commands/init/validate.js.map +1 -1
  33. package/dist/esbuild/esbuild-client-config.d.ts.map +1 -1
  34. package/dist/esbuild/esbuild-client-config.js +17 -0
  35. package/dist/esbuild/esbuild-client-config.js.map +1 -1
  36. package/dist/sd-cli-entry.d.ts.map +1 -1
  37. package/dist/sd-cli-entry.js +15 -2
  38. package/dist/sd-cli-entry.js.map +1 -1
  39. package/package.json +8 -8
  40. package/src/commands/init/generators/client.ts +6 -1
  41. package/src/commands/init/init-client.ts +155 -0
  42. package/src/commands/init/normalize.ts +3 -1
  43. package/src/commands/init/patch.ts +306 -0
  44. package/src/commands/init/prompts.ts +56 -34
  45. package/src/commands/init/recover.ts +236 -0
  46. package/src/commands/init/templates/client/public/robots.txt.hbs +2 -0
  47. package/src/commands/init/templates/client/src/app/home/master/role-permission/role.list.ts.hbs +12 -14
  48. package/src/commands/init/templates/client/src/app/home/master/user.list.ts.hbs +25 -27
  49. package/src/commands/init/templates/client/src/app/home/system/data-log/data-log.list.ts.hbs +29 -31
  50. package/src/commands/init/templates/client/src/app/home/system/system-log/system-log.list.ts.hbs +46 -48
  51. package/src/commands/init/templates/workspace-root/gitignore +9 -1
  52. package/src/commands/init/ts-ast.ts +48 -0
  53. package/src/commands/init/types.ts +2 -0
  54. package/src/commands/init/validate.ts +24 -1
  55. package/src/esbuild/esbuild-client-config.ts +17 -0
  56. package/src/sd-cli-entry.ts +18 -5
  57. package/tests/init/patch.spec.ts +222 -0
  58. package/tests/init/recover.spec.ts +236 -0
  59. package/tests/init/render.spec.ts +19 -0
  60. package/src/commands/init/templates/client/public/robots.txt +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/generators/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAIvD,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAiHf"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/generators/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAIvD,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAsHf"}
@@ -6,7 +6,8 @@ export async function generateClient(cwd, base, client) {
6
6
  const out = path.resolve(cwd, "packages", client.name);
7
7
  const data = { ...base, client };
8
8
  await copyFixed(path.join(TPL, "tsconfig.json"), path.join(out, "tsconfig.json"));
9
- await copyFixed(path.join(TPL, "public"), path.join(out, "public"));
9
+ await copyFixed(path.join(TPL, "public/favicon.ico"), path.join(out, "public/favicon.ico"));
10
+ await renderToFile(path.join(TPL, "public/robots.txt.hbs"), path.join(out, "public/robots.txt"), data);
10
11
  await copyFixed(path.join(TPL, "src/polyfills.ts"), path.join(out, "src/polyfills.ts"));
11
12
  await copyFixed(path.join(TPL, "src/styles.scss"), path.join(out, "src/styles.scss"));
12
13
  if (client.isMobile) {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/commands/init/generators/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/commands/init/generators/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface InitClientOptions {
2
+ cwd: string;
3
+ }
4
+ export declare function runInitClient(opts: InitClientOptions): Promise<void>;
5
+ //# sourceMappingURL=init-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-client.d.ts","sourceRoot":"","sources":["../../../src/commands/init/init-client.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgI1E"}
@@ -0,0 +1,117 @@
1
+ import crypto from "crypto";
2
+ import path from "path";
3
+ import { createLogger } from "@simplysm/core-common";
4
+ import { fsx } from "@simplysm/core-node";
5
+ import { generateClient } from "./generators/client.js";
6
+ import { normalize } from "./normalize.js";
7
+ import { patchAppStructure, patchDevService, patchRootPackageJson, patchSdConfig, patchVitestConfig, } from "./patch.js";
8
+ import { promptInitClient } from "./prompts.js";
9
+ import { recoverWorkspace } from "./recover.js";
10
+ import { validateInitClientInput } from "./validate.js";
11
+ import { shellSpawn } from "../../utils/shell-spawn.js";
12
+ const logger = createLogger("sd:cli:init-client");
13
+ export async function runInitClient(opts) {
14
+ const recovered = await recoverWorkspace(opts.cwd);
15
+ const { client: newClientInput, mobileAppId } = await promptInitClient(recovered.input.mobileAppId != null);
16
+ await validateInitClientInput(opts.cwd, newClientInput, recovered.input.clients);
17
+ const mergedInput = {
18
+ ...recovered.input,
19
+ clients: [...recovered.input.clients, newClientInput],
20
+ mobileAppId: recovered.input.mobileAppId ?? mobileAppId,
21
+ };
22
+ const data = {
23
+ ...normalize(mergedInput),
24
+ // client-common 은 새로 생성하지 않음 — 실재 여부에 맞춰 신규 클라이언트의 의존 포함 여부 결정
25
+ hasClientCommon: recovered.hasClientCommonPkg,
26
+ jwtSecret: crypto.randomBytes(32).toString("hex"),
27
+ };
28
+ const client = data.clients[data.clients.length - 1];
29
+ const outDir = path.resolve(opts.cwd, "packages", client.name);
30
+ //-- mobile 은 루트 package.json 의 description 이 capacitor 앱 표시 이름(appName)으로 들어감
31
+ if (client.isMobile && data.description.trim().length === 0) {
32
+ throw new Error("mobile 클라이언트는 capacitor 앱 표시 이름으로 루트 package.json 의 description 을 사용합니다. description 을 채운 뒤 다시 실행하세요.");
33
+ }
34
+ //-- 공유 파일 패치를 메모리에서 준비 (원자성: 전부 준비된 뒤에만 기록)
35
+ const isFirstMobile = client.isMobile && recovered.input.clients.every((c) => c.type !== "mobile");
36
+ const needsAppStructure = data.hasAuth && client.hasRouter;
37
+ //-- 기존 라우팅 클라이언트 0개면 기본 메뉴 구조 export("appStructureItems")는
38
+ // 파일에 남기되 서버 초기화의 import·권한 계산에서 신규 export 로 대체 (init 동등)
39
+ const isFirstRouterClient = recovered.input.clients.every((c) => !c.hasRouter);
40
+ const fallbackExportName = isFirstRouterClient && recovered.appStructureExportNames.includes("appStructureItems")
41
+ ? "appStructureItems"
42
+ : undefined;
43
+ const combineExportNames = fallbackExportName != null
44
+ ? recovered.appStructureExportNames.filter((n) => n !== fallbackExportName)
45
+ : recovered.appStructureExportNames;
46
+ const patchTargets = [
47
+ { relPath: "sd.config.ts", apply: (src) => patchSdConfig(src, data, client) },
48
+ { relPath: "vitest.config.ts", apply: (src) => patchVitestConfig(src, client) },
49
+ ...(isFirstMobile
50
+ ? [{ relPath: "package.json", apply: (src) => patchRootPackageJson(src, client) }]
51
+ : []),
52
+ ...(needsAppStructure
53
+ ? [
54
+ {
55
+ relPath: "packages/common/src/app-structure.ts",
56
+ apply: (src) => patchAppStructure(src, data, client),
57
+ },
58
+ {
59
+ relPath: "packages/server/src/services/dev.service.ts",
60
+ apply: (src) => patchDevService(src, combineExportNames, data, client, fallbackExportName),
61
+ },
62
+ ]
63
+ : []),
64
+ ];
65
+ const writes = [];
66
+ const manualGuides = [];
67
+ for (const target of patchTargets) {
68
+ const absPath = path.resolve(opts.cwd, target.relPath);
69
+ if (!(await fsx.exists(absPath))) {
70
+ const r = target.apply("");
71
+ manualGuides.push({ relPath: target.relPath, snippet: r.snippet });
72
+ continue;
73
+ }
74
+ const r = target.apply(await fsx.read(absPath));
75
+ if (r.patched != null) {
76
+ writes.push({ absPath, content: r.patched });
77
+ }
78
+ else {
79
+ manualGuides.push({ relPath: target.relPath, snippet: r.snippet });
80
+ }
81
+ }
82
+ logger.info(`클라이언트 패키지 생성 시작: packages/${client.name}`);
83
+ //-- 신규 패키지 생성 (실패 시 생성분 제거 후 중단 — 공유 파일은 아직 미기록)
84
+ try {
85
+ await generateClient(opts.cwd, data, client);
86
+ }
87
+ catch (err) {
88
+ try {
89
+ await fsx.rm(outDir);
90
+ }
91
+ catch {
92
+ const leftovers = await fsx.glob(path.join(outDir, "**/*")).catch(() => []);
93
+ logger.error(`생성 잔여물 제거 실패 — packages/${client.name} 를 수동 삭제하세요. 남은 항목:\n` +
94
+ [outDir, ...leftovers].map((p) => ` - ${p}`).join("\n"));
95
+ }
96
+ throw err;
97
+ }
98
+ //-- 공유 파일 일괄 기록
99
+ for (const w of writes) {
100
+ await fsx.write(w.absPath, w.content);
101
+ }
102
+ logger.info(`클라이언트 패키지 생성 완료: packages/${client.name}`);
103
+ for (const guide of manualGuides) {
104
+ logger.error(`${guide.relPath} 자동 갱신 실패 — 아래 내용을 직접 반영하세요:\n${guide.snippet}`);
105
+ }
106
+ logger.info("의존성 설치 중...");
107
+ await shellSpawn("pnpm", ["install", "--config.dangerously-allow-all-builds=true"], {
108
+ cwd: opts.cwd,
109
+ stdio: "inherit",
110
+ });
111
+ logger.info("의존성 설치 완료.");
112
+ if (client.isMobile) {
113
+ logger.info("다음 단계:");
114
+ logger.info(` 1. (prod 빌드 필요 시) capacitor 키스토어를 packages/${client.name}/res/ 에 배치 후 sd.config.ts 의 capacitor.platform.android.sign 블록 수동 추가`);
115
+ }
116
+ }
117
+ //# sourceMappingURL=init-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-client.js","sourceRoot":"","sources":["../../../src/commands/init/init-client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/commands/init/normalize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,SAAS,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA0CtE,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,eAAe,CAgE3D"}
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/commands/init/normalize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,SAAS,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA0CtE,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,eAAe,CAkE3D"}
@@ -37,6 +37,7 @@ export function normalize(input) {
37
37
  const isMobile = c.type === "mobile";
38
38
  const hasRouter = isMobile ? false : c.hasRouter;
39
39
  const baseName = name.startsWith("client-") ? name.slice("client-".length) : name;
40
+ const useSsg = hasRouter && !isMobile && (c.useSsg ?? false);
40
41
  return {
41
42
  name,
42
43
  type: c.type,
@@ -44,7 +45,8 @@ export function normalize(input) {
44
45
  isMobile,
45
46
  appStructureName: `${str.toCamelCase(baseName)}AppStructureItems`,
46
47
  needsNgIcons: (hasRouter && hasAuth) || hasDb,
47
- useSsg: hasRouter && !isMobile && (c.useSsg ?? false),
48
+ useSsg,
49
+ robotsDirective: useSsg ? "Allow: /" : "Disallow: /",
48
50
  };
49
51
  });
50
52
  const routerClients = clients.filter((c) => c.hasRouter);
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/commands/init/normalize.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/commands/init/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ClientSpec, RenderData } from "./types";
2
+ /** 공유 파일 1개에 대한 패치 결과 */
3
+ export interface FilePatch {
4
+ /** 패치 성공 시 새 파일 내용. 앵커 탐색 실패 시 undefined */
5
+ patched?: string;
6
+ /** 수동 반영 안내용 스니펫 */
7
+ snippet: string;
8
+ }
9
+ export declare function patchSdConfig(source: string, data: RenderData, client: ClientSpec): FilePatch;
10
+ export declare function patchVitestConfig(source: string, client: ClientSpec): FilePatch;
11
+ export declare function patchRootPackageJson(source: string, client: ClientSpec): FilePatch;
12
+ export declare function patchAppStructure(source: string, data: RenderData, client: ClientSpec): FilePatch;
13
+ export declare function patchDevService(source: string, existingExportNames: string[], data: RenderData, client: ClientSpec,
14
+ /** 권한 계산·import 에서 신규 export 로 대체할 기본 export 이름 (기존 라우팅 클라이언트 0개 케이스) */
15
+ replaceExportName?: string): FilePatch;
16
+ //# sourceMappingURL=patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../../src/commands/init/patch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEtD,yBAAyB;AACzB,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAmDD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAmB7F;AA2BD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAiC/E;AAID,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAuClF;AA+BD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAIjG;AAID,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,MAAM,EAAE,EAC7B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,UAAU;AAClB,yEAAyE;AACzE,iBAAiB,CAAC,EAAE,MAAM,GACzB,SAAS,CA4EX"}
@@ -0,0 +1,247 @@
1
+ import ts from "typescript";
2
+ import { findPackagesObject, getPropertyName, getProp } from "./ts-ast.js";
3
+ function applyEdits(source, edits) {
4
+ let result = source;
5
+ for (const edit of [...edits].sort((a, b) => b.start - a.start)) {
6
+ result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);
7
+ }
8
+ return result;
9
+ }
10
+ function lineStartOf(source, pos) {
11
+ return source.lastIndexOf("\n", pos - 1) + 1;
12
+ }
13
+ function parseTs(fileName, source) {
14
+ return ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true);
15
+ }
16
+ //-- sd.config.ts
17
+ function buildSdConfigClientBlock(data, client) {
18
+ const lines = [];
19
+ lines.push(` "${client.name}": {`);
20
+ lines.push(` target: "client",`);
21
+ if (data.hasServer) {
22
+ lines.push(` server: "server",`);
23
+ }
24
+ if (client.useSsg) {
25
+ lines.push(` prerender: ["/"],`);
26
+ }
27
+ if (client.isMobile) {
28
+ lines.push(` pwa: false,`);
29
+ lines.push(` capacitor: {`);
30
+ lines.push(` appId: "${data.mobileAppId}",`);
31
+ lines.push(` appName: "${data.description}",`);
32
+ lines.push(` icon: "res/icon.png",`);
33
+ lines.push(` platform: {`);
34
+ lines.push(` android: {},`);
35
+ lines.push(` },`);
36
+ lines.push(` },`);
37
+ }
38
+ lines.push(` },`);
39
+ return lines.join("\n") + "\n";
40
+ }
41
+ export function patchSdConfig(source, data, client) {
42
+ const block = buildSdConfigClientBlock(data, client);
43
+ const snippet = block;
44
+ const sf = parseTs("sd.config.ts", source);
45
+ const packagesObj = findPackagesObject(sf);
46
+ if (packagesObj == null)
47
+ return { snippet };
48
+ const closeBracePos = packagesObj.getEnd() - 1;
49
+ const lastProp = packagesObj.properties.at(-1);
50
+ if (lastProp != null && !source.slice(lastProp.end, closeBracePos).includes(",")) {
51
+ return { snippet };
52
+ }
53
+ const insertPos = lineStartOf(source, closeBracePos);
54
+ return {
55
+ patched: applyEdits(source, [{ start: insertPos, end: insertPos, text: block }]),
56
+ snippet,
57
+ };
58
+ }
59
+ //-- vitest.config.ts
60
+ function buildVitestProjectBlock(client) {
61
+ return ([
62
+ ` {`,
63
+ ` extends: true,`,
64
+ ` plugins: [sdAngularPlugin({ pkg: "${client.name}" })],`,
65
+ ` test: {`,
66
+ ` name: "${client.name}",`,
67
+ ` setupFiles: ["packages/${client.name}/tests/vitest.setup.ts"],`,
68
+ ` include: ["packages/${client.name}/tests/**/*.spec.{ts,js,mjs,cjs}"],`,
69
+ ` browser: {`,
70
+ ` provider: playwright(),`,
71
+ ` enabled: true,`,
72
+ ` headless: true,`,
73
+ ` screenshotFailures: false,`,
74
+ ` instances: [{ browser: "chromium", viewport: { width: 1920, height: 1080 } }],`,
75
+ ` },`,
76
+ ` },`,
77
+ ` },`,
78
+ ].join("\n") + "\n");
79
+ }
80
+ export function patchVitestConfig(source, client) {
81
+ const block = buildVitestProjectBlock(client);
82
+ const snippet = block;
83
+ const sf = parseTs("vitest.config.ts", source);
84
+ let projectsArray;
85
+ const visit = (node) => {
86
+ if (projectsArray != null)
87
+ return;
88
+ if (ts.isPropertyAssignment(node) &&
89
+ getPropertyName(node.name) === "projects" &&
90
+ ts.isArrayLiteralExpression(node.initializer)) {
91
+ projectsArray = node.initializer;
92
+ return;
93
+ }
94
+ ts.forEachChild(node, visit);
95
+ };
96
+ visit(sf);
97
+ if (projectsArray == null)
98
+ return { snippet };
99
+ const closeBracketPos = projectsArray.getEnd() - 1;
100
+ const lastElement = projectsArray.elements.at(-1);
101
+ if (lastElement != null && !source.slice(lastElement.end, closeBracketPos).includes(",")) {
102
+ return { snippet };
103
+ }
104
+ const insertPos = lineStartOf(source, closeBracketPos);
105
+ return {
106
+ patched: applyEdits(source, [{ start: insertPos, end: insertPos, text: block }]),
107
+ snippet,
108
+ };
109
+ }
110
+ //-- 루트 package.json
111
+ export function patchRootPackageJson(source, client) {
112
+ const block = ` "run-device": "sd-cli device -t ${client.name}",\n "-----": "",\n`;
113
+ const snippet = block;
114
+ const sf = ts.parseJsonText("package.json", source);
115
+ const rootStmt = sf.statements.at(0);
116
+ if (rootStmt == null || !ts.isObjectLiteralExpression(rootStmt.expression)) {
117
+ return { snippet };
118
+ }
119
+ const scriptsExpr = getProp(rootStmt.expression, "scripts");
120
+ if (scriptsExpr == null || !ts.isObjectLiteralExpression(scriptsExpr)) {
121
+ return { snippet };
122
+ }
123
+ const separatorProp = scriptsExpr.properties.find((p) => ts.isPropertyAssignment(p) && getPropertyName(p.name) === "----");
124
+ if (separatorProp != null) {
125
+ const lineEnd = source.indexOf("\n", separatorProp.end);
126
+ if (lineEnd < 0)
127
+ return { snippet };
128
+ const insertPos = lineEnd + 1;
129
+ return {
130
+ patched: applyEdits(source, [{ start: insertPos, end: insertPos, text: block }]),
131
+ snippet,
132
+ };
133
+ }
134
+ const replaceDepsProp = scriptsExpr.properties.find((p) => ts.isPropertyAssignment(p) && getPropertyName(p.name) === "replace-deps");
135
+ if (replaceDepsProp != null) {
136
+ const insertPos = lineStartOf(source, replaceDepsProp.getStart(sf));
137
+ return {
138
+ patched: applyEdits(source, [{ start: insertPos, end: insertPos, text: block }]),
139
+ snippet,
140
+ };
141
+ }
142
+ return { snippet };
143
+ }
144
+ //-- common/src/app-structure.ts
145
+ function buildAppStructureBlock(data, client) {
146
+ return `export const ${client.appStructureName}: AppStructureItem[] = [
147
+ { title: "메인화면", code: "main", isNotMenu: true },
148
+ { title: "내 정보 수정", code: "my-info", isNotMenu: true },
149
+
150
+ {
151
+ code: "master",
152
+ title: "기준정보",
153
+ icon: tablerDatabase,
154
+ children: [
155
+ { code: "role-permission", title: "역할/권한", perms: ["use", "edit"] },
156
+ { code: "${data.userEntityKebab}", title: "${data.userEntityLabel}", perms: ["use", "edit"] },
157
+ ],
158
+ },
159
+ {
160
+ code: "system",
161
+ title: "시스템",
162
+ icon: tablerSettings,
163
+ children: [
164
+ { code: "data-log", title: "데이터 변경내역", perms: ["use"] },
165
+ { code: "system-log", title: "시스템 로그", perms: ["use"] },
166
+ ],
167
+ },
168
+ ];
169
+ `;
170
+ }
171
+ export function patchAppStructure(source, data, client) {
172
+ const block = buildAppStructureBlock(data, client);
173
+ const base = source.endsWith("\n") ? source : `${source}\n`;
174
+ return { patched: `${base}\n${block}`, snippet: block };
175
+ }
176
+ //-- server/src/services/dev.service.ts
177
+ export function patchDevService(source, existingExportNames, data, client,
178
+ /** 권한 계산·import 에서 신규 export 로 대체할 기본 export 이름 (기존 라우팅 클라이언트 0개 케이스) */
179
+ replaceExportName) {
180
+ const combinedNames = [...existingExportNames, client.appStructureName];
181
+ const combinedExpr = combinedNames.length > 1
182
+ ? `[${combinedNames.map((n) => `...${n}`).join(", ")}]`
183
+ : combinedNames[0];
184
+ const snippet = [
185
+ `- import 에 ${client.appStructureName} 추가 (from "@${data.workspaceName}/common")`,
186
+ `- getFlatPermissions 첫 번째 인자를 ${combinedExpr} 로 변경`,
187
+ ].join("\n");
188
+ const sf = parseTs("dev.service.ts", source);
189
+ //-- ① import 명세자 추가 (대체 대상이 있으면 그 명세자를 신규 이름으로 교체)
190
+ const moduleName = `@${data.workspaceName}/common`;
191
+ let importSpecifiers;
192
+ for (const stmt of sf.statements) {
193
+ if (ts.isImportDeclaration(stmt) &&
194
+ ts.isStringLiteral(stmt.moduleSpecifier) &&
195
+ stmt.moduleSpecifier.text === moduleName &&
196
+ stmt.importClause?.namedBindings != null &&
197
+ ts.isNamedImports(stmt.importClause.namedBindings) &&
198
+ stmt.importClause.namedBindings.elements.length > 0) {
199
+ importSpecifiers = stmt.importClause.namedBindings.elements;
200
+ break;
201
+ }
202
+ }
203
+ if (importSpecifiers == null)
204
+ return { snippet };
205
+ const replaceTarget = replaceExportName != null
206
+ ? importSpecifiers.find((s) => s.name.text === replaceExportName)
207
+ : undefined;
208
+ const importEdit = replaceTarget != null
209
+ ? {
210
+ start: replaceTarget.getStart(sf),
211
+ end: replaceTarget.end,
212
+ text: client.appStructureName,
213
+ }
214
+ : (() => {
215
+ const lastSpecifier = importSpecifiers[importSpecifiers.length - 1];
216
+ return {
217
+ start: lastSpecifier.end,
218
+ end: lastSpecifier.end,
219
+ text: `, ${client.appStructureName}`,
220
+ };
221
+ })();
222
+ //-- ② getFlatPermissions 첫 번째 인자 교체
223
+ let permsArg;
224
+ const visit = (node) => {
225
+ if (permsArg != null)
226
+ return;
227
+ if (ts.isCallExpression(node) &&
228
+ ts.isIdentifier(node.expression) &&
229
+ node.expression.text === "getFlatPermissions" &&
230
+ node.arguments.length > 0) {
231
+ permsArg = node.arguments[0];
232
+ return;
233
+ }
234
+ ts.forEachChild(node, visit);
235
+ };
236
+ visit(sf);
237
+ if (permsArg == null)
238
+ return { snippet };
239
+ return {
240
+ patched: applyEdits(source, [
241
+ importEdit,
242
+ { start: permsArg.getStart(sf), end: permsArg.end, text: combinedExpr },
243
+ ]),
244
+ snippet,
245
+ };
246
+ }
247
+ //# sourceMappingURL=patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../../src/commands/init/patch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAiBxE,SAAS,UAAU,CAAC,MAAc,EAAE,KAAiB;IACnD,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,GAAW;IAC9C,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,OAAO,CAAC,QAAgB,EAAE,MAAc;IAC/C,OAAO,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED,iBAAiB;AAEjB,SAAS,wBAAwB,CAAC,IAAgB,EAAE,MAAkB;IACpE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,IAAgB,EAAE,MAAkB;IAChF,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,KAAK,CAAC;IAEtB,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC3C,IAAI,WAAW,IAAI,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAE5C,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACjF,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrD,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChF,OAAO;KACR,CAAC;AACJ,CAAC;AAED,qBAAqB;AAErB,SAAS,uBAAuB,CAAC,MAAkB;IACjD,OAAO,CACL;QACE,SAAS;QACT,wBAAwB;QACxB,6CAA6C,MAAM,CAAC,IAAI,QAAQ;QAChE,iBAAiB;QACjB,oBAAoB,MAAM,CAAC,IAAI,IAAI;QACnC,oCAAoC,MAAM,CAAC,IAAI,2BAA2B;QAC1E,iCAAiC,MAAM,CAAC,IAAI,qCAAqC;QACjF,sBAAsB;QACtB,qCAAqC;QACrC,4BAA4B;QAC5B,6BAA6B;QAC7B,wCAAwC;QACxC,4FAA4F;QAC5F,cAAc;QACd,YAAY;QACZ,UAAU;KACX,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,MAAkB;IAClE,MAAM,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC;IAEtB,MAAM,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAE/C,IAAI,aAAoD,CAAC;IACzD,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QACpC,IAAI,aAAa,IAAI,IAAI;YAAE,OAAO;QAClC,IACE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAC7B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,UAAU;YACzC,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,EAC7C,CAAC;YACD,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC;YACjC,OAAO;QACT,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,IAAI,aAAa,IAAI,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAE9C,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,WAAW,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzF,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACvD,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChF,OAAO;KACR,CAAC;AACJ,CAAC;AAED,oBAAoB;AAEpB,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,MAAkB;IACrE,MAAM,KAAK,GAAG,uCAAuC,MAAM,CAAC,IAAI,wBAAwB,CAAC;IACzF,MAAM,OAAO,GAAG,KAAK,CAAC;IAEtB,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,WAAW,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,WAAW,CAAC,EAAE,CAAC;QACtE,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CACxE,CAAC;IACF,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,OAAO,GAAG,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAChF,OAAO;SACR,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,cAAc,CAChF,CAAC;IACF,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO;YACL,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAChF,OAAO;SACR,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,gCAAgC;AAEhC,SAAS,sBAAsB,CAAC,IAAgB,EAAE,MAAkB;IAClE,OAAO,gBAAgB,MAAM,CAAC,gBAAgB;;;;;;;;;;iBAU/B,IAAI,CAAC,eAAe,cAAc,IAAI,CAAC,eAAe;;;;;;;;;;;;;CAatE,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,IAAgB,EAAE,MAAkB;IACpF,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAC5D,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,KAAK,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,uCAAuC;AAEvC,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,mBAA6B,EAC7B,IAAgB,EAChB,MAAkB;AAClB,yEAAyE;AACzE,iBAA0B;IAE1B,MAAM,aAAa,GAAG,CAAC,GAAG,mBAAmB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACxE,MAAM,YAAY,GAChB,aAAa,CAAC,MAAM,GAAG,CAAC;QACtB,CAAC,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QACvD,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG;QACd,cAAc,MAAM,CAAC,gBAAgB,eAAe,IAAI,CAAC,aAAa,WAAW;QACjF,iCAAiC,YAAY,OAAO;KACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAE7C,mDAAmD;IACnD,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,aAAa,SAAS,CAAC;IACnD,IAAI,gBAA8D,CAAC;IACnE,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;QACjC,IACE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAC5B,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC;YACxC,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,UAAU;YACxC,IAAI,CAAC,YAAY,EAAE,aAAa,IAAI,IAAI;YACxC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;YAClD,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EACnD,CAAC;YACD,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC;YAC5D,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,gBAAgB,IAAI,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAEjD,MAAM,aAAa,GACjB,iBAAiB,IAAI,IAAI;QACvB,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC;QACjE,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,UAAU,GACd,aAAa,IAAI,IAAI;QACnB,CAAC,CAAC;YACE,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,GAAG,EAAE,aAAa,CAAC,GAAG;YACtB,IAAI,EAAE,MAAM,CAAC,gBAAgB;SAC9B;QACH,CAAC,CAAC,CAAC,GAAG,EAAE;YACJ,MAAM,aAAa,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpE,OAAO;gBACL,KAAK,EAAE,aAAa,CAAC,GAAG;gBACxB,GAAG,EAAE,aAAa,CAAC,GAAG;gBACtB,IAAI,EAAE,KAAK,MAAM,CAAC,gBAAgB,EAAE;aACrC,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IAEX,oCAAoC;IACpC,IAAI,QAAmC,CAAC;IACxC,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QACpC,IAAI,QAAQ,IAAI,IAAI;YAAE,OAAO;QAC7B,IACE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACzB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,oBAAoB;YAC7C,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EACzB,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,IAAI,QAAQ,IAAI,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAEzC,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE;YAC1B,UAAU;YACV,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE;SACxE,CAAC;QACF,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -1,3 +1,8 @@
1
- import type { InitInput } from "./types";
1
+ import type { ClientInputSpec, InitInput } from "./types";
2
2
  export declare function promptInit(workspaceNameDefault: string): Promise<InitInput>;
3
+ /** init client — 신규 클라이언트 질문 (워크스페이스에 capacitor appId 가 없고 mobile 이면 appId 질문 포함) */
4
+ export declare function promptInitClient(hasExistingMobileAppId: boolean): Promise<{
5
+ client: ClientInputSpec;
6
+ mobileAppId?: string;
7
+ }>;
3
8
  //# sourceMappingURL=prompts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/commands/init/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA0C,SAAS,EAAE,MAAM,SAAS,CAAC;AAKjF,wBAAsB,UAAU,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA6IjF"}
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/commands/init/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAyB,SAAS,EAAE,MAAM,SAAS,CAAC;AAKjF,wBAAsB,UAAU,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA8GjF;AAED,qFAAqF;AACrF,wBAAsB,gBAAgB,CACpC,sBAAsB,EAAE,OAAO,GAC9B,OAAO,CAAC;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAS5D"}
@@ -41,7 +41,7 @@ export async function promptInit(workspaceNameDefault) {
41
41
  validate: (v) => /^[A-Za-z][A-Za-z0-9]*$/.test(v) || "영문 (대소문자) + 숫자만, 첫 글자는 영문",
42
42
  });
43
43
  hasAuth = await confirm({
44
- message: "사용자 인증을 사용할까요? (사용자/역할/권한/로그 테이블 부트스트랩)",
44
+ message: "사용자 인증을 사용할까요? (사용자/역할/권한)",
45
45
  default: true,
46
46
  });
47
47
  if (hasAuth) {
@@ -82,39 +82,11 @@ export async function promptInit(workspaceNameDefault) {
82
82
  : await confirm({ message: "다른 client 를 더 추가할까요?", default: false });
83
83
  if (!shouldAdd)
84
84
  break;
85
- const clientName = await input({
86
- message: "client 이름 (예: admin → 자동으로 client-admin):",
87
- validate: (v) => KEBAB_CASE_RE.test(v) || "영문 kebab-case 만 허용됩니다.",
88
- });
89
- const clientType = await select({
90
- message: "client 타입:",
91
- choices: [
92
- { name: "일반 웹", value: "web" },
93
- { name: "모바일 (capacitor)", value: "mobile" },
94
- ],
95
- });
96
- let hasRouter = false;
97
- if (clientType !== "mobile") {
98
- hasRouter = await confirm({
99
- message: `${clientName}: 라우팅 (@angular/router) 을 쓸까요?`,
100
- default: true,
101
- });
102
- }
103
- let useSsg = false;
104
- if (clientType === "web" && hasRouter) {
105
- useSsg = await confirm({
106
- message: `${clientName}: SSG (SEO 용 빌드 타임 프리렌더) 를 쓸까요?`,
107
- default: false,
108
- });
109
- }
110
- clients.push({ name: clientName, type: clientType, hasRouter, useSsg });
85
+ clients.push(await promptClientSpec());
111
86
  }
112
87
  let mobileAppId;
113
88
  if (clients.some((c) => c.type === "mobile")) {
114
- mobileAppId = await input({
115
- message: "capacitor appId (reverse-DNS, 예: kr.co.example.app):",
116
- validate: (v) => APPID_RE.test(v) || "reverse-DNS 형식이어야 합니다.",
117
- });
89
+ mobileAppId = await promptMobileAppId();
118
90
  }
119
91
  return {
120
92
  workspaceName,
@@ -131,4 +103,47 @@ export async function promptInit(workspaceNameDefault) {
131
103
  serverPort,
132
104
  };
133
105
  }
106
+ /** init client — 신규 클라이언트 질문 (워크스페이스에 capacitor appId 가 없고 mobile 이면 appId 질문 포함) */
107
+ export async function promptInitClient(hasExistingMobileAppId) {
108
+ const client = await promptClientSpec();
109
+ let mobileAppId;
110
+ if (client.type === "mobile" && !hasExistingMobileAppId) {
111
+ mobileAppId = await promptMobileAppId();
112
+ }
113
+ return { client, mobileAppId };
114
+ }
115
+ async function promptClientSpec() {
116
+ const clientName = await input({
117
+ message: "client 이름 (예: admin → 자동으로 client-admin):",
118
+ validate: (v) => KEBAB_CASE_RE.test(v) || "영문 kebab-case 만 허용됩니다.",
119
+ });
120
+ const clientType = await select({
121
+ message: "client 타입:",
122
+ choices: [
123
+ { name: "일반 웹", value: "web" },
124
+ { name: "모바일 (capacitor)", value: "mobile" },
125
+ ],
126
+ });
127
+ let hasRouter = false;
128
+ if (clientType !== "mobile") {
129
+ hasRouter = await confirm({
130
+ message: `${clientName}: 라우팅 (@angular/router) 을 쓸까요?`,
131
+ default: true,
132
+ });
133
+ }
134
+ let useSsg = false;
135
+ if (clientType === "web" && hasRouter) {
136
+ useSsg = await confirm({
137
+ message: `${clientName}: SSG (SEO 용 빌드 타임 프리렌더) 를 쓸까요?`,
138
+ default: false,
139
+ });
140
+ }
141
+ return { name: clientName, type: clientType, hasRouter, useSsg };
142
+ }
143
+ async function promptMobileAppId() {
144
+ return input({
145
+ message: "capacitor appId (reverse-DNS, 예: kr.co.example.app):",
146
+ validate: (v) => APPID_RE.test(v) || "reverse-DNS 형식이어야 합니다.",
147
+ });
148
+ }
134
149
  //# sourceMappingURL=prompts.js.map