@simplysm/sd-cli 13.0.71 → 13.0.72

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 (98) hide show
  1. package/dist/commands/init.d.ts +4 -5
  2. package/dist/commands/init.d.ts.map +1 -1
  3. package/dist/commands/init.js +26 -8
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/sd-cli-entry.d.ts.map +1 -1
  6. package/dist/sd-cli-entry.js +0 -20
  7. package/dist/sd-cli-entry.js.map +1 -1
  8. package/package.json +4 -4
  9. package/src/commands/init.ts +40 -21
  10. package/src/sd-cli-entry.ts +0 -24
  11. package/templates/init/{.prettierrc.yaml.hbs → .prettierrc.yaml} +1 -1
  12. package/templates/init/eslint.config.ts +15 -0
  13. package/templates/init/mise.toml +3 -0
  14. package/templates/init/package.json.hbs +8 -7
  15. package/templates/init/packages/client-admin/index.html.hbs +144 -0
  16. package/templates/init/packages/client-admin/package.json.hbs +26 -0
  17. package/templates/init/packages/client-admin/public/assets/logo-landscape.png +0 -0
  18. package/templates/init/packages/client-admin/public/assets/logo.png +0 -0
  19. package/templates/init/packages/client-admin/src/App.tsx +42 -0
  20. package/templates/init/packages/client-admin/src/dev/DevDialog.tsx +34 -0
  21. package/templates/{add-client/__CLIENT__/src/main.css.hbs → init/packages/client-admin/src/main.css} +1 -1
  22. package/templates/init/packages/client-admin/src/main.tsx.hbs +146 -0
  23. package/templates/init/packages/client-admin/src/providers/AppServiceProvider.tsx.hbs +103 -0
  24. package/templates/init/packages/client-admin/src/providers/AppStructureProvider.tsx +84 -0
  25. package/templates/init/packages/client-admin/src/providers/AuthProvider.tsx.hbs +71 -0
  26. package/templates/init/packages/client-admin/src/providers/configureSharedData.ts.hbs +67 -0
  27. package/templates/init/packages/client-admin/src/views/auth/LoginView.tsx +132 -0
  28. package/templates/init/packages/client-admin/src/views/home/HomeView.tsx +108 -0
  29. package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeDetail.tsx.hbs +262 -0
  30. package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeSheet.tsx.hbs +271 -0
  31. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleDetail.tsx.hbs +154 -0
  32. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionDetail.tsx.hbs +123 -0
  33. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionView.tsx +52 -0
  34. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleSheet.tsx.hbs +125 -0
  35. package/templates/init/packages/client-admin/src/views/home/main/MainView.tsx.hbs +13 -0
  36. package/templates/init/packages/client-admin/src/views/home/my-info/MyInfoDetail.tsx.hbs +248 -0
  37. package/templates/init/packages/client-admin/src/views/home/system/system-log/SystemLogSheet.tsx.hbs +169 -0
  38. package/templates/init/packages/client-admin/src/views/not-found/NotFoundView.tsx +15 -0
  39. package/templates/init/packages/client-admin/tailwind.config.ts +10 -0
  40. package/templates/init/packages/db-main/package.json.hbs +13 -0
  41. package/templates/init/packages/db-main/src/MainDbContext.ts +20 -0
  42. package/templates/init/packages/db-main/src/dataLogExt.ts +127 -0
  43. package/templates/init/packages/db-main/src/index.ts +10 -0
  44. package/templates/init/packages/db-main/src/tables/Employee.ts +24 -0
  45. package/templates/init/packages/db-main/src/tables/EmployeeConfig.ts +13 -0
  46. package/templates/init/packages/db-main/src/tables/Role.ts +9 -0
  47. package/templates/init/packages/db-main/src/tables/RolePermission.ts +13 -0
  48. package/templates/init/packages/db-main/src/tables/_DataLog.ts +19 -0
  49. package/templates/init/packages/db-main/src/tables/_Log.ts +16 -0
  50. package/templates/init/packages/server/package.json.hbs +20 -0
  51. package/templates/init/packages/server/public-dev/dev//354/264/210/352/270/260/355/231/224.xlsx +0 -0
  52. package/templates/init/packages/server/src/index.ts +4 -0
  53. package/templates/init/packages/server/src/main.ts.hbs +34 -0
  54. package/templates/init/packages/server/src/services/AuthService.ts.hbs +171 -0
  55. package/templates/init/packages/server/src/services/DevService.ts.hbs +94 -0
  56. package/templates/init/packages/server/src/services/EmployeeService.ts.hbs +122 -0
  57. package/templates/init/packages/server/src/services/RoleService.ts.hbs +59 -0
  58. package/templates/init/{pnpm-workspace.yaml.hbs → pnpm-workspace.yaml} +3 -1
  59. package/templates/init/sd.config.ts.hbs +30 -1
  60. package/templates/init/tests/e2e/package.json.hbs +16 -0
  61. package/templates/init/tests/e2e/src/e2e.spec.ts +36 -0
  62. package/templates/init/tests/e2e/src/employee-crud.ts +204 -0
  63. package/templates/init/tests/e2e/src/login.ts +61 -0
  64. package/templates/init/tests/e2e/vitest.setup.ts.hbs +220 -0
  65. package/templates/init/tsconfig.json.hbs +0 -11
  66. package/templates/init/{vitest.config.ts.hbs → vitest.config.ts} +16 -12
  67. package/dist/commands/add-client.d.ts +0 -18
  68. package/dist/commands/add-client.d.ts.map +0 -1
  69. package/dist/commands/add-client.js +0 -79
  70. package/dist/commands/add-client.js.map +0 -6
  71. package/dist/commands/add-server.d.ts +0 -18
  72. package/dist/commands/add-server.d.ts.map +0 -1
  73. package/dist/commands/add-server.js +0 -83
  74. package/dist/commands/add-server.js.map +0 -6
  75. package/dist/utils/config-editor.d.ts +0 -17
  76. package/dist/utils/config-editor.d.ts.map +0 -1
  77. package/dist/utils/config-editor.js +0 -79
  78. package/dist/utils/config-editor.js.map +0 -6
  79. package/src/commands/add-client.ts +0 -126
  80. package/src/commands/add-server.ts +0 -138
  81. package/src/utils/config-editor.ts +0 -141
  82. package/templates/add-client/__CLIENT__/index.html.hbs +0 -13
  83. package/templates/add-client/__CLIENT__/package.json.hbs +0 -16
  84. package/templates/add-client/__CLIENT__/src/App.tsx.hbs +0 -65
  85. package/templates/add-client/__CLIENT__/src/appStructure.ts.hbs +0 -20
  86. package/templates/add-client/__CLIENT__/src/main.tsx.hbs +0 -24
  87. package/templates/add-client/__CLIENT__/src/pages/HomePage.tsx.hbs +0 -9
  88. package/templates/add-client/__CLIENT__/tailwind.config.ts.hbs +0 -15
  89. package/templates/add-server/__SERVER__/package.json.hbs +0 -10
  90. package/templates/add-server/__SERVER__/src/main.ts.hbs +0 -14
  91. package/templates/init/.gitignore.hbs +0 -26
  92. package/templates/init/.npmrc.hbs +0 -1
  93. package/templates/init/eslint.config.ts.hbs +0 -5
  94. package/templates/init/mise.toml.hbs +0 -3
  95. package/tests/config-editor.spec.ts +0 -160
  96. /package/templates/init/{.prettierignore.hbs → .prettierignore} +0 -0
  97. /package/templates/{add-client/__CLIENT__ → init/packages/client-admin}/public/favicon.ico +0 -0
  98. /package/templates/init/{stylelint.config.ts.hbs → stylelint.config.ts} +0 -0
