@simplysm/sd-cli 14.0.95 → 14.0.97

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 (99) hide show
  1. package/dist/commands/init/generators/client.d.ts.map +1 -1
  2. package/dist/commands/init/generators/client.js +12 -0
  3. package/dist/commands/init/generators/client.js.map +1 -1
  4. package/dist/commands/init/generators/server.d.ts.map +1 -1
  5. package/dist/commands/init/generators/server.js +1 -0
  6. package/dist/commands/init/generators/server.js.map +1 -1
  7. package/dist/commands/init/normalize.d.ts.map +1 -1
  8. package/dist/commands/init/normalize.js +1 -0
  9. package/dist/commands/init/normalize.js.map +1 -1
  10. package/dist/commands/init/prompts.d.ts.map +1 -1
  11. package/dist/commands/init/prompts.js +8 -1
  12. package/dist/commands/init/prompts.js.map +1 -1
  13. package/dist/commands/init/types.d.ts +3 -0
  14. package/dist/commands/init/types.d.ts.map +1 -1
  15. package/dist/engines/EsbuildClientEngine.d.ts.map +1 -1
  16. package/dist/engines/EsbuildClientEngine.js +1 -0
  17. package/dist/engines/EsbuildClientEngine.js.map +1 -1
  18. package/dist/esbuild/esbuild-client-config.d.ts.map +1 -1
  19. package/dist/esbuild/esbuild-client-config.js +2 -11
  20. package/dist/esbuild/esbuild-client-config.js.map +1 -1
  21. package/dist/esbuild/esbuild-postcss-plugin.d.ts +4 -0
  22. package/dist/esbuild/esbuild-postcss-plugin.d.ts.map +1 -1
  23. package/dist/esbuild/esbuild-postcss-plugin.js +15 -0
  24. package/dist/esbuild/esbuild-postcss-plugin.js.map +1 -1
  25. package/dist/esbuild/esbuild-ssr-config.d.ts +27 -0
  26. package/dist/esbuild/esbuild-ssr-config.d.ts.map +1 -0
  27. package/dist/esbuild/esbuild-ssr-config.js +113 -0
  28. package/dist/esbuild/esbuild-ssr-config.js.map +1 -0
  29. package/dist/sd-config.types.d.ts +7 -0
  30. package/dist/sd-config.types.d.ts.map +1 -1
  31. package/dist/ssg/prerender.d.ts +19 -0
  32. package/dist/ssg/prerender.d.ts.map +1 -0
  33. package/dist/ssg/prerender.js +43 -0
  34. package/dist/ssg/prerender.js.map +1 -0
  35. package/dist/workers/client.worker.d.ts +2 -0
  36. package/dist/workers/client.worker.d.ts.map +1 -1
  37. package/dist/workers/client.worker.js +21 -0
  38. package/dist/workers/client.worker.js.map +1 -1
  39. package/package.json +6 -6
  40. package/src/commands/init/generators/client.ts +53 -0
  41. package/src/commands/init/generators/server.ts +5 -0
  42. package/src/commands/init/normalize.ts +1 -0
  43. package/src/commands/init/prompts.ts +9 -1
  44. package/src/commands/init/templates/client/package.json.hbs +2 -1
  45. package/src/commands/init/templates/client/src/app/home/home.view.ts.hbs +1 -1
  46. package/src/commands/init/templates/client/src/app/home/master/role-permission/role-permission.detail.ts.hbs +221 -0
  47. package/src/commands/init/templates/client/src/app/home/master/role-permission/role-permission.view.ts.hbs +106 -0
  48. package/src/commands/init/templates/client/src/app/home/master/role-permission/role.detail.ts.hbs +277 -0
  49. package/src/commands/init/templates/client/src/app/home/master/role-permission/role.list.ts.hbs +537 -0
  50. package/src/commands/init/templates/client/src/app/home/master/user.detail.ts.hbs +337 -0
  51. package/src/commands/init/templates/client/src/app/home/master/user.list.ts.hbs +540 -0
  52. package/src/commands/init/templates/client/src/app/home/my-info/my-info.detail.ts.hbs +4 -6
  53. package/src/commands/init/templates/client/src/app/home/system/data-log/data-log.list.ts.hbs +355 -0
  54. package/src/commands/init/templates/client/src/app/home/system/system-log/system-log.list.ts.hbs +382 -0
  55. package/src/commands/init/templates/client/src/app/login/login.view.ts.hbs +3 -4
  56. package/src/commands/init/templates/client/src/app.root.ts.hbs +9 -3
  57. package/src/commands/init/templates/client/src/index.html.hbs +1 -0
  58. package/src/commands/init/templates/client/src/main.server.ts.hbs +24 -0
  59. package/src/commands/init/templates/client/src/main.ts.hbs +36 -18
  60. package/src/commands/init/templates/client/src/modals/text-view.modal.ts.hbs +30 -0
  61. package/src/commands/init/templates/client/src/routes.ts.hbs +22 -0
  62. package/src/commands/init/templates/client-common/src/index.ts.hbs +6 -4
  63. package/src/commands/init/templates/client-common/src/providers/app-auth.provider.ts.hbs +3 -3
  64. package/src/commands/init/templates/client-common/src/providers/app-orm.provider.ts.hbs +0 -11
  65. package/src/commands/init/templates/client-common/src/providers/app-service.provider.ts.hbs +24 -10
  66. package/src/commands/init/templates/client-common/src/providers/app-shared-data.provider.ts.hbs +2 -2
  67. package/src/commands/init/templates/common/package.json.hbs +2 -1
  68. package/src/commands/init/templates/common/src/app-structure.ts.hbs +7 -2
  69. package/src/commands/init/templates/common/src/auth-info-changed.event.ts.hbs +3 -1
  70. package/src/commands/init/templates/common/src/db/db-context.ts.hbs +2 -2
  71. package/src/commands/init/templates/common/src/db/tables/master/user.ts.hbs +2 -2
  72. package/src/commands/init/templates/common/src/db/tables/system/role.ts.hbs +1 -0
  73. package/src/commands/init/templates/common/src/index.ts.hbs +1 -1
  74. package/src/commands/init/templates/server/src/index.ts.hbs +3 -0
  75. package/src/commands/init/templates/server/src/main.ts.hbs +15 -1
  76. package/src/commands/init/templates/server/src/services/auth.service.ts.hbs +28 -22
  77. package/src/commands/init/templates/server/src/services/dev.service.ts.hbs +5 -5
  78. package/src/commands/init/templates/server/src/services/user.service.ts.hbs +191 -0
  79. package/src/commands/init/templates/workspace-root/sd.config.ts.hbs +3 -0
  80. package/src/commands/init/types.ts +3 -0
  81. package/src/engines/EsbuildClientEngine.ts +1 -0
  82. package/src/esbuild/esbuild-client-config.ts +2 -12
  83. package/src/esbuild/esbuild-postcss-plugin.ts +18 -0
  84. package/src/esbuild/esbuild-ssr-config.ts +149 -0
  85. package/src/sd-config.types.ts +7 -0
  86. package/src/ssg/prerender.ts +65 -0
  87. package/src/workers/client.worker.ts +26 -0
  88. package/tests/engines/base-engine.spec.ts +1 -26
  89. package/tests/init/__snapshots__/render.spec.ts.snap +38 -20
  90. package/tests/init/render.spec.ts +113 -33
  91. package/tests/utils/hmr-client-script.acc.spec.ts +0 -21
  92. package/tests/angular/vite-angular-plugin.spec.ts +0 -102
  93. package/tests/engines/engine-adapter-isolation.spec.ts +0 -79
  94. package/tests/runtime/signal-handler.spec.ts +0 -21
  95. package/tests/utils/angular-build.spec.ts +0 -109
  96. package/tests/utils/esbuild-client-config.acc.spec.ts +0 -438
  97. package/tests/utils/esbuild-client-config.spec.ts +0 -659
  98. package/tests/utils/hmr-client-script.spec.ts +0 -44
  99. package/tests/utils/tsconfig-angular.spec.ts +0 -9
