@gadmin2n/cli 0.0.78 → 0.0.80
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/actions/prisma.action.js
CHANGED
|
@@ -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,88 @@ 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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
104
|
+
else if (serverOnly) {
|
|
105
|
+
// 只清 server/src/generated/
|
|
106
|
+
fs.rmSync('server/src/generated', { recursive: true, force: true });
|
|
71
107
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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(
|
|
134
|
-
|
|
135
|
-
|
|
132
|
+
fs.rmSync('server/src/generated/.react', { recursive: true, force: true });
|
|
133
|
+
// pages 目录可能因所有模型都已存在而未生成,需判断后再复制
|
|
134
|
+
if (fs.existsSync('web/src/generated/pages')) {
|
|
135
|
+
fs.cpSync('web/src/generated/pages', 'web/src/pages', {
|
|
136
|
+
recursive: true,
|
|
137
|
+
force: false,
|
|
138
|
+
});
|
|
139
|
+
fs.rmSync('web/src/generated/pages', { recursive: true, force: true });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// 分发后端文件(!webOnly)
|
|
143
|
+
if (!webOnly) {
|
|
144
|
+
shell.cd('server/src/generated/');
|
|
145
|
+
const models = shell
|
|
146
|
+
.ls('-d', '*')
|
|
147
|
+
.filter((file) => shell.test('-d', file))
|
|
148
|
+
.filter((dir) => shell.test('-e', `${dir}/dto/${dir}.form.validator.ts`));
|
|
149
|
+
shell.cd('../../..');
|
|
150
|
+
models.forEach((modelName) => {
|
|
151
|
+
fs.mkdirSync(`web/src/generated/props/${modelName}`, {
|
|
152
|
+
recursive: true,
|
|
153
|
+
});
|
|
154
|
+
shell.mv('-f', `server/src/generated/${modelName}/dto/${modelName}.form.validator.ts`, `web/src/generated/props/${modelName}/form.validator.ts`);
|
|
155
|
+
fs.cpSync(`server/src/generated/${modelName}`, `server/src/modules/${modelName}`, { recursive: true, force: false });
|
|
156
|
+
shell.rm('-f', `server/src/generated/${modelName}/*.ts`);
|
|
157
|
+
fs.rmSync(`server/src/modules/${modelName}/dto`, {
|
|
158
|
+
recursive: true,
|
|
159
|
+
force: true,
|
|
160
|
+
});
|
|
161
|
+
fs.rmSync(`server/src/modules/${modelName}/entities`, {
|
|
162
|
+
recursive: true,
|
|
163
|
+
force: true,
|
|
164
|
+
});
|
|
136
165
|
});
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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');
|
|
166
|
+
}
|
|
167
|
+
// 更新 Prisma 类型文件(!webOnly)
|
|
168
|
+
if (!webOnly) {
|
|
169
|
+
fs.mkdirSync('web/src/generated/types', { recursive: true });
|
|
170
|
+
fs.copyFileSync('server/node_modules/.prisma/client/index.d.ts', 'web/src/generated/types/prisma.types.d.ts');
|
|
171
|
+
const prismaRegex = new RegExp("import \\* as runtime from '@prisma/client/runtime/index';");
|
|
172
|
+
shell.sed('-i', prismaRegex, 'declare const runtime : any', 'web/src/generated/types/prisma.types.d.ts');
|
|
173
|
+
shell.sed('-i', new RegExp('bigint', 'g'), 'number', 'web/src/generated/types/prisma.types.d.ts');
|
|
174
|
+
fs.copyFileSync('config/.types.d.ts', 'web/src/generated/types/config.types.d.ts');
|
|
175
|
+
}
|
|
149
176
|
process.exit(0);
|
|
150
177
|
});
|
|
151
178
|
}
|
|
@@ -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
|
-
|
|
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.
|
|
3
|
+
"version": "0.0.80",
|
|
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.
|
|
50
|
+
"@gadmin2n/schematics": "^0.0.63",
|
|
51
51
|
"abc": "^0.6.1",
|
|
52
52
|
"chalk": "3.0.0",
|
|
53
53
|
"chokidar": "3.5.3",
|