@@ -1,6 +1,3 @@
1
- /**
2
- * Init command options
3
- */
4
1
  export interface InitOptions {
5
2
  }
6
3
  /**
@@ -8,8 +5,10 @@ export interface InitOptions {
8
5
  *
9
6
  * 1. Check if directory is empty
10
7
  * 2. Validate project name (folder name)
11
- * 3. Render Handlebars template
12
- * 4. Run pnpm install
8
+ * 3. Prompt for description, port
9
+ * 4. Generate jwtSecret
10
+ * 5. Render Handlebars template
11
+ * 6. Run pnpm install
13
12
  */
14
13
  export declare function runInit(_options: InitOptions): Promise<void>;
15
14
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["..\\..\\src\\commands\\init.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,WAAW,WAAW;CAAG;AAiB/B;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDlE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["..\\..\\src\\commands\\init.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,WAAW;CAAG;AA2B/B;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DlE"}
@@ -1,5 +1,7 @@
1
1
  import path from "path";
2
2
  import fs from "fs";
3
+ import crypto from "crypto";
4
+ import readline from "readline";
3
5
  import { consola } from "consola";
4
6
  import { renderTemplateDir } from "../utils/template.js";
5
7
  import { execa } from "execa";
@@ -7,6 +9,18 @@ import { findPackageRoot } from "../utils/package-utils.js";
7
9
  function isValidScopeName(name) {
8
10
  return /^[a-z][a-z0-9-]*$/.test(name);
9
11
  }
12
+ function prompt(question) {
13
+ const rl = readline.createInterface({
14
+ input: process.stdin,
15
+ output: process.stdout
16
+ });
17
+ return new Promise((resolve) => {
18
+ rl.question(question, (answer) => {
19
+ rl.close();
20
+ resolve(answer.trim());
21
+ });
22
+ });
23
+ }
10
24
  async function runInit(_options) {
11
25
  const cwd = process.cwd();
12
26
  const logger = consola.withTag("sd:cli:init");
@@ -24,27 +38,31 @@ async function runInit(_options) {
24
38
  process.exitCode = 1;
25
39
  return;
26
40
  }
41
+ const description = await prompt("Project description: ");
42
+ const portInput = await prompt("Server port (default: 40080): ");
43
+ const port = portInput !== "" ? Number(portInput) : 40080;
44
+ if (Number.isNaN(port) || !Number.isInteger(port) || port < 1 || port > 65535) {
45
+ consola.error("Invalid port number.");
46
+ process.exitCode = 1;
47
+ return;
48
+ }
49
+ const jwtSecret = `${projectName}-${crypto.randomUUID().slice(0, 8)}`;
27
50
  const pkgRoot = findPackageRoot(import.meta.dirname);
28
51
  const templateDir = path.join(pkgRoot, "templates", "init");
29
- const context = { projectName };
52
+ const context = { projectName, description, port, jwtSecret };
30
53
  logger.info("Creating project files...");
31
54
  await renderTemplateDir(templateDir, cwd, context);
32
55
  logger.success("Project files created successfully");
33
56
  logger.info("Running pnpm install...");
34
57
  await execa("pnpm", ["install"], { cwd });
35
58
  logger.success("pnpm install completed");
36
- logger.info("Initializing git repository...");
37
- await execa("git", ["init"], { cwd });
38
- await execa("git", ["add", "."], { cwd });
39
- await execa("git", ["commit", "-m", "init"], { cwd });
40
- logger.success("git repository initialized");
41
59
  consola.box(
42
60
  [
43
61
  "Project created!",
44
62
  "",
45
63
  "Next steps:",
46
- " sd-cli add client Add a client package",
47
- " sd-cli add server Add a server package"
64
+ " pnpm dev Start dev server",
65
+ " pnpm build Production build"
48
66
  ].join("\n")
49
67
  );
50
68
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/init.ts"],
4
- "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,aAAa;AACtB,SAAS,uBAAuB;AAgBhC,SAAS,iBAAiB,MAAuB;AAC/C,SAAO,oBAAoB,KAAK,IAAI;AACtC;AAcA,eAAsB,QAAQ,UAAsC;AAClE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,aAAa;AAG5C,QAAM,UAAU,GAAG,YAAY,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACpE,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,MAAM,kEAAkE;AAChF,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,cAAc,KAAK,SAAS,GAAG;AACrC,MAAI,CAAC,iBAAiB,WAAW,GAAG;AAClC,YAAQ;AAAA,MACN,iBAAiB,WAAW;AAAA,IAC9B;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,UAAU,gBAAgB,YAAY,OAAO;AACnD,QAAM,cAAc,KAAK,KAAK,SAAS,aAAa,MAAM;AAE1D,QAAM,UAAU,EAAE,YAAY;AAE9B,SAAO,KAAK,2BAA2B;AACvC,QAAM,kBAAkB,aAAa,KAAK,OAAO;AACjD,SAAO,QAAQ,oCAAoC;AAGnD,SAAO,KAAK,yBAAyB;AACrC,QAAM,MAAM,QAAQ,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC;AACxC,SAAO,QAAQ,wBAAwB;AAGvC,SAAO,KAAK,gCAAgC;AAC5C,QAAM,MAAM,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC;AACpC,QAAM,MAAM,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,IAAI,CAAC;AACxC,QAAM,MAAM,OAAO,CAAC,UAAU,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC;AACpD,SAAO,QAAQ,4BAA4B;AAG3C,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;",
4
+ "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,OAAO,YAAY;AACnB,OAAO,cAAc;AACrB,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,aAAa;AACtB,SAAS,uBAAuB;AAUhC,SAAS,iBAAiB,MAAuB;AAC/C,SAAO,oBAAoB,KAAK,IAAI;AACtC;AAEA,SAAS,OAAO,UAAmC;AACjD,QAAM,KAAK,SAAS,gBAAgB;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,OAAG,SAAS,UAAU,CAAC,WAAW;AAChC,SAAG,MAAM;AACT,cAAQ,OAAO,KAAK,CAAC;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAgBA,eAAsB,QAAQ,UAAsC;AAClE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,aAAa;AAG5C,QAAM,UAAU,GAAG,YAAY,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACpE,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,MAAM,kEAAkE;AAChF,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,cAAc,KAAK,SAAS,GAAG;AACrC,MAAI,CAAC,iBAAiB,WAAW,GAAG;AAClC,YAAQ;AAAA,MACN,iBAAiB,WAAW;AAAA,IAC9B;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,cAAc,MAAM,OAAO,uBAAuB;AAGxD,QAAM,YAAY,MAAM,OAAO,gCAAgC;AAC/D,QAAM,OAAO,cAAc,KAAK,OAAO,SAAS,IAAI;AACpD,MAAI,OAAO,MAAM,IAAI,KAAK,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,OAAO;AAC7E,YAAQ,MAAM,sBAAsB;AACpC,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,YAAY,GAAG,WAAW,IAAI,OAAO,WAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AAGnE,QAAM,UAAU,gBAAgB,YAAY,OAAO;AACnD,QAAM,cAAc,KAAK,KAAK,SAAS,aAAa,MAAM;AAE1D,QAAM,UAAU,EAAE,aAAa,aAAa,MAAM,UAAU;AAE5D,SAAO,KAAK,2BAA2B;AACvC,QAAM,kBAAkB,aAAa,KAAK,OAAO;AACjD,SAAO,QAAQ,oCAAoC;AAGnD,SAAO,KAAK,yBAAyB;AACrC,QAAM,MAAM,QAAQ,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC;AACxC,SAAO,QAAQ,wBAAwB;AAGvC,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;",
5
5
  "names": []
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sd-cli-entry.d.ts","sourceRoot":"","sources":["..\\src\\sd-cli-entry.ts"],"names":[],"mappings":";AAGA,OAAO,uBAAuB,CAAC;AAC/B,OAAc,EAAE,KAAK,IAAI,EAAE,MAAM,OAAO,CAAC;AAoBzC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkUpD"}
1
+ {"version":3,"file":"sd-cli-entry.d.ts","sourceRoot":"","sources":["..\\src\\sd-cli-entry.ts"],"names":[],"mappings":";AAGA,OAAO,uBAAuB,CAAC;AAC/B,OAAc,EAAE,KAAK,IAAI,EAAE,MAAM,OAAO,CAAC;AAoBzC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0SpD"}
@@ -204,26 +204,6 @@ function createCliParser(argv) {
204
204
  const { runInit } = await import("./commands/init.js");
205
205
  await runInit({});
206
206
  }
207
- ).command(
208
- "add",
209
- "Add package to project",
210
- (cmd) => cmd.version(false).hide("help").command(
211
- "client",
212
- "Add client package",
213
- (subCmd) => subCmd.version(false).hide("help"),
214
- async () => {
215
- const { runAddClient } = await import("./commands/add-client.js");
216
- await runAddClient({});
217
- }
218
- ).command(
219
- "server",
220
- "Add server package",
221
- (subCmd) => subCmd.version(false).hide("help"),
222
- async () => {
223
- const { runAddServer } = await import("./commands/add-server.js");
224
- await runAddServer({});
225
- }
226
- ).demandCommand(1, "Please specify package type. (client, server)")
227
207
  ).command(
228
208
  "publish [targets..]",
229
209
  "Publish packages",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/sd-cli-entry.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/sd-cli",
3
- "version": "13.0.71",
3
+ "version": "13.0.72",
4
4
  "description": "Simplysm package - CLI tool",
5
5
  "author": "simplysm",
6
6
  "license": "Apache-2.0",
@@ -43,9 +43,9 @@
43
43
  "vite-plugin-solid": "^2.11.10",
44
44
  "vite-tsconfig-paths": "^6.1.1",
45
45
  "yargs": "^18.0.0",
46
- "@simplysm/core-node": "13.0.71",
47
- "@simplysm/core-common": "13.0.71",
48
- "@simplysm/storage": "13.0.71"
46
+ "@simplysm/core-common": "13.0.72",
47
+ "@simplysm/core-node": "13.0.72",
48
+ "@simplysm/storage": "13.0.72"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@types/semver": "^7.7.1",
@@ -1,5 +1,7 @@
1
1
  import path from "path";
2
2
  import fs from "fs";
3
+ import crypto from "crypto";
4
+ import readline from "readline";
3
5
  import { consola } from "consola";
4
6
  import { renderTemplateDir } from "../utils/template";
5
7
  import { execa } from "execa";
@@ -7,22 +9,29 @@ import { findPackageRoot } from "../utils/package-utils";
7
9
 
8
10
  //#region Types
9
11
 
10
- /**
11
- * Init command options
12
- */
13
12
  export interface InitOptions {}
14
13
 
15
14
  //#endregion
16
15
 
17
16
  //#region Utilities
18
17
 
19
- /**
20
- * Validates npm scope name validity
21
- */
22
18
  function isValidScopeName(name: string): boolean {
23
19
  return /^[a-z][a-z0-9-]*$/.test(name);
24
20
  }
25
21
 
22
+ function prompt(question: string): Promise<string> {
23
+ const rl = readline.createInterface({
24
+ input: process.stdin,
25
+ output: process.stdout,
26
+ });
27
+ return new Promise((resolve) => {
28
+ rl.question(question, (answer) => {
29
+ rl.close();
30
+ resolve(answer.trim());
31
+ });
32
+ });
33
+ }
34
+
26
35
  //#endregion
27
36
 
28
37
  //#region Main
@@ -32,8 +41,10 @@ function isValidScopeName(name: string): boolean {
32
41
  *
33
42
  * 1. Check if directory is empty
34
43
  * 2. Validate project name (folder name)
35
- * 3. Render Handlebars template
36
- * 4. Run pnpm install
44
+ * 3. Prompt for description, port
45
+ * 4. Generate jwtSecret
46
+ * 5. Render Handlebars template
47
+ * 6. Run pnpm install
37
48
  */
38
49
  export async function runInit(_options: InitOptions): Promise<void> {
39
50
  const cwd = process.cwd();
@@ -57,36 +68,44 @@ export async function runInit(_options: InitOptions): Promise<void> {
57
68
  return;
58
69
  }
59
70
 
60
- // 3. Render template
71
+ // 3. Prompt for description
72
+ const description = await prompt("Project description: ");
73
+
74
+ // 4. Prompt for port
75
+ const portInput = await prompt("Server port (default: 40080): ");
76
+ const port = portInput !== "" ? Number(portInput) : 40080;
77
+ if (Number.isNaN(port) || !Number.isInteger(port) || port < 1 || port > 65535) {
78
+ consola.error("Invalid port number.");
79
+ process.exitCode = 1;
80
+ return;
81
+ }
82
+
83
+ // 5. Generate jwtSecret
84
+ const jwtSecret = `${projectName}-${crypto.randomUUID().slice(0, 8)}`;
85
+
86
+ // 6. Render template
61
87
  const pkgRoot = findPackageRoot(import.meta.dirname);
62
88
  const templateDir = path.join(pkgRoot, "templates", "init");
63
89
 
64
- const context = { projectName };
90
+ const context = { projectName, description, port, jwtSecret };
65
91
 
66
92
  logger.info("Creating project files...");
67
93
  await renderTemplateDir(templateDir, cwd, context);
68
94
  logger.success("Project files created successfully");
69
95
 
70
- // 4. Run pnpm install
96
+ // 7. Run pnpm install
71
97
  logger.info("Running pnpm install...");
72
98
  await execa("pnpm", ["install"], { cwd });
73
99
  logger.success("pnpm install completed");
74
100
 
75
- // 5. Initialize git repository
76
- logger.info("Initializing git repository...");
77
- await execa("git", ["init"], { cwd });
78
- await execa("git", ["add", "."], { cwd });
79
- await execa("git", ["commit", "-m", "init"], { cwd });
80
- logger.success("git repository initialized");
81
-
82
- // 6. Completion message
101
+ // 8. Completion message
83
102
  consola.box(
84
103
  [
85
104
  "Project created!",
86
105
  "",
87
106
  "Next steps:",
88
- " sd-cli add client Add a client package",
89
- " sd-cli add server Add a server package",
107
+ " pnpm dev Start dev server",
108
+ " pnpm build Production build",
90
109
  ].join("\n"),
91
110
  );
92
111
  }
@@ -259,30 +259,6 @@ export function createCliParser(argv: string[]): Argv {
259
259
  await runInit({});
260
260
  },
261
261
  )
262
- .command("add", "Add package to project", (cmd) =>
263
- cmd
264
- .version(false)
265
- .hide("help")
266
- .command(
267
- "client",
268
- "Add client package",
269
- (subCmd) => subCmd.version(false).hide("help"),
270
- async () => {
271
- const { runAddClient } = await import("./commands/add-client.js");
272
- await runAddClient({});
273
- },
274
- )
275
- .command(
276
- "server",
277
- "Add server package",
278
- (subCmd) => subCmd.version(false).hide("help"),
279
- async () => {
280
- const { runAddServer } = await import("./commands/add-server.js");
281
- await runAddServer({});
282
- },
283
- )
284
- .demandCommand(1, "Please specify package type. (client, server)"),
285
- )
286
262
  .command(
287
263
  "publish [targets..]",
288
264
  "Publish packages",
@@ -1,4 +1,4 @@
1
- printWidth: 120
1
+ printWidth: 100
2
2
  tabWidth: 2
3
3
  useTabs: false
4
4
  semi: true
@@ -0,0 +1,15 @@
1
+ import simplysmRecommended from "@simplysm/lint/eslint-recommended";
2
+ import { globalIgnores } from "eslint/config";
3
+
4
+ export default [
5
+ globalIgnores([".legacy/**"]),
6
+ ...simplysmRecommended,
7
+ {
8
+ files: ["**/*.{ts,tsx}"],
9
+ settings: {
10
+ tailwindcss: {
11
+ config: "packages/client-admin/tailwind.config.ts",
12
+ },
13
+ },
14
+ },
15
+ ];
@@ -0,0 +1,3 @@
1
+ [tools]
2
+ node = "20.20.0"
3
+ pnpm = "10.30.0"
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "{{projectName}}",
3
3
  "version": "1.0.0",
4
+ "description": "{{description}}",
4
5
  "type": "module",
5
6
  "private": true,
6
7
  "scripts": {
@@ -12,18 +13,18 @@
12
13
  "typecheck": "sd-cli typecheck",
13
14
  "lint": "sd-cli lint",
14
15
  "lint:fix": "sd-cli lint --fix",
16
+ "check": "sd-cli check",
15
17
  "vitest": "vitest"
16
18
  },
17
19
  "devDependencies": {
18
- "@simplysm/sd-cli": "~13.0.71",
19
- "@simplysm/sd-claude": "~13.0.71",
20
- "@simplysm/lint": "~13.0.71",
21
- "@types/node": "^20.19.33",
22
- "eslint": "^9.39.2",
20
+ "@simplysm/lint": "~13.0.72",
21
+ "@simplysm/sd-cli": "~13.0.72",
22
+ "@types/node": "^20.19.35",
23
+ "eslint": "^9.39.3",
23
24
  "prettier": "^3.8.1",
24
- "stylelint": "^16.13.0",
25
+ "stylelint": "^16.26.1",
25
26
  "typescript": "^5.9.3",
26
- "vite-tsconfig-paths": "^6.1.0",
27
+ "vite-tsconfig-paths": "^6.1.1",
27
28
  "vitest": "^4.0.18"
28
29
  }
29
30
  }
@@ -0,0 +1,144 @@
1
+ <!doctype html>
2
+ <html lang="ko">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link rel="icon" href="favicon.ico" />
7
+ <title>{{projectName}}</title>
8
+ <script>
9
+ (function () {
10
+ var theme = localStorage.getItem("client-admin.theme");
11
+ if (theme === "dark") {
12
+ document.documentElement.classList.add("dark");
13
+ } else if (theme === "light") {
14
+ document.documentElement.classList.remove("dark");
15
+ }
16
+ })();
17
+ </script>
18
+ <style>
19
+ * {
20
+ box-sizing: border-box;
21
+ }
22
+
23
+ html,
24
+ body,
25
+ #root {
26
+ padding: 0;
27
+ margin: 0;
28
+ width: 100%;
29
+ height: 100%;
30
+ }
31
+
32
+ .app-loading {
33
+ display: flex;
34
+ flex-direction: column;
35
+ align-items: center;
36
+ justify-content: center;
37
+ height: 100%;
38
+ width: 100%;
39
+ gap: 24px;
40
+ background: #f9fafb;
41
+ padding-bottom: 128px;
42
+ position: relative;
43
+ overflow: hidden;
44
+ }
45
+
46
+ .dark .app-loading {
47
+ background: #18181b;
48
+ }
49
+
50
+ @media (prefers-color-scheme: dark) {
51
+ .app-loading {
52
+ background: #18181b;
53
+ }
54
+
55
+ .app-loading-spinner::before {
56
+ border-top-color: #3b82f6;
57
+ border-right-color: #2563eb;
58
+ }
59
+
60
+ .app-loading-spinner::after {
61
+ border-bottom-color: #60a5fa;
62
+ border-left-color: #3b82f6;
63
+ }
64
+ }
65
+
66
+ .app-loading img {
67
+ width: auto;
68
+ position: relative;
69
+ z-index: 1;
70
+ margin-bottom: 32px;
71
+ }
72
+
73
+ .app-loading-spinner {
74
+ width: 48px;
75
+ height: 48px;
76
+ position: relative;
77
+ z-index: 1;
78
+ }
79
+
80
+ .app-loading-spinner::before {
81
+ content: "";
82
+ position: absolute;
83
+ inset: 0;
84
+ border: 3px solid transparent;
85
+ border-radius: 50%;
86
+ border-top-color: #60a5fa;
87
+ border-right-color: #3b82f6;
88
+ animation: spinClockwise 1.2s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;
89
+ }
90
+
91
+ .dark .app-loading-spinner::before {
92
+ border-top-color: #3b82f6;
93
+ border-right-color: #2563eb;
94
+ }
95
+
96
+ .app-loading-spinner::after {
97
+ content: "";
98
+ position: absolute;
99
+ inset: 8px;
100
+ border: 3px solid transparent;
101
+ border-radius: 50%;
102
+ border-bottom-color: #93c5fd;
103
+ border-left-color: #60a5fa;
104
+ animation: spinCounterClockwise 0.8s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;
105
+ }
106
+
107
+ .dark .app-loading-spinner::after {
108
+ border-bottom-color: #60a5fa;
109
+ border-left-color: #3b82f6;
110
+ }
111
+
112
+ @keyframes spinClockwise {
113
+ 0% {
114
+ transform: rotate(0deg);
115
+ opacity: 1;
116
+ }
117
+ 100% {
118
+ transform: rotate(360deg);
119
+ opacity: 1;
120
+ }
121
+ }
122
+
123
+ @keyframes spinCounterClockwise {
124
+ 0% {
125
+ transform: rotate(0deg);
126
+ opacity: 0.8;
127
+ }
128
+ 100% {
129
+ transform: rotate(-360deg);
130
+ opacity: 0.8;
131
+ }
132
+ }
133
+ </style>
134
+ </head>
135
+ <body>
136
+ <div id="root">
137
+ <div class="app-loading">
138
+ <img src="assets/logo-landscape.png" alt="logo" />
139
+ <div class="app-loading-spinner"></div>
140
+ </div>
141
+ </div>
142
+ <script type="module" src="src/main.tsx"></script>
143
+ </body>
144
+ </html>
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@{{projectName}}/client-admin",
3
+ "version": "1.0.0",
4
+ "description": "{{description}}",
5
+ "type": "module",
6
+ "private": true,
7
+ "dependencies": {
8
+ "@{{projectName}}/db-main": "workspace:*",
9
+ "@simplysm/core-browser": "~13.0.72",
10
+ "@simplysm/core-common": "~13.0.72",
11
+ "@simplysm/excel": "^13.0.71",
12
+ "@simplysm/orm-common": "~13.0.72",
13
+ "@simplysm/service-client": "~13.0.72",
14
+ "@simplysm/solid": "~13.0.72",
15
+ "@solid-primitives/event-listener": "^2.4.5",
16
+ "@solidjs/router": "^0.15.4",
17
+ "@tabler/icons-solidjs": "^3.37.1",
18
+ "clsx": "^2.1.1",
19
+ "consola": "^3.4.2",
20
+ "solid-js": "^1.9.11",
21
+ "zod": "^4.3.6"
22
+ },
23
+ "devDependencies": {
24
+ "tailwindcss": "^3.4.19"
25
+ }
26
+ }
@@ -0,0 +1,42 @@
1
+ import type { RouteSectionProps } from "@solidjs/router";
2
+ import { createEventListener } from "@solid-primitives/event-listener";
3
+ import { useDialog } from "@simplysm/solid";
4
+ import { env } from "@simplysm/core-common";
5
+ import { DevDialog } from "./dev/DevDialog";
6
+
7
+ export function App(props: RouteSectionProps) {
8
+ const dialog = useDialog();
9
+
10
+ if (env.DEV) {
11
+ let preservedKeys: string[] = [];
12
+
13
+ createEventListener(document, "keydown", async (event) => {
14
+ if (
15
+ event.ctrlKey &&
16
+ event.altKey &&
17
+ event.shiftKey &&
18
+ (event.key === "F11" || event.key === "F12")
19
+ ) {
20
+ event.preventDefault();
21
+ event.stopPropagation();
22
+
23
+ preservedKeys.push(event.key);
24
+ preservedKeys = preservedKeys.slice(-4);
25
+
26
+ if (
27
+ preservedKeys[0] === "F12" &&
28
+ preservedKeys[1] === "F11" &&
29
+ preservedKeys[2] === "F12" &&
30
+ preservedKeys[3] === "F12"
31
+ ) {
32
+ preservedKeys = [];
33
+ await dialog.show(() => <DevDialog />, {
34
+ header: "DEV",
35
+ });
36
+ }
37
+ }
38
+ });
39
+ }
40
+
41
+ return <>{props.children}</>;
42
+ }
@@ -0,0 +1,34 @@
1
+ import { createSignal } from "solid-js";
2
+ import { BusyContainer, Button, useNotification } from "@simplysm/solid";
3
+ import { useAppService } from "../providers/AppServiceProvider";
4
+ import { useAppStructure } from "../providers/AppStructureProvider";
5
+
6
+ export function DevDialog() {
7
+ const serv = useAppService();
8
+ const noti = useNotification();
9
+ const appStructure = useAppStructure();
10
+ const [busyCount, setBusyCount] = createSignal(0);
11
+
12
+ const handleInitDb = async () => {
13
+ setBusyCount((c) => c + 1);
14
+ try {
15
+ const permCodes = appStructure.allFlatPerms.map((p) => p.code);
16
+ await serv.dev.initDb(permCodes);
17
+ noti.success("DB 초기화 완료");
18
+ } catch (err) {
19
+ noti.error(err, "오류");
20
+ }
21
+ setBusyCount((c) => c - 1);
22
+ };
23
+
24
+ return (
25
+ <BusyContainer busy={busyCount() > 0}>
26
+ <div class="inline-flex flex-row gap-2 p-2">
27
+ <Button onClick={handleInitDb} theme="primary" variant="solid">
28
+ DB 초기화
29
+ </Button>
30
+ <Button onClick={() => location.reload()}>새로고침</Button>
31
+ </div>
32
+ </BusyContainer>
33
+ );
34
+ }
@@ -1,4 +1,4 @@
1
- @import "@simplysm/solid/src/base.css";
1
+ @import "@simplysm/solid/tailwind.css";
2
2
 
3
3
  @tailwind components;
4
4
  @tailwind utilities;