@@ -0,0 +1,43 @@
1
+ import fs from "node:fs";
2
+ import path from "path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { createLogger } from "@simplysm/core-common";
5
+ const logger = createLogger("sd:cli:ssg:prerender");
6
+ /**
7
+ * server 번들로 라우트별 HTML을 생성해 outdir에 기록한다.
8
+ *
9
+ * 라우트 1건이라도 실패하면 throw (빌드 전체 실패 — 부분 산출 금지).
10
+ */
11
+ export async function prerenderRoutes(options) {
12
+ const bundleModule = (await import(pathToFileURL(options.bundlePath).href));
13
+ // 1. 전체 라우트 렌더 (전부 성공해야 기록 단계로 진행)
14
+ const rendered = [];
15
+ for (const route of options.routes) {
16
+ const normalizedRoute = normalizeRoute(route);
17
+ const url = path.posix.join(options.basePath, normalizedRoute);
18
+ logger.debug(`프리렌더: ${url}`);
19
+ try {
20
+ const html = await bundleModule.render(url, options.documentHtml);
21
+ rendered.push({ route: normalizedRoute, html });
22
+ }
23
+ catch (err) {
24
+ throw new Error(`프리렌더 실패 (라우트: ${route}): ${err instanceof Error ? err.message : String(err)}`, {
25
+ cause: err,
26
+ });
27
+ }
28
+ }
29
+ // 2. 라우트별 <경로>/index.html 기록 ("/"는 index.html)
30
+ for (const { route, html } of rendered) {
31
+ const htmlPath = path.join(options.outdir, route, "index.html");
32
+ fs.mkdirSync(path.dirname(htmlPath), { recursive: true });
33
+ fs.writeFileSync(htmlPath, html);
34
+ }
35
+ }
36
+ /** 라우트 경로 정규화: 선행 "/" 제거 ("/" → "") */
37
+ function normalizeRoute(route) {
38
+ if (!route.startsWith("/")) {
39
+ throw new Error(`프리렌더 라우트는 "/"로 시작해야 합니다: "${route}"`);
40
+ }
41
+ return route.replace(/^\/+/, "").replace(/\/+$/, "");
42
+ }
43
+ //# sourceMappingURL=prerender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerender.js","sourceRoot":"","sources":["../../src/ssg/prerender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,MAAM,GAAG,YAAY,CAAC,sBAAsB,CAAC,CAAC;AAmBpD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAyB;IAC7D,MAAM,YAAY,GAAG,CAAC,MAAM,MAAM,CAChC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CACvC,CAAoB,CAAC;IAEtB,mCAAmC;IACnC,MAAM,QAAQ,GAAsC,EAAE,CAAC;IACvD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;gBAC9F,KAAK,EAAE,GAAG;aACX,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QAChE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,GAAG,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC"}
@@ -18,6 +18,8 @@ export interface ClientBuildInfo {
18
18
  base?: string;
19
19
  /** 브라우저 지원 설정 (메인 프로세스에서 전달, Worker 내 sd.config.ts 재로드 방지) */
20
20
  browserSupport?: SdBrowserSupportConfig;
21
+ /** SSG(빌드 타임 프리렌더) 라우트 목록. 지정 시 프로덕션 빌드에서만 적용 */
22
+ prerender?: string[];
21
23
  }
