nsgm-cli 2.1.12 → 2.1.14

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 (113) hide show
  1. package/README.md +369 -163
  2. package/client/components/Button.tsx +3 -5
  3. package/client/components/__tests__/Button.test.tsx +10 -10
  4. package/client/layout/index.tsx +149 -137
  5. package/client/redux/reducers.ts +1 -1
  6. package/client/redux/store.ts +2 -1
  7. package/client/redux/template/manage/actions.ts +77 -88
  8. package/client/redux/template/manage/reducers.ts +25 -37
  9. package/client/redux/template/manage/types.ts +1 -1
  10. package/client/service/template/manage.ts +20 -21
  11. package/client/styled/common.ts +12 -13
  12. package/client/styled/layout/index.ts +19 -19
  13. package/client/styled/template/manage.ts +14 -13
  14. package/client/utils/common.ts +23 -21
  15. package/client/utils/cookie.ts +18 -19
  16. package/client/utils/fetch.ts +64 -100
  17. package/client/utils/menu.tsx +16 -3
  18. package/client/utils/sso.ts +74 -84
  19. package/eslint.config.js +38 -1
  20. package/generation/README.md +25 -18
  21. package/generation/__tests__/example.test.js +41 -0
  22. package/generation/client/utils/menu.tsx +9 -2
  23. package/generation/env.example +3 -0
  24. package/generation/eslint.config.js +112 -0
  25. package/generation/gitignore +6 -1
  26. package/generation/jest.config.js +40 -0
  27. package/generation/package.json +25 -4
  28. package/jest.config.js +23 -6
  29. package/lib/args.js +9 -1
  30. package/lib/cli/app.d.ts +28 -0
  31. package/lib/cli/app.js +99 -0
  32. package/lib/cli/commands/build.d.ts +2 -0
  33. package/lib/cli/commands/build.js +29 -0
  34. package/lib/cli/commands/create.d.ts +2 -0
  35. package/lib/cli/commands/create.js +113 -0
  36. package/lib/cli/commands/delete.d.ts +3 -0
  37. package/lib/cli/commands/delete.js +151 -0
  38. package/lib/cli/commands/export.d.ts +2 -0
  39. package/lib/cli/commands/export.js +42 -0
  40. package/lib/cli/commands/help.d.ts +2 -0
  41. package/lib/cli/commands/help.js +42 -0
  42. package/lib/cli/commands/init.d.ts +2 -0
  43. package/lib/cli/commands/init.js +115 -0
  44. package/lib/cli/commands/server.d.ts +3 -0
  45. package/lib/cli/commands/server.js +26 -0
  46. package/lib/cli/commands/upgrade.d.ts +2 -0
  47. package/lib/cli/commands/upgrade.js +38 -0
  48. package/lib/cli/commands/version.d.ts +2 -0
  49. package/lib/cli/commands/version.js +24 -0
  50. package/lib/cli/index.d.ts +16 -0
  51. package/lib/cli/index.js +33 -0
  52. package/lib/cli/parser.d.ts +22 -0
  53. package/lib/cli/parser.js +115 -0
  54. package/lib/cli/registry.d.ts +33 -0
  55. package/lib/cli/registry.js +81 -0
  56. package/lib/cli/types/project.d.ts +10 -0
  57. package/lib/cli/types/project.js +2 -0
  58. package/lib/cli/types.d.ts +31 -0
  59. package/lib/cli/types.js +20 -0
  60. package/lib/cli/utils/console.d.ts +62 -0
  61. package/lib/cli/utils/console.js +148 -0
  62. package/lib/cli/utils/index.d.ts +2 -0
  63. package/lib/cli/utils/index.js +7 -0
  64. package/lib/cli/utils/prompt.d.ts +83 -0
  65. package/lib/cli/utils/prompt.js +368 -0
  66. package/lib/constants.d.ts +58 -0
  67. package/lib/constants.js +162 -0
  68. package/lib/generate.d.ts +25 -3
  69. package/lib/generate.js +97 -621
  70. package/lib/generate_create.d.ts +9 -0
  71. package/lib/generate_create.js +326 -0
  72. package/lib/generate_delete.d.ts +8 -0
  73. package/lib/generate_delete.js +156 -0
  74. package/lib/generate_init.d.ts +50 -0
  75. package/lib/generate_init.js +492 -0
  76. package/lib/generators/base-generator.d.ts +47 -0
  77. package/lib/generators/base-generator.js +92 -0
  78. package/lib/generators/generator-factory.d.ts +20 -0
  79. package/lib/generators/generator-factory.js +25 -0
  80. package/lib/generators/page-generator.d.ts +41 -0
  81. package/lib/generators/page-generator.js +552 -0
  82. package/lib/generators/resolver-generator.d.ts +12 -0
  83. package/lib/generators/resolver-generator.js +303 -0
  84. package/lib/generators/schema-generator.d.ts +7 -0
  85. package/lib/generators/schema-generator.js +57 -0
  86. package/lib/generators/service-generator.d.ts +7 -0
  87. package/lib/generators/service-generator.js +119 -0
  88. package/lib/generators/sql-generator.d.ts +8 -0
  89. package/lib/generators/sql-generator.js +52 -0
  90. package/lib/index.d.ts +1 -1
  91. package/lib/index.js +14 -193
  92. package/lib/server/csrf.js +9 -16
  93. package/lib/server/db.js +6 -7
  94. package/lib/server/graphql.js +5 -6
  95. package/lib/server/plugins/date.js +1 -1
  96. package/lib/server/utils/graphql-cache.js +3 -3
  97. package/lib/tsconfig.build.tsbuildinfo +1 -1
  98. package/lib/utils/project-config.d.ts +5 -0
  99. package/lib/utils/project-config.js +145 -0
  100. package/lib/utils.js +1 -1
  101. package/next.config.js +12 -8
  102. package/package.json +10 -7
  103. package/pages/_app.tsx +23 -28
  104. package/pages/_document.tsx +39 -19
  105. package/pages/index.tsx +84 -39
  106. package/pages/login.tsx +21 -21
  107. package/pages/template/manage.tsx +114 -89
  108. package/public/fonts/font-awesome.min.css +4 -0
  109. package/public/fonts/fontawesome-webfont.woff +0 -0
  110. package/public/fonts/fontawesome-webfont.woff2 +0 -0
  111. package/public/slbhealthcheck.html +1 -1
  112. package/server/apis/template.js +0 -2
  113. package/generation/eslintrc.js +0 -16
