@simplysm/sd-cli 13.0.70 → 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.
- package/dist/commands/init.d.ts +4 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +26 -8
- package/dist/commands/init.js.map +1 -1
- package/dist/sd-cli-entry.d.ts.map +1 -1
- package/dist/sd-cli-entry.js +0 -20
- package/dist/sd-cli-entry.js.map +1 -1
- package/package.json +4 -4
- package/src/commands/init.ts +40 -21
- package/src/sd-cli-entry.ts +0 -24
- package/templates/init/{.prettierrc.yaml.hbs → .prettierrc.yaml} +1 -1
- package/templates/init/eslint.config.ts +15 -0
- package/templates/init/mise.toml +3 -0
- package/templates/init/package.json.hbs +8 -7
- package/templates/init/packages/client-admin/index.html.hbs +144 -0
- package/templates/init/packages/client-admin/package.json.hbs +26 -0
- package/templates/init/packages/client-admin/public/assets/logo-landscape.png +0 -0
- package/templates/init/packages/client-admin/public/assets/logo.png +0 -0
- package/templates/init/packages/client-admin/src/App.tsx +42 -0
- package/templates/init/packages/client-admin/src/dev/DevDialog.tsx +34 -0
- package/templates/{add-client/__CLIENT__/src/main.css.hbs → init/packages/client-admin/src/main.css} +1 -1
- package/templates/init/packages/client-admin/src/main.tsx.hbs +146 -0
- package/templates/init/packages/client-admin/src/providers/AppServiceProvider.tsx.hbs +103 -0
- package/templates/init/packages/client-admin/src/providers/AppStructureProvider.tsx +84 -0
- package/templates/init/packages/client-admin/src/providers/AuthProvider.tsx.hbs +71 -0
- package/templates/init/packages/client-admin/src/providers/configureSharedData.ts.hbs +67 -0
- package/templates/init/packages/client-admin/src/views/auth/LoginView.tsx +132 -0
- package/templates/init/packages/client-admin/src/views/home/HomeView.tsx +108 -0
- package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeDetail.tsx.hbs +262 -0
- package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeSheet.tsx.hbs +271 -0
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleDetail.tsx.hbs +154 -0
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionDetail.tsx.hbs +123 -0
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionView.tsx +52 -0
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleSheet.tsx.hbs +125 -0
- package/templates/init/packages/client-admin/src/views/home/main/MainView.tsx.hbs +13 -0
- package/templates/init/packages/client-admin/src/views/home/my-info/MyInfoDetail.tsx.hbs +248 -0
- package/templates/init/packages/client-admin/src/views/home/system/system-log/SystemLogSheet.tsx.hbs +169 -0
- package/templates/init/packages/client-admin/src/views/not-found/NotFoundView.tsx +15 -0
- package/templates/init/packages/client-admin/tailwind.config.ts +10 -0
- package/templates/init/packages/db-main/package.json.hbs +13 -0
- package/templates/init/packages/db-main/src/MainDbContext.ts +20 -0
- package/templates/init/packages/db-main/src/dataLogExt.ts +127 -0
- package/templates/init/packages/db-main/src/index.ts +10 -0
- package/templates/init/packages/db-main/src/tables/Employee.ts +24 -0
- package/templates/init/packages/db-main/src/tables/EmployeeConfig.ts +13 -0
- package/templates/init/packages/db-main/src/tables/Role.ts +9 -0
- package/templates/init/packages/db-main/src/tables/RolePermission.ts +13 -0
- package/templates/init/packages/db-main/src/tables/_DataLog.ts +19 -0
- package/templates/init/packages/db-main/src/tables/_Log.ts +16 -0
- package/templates/init/packages/server/package.json.hbs +20 -0
- package/templates/init/packages/server/public-dev/dev//354/264/210/352/270/260/355/231/224.xlsx +0 -0
- package/templates/init/packages/server/src/index.ts +4 -0
- package/templates/init/packages/server/src/main.ts.hbs +34 -0
- package/templates/init/packages/server/src/services/AuthService.ts.hbs +171 -0
- package/templates/init/packages/server/src/services/DevService.ts.hbs +94 -0
- package/templates/init/packages/server/src/services/EmployeeService.ts.hbs +122 -0
- package/templates/init/packages/server/src/services/RoleService.ts.hbs +59 -0
- package/templates/init/{pnpm-workspace.yaml.hbs → pnpm-workspace.yaml} +3 -1
- package/templates/init/sd.config.ts.hbs +30 -1
- package/templates/init/tests/e2e/package.json.hbs +16 -0
- package/templates/init/tests/e2e/src/e2e.spec.ts +36 -0
- package/templates/init/tests/e2e/src/employee-crud.ts +204 -0
- package/templates/init/tests/e2e/src/login.ts +61 -0
- package/templates/init/tests/e2e/vitest.setup.ts.hbs +220 -0
- package/templates/init/tsconfig.json.hbs +0 -11
- package/templates/init/{vitest.config.ts.hbs → vitest.config.ts} +16 -12
- package/tests/infra/WorkerManager.spec.ts +1 -1
- package/tests/replace-deps.spec.ts +2 -2
- package/tests/run-lint.spec.ts +6 -6
- package/tests/run-typecheck.spec.ts +3 -3
- package/tests/sd-cli.spec.ts +1 -1
- package/dist/commands/add-client.d.ts +0 -18
- package/dist/commands/add-client.d.ts.map +0 -1
- package/dist/commands/add-client.js +0 -79
- package/dist/commands/add-client.js.map +0 -6
- package/dist/commands/add-server.d.ts +0 -18
- package/dist/commands/add-server.d.ts.map +0 -1
- package/dist/commands/add-server.js +0 -83
- package/dist/commands/add-server.js.map +0 -6
- package/dist/utils/config-editor.d.ts +0 -17
- package/dist/utils/config-editor.d.ts.map +0 -1
- package/dist/utils/config-editor.js +0 -79
- package/dist/utils/config-editor.js.map +0 -6
- package/src/commands/add-client.ts +0 -126
- package/src/commands/add-server.ts +0 -138
- package/src/utils/config-editor.ts +0 -141
- package/templates/add-client/__CLIENT__/index.html.hbs +0 -13
- package/templates/add-client/__CLIENT__/package.json.hbs +0 -16
- package/templates/add-client/__CLIENT__/src/App.tsx.hbs +0 -65
- package/templates/add-client/__CLIENT__/src/appStructure.ts.hbs +0 -20
- package/templates/add-client/__CLIENT__/src/main.tsx.hbs +0 -24
- package/templates/add-client/__CLIENT__/src/pages/HomePage.tsx.hbs +0 -9
- package/templates/add-client/__CLIENT__/tailwind.config.ts.hbs +0 -15
- package/templates/add-server/__SERVER__/package.json.hbs +0 -10
- package/templates/add-server/__SERVER__/src/main.ts.hbs +0 -14
- package/templates/init/.gitignore.hbs +0 -26
- package/templates/init/.npmrc.hbs +0 -1
- package/templates/init/eslint.config.ts.hbs +0 -5
- package/templates/init/mise.toml.hbs +0 -3
- package/tests/config-editor.spec.ts +0 -160
- /package/templates/init/{.prettierignore.hbs → .prettierignore} +0 -0
- /package/templates/{add-client/__CLIENT__ → init/packages/client-admin}/public/favicon.ico +0 -0
- /package/templates/init/{stylelint.config.ts.hbs → stylelint.config.ts} +0 -0
package/dist/commands/init.d.ts
CHANGED
|
@@ -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.
|
|
12
|
-
* 4.
|
|
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":"
|
|
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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -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
|
-
"
|
|
47
|
-
"
|
|
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;
|
|
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,
|
|
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"}
|
package/dist/sd-cli-entry.js
CHANGED
|
@@ -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",
|
package/dist/sd-cli-entry.js.map
CHANGED
|
@@ -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.
|
|
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-common": "13.0.
|
|
47
|
-
"@simplysm/core-node": "13.0.
|
|
48
|
-
"@simplysm/storage": "13.0.
|
|
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",
|
package/src/commands/init.ts
CHANGED
|
@@ -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.
|
|
36
|
-
* 4.
|
|
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.
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
"
|
|
89
|
-
"
|
|
107
|
+
" pnpm dev Start dev server",
|
|
108
|
+
" pnpm build Production build",
|
|
90
109
|
].join("\n"),
|
|
91
110
|
);
|
|
92
111
|
}
|
package/src/sd-cli-entry.ts
CHANGED
|
@@ -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",
|
|
@@ -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
|
+
];
|
|
@@ -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/
|
|
19
|
-
"@simplysm/sd-
|
|
20
|
-
"@
|
|
21
|
-
"
|
|
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.
|
|
25
|
+
"stylelint": "^16.26.1",
|
|
25
26
|
"typescript": "^5.9.3",
|
|
26
|
-
"vite-tsconfig-paths": "^6.1.
|
|
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
|
+
}
|
|
Binary file
|
|
@@ -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
|
+
}
|