22
24
  /** Client 빌드 결과 */
23
25
  export interface ClientBuildResult {
@@ -1 +1 @@
1
- {"version":3,"file":"client.worker.d.ts","sourceRoot":"","sources":["../../src/workers/client.worker.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAO9E,sBAAsB;AACtB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,2CAA2C;IAC3C,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,CAAC;IAC1B,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,cAAc,CAAC,EAAE,sBAAsB,CAAC;CACzC;AAED,mBAAmB;AACnB,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,oBAAoB;AACpB,MAAM,WAAW,kBAAmB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,KAAK,EAAE,iBAAiB,CAAC;IACzB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B;AAqCD;;GAEG;AACH,iBAAe,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2FtE;AAyHD;;GAEG;AACH,iBAAe,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2G3E;AAED;;GAEG;AACH,iBAAe,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCxC;AAcD,QAAA,MAAM,MAAM;;;eAED,OAAO,KAAK;oBACP,OAAO,UAAU;mBAClB,OAAO,SAAS;;;CAGI,CAAC;AAEpC,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"client.worker.d.ts","sourceRoot":"","sources":["../../src/workers/client.worker.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAO9E,sBAAsB;AACtB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,2CAA2C;IAC3C,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,CAAC;IAC1B,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,mBAAmB;AACnB,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,oBAAoB;AACpB,MAAM,WAAW,kBAAmB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,KAAK,EAAE,iBAAiB,CAAC;IACzB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B;AAqCD;;GAEG;AACH,iBAAe,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiHtE;AAyHD;;GAEG;AACH,iBAAe,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2G3E;AAED;;GAEG;AACH,iBAAe,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCxC;AAcD,QAAA,MAAM,MAAM;;;eAED,OAAO,KAAK;oBACP,OAAO,UAAU;mBAClB,OAAO,SAAS;;;CAGI,CAAC;AAEpC,eAAe,MAAM,CAAC"}
@@ -11,6 +11,8 @@ import { createDevHttpServer } from "../dev-server/dev-http-server.js";
11
11
  import { createHmrService } from "../dev-server/hmr-service.js";
12
12
  import { createHmrPostTransform } from "../dev-server/hmr-client-script.js";
13
13
  import { copyPublicFiles, watchPublicFiles } from "../utils/copy-public.js";
14
+ import { buildSsrBundle } from "../esbuild/esbuild-ssr-config.js";
15
+ import { prerenderRoutes } from "../ssg/prerender.js";
14
16
  import { IncrementalMtimeTracker } from "./incremental-mtime-tracker.js";
15
17
  //#endregion
16
18
  //#region Worker
@@ -80,6 +82,25 @@ async function build(info) {
80
82
  postTransform: pwaHtmlTransform,
81
83
  });
82
84
  fs.writeFileSync(path.join(outdir, "index.html"), indexResult.content);
85
+ // 5.5. SSG 프리렌더 (opt-in — prerender 설정이 있을 때만)
86
+ if (info.prerender != null && info.prerender.length > 0 && indexResult.errors.length === 0) {
87
+ // SPA 셸 별도 보존 (비프리렌더 라우트 딥링크 폴백용 — 서버 정적 핸들러가 사용)
88
+ fs.writeFileSync(path.join(outdir, "index.csr.html"), indexResult.content);
89
+ const { bundlePath } = await buildSsrBundle({
90
+ pkgDir: info.pkgDir,
91
+ cwd: info.cwd,
92
+ env: info.env,
93
+ postcssPlugins: info.browserSupport?.postCss?.plugins,
94
+ });
95
+ // 라우트별 HTML 생성 ("/"는 index.html을 프리렌더 결과로 대체)
96
+ await prerenderRoutes({
97
+ bundlePath,
98
+ routes: info.prerender,
99
+ documentHtml: indexResult.content,
100
+ basePath,
101
+ outdir,
102
+ });
103
+ }
83
104
  // 6. PWA 적용
84
105
  await applyPwa({
85
106
  pkgDir: info.pkgDir,
@@ -1 +1 @@
1
- {"version":3,"file":"client.worker.js","sourceRoot":"","sources":["../../src/workers/client.worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.worker.js","sourceRoot":"","sources":["../../src/workers/client.worker.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.95",
3
+ "version": "14.0.97",
4
4
  "description": "Simplysm package - CLI tool",
5
5
  "author": "simplysm",
6
6
  "license": "Apache-2.0",
@@ -20,7 +20,7 @@
20
20
  "sideEffects": false,
21
21
  "dependencies": {
22
22
  "@angular/build": "^21.2.14",
23
- "@angular/compiler-cli": "^21.2.16",
23
+ "@angular/compiler-cli": "^21.2.17",
24
24
  "@fastify/http-proxy": "^11.5.0",
25
25
  "@inquirer/prompts": "^8.5.2",
26
26
  "acorn": "^8.16.0",
@@ -37,7 +37,7 @@
37
37
  "mime": "^4.1.0",
38
38
  "postcss": "^8.5.15",
39
39
  "sass": "^1.100.0",
40
- "semver": "^7.8.2",
40
+ "semver": "^7.8.4",
41
41
  "sharp": "^0.34.5",
42
42
  "smol-toml": "^1.6.1",
43
43
  "ssh2": "^1.17.0",
@@ -45,9 +45,9 @@
45
45
  "ws": "^8.21.0",
46
46
  "yaml": "^2.9.0",
47
47
  "yargs": "^18.0.0",
48
- "@simplysm/core-common": "14.0.95",
49
- "@simplysm/core-node": "14.0.95",
50
- "@simplysm/storage": "14.0.95"
48
+ "@simplysm/core-node": "14.0.97",
49
+ "@simplysm/core-common": "14.0.97",
50
+ "@simplysm/storage": "14.0.97"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/semver": "^7.7.1",
@@ -39,6 +39,14 @@ export async function generateClient(
39
39
  await renderToFile(path.join(TPL, "src/routes.ts.hbs"), path.join(out, "src/routes.ts"), data);
40
40
  }
41
41
 
42
+ if (client.useSsg) {
43
+ await renderToFile(
44
+ path.join(TPL, "src/main.server.ts.hbs"),
45
+ path.join(out, "src/main.server.ts"),
46
+ data,
47
+ );
48
+ }
49
+
42
50
  if (data.hasAuth && client.hasRouter) {
43
51
  await renderToFile(
44
52
  path.join(TPL, "src/app/login/login.view.ts.hbs"),
@@ -60,6 +68,51 @@ export async function generateClient(
60
68
  path.join(out, "src/app/home/my-info/my-info.detail.ts"),
61
69
  data,
62
70
  );
71
+ await renderToFile(
72
+ path.join(TPL, "src/app/home/master/user.list.ts.hbs"),
73
+ path.join(out, `src/app/home/master/${data.userEntityKebab}/${data.userEntityKebab}.list.ts`),
74
+ data,
75
+ );
76
+ await renderToFile(
77
+ path.join(TPL, "src/app/home/master/user.detail.ts.hbs"),
78
+ path.join(out, `src/app/home/master/${data.userEntityKebab}/${data.userEntityKebab}.detail.ts`),
79
+ data,
80
+ );
81
+ await renderToFile(
82
+ path.join(TPL, "src/app/home/master/role-permission/role.list.ts.hbs"),
83
+ path.join(out, "src/app/home/master/role-permission/role.list.ts"),
84
+ data,
85
+ );
86
+ await renderToFile(
87
+ path.join(TPL, "src/app/home/master/role-permission/role.detail.ts.hbs"),
88
+ path.join(out, "src/app/home/master/role-permission/role.detail.ts"),
89
+ data,
90
+ );
91
+ await renderToFile(
92
+ path.join(TPL, "src/app/home/master/role-permission/role-permission.view.ts.hbs"),
93
+ path.join(out, "src/app/home/master/role-permission/role-permission.view.ts"),
94
+ data,
95
+ );
96
+ await renderToFile(
97
+ path.join(TPL, "src/app/home/master/role-permission/role-permission.detail.ts.hbs"),
98
+ path.join(out, "src/app/home/master/role-permission/role-permission.detail.ts"),
99
+ data,
100
+ );
101
+ await renderToFile(
102
+ path.join(TPL, "src/app/home/system/data-log/data-log.list.ts.hbs"),
103
+ path.join(out, "src/app/home/system/data-log/data-log.list.ts"),
104
+ data,
105
+ );
106
+ await renderToFile(
107
+ path.join(TPL, "src/app/home/system/system-log/system-log.list.ts.hbs"),
108
+ path.join(out, "src/app/home/system/system-log/system-log.list.ts"),
109
+ data,
110
+ );
111
+ await renderToFile(
112
+ path.join(TPL, "src/modals/text-view.modal.ts.hbs"),
113
+ path.join(out, "src/modals/text-view.modal.ts"),
114
+ data,
115
+ );
63
116
  await copyFixed(
64
117
  path.join(TPL, "login-public/assets/logo.png"),
65
118
  path.join(out, "public/assets/logo.png"),
@@ -37,6 +37,11 @@ export async function generateServer(cwd: string, data: RenderData): Promise<voi
37
37
  path.join(out, "src/services/auth.service.ts"),
38
38
  data,
39
39
  );
40
+ await renderToFile(
41
+ path.join(TPL, "src/services/user.service.ts.hbs"),
42
+ path.join(out, `src/services/${data.userEntityKebab}.service.ts`),
43
+ data,
44
+ );
40
45
  await copyFixed(
41
46
  path.join(TPL, "public-dev/초기화.xlsx"),
42
47
  path.join(out, "public-dev/초기화.xlsx"),
@@ -57,6 +57,7 @@ export function normalize(input: InitInput): NormalizedInput {
57
57
  isMobile,
58
58
  appStructureName: `${str.toCamelCase(baseName)}AppStructureItems`,
59
59
  needsNgIcons: (hasRouter && hasAuth) || hasDb,
60
+ useSsg: hasRouter && !isMobile && (c.useSsg ?? false),
60
61
  };
61
62
  });
62
63
 
@@ -112,7 +112,15 @@ export async function promptInit(workspaceNameDefault: string): Promise<InitInpu
112
112
  });
113
113
  }
114
114
 
115
- clients.push({ name: clientName, type: clientType, hasRouter });
115
+ let useSsg = false;
116
+ if (clientType === "web" && hasRouter) {
117
+ useSsg = await confirm({
118
+ message: `${clientName}: SSG (SEO 용 빌드 타임 프리렌더) 를 쓸까요?`,
119
+ default: false,
120
+ });
121
+ }
122
+
123
+ clients.push({ name: clientName, type: clientType, hasRouter, useSsg });
116
124
  }
117
125
 
118
126
  let mobileAppId: string | undefined;
@@ -15,7 +15,8 @@
15
15
  "@{{workspaceName}}/client-common": "workspace:*"{{/if}}{{#if hasServer}},
16
16
  "@simplysm/service-client": "^14.0.0",
17
17
  "@simplysm/service-common": "^14.0.0"{{/if}}{{#if client.hasRouter}},
18
- "@angular/router": "^21.2.0"{{/if}}{{#if client.needsNgIcons}},
18
+ "@angular/router": "^21.2.0"{{/if}}{{#if client.useSsg}},
19
+ "@angular/platform-server": "^21.2.0"{{/if}}{{#if client.needsNgIcons}},
19
20
  "@ng-icons/core": "^33.2.3",
20
21
  "@ng-icons/tabler-icons": "^33.2.3"{{/if}}{{#if hasDb}},
21
22
  "@{{workspaceName}}/common": "workspace:*",
@@ -46,7 +46,7 @@ import { tablerUserCircle } from "@ng-icons/tabler-icons";
46
46
  <sd-sidebar class="flex-column">
47
47
  <div>
48
48
  <div
49
- class="p-default-xl sh-topbar"
49
+ class="p-sm-lg sh-topbar"
50
50
  style="cursor: pointer;"
51
51
  [sdRouterLink]="{ link: '/home/main' }"
52
52
  >
@@ -0,0 +1,221 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ computed,
5
+ effect,
6
+ inject,
7
+ input,
8
+ signal,
9
+ untracked,
10
+ ViewEncapsulation,
11
+ } from "@angular/core";
12
+ import { json, obj } from "@simplysm/core-common";
13
+ import {
14
+ injectPermsSignal,
15
+ injectViewTypeSignal,
16
+ SdAppStructureProvider,
17
+ SdButton,
18
+ SdCrudDetail,
19
+ SdItemOfTemplate,
20
+ SdPermissionTable,
21
+ SdSharedDataSelect,
22
+ SdToastProvider,
23
+ } from "@simplysm/angular";
24
+ import { expr } from "@simplysm/orm-common";
25
+ import {
26
+ AppAuthProvider,
27
+ AppOrmProvider,
28
+ AppServiceProvider,
29
+ useSharedSignal,
30
+ } from "@{{workspaceName}}/client-common";
31
+ import { RoleList } from "./role.list";
32
+
33
+ @Component({
34
+ selector: "app-role-permission-detail",
35
+ changeDetection: ChangeDetectionStrategy.OnPush,
36
+ encapsulation: ViewEncapsulation.None,
37
+ standalone: true,
38
+ imports: [SdCrudDetail, SdPermissionTable, SdSharedDataSelect, SdItemOfTemplate, SdButton],
39
+ template: `
40
+ <sd-crud-detail
41
+ [(ready)]="ready"
42
+ [initialized]="initialized()"
43
+ [(busyCount)]="busyCount"
44
+ [viewType]="viewType()"
45
+ [restricted]="!perms().includes('use')"
46
+ [readonly]="!perms().includes('edit')"
47
+ (submit)="onSubmit()"
48
+ >
49
+ <ng-template #contentTpl>
50
+ <div class="flex-column">
51
+ @if (perms().includes("edit")) {
52
+ <div class="flex-row gap-sm p-sm-default">
53
+ <sd-shared-data-select
54
+ [size]="'sm'"
55
+ [items]="sharedRoles.items()"
56
+ [(value)]="copySourceRoleId"
57
+ [modal]="{ type: RoleList, title: '역할', inputs: { readonly: true } }"
58
+ >
59
+ <ng-template [itemOf]="sharedRoles.items()" let-item="item">
60
+ \{{ item.name }}
61
+ </ng-template>
62
+ </sd-shared-data-select>
63
+ <sd-button
64
+ [size]="'sm'"
65
+ [inline]="true"
66
+ [disabled]="copySourceRoleId() == null"
67
+ (click)="onImport()"
68
+ >
69
+ 가져오기
70
+ </sd-button>
71
+ </div>
72
+ }
73
+ <sd-permission-table
74
+ [items]="permItems()"
75
+ [(value)]="data"
76
+ [disabled]="!perms().includes('edit')"
77
+ />
78
+ </div>
79
+ </ng-template>
80
+ </sd-crud-detail>
81
+ `,
82
+ })
83
+ export class RolePermissionDetail {
84
+ private readonly _sdToast = inject(SdToastProvider);
85
+ private readonly _appOrm = inject(AppOrmProvider);
86
+ private readonly _appService = inject(AppServiceProvider);
87
+ private readonly _appAuth = inject(AppAuthProvider);
88
+ private readonly _sdAppStructure = inject(SdAppStructureProvider);
89
+
90
+ roleId = input.required<number>();
91
+
92
+ perms = injectPermsSignal(["master.role-permission"], ["use", "edit"]);
93
+ viewType = injectViewTypeSignal();
94
+
95
+ ready = signal(false);
96
+ initialized = signal(false);
97
+ busyCount = signal(0);
98
+
99
+ sharedRoles = useSharedSignal("역할");
100
+ copySourceRoleId = signal<number | undefined>(undefined);
101
+
102
+ permItems = computed(() =>
103
+ this._sdAppStructure.getPermissionsByStructure(this._sdAppStructure.items()),
104
+ );
105
+
106
+ data = signal<Record<string, boolean>>({});
107
+ private _orgData?: Record<string, boolean>;
108
+
109
+ constructor() {
110
+ effect(() => {
111
+ this.roleId();
112
+
113
+ if (!this.perms().includes("use") || !this.ready()) {
114
+ this.initialized.set(true);
115
+ return;
116
+ }
117
+
118
+ void untracked(async () => {
119
+ this.busyCount.update((v) => v + 1);
120
+ await this._sdToast.try(async () => {
121
+ await this._refresh();
122
+ });
123
+ this.busyCount.update((v) => v - 1);
124
+ this.initialized.set(true);
125
+ });
126
+ });
127
+ }
128
+
129
+ async onImport(): Promise<void> {
130
+ if (this.busyCount() > 0) return;
131
+ if (!this.perms().includes("edit")) return;
132
+
133
+ const sourceId = this.copySourceRoleId();
134
+ if (sourceId == null) return;
135
+
136
+ this.busyCount.update((v) => v + 1);
137
+ await this._sdToast.try(async () => {
138
+ const record = await this._loadPermissions(sourceId);
139
+ this.data.set(record);
140
+ });
141
+ this.busyCount.update((v) => v - 1);
142
+ }
143
+
144
+ async onSubmit(): Promise<void> {
145
+ if (this.busyCount() > 0) return;
146
+ if (!this.perms().includes("edit")) return;
147
+
148
+ const data = this.data();
149
+ if (this._orgData != null && obj.equal(data, this._orgData)) {
150
+ this._sdToast.info("변경사항이 없습니다.");
151
+ return;
152
+ }
153
+
154
+ this.busyCount.update((v) => v + 1);
155
+ await this._sdToast.try(async () => {
156
+ const roleId = this.roleId();
157
+ const {{userEntityCamel}}Id = this._appAuth.authInfo()?.{{userEntityCamel}}Id;
158
+
159
+ // 권한 동기화: 기존 전체 삭제 후 부여된 권한만 재적재
160
+ await this._appOrm.connectAsync(async (db) => {
161
+ await db
162
+ .rolePermission()
163
+ .where((c) => [expr.eq(c.roleId, roleId)])
164
+ .delete();
165
+
166
+ const entries = Object.entries(data).filter(([, v]) => v);
167
+ if (entries.length > 0) {
168
+ await db.rolePermission().insert(
169
+ entries.map(([code, value]) => ({
170
+ roleId,
171
+ code,
172
+ valueJson: json.stringify(value),
173
+ })),
174
+ );
175
+ }
176
+
177
+ // 권한 집합 변경 이력은 부모 Role 모델에 단일 적재 (itemId=roleId)
178
+ await db.role().insertDataLog({ action: "수정(권한)", itemId: roleId, {{userEntityCamel}}Id });
179
+ });
180
+
181
+ // 해당 역할 세션에 인증정보 변경 통지 → 권한 재로드 (roleId 로 직접 타겟, {{userEntityLabel}} 조회 불필요)
182
+ await this._appService.authInfoChangedEvent.emit((info) => info.roleId === roleId, undefined);
183
+
184
+ this._sdToast.success("저장되었습니다.");
185
+ await this._refresh();
186
+ });
187
+ this.busyCount.update((v) => v - 1);
188
+ }
189
+
190
+ checkIgnoreChanges(): boolean {
191
+ return (
192
+ this._orgData == null ||
193
+ obj.equal(this.data(), this._orgData) ||
194
+ confirm("변경사항이 있습니다. 무시하고 진행하시겠습니까?")
195
+ );
196
+ }
197
+
198
+ private async _refresh(): Promise<void> {
199
+ const record = await this._loadPermissions(this.roleId());
200
+ this.data.set(record);
201
+ this._orgData = obj.clone(record);
202
+ }
203
+
204
+ private async _loadPermissions(roleId: number): Promise<Record<string, boolean>> {
205
+ return this._appOrm.connectAsync(async (db) => {
206
+ const rows = await db
207
+ .rolePermission()
208
+ .where((c) => [expr.eq(c.roleId, roleId)])
209
+ .select((c) => ({ code: c.code, valueJson: c.valueJson }))
210
+ .execute();
211
+
212
+ const record: Record<string, boolean> = {};
213
+ for (const row of rows) {
214
+ record[row.code] = json.parse(row.valueJson);
215
+ }
216
+ return record;
217
+ });
218
+ }
219
+
220
+ protected readonly RoleList = RoleList;
221
+ }
@@ -0,0 +1,106 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ effect,
5
+ signal,
6
+ untracked,
7
+ viewChild,
8
+ ViewEncapsulation,
9
+ } from "@angular/core";
10
+ import {
11
+ injectViewTypeSignal,
12
+ SdBaseContainer,
13
+ SdItemOfTemplate,
14
+ SdSharedDataSelectList,
15
+ setupCanDeactivate,
16
+ } from "@simplysm/angular";
17
+ import { NgIcon } from "@ng-icons/core";
18
+ import { tablerArrowLeft } from "@ng-icons/tabler-icons";
19
+ import { type ISharedRole, useSharedSignal } from "@{{workspaceName}}/client-common";
20
+ import { RolePermissionDetail } from "./role-permission.detail";
21
+ import { RoleList } from "./role.list";
22
+
23
+ @Component({
24
+ selector: "app-role-permission-view",
25
+ changeDetection: ChangeDetectionStrategy.OnPush,
26
+ encapsulation: ViewEncapsulation.None,
27
+ standalone: true,
28
+ imports: [
29
+ SdBaseContainer,
30
+ SdSharedDataSelectList,
31
+ SdItemOfTemplate,
32
+ RolePermissionDetail,
33
+ NgIcon,
34
+ ],
35
+ template: `
36
+ <sd-base-container
37
+ [(ready)]="ready"
38
+ [initialized]="initialized()"
39
+ [(busyCount)]="busyCount"
40
+ [viewType]="viewType()"
41
+ >
42
+ <ng-template #contentTpl>
43
+ <div class="flex-row fill">
44
+ <!-- min-width: 좌측 역할 목록이 너무 좁아져 가독성이 떨어지는 것을 막는 의도적 고정 폭 (사용자 지시) -->
45
+ <sd-shared-data-select-list
46
+ class="flex-min bdr bdr-color-lighter"
47
+ style="min-width: 12rem;"
48
+ [items]="sharedRoles.items()"
49
+ [(selectedItem)]="selectedRole"
50
+ [canChangeFn]="checkCanLeave"
51
+ [header]="'역할'"
52
+ [modal]="{ type: RoleList, title: '역할', inputs: {} }"
53
+ >
54
+ <ng-template [itemOf]="sharedRoles.items()" let-item="item">
55
+ \{{ item.name }}
56
+ </ng-template>
57
+ </sd-shared-data-select-list>
58
+
59
+ @let _selectedRole = selectedRole();
60
+ @if (_selectedRole == null) {
61
+ <div
62
+ class="flex-fill tx-theme-gray-default p-xxl"
63
+ style="font-size: 48px; line-height: 1.5em"
64
+ >
65
+ <ng-icon [svg]="tablerArrowLeft" />
66
+ 역할을 선택하세요.
67
+ </div>
68
+ } @else {
69
+ <app-role-permission-detail class="flex-fill" [roleId]="_selectedRole.id" />
70
+ }
71
+ </div>
72
+ </ng-template>
73
+ </sd-base-container>
74
+ `,
75
+ })
76
+ export class RolePermissionView {
77
+ viewType = injectViewTypeSignal();
78
+
79
+ ready = signal(false);
80
+ initialized = signal(false);
81
+ busyCount = signal(0);
82
+
83
+ sharedRoles = useSharedSignal("역할");
84
+ selectedRole = signal<ISharedRole | undefined>(undefined);
85
+
86
+ detail = viewChild(RolePermissionDetail);
87
+
88
+ // 미저장 권한 변경 보호: 페이지 이탈·역할 전환 전에 자식 detail 의 변경 가드 확인
89
+ protected readonly checkCanLeave = (): boolean => {
90
+ const detail = this.detail();
91
+ return detail == null || detail.checkIgnoreChanges();
92
+ };
93
+
94
+ constructor() {
95
+ effect(() => {
96
+ if (this.ready()) {
97
+ untracked(() => this.initialized.set(true));
98
+ }
99
+ });
100
+
101
+ setupCanDeactivate(this.checkCanLeave);
102
+ }
103
+
104
+ protected readonly RoleList = RoleList;
105
+ protected readonly tablerArrowLeft = tablerArrowLeft;
106
+ }