@gadmin2n/cli 0.0.78 → 0.0.79

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.
@@ -1,4 +1,5 @@
1
1
  import { Input } from '../commands';
2
+ export { Input };
2
3
  export declare abstract class AbstractAction {
3
4
  abstract handle(inputs?: Input[], options?: Input[], extraFlags?: string[]): Promise<void>;
4
5
  }
@@ -1,5 +1,6 @@
1
1
  import { Input } from '../commands';
2
2
  import { AbstractAction } from './abstract.action';
3
3
  export declare class PrismaAction extends AbstractAction {
4
+ private buildMergedSchema;
4
5
  handle(inputs: Input[], options: Input[]): Promise<void>;
5
6
  }
@@ -48,7 +48,40 @@ function replaceFileContent(filePath, match, src, dest) {
48
48
  });
49
49
  }
50
50
  class PrismaAction extends abstract_action_1.AbstractAction {
51
+ buildMergedSchema() {
52
+ shell
53
+ .cat('server/prisma/.generator.prisma')
54
+ .to('server/prisma/schema.prisma');
55
+ let schemaStr = '';
56
+ if (shell.test('-d', 'config/prisma')) {
57
+ schemaStr = shell.cat('config/prisma/*.prisma');
58
+ }
59
+ else {
60
+ schemaStr = shell.cat('config/schema.prisma');
61
+ }
62
+ const schemaRegex = /([\s\S]*?model\s\w*\s*\{)([^\}]*)(\})/gim; // https://regex101.com/
63
+ let m, result = '';
64
+ while ((m = schemaRegex.exec(schemaStr)) !== null) {
65
+ // This is necessary to avoid infinite loops with zero-width matches
66
+ if (m.index === schemaRegex.lastIndex) {
67
+ schemaRegex.lastIndex++;
68
+ }
69
+ let ignore = !!m[1].match(/\/\/\/\s*@IgnoreAutoField/);
70
+ result += m[1];
71
+ if (!ignore) {
72
+ result += '\n id Int @id @default(autoincrement())';
73
+ }
74
+ result += m[2];
75
+ if (!ignore) {
76
+ result +=
77
+ ' creator String @default("") @db.VarChar(128)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt @default(now())\n';
78
+ }
79
+ result += m[3];
80
+ }
81
+ new shell.ShellString(result).toEnd('server/prisma/schema.prisma');
82
+ }
51
83
  handle(inputs, options) {
84
+ var _a, _b, _c;
52
85
  return __awaiter(this, void 0, void 0, function* () {
53
86
  // 检查 prisma schema 配置是否存在
54
87
  const hasPrismaConfig = shell.test('-e', 'config/schema.prisma') ||
@@ -58,94 +91,85 @@ class PrismaAction extends abstract_action_1.AbstractAction {
58
91
  console.error(`${chalk.red('Missing: config/schema.prisma or config/prisma/ directory')}`);
59
92
  process.exit(-1);
60
93
  }
61
- const devMode = options.find((option) => option.name === 'dev');
62
- shell
63
- .cat('server/prisma/.generator.prisma')
64
- .to('server/prisma/schema.prisma');
65
- let schemaStr = '';
66
- if (shell.test('-d', 'config/prisma')) {
67
- schemaStr = shell.cat('config/prisma/*.prisma');
94
+ const devMode = !!((_a = options.find((option) => option.name === 'dev')) === null || _a === void 0 ? void 0 : _a.value);
95
+ const webOnly = !!((_b = options.find((option) => option.name === 'webOnly')) === null || _b === void 0 ? void 0 : _b.value);
96
+ const serverOnly = !!((_c = options.find((option) => option.name === 'serverOnly')) === null || _c === void 0 ? void 0 : _c.value);
97
+ // 构建合并的 schema(三种模式都需要重建 schema.prisma
98
+ this.buildMergedSchema();
99
+ // 清空 generated 目录(按模式选择)
100
+ if (webOnly) {
101
+ // 只清 server/src/generated/.react(清理旧 react 输出)
102
+ fs.rmSync('server/src/generated/.react', { recursive: true, force: true });
68
103
  }
69
- else {
70
- schemaStr = shell.cat('config/schema.prisma');
104
+ else if (serverOnly) {
105
+ // 只清 server/src/generated/
106
+ fs.rmSync('server/src/generated', { recursive: true, force: true });
71
107
  }
72
- const schemaRegex = /([\s\S]*?model\s\w*\s*\{)([^\}]*)(\})/gim; // https://regex101.com/
73
- // const subst = `$1\n id Int @id @default(autoincrement())$2 createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n$3`;
74
- let m, result = '';
75
- while ((m = schemaRegex.exec(schemaStr)) !== null) {
76
- // This is necessary to avoid infinite loops with zero-width matches
77
- if (m.index === schemaRegex.lastIndex) {
78
- schemaRegex.lastIndex++;
79
- }
80
- // The result can be accessed through the `m`-variable.
81
- // m.forEach((match, groupIndex) => {
82
- // console.log(`Found match, group ${groupIndex}: ${match}`);
83
- // });
84
- let ignore = !!m[1].match(/\/\/\/\s*@IgnoreAutoField/);
85
- result += m[1];
86
- if (!ignore) {
87
- result += '\n id Int @id @default(autoincrement())';
88
- }
89
- result += m[2];
90
- if (!ignore) {
91
- result +=
92
- ' creator String @default("") @db.VarChar(128)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt @default(now())\n';
93
- }
94
- result += m[3];
95
- }
96
- //const result = schemaStr.replace(schemaRegex, subst);
97
- new shell.ShellString(result).toEnd('server/prisma/schema.prisma');
98
- fs.rmSync('server/src/generated', { recursive: true, force: true });
99
- fs.rmSync('web/src/generated', { recursive: true, force: true });
100
- /*
101
- const {code} = shell.cd('config/').exec('tsc ui.config.ts');
102
- if(code !== 0){
103
- process.exit(code);
108
+ else {
109
+ // 全清两侧
110
+ fs.rmSync('server/src/generated', { recursive: true, force: true });
111
+ fs.rmSync('web/src/generated', { recursive: true, force: true });
104
112
  }
105
- shell.cd('../');
106
- */
107
- const { code } = shell
108
- .cd('server/')
109
- .exec(devMode ? 'npm run generate:dev' : 'npm run generate');
113
+ // 执行代码生成(走 npm run 脚本)
114
+ let generateScript = 'npm run generate';
115
+ if (devMode)
116
+ generateScript = 'npm run generate:dev';
117
+ else if (webOnly)
118
+ generateScript = 'npm run generate:web';
119
+ else if (serverOnly)
120
+ generateScript = 'npm run generate:server';
121
+ const { code } = shell.cd('server/').exec(generateScript);
110
122
  if (code !== 0) {
111
123
  process.exit(code);
112
124
  }
113
125
  shell.cd('../');
114
- fs.cpSync('server/src/generated/.react', 'web/src/generated', {
115
- recursive: true,
116
- force: true,
117
- });
118
- fs.rmSync('server/src/generated/.react', { recursive: true, force: true });
119
- shell.cd('server/src/generated/');
120
- const models = shell
121
- .ls('-d', '*')
122
- .filter((file) => shell.test('-d', file))
123
- .filter((dir) => shell.test('-e', `${dir}/dto/${dir}.form.validator.ts`));
124
- shell.cd('../../..');
125
- models.forEach((modelName) => {
126
- shell.mv('-f', `server/src/generated/${modelName}/dto/${modelName}.form.validator.ts`, `web/src/generated/props/${modelName}/form.validator.ts`);
127
- fs.cpSync(`server/src/generated/${modelName}`, `server/src/modules/${modelName}`, { recursive: true, force: false });
128
- shell.rm('-f', `server/src/generated/${modelName}/*.ts`);
129
- fs.rmSync(`server/src/modules/${modelName}/dto`, {
126
+ // 分发前端文件(!serverOnly)
127
+ if (!serverOnly) {
128
+ fs.cpSync('server/src/generated/.react', 'web/src/generated', {
130
129
  recursive: true,
131
130
  force: true,
132
131
  });
133
- fs.rmSync(`server/src/modules/${modelName}/entities`, {
132
+ fs.rmSync('server/src/generated/.react', { recursive: true, force: true });
133
+ fs.cpSync('web/src/generated/pages', 'web/src/pages', {
134
134
  recursive: true,
135
- force: true,
135
+ force: false,
136
136
  });
137
- });
138
- fs.cpSync('web/src/generated/pages', 'web/src/pages', {
139
- recursive: true,
140
- force: false,
141
- });
142
- fs.rmSync('web/src/generated/pages', { recursive: true, force: true });
143
- fs.mkdirSync('web/src/generated/types');
144
- fs.copyFileSync('server/node_modules/.prisma/client/index.d.ts', 'web/src/generated/types/prisma.types.d.ts');
145
- const prismaRegex = new RegExp("import \\* as runtime from '@prisma/client/runtime/index';");
146
- shell.sed('-i', prismaRegex, 'declare const runtime : any', 'web/src/generated/types/prisma.types.d.ts');
147
- shell.sed('-i', new RegExp('bigint', 'g'), 'number', 'web/src/generated/types/prisma.types.d.ts');
148
- fs.copyFileSync('config/.types.d.ts', 'web/src/generated/types/config.types.d.ts');
137
+ fs.rmSync('web/src/generated/pages', { recursive: true, force: true });
138
+ }
139
+ // 分发后端文件(!webOnly)
140
+ if (!webOnly) {
141
+ shell.cd('server/src/generated/');
142
+ const models = shell
143
+ .ls('-d', '*')
144
+ .filter((file) => shell.test('-d', file))
145
+ .filter((dir) => shell.test('-e', `${dir}/dto/${dir}.form.validator.ts`));
146
+ shell.cd('../../..');
147
+ models.forEach((modelName) => {
148
+ fs.mkdirSync(`web/src/generated/props/${modelName}`, {
149
+ recursive: true,
150
+ });
151
+ shell.mv('-f', `server/src/generated/${modelName}/dto/${modelName}.form.validator.ts`, `web/src/generated/props/${modelName}/form.validator.ts`);
152
+ fs.cpSync(`server/src/generated/${modelName}`, `server/src/modules/${modelName}`, { recursive: true, force: false });
153
+ shell.rm('-f', `server/src/generated/${modelName}/*.ts`);
154
+ fs.rmSync(`server/src/modules/${modelName}/dto`, {
155
+ recursive: true,
156
+ force: true,
157
+ });
158
+ fs.rmSync(`server/src/modules/${modelName}/entities`, {
159
+ recursive: true,
160
+ force: true,
161
+ });
162
+ });
163
+ }
164
+ // 更新 Prisma 类型文件(!webOnly)
165
+ if (!webOnly) {
166
+ fs.mkdirSync('web/src/generated/types', { recursive: true });
167
+ fs.copyFileSync('server/node_modules/.prisma/client/index.d.ts', 'web/src/generated/types/prisma.types.d.ts');
168
+ const prismaRegex = new RegExp("import \\* as runtime from '@prisma/client/runtime/index';");
169
+ shell.sed('-i', prismaRegex, 'declare const runtime : any', 'web/src/generated/types/prisma.types.d.ts');
170
+ shell.sed('-i', new RegExp('bigint', 'g'), 'number', 'web/src/generated/types/prisma.types.d.ts');
171
+ fs.copyFileSync('config/.types.d.ts', 'web/src/generated/types/config.types.d.ts');
172
+ }
149
173
  process.exit(0);
150
174
  });
151
175
  }
@@ -29,9 +29,16 @@ class GadminCollection extends abstract_collection_1.AbstractCollection {
29
29
  execute: { get: () => super.execute }
30
30
  });
31
31
  return __awaiter(this, void 0, void 0, function* () {
32
- if (['prisma', 'prisma:dev'].includes(name)) {
32
+ if (['prisma', 'prisma:dev', 'prisma:web', 'prisma:server'].includes(name)) {
33
33
  const prisma = new prisma_action_1.PrismaAction();
34
- return yield prisma.handle([], name.includes(':dev') ? [{ name: 'dev', value: true }] : []);
34
+ const opts = [];
35
+ if (name.includes(':dev'))
36
+ opts.push({ name: 'dev', value: true });
37
+ if (name.includes(':web'))
38
+ opts.push({ name: 'webOnly', value: true });
39
+ if (name.includes(':server'))
40
+ opts.push({ name: 'serverOnly', value: true });
41
+ return yield prisma.handle([], opts);
35
42
  }
36
43
  const schematic = this.validate(name);
37
44
  yield _super.execute.call(this, schematic, options);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gadmin2n/cli",
3
- "version": "0.0.78",
3
+ "version": "0.0.79",
4
4
  "description": "Gadmin - modern, fast, powerful node.js web framework (@cli)",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -47,7 +47,7 @@
47
47
  "@angular-devkit/core": "13.3.2",
48
48
  "@angular-devkit/schematics": "13.3.2",
49
49
  "@angular-devkit/schematics-cli": "13.3.2",
50
- "@gadmin2n/schematics": "^0.0.60",
50
+ "@gadmin2n/schematics": "^0.0.62",
51
51
  "abc": "^0.6.1",
52
52
  "chalk": "3.0.0",
53
53
  "chokidar": "3.5.3",