@@ -0,0 +1,9 @@
1
+ import { FieldDefinition } from './cli/utils/prompt';
2
+ /**
3
+ * 创建控制器和动作相关的文件
4
+ * @param controller 控制器名称
5
+ * @param action 动作名称
6
+ * @param dictionary 目标目录路径(可选,默认为当前目录)
7
+ * @param fields 字段定义数组(可选)
8
+ */
9
+ export declare const createFiles: (controller: string, action: string, dictionary?: string, fields?: FieldDefinition[]) => void;
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.createFiles = void 0;
40
+ const path_1 = __importStar(require("path"));
41
+ const shelljs_1 = __importDefault(require("shelljs"));
42
+ const fs_1 = __importDefault(require("fs"));
43
+ const constants_1 = require("./constants");
44
+ const utils_1 = require("./utils");
45
+ const sql_generator_1 = require("./generators/sql-generator");
46
+ const schema_generator_1 = require("./generators/schema-generator");
47
+ const resolver_generator_1 = require("./generators/resolver-generator");
48
+ const service_generator_1 = require("./generators/service-generator");
49
+ const page_generator_1 = require("./generators/page-generator");
50
+ // 常量定义
51
+ const TEMPLATE_FILES = {
52
+ reduxActions: 'redux/template/manage/actions.ts',
53
+ reduxReducers: 'redux/template/manage/reducers.ts',
54
+ reduxTypes: 'redux/template/manage/types.ts',
55
+ styled: 'styled/template/manage.ts',
56
+ serverApi: 'apis/template.js',
57
+ };
58
+ const MYSQL_TIMEOUT = 1000;
59
+ // 辅助函数
60
+ const createDirectoryStructure = (basePaths) => {
61
+ basePaths.forEach((path) => (0, utils_1.mkdirSync)(path));
62
+ };
63
+ const generateFilePaths = (controller, action, dictionary = '.') => {
64
+ // 根据 dictionary 确定目标路径
65
+ const getDestPath = (basePath) => {
66
+ if (!dictionary || dictionary === '.') {
67
+ return basePath;
68
+ }
69
+ return path_1.default.join(constants_1.destFolder, dictionary, basePath.replace(`${constants_1.destFolder}/`, ''));
70
+ };
71
+ const paths = {
72
+ // Pages - 动态生成,不需要源文件
73
+ destPagesController: (0, path_1.resolve)(`${getDestPath(constants_1.destPagesPath)}/${controller}`),
74
+ destPagesAction: (0, path_1.resolve)(`${getDestPath(constants_1.destPagesPath)}/${controller}/${action}.tsx`),
75
+ // Client Redux - 使用模板
76
+ destClientReduxController: (0, path_1.resolve)(`${getDestPath(constants_1.destClientReduxPath)}/${controller}`),
77
+ destClientReduxControllerAction: (0, path_1.resolve)(`${getDestPath(constants_1.destClientReduxPath)}/${controller}/${action}`),
78
+ sourceClientReduxActions: (0, path_1.resolve)(`${constants_1.sourceClientPath}/${TEMPLATE_FILES.reduxActions}`),
79
+ sourceClientReduxReducers: (0, path_1.resolve)(`${constants_1.sourceClientPath}/${TEMPLATE_FILES.reduxReducers}`),
80
+ sourceClientReduxTypes: (0, path_1.resolve)(`${constants_1.sourceClientPath}/${TEMPLATE_FILES.reduxTypes}`),
81
+ destClientReduxActions: (0, path_1.resolve)(`${getDestPath(constants_1.destClientReduxPath)}/${controller}/${action}/actions.ts`),
82
+ destClientReduxReducers: (0, path_1.resolve)(`${getDestPath(constants_1.destClientReduxPath)}/${controller}/${action}/reducers.ts`),
83
+ destClientReduxTypes: (0, path_1.resolve)(`${getDestPath(constants_1.destClientReduxPath)}/${controller}/${action}/types.ts`),
84
+ // Client Service - 动态生成
85
+ destClientServiceController: (0, path_1.resolve)(`${getDestPath(constants_1.destClientServicePath)}/${controller}`),
86
+ destClientAction: (0, path_1.resolve)(`${getDestPath(constants_1.destClientServicePath)}/${controller}/${action}.ts`),
87
+ // Client Styled - 使用模板
88
+ sourceClientStyledAction: (0, path_1.resolve)(`${constants_1.sourceClientPath}/${TEMPLATE_FILES.styled}`),
89
+ destClientStyledController: (0, path_1.resolve)(`${getDestPath(constants_1.destClientStyledPath)}/${controller}`),
90
+ destClientStyledAction: (0, path_1.resolve)(`${getDestPath(constants_1.destClientStyledPath)}/${controller}/${action}.ts`),
91
+ // Server Modules - 动态生成
92
+ destServerModulesController: (0, path_1.resolve)(`${getDestPath(constants_1.destServerModulesPath)}/${controller}`),
93
+ destServerModulesResolver: (0, path_1.resolve)(`${getDestPath(constants_1.destServerModulesPath)}/${controller}/resolver.js`),
94
+ destServerModulesSchema: (0, path_1.resolve)(`${getDestPath(constants_1.destServerModulesPath)}/${controller}/schema.js`),
95
+ // Server APIs - 使用模板
96
+ sourceServerApisController: (0, path_1.resolve)(`${constants_1.sourceServerPath}/${TEMPLATE_FILES.serverApi}`),
97
+ destServerApisController: (0, path_1.resolve)(`${getDestPath(constants_1.destServerApisPath)}/${controller}.js`),
98
+ // Server SQL - 动态生成
99
+ destServerSqlController: (0, path_1.resolve)(`${getDestPath(constants_1.destServerSqlPath)}/${controller}.sql`),
100
+ // Configuration files
101
+ destClientReduxReducersAllPath: !dictionary || dictionary === '.'
102
+ ? constants_1.destClientReduxReducersAllPath
103
+ : (0, path_1.resolve)(`${getDestPath(constants_1.destClientReduxPath)}/reducers.ts`),
104
+ destServerRestPath: !dictionary || dictionary === '.' ? constants_1.destServerRestPath : (0, path_1.resolve)(`${getDestPath(constants_1.destServerPath)}/rest.js`),
105
+ destClientUtilsMenuPath: !dictionary || dictionary === '.'
106
+ ? constants_1.destClientUtilsMenuPath
107
+ : (0, path_1.resolve)(`${getDestPath(constants_1.destClientPath)}/utils/menu.tsx`),
108
+ };
109
+ return paths;
110
+ };
111
+ const performBasicReplacements = (controller, action, paths) => {
112
+ const replacements = [
113
+ {
114
+ regex: 'template',
115
+ replacement: controller,
116
+ paths: [
117
+ paths.destPagesAction,
118
+ paths.destClientAction,
119
+ paths.destClientReduxActions,
120
+ paths.destClientReduxReducers,
121
+ paths.destServerModulesResolver,
122
+ paths.destServerModulesSchema,
123
+ paths.destServerApisController,
124
+ ],
125
+ },
126
+ {
127
+ regex: 'Template',
128
+ replacement: (0, utils_1.firstUpperCase)(controller),
129
+ paths: [
130
+ paths.destPagesAction,
131
+ paths.destClientAction,
132
+ paths.destClientReduxActions,
133
+ paths.destServerModulesSchema,
134
+ paths.destServerApisController,
135
+ ],
136
+ },
137
+ {
138
+ regex: 'TEMPLATE',
139
+ replacement: controller.toUpperCase(),
140
+ paths: [paths.destClientReduxActions, paths.destClientReduxReducers, paths.destClientReduxTypes],
141
+ },
142
+ {
143
+ regex: 'manage',
144
+ replacement: action,
145
+ paths: [paths.destPagesAction, paths.destClientReduxActions],
146
+ },
147
+ {
148
+ regex: 'Manage',
149
+ replacement: (0, utils_1.firstUpperCase)(action),
150
+ paths: [paths.destPagesAction, paths.destClientReduxReducers],
151
+ },
152
+ ];
153
+ replacements.forEach((rule) => {
154
+ (0, utils_1.handleReplace)(rule);
155
+ });
156
+ };
157
+ const performAdvancedReplacements = (controller, action, paths) => {
158
+ const optionsArr = [
159
+ {
160
+ from: /\n\s*\n/,
161
+ to: `\nimport { ${controller}${(0, utils_1.firstUpperCase)(action)}Reducer } from './${controller}/${action}/reducers'\n\n`,
162
+ files: [paths.destClientReduxReducersAllPath],
163
+ },
164
+ {
165
+ from: /Reducer,?\s*\n/,
166
+ to: `Reducer,\n ${controller}${(0, utils_1.firstUpperCase)(action)}: ${controller}${(0, utils_1.firstUpperCase)(action)}Reducer\n`,
167
+ files: [paths.destClientReduxReducersAllPath],
168
+ },
169
+ {
170
+ from: /'(.\/apis\/template.*?)'\)\s*\n/,
171
+ to: `'./apis/template')\nconst ${controller} = require('./apis/${controller}')\n`,
172
+ files: [paths.destServerRestPath],
173
+ },
174
+ {
175
+ from: /template\)\s*\n/,
176
+ to: `template)\nrouter.use('/${controller}', ${controller})\n`,
177
+ files: [paths.destServerRestPath],
178
+ },
179
+ {
180
+ from: /\/\*\{\s*\n\s*key: \(\+\+key\)\.toString\(\),/,
181
+ to: `{\n // ${controller}_${action}_start\n key: (++key).toString(),\n text: '${controller}',\n url: '/${controller}/${action}',\n icon: <SolutionOutlined rev={undefined} />,\n ` +
182
+ `subMenus: [\n {\n key: \`\${key}_1\`,\n text: '${action}',\n url: '/${controller}/${action}'\n }\n ]\n // ${controller}_${action}_end\n },\n /*{\n key: (++key).toString(),`,
183
+ files: [paths.destClientUtilsMenuPath],
184
+ },
185
+ ];
186
+ if (constants_1.isLocal) {
187
+ optionsArr.push({
188
+ from: /'nsgm-cli'\)/,
189
+ to: "'../../../index')",
190
+ files: [paths.destServerModulesResolver],
191
+ });
192
+ }
193
+ // 清理之前的配置
194
+ shelljs_1.default.sed('-i', /.*${controller}${firstUpperCase(action)}Reducer.*/, '', paths.destClientReduxReducersAllPath);
195
+ shelljs_1.default.sed('-i', /.*${controller}.*/, '', paths.destServerRestPath);
196
+ setTimeout(() => {
197
+ (0, utils_1.replaceInFileAll)(optionsArr, 0, () => {
198
+ console.log('special replace dest files finished');
199
+ });
200
+ }, MYSQL_TIMEOUT);
201
+ };
202
+ /**
203
+ * 生成动态文件内容 - 使用专门的生成器
204
+ */
205
+ const generateDynamicFiles = (controller, _action, paths, fields) => {
206
+ // 创建生成器实例
207
+ const sqlGenerator = new sql_generator_1.SQLGenerator(controller, _action, fields);
208
+ const schemaGenerator = new schema_generator_1.SchemaGenerator(controller, _action, fields);
209
+ const resolverGenerator = new resolver_generator_1.ResolverGenerator(controller, _action, fields);
210
+ const serviceGenerator = new service_generator_1.ServiceGenerator(controller, _action, fields);
211
+ const pageGenerator = new page_generator_1.PageGenerator(controller, _action, fields);
212
+ // 生成并写入文件
213
+ fs_1.default.writeFileSync(paths.destServerSqlController, sqlGenerator.generate());
214
+ fs_1.default.writeFileSync(paths.destServerModulesSchema, schemaGenerator.generate());
215
+ fs_1.default.writeFileSync(paths.destServerModulesResolver, resolverGenerator.generate());
216
+ fs_1.default.writeFileSync(paths.destClientAction, serviceGenerator.generate());
217
+ fs_1.default.writeFileSync(paths.destPagesAction, pageGenerator.generate());
218
+ };
219
+ /**
220
+ * 复制并自定义模板文件
221
+ */
222
+ const copyAndCustomizeTemplateFiles = (paths, _fields) => {
223
+ // 只复制 Redux 相关的模板文件,其他文件已经动态生成
224
+ const fileMappings = [
225
+ [paths.sourceClientReduxActions, paths.destClientReduxActions],
226
+ [paths.sourceClientReduxReducers, paths.destClientReduxReducers],
227
+ [paths.sourceClientReduxTypes, paths.destClientReduxTypes],
228
+ [paths.sourceClientStyledAction, paths.destClientStyledAction],
229
+ [paths.sourceServerApisController, paths.destServerApisController],
230
+ ];
231
+ fileMappings.forEach(([source, dest]) => {
232
+ (0, utils_1.copyFileSync)(source, dest);
233
+ });
234
+ };
235
+ /**
236
+ * 设置动态数据库
237
+ */
238
+ const setupDynamicDatabase = (_controller, paths, _fields) => {
239
+ // SQL 文件已经在 generateDynamicFiles 中生成,这里直接执行
240
+ const mysqlCommand = `mysql -u${constants_1.mysqlUser} -p${constants_1.mysqlPassword} -h${constants_1.mysqlHost} -P${constants_1.mysqlPort} < ${paths.destServerSqlController}`;
241
+ try {
242
+ shelljs_1.default.exec(mysqlCommand);
243
+ console.log('Dynamic database setup completed');
244
+ }
245
+ catch (error) {
246
+ console.error('Failed to execute dynamic SQL script:', error);
247
+ }
248
+ };
249
+ /**
250
+ * 创建控制器和动作相关的文件
251
+ * @param controller 控制器名称
252
+ * @param action 动作名称
253
+ * @param dictionary 目标目录路径(可选,默认为当前目录)
254
+ * @param fields 字段定义数组(可选)
255
+ */
256
+ const createFiles = (controller, action, dictionary, fields) => {
257
+ console.log('createFiles', constants_1.sourceFolder, constants_1.destFolder, constants_1.isLocal, controller, action, dictionary);
258
+ try {
259
+ // 如果没有提供字段定义,使用默认字段
260
+ const defaultFields = [
261
+ { name: 'id', type: 'integer', required: true, comment: '主键', isPrimaryKey: true, isAutoIncrement: true },
262
+ {
263
+ name: 'name',
264
+ type: 'varchar',
265
+ length: 100,
266
+ required: true,
267
+ comment: '名称',
268
+ showInList: true,
269
+ showInForm: true,
270
+ searchable: true,
271
+ },
272
+ { name: 'create_date', type: 'timestamp', required: true, comment: '创建时间', isSystemField: true },
273
+ { name: 'update_date', type: 'timestamp', required: true, comment: '更新时间', isSystemField: true },
274
+ ];
275
+ const finalFields = fields && fields.length > 0 ? fields : defaultFields;
276
+ // 1. 生成文件路径
277
+ const paths = generateFilePaths(controller, action, dictionary);
278
+ // 2. 根据 dictionary 确定基础路径
279
+ const getDestPath = (basePath) => {
280
+ if (!dictionary || dictionary === '.') {
281
+ return basePath;
282
+ }
283
+ return path_1.default.join(constants_1.destFolder, dictionary, basePath.replace(`${constants_1.destFolder}/`, ''));
284
+ };
285
+ // 3. 创建目录结构(包括基础目录和特定目录)
286
+ const basePaths = [
287
+ getDestPath(constants_1.destClientPath),
288
+ getDestPath(constants_1.destServerPath),
289
+ getDestPath(constants_1.destPagesPath),
290
+ getDestPath(constants_1.destClientReduxPath),
291
+ getDestPath(constants_1.destClientServicePath),
292
+ getDestPath(constants_1.destClientStyledPath),
293
+ getDestPath(constants_1.destServerModulesPath),
294
+ getDestPath(constants_1.destServerApisPath),
295
+ getDestPath(constants_1.destServerSqlPath),
296
+ paths.destPagesController,
297
+ paths.destClientReduxController,
298
+ paths.destClientReduxControllerAction,
299
+ paths.destClientServiceController,
300
+ paths.destClientStyledController,
301
+ paths.destServerModulesController,
302
+ ];
303
+ createDirectoryStructure(basePaths);
304
+ console.log('Directory structure created');
305
+ // 4. 生成动态文件内容
306
+ generateDynamicFiles(controller, action, paths, finalFields);
307
+ console.log('Dynamic files generated');
308
+ // 5. 复制并自定义模板文件
309
+ copyAndCustomizeTemplateFiles(paths, finalFields);
310
+ console.log('Template files processed');
311
+ // 6. 执行基本替换
312
+ performBasicReplacements(controller, action, paths);
313
+ console.log('Basic replacements completed');
314
+ // 7. 执行高级替换
315
+ performAdvancedReplacements(controller, action, paths);
316
+ console.log('Advanced replacements initiated');
317
+ // 8. 设置数据库
318
+ setupDynamicDatabase(controller, paths, finalFields);
319
+ console.log('createFiles completed successfully');
320
+ }
321
+ catch (error) {
322
+ console.error('Failed to create files:', error);
323
+ throw error;
324
+ }
325
+ };
326
+ exports.createFiles = createFiles;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 删除控制器相关的文件
3
+ * @param controller 控制器名称
4
+ * @param action 动作名称,传入 'all' 删除整个控制器
5
+ * @param deleteDBFlag 是否删除数据库表
6
+ * @param dictionary 目标目录路径(可选,默认为当前目录)
7
+ */
8
+ export declare const deleteFiles: (controller: string, action: string, deleteDBFlag?: boolean, dictionary?: string) => void;
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.deleteFiles = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const shelljs_1 = __importDefault(require("shelljs"));
9
+ const constants_1 = require("./constants");
10
+ const utils_1 = require("./utils");
11
+ // 常量定义
12
+ const CLEANUP_TIMEOUT = 1000;
13
+ // 辅助函数
14
+ const generateDeletePaths = (controller, action, dictionary) => {
15
+ const basePath = dictionary || process.cwd();
16
+ return {
17
+ destPagesController: path_1.default.join(basePath, 'pages', controller),
18
+ destClientReduxController: path_1.default.join(basePath, 'client', 'redux', controller),
19
+ destClientServiceController: path_1.default.join(basePath, 'client', 'service', controller),
20
+ destClientStyledController: path_1.default.join(basePath, 'client', 'styled', controller),
21
+ destServerModulesController: path_1.default.join(basePath, 'server', 'modules', controller),
22
+ destServerApisController: path_1.default.join(basePath, 'server', 'apis', `${controller}.js`),
23
+ destServerSqlController: path_1.default.join(basePath, 'server', 'sql', `${controller}.sql`),
24
+ // 配置文件路径
25
+ destClientReduxReducersAllPath: path_1.default.join(basePath, 'client', 'redux', 'reducers.ts'),
26
+ destClientUtilsMenuPath: path_1.default.join(basePath, 'client', 'utils', 'menu.tsx'),
27
+ destServerRestPath: path_1.default.join(basePath, 'server', 'rest.js'),
28
+ ...(action && {
29
+ destPagesAction: path_1.default.join(basePath, 'pages', controller, `${action}.tsx`),
30
+ destClientReduxControllerAction: path_1.default.join(basePath, 'client', 'redux', controller, action),
31
+ destClientAction: path_1.default.join(basePath, 'client', 'components', controller, action),
32
+ destClientStyledAction: path_1.default.join(basePath, 'client', 'styled', controller, `${action}.js`),
33
+ }),
34
+ };
35
+ };
36
+ const deleteAllControllerFiles = (paths) => {
37
+ const directoriesToDelete = [
38
+ paths.destPagesController,
39
+ paths.destClientReduxController,
40
+ paths.destClientServiceController,
41
+ paths.destClientStyledController,
42
+ paths.destServerModulesController,
43
+ ];
44
+ const filesToDelete = [paths.destServerApisController, paths.destServerSqlController];
45
+ directoriesToDelete.forEach((dir) => (0, utils_1.rmdirSync)(dir));
46
+ filesToDelete.forEach((file) => (0, utils_1.rmFileSync)(file));
47
+ };
48
+ const deleteSpecificActionFiles = (paths) => {
49
+ if (paths.destPagesAction) {
50
+ (0, utils_1.rmFileSync)(paths.destPagesAction);
51
+ }
52
+ if (paths.destClientReduxControllerAction) {
53
+ (0, utils_1.rmdirSync)(paths.destClientReduxControllerAction);
54
+ }
55
+ if (paths.destClientAction) {
56
+ (0, utils_1.rmFileSync)(paths.destClientAction);
57
+ }
58
+ if (paths.destClientStyledAction) {
59
+ (0, utils_1.rmFileSync)(paths.destClientStyledAction);
60
+ }
61
+ };
62
+ const cleanupConfigurationFiles = (controller, action, paths) => {
63
+ if (action === 'all') {
64
+ // 清理所有控制器相关的配置
65
+ shelljs_1.default.sed('-i', new RegExp(`.*${controller}.*Reducer.*`, 'g'), '', paths.destClientReduxReducersAllPath);
66
+ shelljs_1.default.sed('-i', new RegExp(`.*${controller}.*`, 'g'), '', paths.destServerRestPath);
67
+ }
68
+ else {
69
+ // 清理特定动作的配置
70
+ shelljs_1.default.sed('-i', new RegExp(`.*${controller}${(0, utils_1.firstUpperCase)(action)}Reducer.*`, 'g'), '', paths.destClientReduxReducersAllPath);
71
+ }
72
+ };
73
+ const performDatabaseCleanup = (controller, paths) => {
74
+ try {
75
+ shelljs_1.default.sed('-i', new RegExp(`${constants_1.mysqlDatabase};`, 'g'), `${constants_1.mysqlDatabase};\nDROP TABLE \`${controller}\`;\n/*`, paths.destServerSqlController);
76
+ shelljs_1.default.sed('-i', /utf8mb4;/g, 'utf8mb4;\n*/', paths.destServerSqlController);
77
+ const mysqlCommand = `mysql -u${constants_1.mysqlUser} -p${constants_1.mysqlPassword} -h${constants_1.mysqlHost} -P${constants_1.mysqlPort} < ${paths.destServerSqlController}`;
78
+ shelljs_1.default.exec(mysqlCommand);
79
+ console.log('Database cleanup completed');
80
+ }
81
+ catch (error) {
82
+ console.error('Failed to execute database cleanup:', error);
83
+ }
84
+ };
85
+ const performAdvancedCleanup = (controller, action, paths) => {
86
+ const cleanupRules = [
87
+ {
88
+ from: /\n\s*\n/,
89
+ to: '\n\n',
90
+ files: [paths.destClientReduxReducersAllPath],
91
+ },
92
+ {
93
+ from: /Reducer,?\s*\n/,
94
+ to: 'Reducer\n',
95
+ files: [paths.destClientReduxReducersAllPath],
96
+ },
97
+ ];
98
+ if (action === 'all') {
99
+ cleanupRules.push({
100
+ from: /'(.\/apis\/template.*?)'\)\s*\n/,
101
+ to: "'./apis/template')\n\n",
102
+ files: [paths.destServerRestPath],
103
+ }, {
104
+ from: /template\)\s*\n/,
105
+ to: 'template)\n\n',
106
+ files: [paths.destServerRestPath],
107
+ }, {
108
+ from: new RegExp(`,?\\s*{\\s*//\\s*${controller}_.*_start[\\s\\S]*?//\\s*${controller}_.*_end\\s*}\\s*,?`, 'gm'),
109
+ to: ',',
110
+ files: [paths.destClientUtilsMenuPath],
111
+ });
112
+ }
113
+ setTimeout(() => {
114
+ (0, utils_1.replaceInFileAll)(cleanupRules, 0, () => {
115
+ console.log('Advanced cleanup completed');
116
+ });
117
+ }, CLEANUP_TIMEOUT);
118
+ };
119
+ /**
120
+ * 删除控制器相关的文件
121
+ * @param controller 控制器名称
122
+ * @param action 动作名称,传入 'all' 删除整个控制器
123
+ * @param deleteDBFlag 是否删除数据库表
124
+ * @param dictionary 目标目录路径(可选,默认为当前目录)
125
+ */
126
+ const deleteFiles = (controller, action, deleteDBFlag = false, dictionary) => {
127
+ console.log('deleteFiles', constants_1.sourceFolder, constants_1.destFolder, constants_1.isLocal, controller, action, deleteDBFlag, dictionary);
128
+ try {
129
+ // 1. 生成删除路径
130
+ const paths = generateDeletePaths(controller, action, dictionary);
131
+ // 2. 删除文件和目录
132
+ if (action === 'all') {
133
+ console.log('Deleting all controller files...');
134
+ deleteAllControllerFiles(paths);
135
+ }
136
+ else {
137
+ console.log(`Deleting specific action files for ${action}...`);
138
+ deleteSpecificActionFiles(paths);
139
+ }
140
+ // 3. 清理配置文件
141
+ cleanupConfigurationFiles(controller, action, paths);
142
+ console.log('Configuration files cleaned up');
143
+ // 4. 处理数据库清理(仅在删除整个控制器且设置了标志时)
144
+ if (action === 'all' && deleteDBFlag) {
145
+ performDatabaseCleanup(controller, paths);
146
+ }
147
+ // 5. 执行高级清理
148
+ performAdvancedCleanup(controller, action, paths);
149
+ console.log('deleteFiles completed successfully');
150
+ }
151
+ catch (error) {
152
+ console.error('Failed to delete files:', error);
153
+ throw error;
154
+ }
155
+ };
156
+ exports.deleteFiles = deleteFiles;
@@ -0,0 +1,50 @@
1
+ interface InitResult {
2
+ [key: string]: string;
3
+ }
4
+ /**
5
+ * 初始化客户端文件
6
+ * @param dictionary 目标目录名称
7
+ * @param newDestFolder 新的目标文件夹路径
8
+ * @param upgradeFlag 是否为升级模式
9
+ */
10
+ export declare const initClientFiles: (dictionary: string, newDestFolder: string, upgradeFlag: boolean) => InitResult;
11
+ /**
12
+ * 初始化页面文件
13
+ * @param dictionary 目标目录名称
14
+ * @param newDestFolder 新的目标文件夹路径
15
+ * @param upgradeFlag 是否为升级模式
16
+ */
17
+ export declare const initPagesFiles: (dictionary: string, newDestFolder: string, upgradeFlag: boolean) => void;
18
+ /**
19
+ * 初始化服务器文件
20
+ * @param dictionary 目标目录名称
21
+ * @param newDestFolder 新的目标文件夹路径
22
+ * @param upgradeFlag 是否为升级模式
23
+ */
24
+ export declare const initServerFiles: (dictionary: string, newDestFolder: string, upgradeFlag: boolean) => InitResult;
25
+ /**
26
+ * 初始化公共文件
27
+ * @param dictionary 目标目录名称
28
+ * @param newDestFolder 新的目标文件夹路径
29
+ * @param upgradeFlag 是否为升级模式
30
+ */
31
+ export declare const initPublicFiles: (dictionary: string, newDestFolder: string, upgradeFlag: boolean) => InitResult;
32
+ /**
33
+ * 初始化脚本文件
34
+ * @param dictionary 目标目录名称
35
+ * @param newDestFolder 新的目标文件夹路径
36
+ */
37
+ export declare const initScriptsFiles: (dictionary: string, newDestFolder: string) => void;
38
+ /**
39
+ * 初始化根目录文件
40
+ * @param dictionary 目标目录名称
41
+ * @param newDestFolder 新的目标文件夹路径
42
+ */
43
+ export declare const initRootFiles: (dictionary: string, newDestFolder: string) => InitResult;
44
+ /**
45
+ * 初始化测试文件和目录
46
+ * @param dictionary 目标目录名称
47
+ * @param newDestFolder 新的目标文件夹路径
48
+ */
49
+ export declare const initTestFiles: (dictionary: string, newDestFolder: string) => void;
50
+ export {};