@strapi/generators 5.30.0 → 5.31.0

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 (56) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +1 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.mjs +1 -2
  5. package/dist/index.mjs.map +1 -1
  6. package/dist/plops/api.d.ts.map +1 -1
  7. package/dist/plops/api.js +79 -11
  8. package/dist/plops/api.js.map +1 -1
  9. package/dist/plops/api.mjs +79 -11
  10. package/dist/plops/api.mjs.map +1 -1
  11. package/dist/plops/content-type.d.ts.map +1 -1
  12. package/dist/plops/content-type.js +98 -2
  13. package/dist/plops/content-type.js.map +1 -1
  14. package/dist/plops/content-type.mjs +98 -2
  15. package/dist/plops/content-type.mjs.map +1 -1
  16. package/dist/plops/controller.d.ts.map +1 -1
  17. package/dist/plops/controller.js +35 -2
  18. package/dist/plops/controller.js.map +1 -1
  19. package/dist/plops/controller.mjs +35 -2
  20. package/dist/plops/controller.mjs.map +1 -1
  21. package/dist/plops/middleware.d.ts.map +1 -1
  22. package/dist/plops/middleware.js +35 -2
  23. package/dist/plops/middleware.js.map +1 -1
  24. package/dist/plops/middleware.mjs +35 -2
  25. package/dist/plops/middleware.mjs.map +1 -1
  26. package/dist/plops/migration.js.map +1 -1
  27. package/dist/plops/migration.mjs.map +1 -1
  28. package/dist/plops/policy.d.ts.map +1 -1
  29. package/dist/plops/policy.js +35 -2
  30. package/dist/plops/policy.js.map +1 -1
  31. package/dist/plops/policy.mjs +35 -2
  32. package/dist/plops/policy.mjs.map +1 -1
  33. package/dist/plops/prompts/get-destination-prompts.d.ts +1 -1
  34. package/dist/plops/service.d.ts.map +1 -1
  35. package/dist/plops/service.js +35 -2
  36. package/dist/plops/service.js.map +1 -1
  37. package/dist/plops/service.mjs +35 -2
  38. package/dist/plops/service.mjs.map +1 -1
  39. package/dist/plops/utils/extend-plugin-index-files.d.ts +8 -0
  40. package/dist/plops/utils/extend-plugin-index-files.d.ts.map +1 -0
  41. package/dist/plops/utils/extend-plugin-index-files.js +356 -0
  42. package/dist/plops/utils/extend-plugin-index-files.js.map +1 -0
  43. package/dist/plops/utils/extend-plugin-index-files.mjs +335 -0
  44. package/dist/plops/utils/extend-plugin-index-files.mjs.map +1 -0
  45. package/dist/plops/utils/get-file-path.d.ts +1 -1
  46. package/dist/plops/utils/get-file-path.js +2 -2
  47. package/dist/plops/utils/get-file-path.js.map +1 -1
  48. package/dist/plops/utils/get-file-path.mjs +2 -2
  49. package/dist/plops/utils/get-file-path.mjs.map +1 -1
  50. package/dist/templates/js/plugin/plugin.index.js.hbs +3 -0
  51. package/dist/templates/js/plugin/plugin.routes.index.js.hbs +12 -0
  52. package/dist/templates/js/plugin/plugin.routes.type.index.js.hbs +6 -0
  53. package/dist/templates/ts/plugin/plugin.index.ts.hbs +1 -0
  54. package/dist/templates/ts/plugin/plugin.routes.index.ts.hbs +9 -0
  55. package/dist/templates/ts/plugin/plugin.routes.type.index.ts.hbs +4 -0
  56. package/package.json +10 -6
@@ -0,0 +1,335 @@
1
+ import * as jscodeshift from 'jscodeshift';
2
+ import camelCase from 'lodash/camelCase';
3
+
4
+ const j = jscodeshift.withParser('tsx');
5
+ // Helper to check if a string is a valid JavaScript identifier
6
+ const isValidIdentifier = (str)=>{
7
+ return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(str);
8
+ };
9
+ // Helper to create the appropriate property based on type
10
+ const createProperty = (config)=>{
11
+ const { type, singularName } = config;
12
+ const camelCaseName = camelCase(singularName);
13
+ const varName = type === 'content-type' ? `${camelCaseName}Schema` : camelCaseName;
14
+ // Use string literal for key only if singularName is not a valid identifier
15
+ const keyNode = isValidIdentifier(singularName) ? j.identifier(singularName) : j.literal(singularName);
16
+ switch(type){
17
+ case 'content-type':
18
+ return j.objectProperty(keyNode, j.objectExpression([
19
+ j.objectProperty(j.identifier('schema'), j.identifier(varName))
20
+ ]));
21
+ case 'index':
22
+ return j.objectProperty(keyNode, j.identifier(varName));
23
+ case 'routes':
24
+ return j.spreadElement(j.memberExpression(j.identifier(varName), j.identifier('routes')));
25
+ default:
26
+ throw new Error(`Unknown append type: ${type}`);
27
+ }
28
+ };
29
+ // Helper to check if property already exists
30
+ const hasExistingProperty = (obj, config)=>{
31
+ const { type, singularName } = config;
32
+ if (!obj?.properties && !j.ArrayExpression.check(obj)) return false;
33
+ const elements = j.ArrayExpression.check(obj) ? obj.elements : obj.properties;
34
+ if (!elements) return false;
35
+ if (type === 'routes') {
36
+ // Check for spread elements ...camelCaseName.routes
37
+ const camelCaseName = camelCase(singularName);
38
+ return elements.some((element)=>j.SpreadElement.check(element) && j.MemberExpression.check(element.argument) && j.Identifier.check(element.argument.object) && element.argument.object.name === camelCaseName && j.Identifier.check(element.argument.property) && element.argument.property.name === 'routes');
39
+ }
40
+ // For content-type and index, check for object property (both identifier and literal keys)
41
+ return elements.some((prop)=>j.ObjectProperty.check(prop) && (j.Identifier.check(prop.key) && prop.key.name === singularName || j.Literal.check(prop.key) && prop.key.value === singularName));
42
+ };
43
+ // Helper to add property to object if it doesn't exist
44
+ const addPropertyToObject = (obj, config)=>{
45
+ if (!obj || hasExistingProperty(obj, config)) return;
46
+ if (config.type === 'routes' && j.ArrayExpression.check(obj)) {
47
+ obj.elements.push(createRoutesElement(config));
48
+ } else if (obj.properties?.length >= 0) {
49
+ obj.properties.push(createProperty(config));
50
+ }
51
+ };
52
+ // Helper to find and add to routes array
53
+ const handleRoutesArray = (obj, config)=>{
54
+ if (!obj?.properties) return false;
55
+ const routesProp = obj.properties.find((prop)=>j.ObjectProperty.check(prop) && (j.Identifier.check(prop.key) && prop.key.name === 'routes' || j.Literal.check(prop.key) && prop.key.value === 'routes') && j.ArrayExpression.check(prop.value));
56
+ if (routesProp?.value) {
57
+ const routesArray = routesProp.value;
58
+ if (!hasExistingProperty(routesArray, config)) {
59
+ routesArray.elements = routesArray.elements || [];
60
+ routesArray.elements.push(createRoutesElement(config));
61
+ }
62
+ return true;
63
+ }
64
+ return false;
65
+ };
66
+ // Helper to create routes array element (always returns SpreadElement for routes)
67
+ const createRoutesElement = (config)=>{
68
+ const { singularName } = config;
69
+ const camelCaseName = camelCase(singularName);
70
+ return j.spreadElement(j.memberExpression(j.identifier(camelCaseName), j.identifier('routes')));
71
+ };
72
+ // Helper to create new export for routes
73
+ const createRoutesExport = (config)=>{
74
+ return j.arrowFunctionExpression([], j.objectExpression([
75
+ j.objectProperty(j.identifier('type'), j.literal('content-api')),
76
+ j.objectProperty(j.identifier('routes'), j.arrayExpression([
77
+ createRoutesElement(config)
78
+ ]))
79
+ ]));
80
+ };
81
+ // Unified append function for all types
82
+ const appendToFile = (template, config)=>{
83
+ if (!config?.singularName || !config?.type) {
84
+ throw new Error('Invalid config: singularName and type are required');
85
+ }
86
+ const normalizedTemplate = template?.trim() || '';
87
+ const root = normalizedTemplate ? j(normalizedTemplate) : j(j.program([]));
88
+ const { type, singularName } = config;
89
+ const isEsm = detectModuleFormat(normalizedTemplate) === 'esm';
90
+ const camelCaseName = camelCase(singularName);
91
+ const varName = type === 'content-type' ? `${camelCaseName}Schema` : camelCaseName;
92
+ const source = type === 'content-type' ? `./${singularName}/schema.json` : `./${singularName}`;
93
+ addImportIfMissing(root, varName, source, isEsm);
94
+ if (isEsm) {
95
+ handleEsmExport(root, config, type);
96
+ } else {
97
+ handleCjsExport(root, config, type);
98
+ }
99
+ return root.toSource({
100
+ quote: 'single'
101
+ });
102
+ };
103
+ // Helper to detect module format
104
+ const detectModuleFormat = (template)=>{
105
+ const hasImport = /^import\s/.test(template) || template.includes('import ');
106
+ const hasExportDefault = template.includes('export default');
107
+ const hasRequire = template.includes('require(');
108
+ const hasModuleExports = template.includes('module.exports');
109
+ if (hasImport || hasExportDefault) return 'esm';
110
+ if (hasRequire || hasModuleExports) return 'cjs';
111
+ return 'esm'; // Default to ESM
112
+ };
113
+ // Helper to insert statement at appropriate location
114
+ const insertStatement = (root, statement, preferredLocation)=>{
115
+ if (preferredLocation && preferredLocation.length > 0) {
116
+ preferredLocation.at(-1).insertAfter(statement);
117
+ } else {
118
+ const firstStatement = root.find(j.Statement).at(0);
119
+ if (firstStatement.length > 0) {
120
+ firstStatement.insertBefore(statement);
121
+ } else {
122
+ handleEmptyFile(root, statement);
123
+ }
124
+ }
125
+ };
126
+ // Helper to add import/require if missing
127
+ const addImportIfMissing = (root, varName, source, isEsm)=>{
128
+ if (isEsm) {
129
+ if (root.find(j.ImportDeclaration, {
130
+ source: {
131
+ value: source
132
+ }
133
+ }).length === 0) {
134
+ const importDecl = j.importDeclaration([
135
+ j.importDefaultSpecifier(j.identifier(varName))
136
+ ], j.literal(source));
137
+ insertStatement(root, importDecl, root.find(j.ImportDeclaration));
138
+ }
139
+ } else if (root.find(j.VariableDeclarator, {
140
+ id: {
141
+ name: varName
142
+ },
143
+ init: {
144
+ type: 'CallExpression',
145
+ callee: {
146
+ name: 'require'
147
+ },
148
+ arguments: [
149
+ {
150
+ value: source
151
+ }
152
+ ]
153
+ }
154
+ }).length === 0) {
155
+ const requireStmt = j.variableDeclaration('const', [
156
+ j.variableDeclarator(j.identifier(varName), j.callExpression(j.identifier('require'), [
157
+ j.literal(source)
158
+ ]))
159
+ ]);
160
+ const requires = root.find(j.VariableDeclaration).filter((path)=>path.value.declarations.some((decl)=>j.CallExpression.check(decl.init) && decl.init.callee?.name === 'require'));
161
+ const useStrict = root.find(j.ExpressionStatement).filter((path)=>j.Literal.check(path.value.expression) && /use strict/.test(String(path.value.expression.value)));
162
+ insertStatement(root, requireStmt, requires.length > 0 ? requires : useStrict);
163
+ }
164
+ };
165
+ // Helper to safely handle empty files
166
+ const handleEmptyFile = (root, firstStatement)=>{
167
+ try {
168
+ // Check if we have any paths in the collection
169
+ const paths = root.paths();
170
+ if (paths.length === 0) {
171
+ // Completely empty collection - create new program
172
+ const newProgram = j.program([
173
+ firstStatement
174
+ ]);
175
+ // Replace the entire root with new program
176
+ return root.replaceWith(newProgram);
177
+ }
178
+ // Get the first path (should be the program)
179
+ const rootPath = paths[0];
180
+ if (!rootPath || !rootPath.value) {
181
+ // Invalid root path - create new program
182
+ const newProgram = j.program([
183
+ firstStatement
184
+ ]);
185
+ return root.replaceWith(newProgram);
186
+ }
187
+ // Check if it's a valid program node
188
+ if (j.Program.check(rootPath.value)) {
189
+ // Ensure body exists and add statement
190
+ if (!rootPath.value.body) {
191
+ rootPath.value.body = [];
192
+ }
193
+ rootPath.value.body.push(firstStatement);
194
+ } else {
195
+ // Not a program node - replace with new program
196
+ const newProgram = j.program([
197
+ firstStatement
198
+ ]);
199
+ rootPath.replace(newProgram);
200
+ }
201
+ } catch (error) {
202
+ // Ultimate fallback - create a minimal working file
203
+ console.warn('Failed to handle empty file, creating new program:', error.message);
204
+ const newProgram = j.program([
205
+ firstStatement
206
+ ]);
207
+ try {
208
+ root.replaceWith(newProgram);
209
+ } catch (replaceError) {
210
+ // Last resort - throw descriptive error
211
+ throw new Error(`Unable to add statement to empty file: ${error.message}. Root collection may be invalid.`);
212
+ }
213
+ }
214
+ };
215
+ // Helper to find the exported object regardless of export pattern
216
+ const findExportedObject = (root, exportedValue)=>{
217
+ // Case 1: Direct object export
218
+ if (j.ObjectExpression.check(exportedValue)) {
219
+ return exportedValue;
220
+ }
221
+ // Case 2: Function that returns an object
222
+ if (j.FunctionExpression.check(exportedValue) || j.ArrowFunctionExpression.check(exportedValue) || j.FunctionDeclaration.check(exportedValue)) {
223
+ const body = exportedValue.body;
224
+ // Arrow function with object expression body: () => ({...})
225
+ if (j.ObjectExpression.check(body)) {
226
+ return body;
227
+ }
228
+ // Function with return statement in block
229
+ if (j.BlockStatement.check(body)) {
230
+ for (const stmt of body.body){
231
+ if (j.ReturnStatement.check(stmt) && j.ObjectExpression.check(stmt.argument)) {
232
+ return stmt.argument;
233
+ }
234
+ }
235
+ }
236
+ }
237
+ // Case 3: Identifier reference to a variable
238
+ if (j.Identifier.check(exportedValue)) {
239
+ const varName = exportedValue.name;
240
+ // Find the variable declaration
241
+ const varDeclaration = root.find(j.VariableDeclarator, {
242
+ id: {
243
+ name: varName
244
+ }
245
+ });
246
+ if (varDeclaration.length > 0) {
247
+ const init = varDeclaration.get().value.init;
248
+ // If it's an object, return it
249
+ if (j.ObjectExpression.check(init)) {
250
+ return init;
251
+ }
252
+ // If it's a function, recursively check its return value
253
+ if (j.FunctionExpression.check(init) || j.ArrowFunctionExpression.check(init)) {
254
+ return findExportedObject(root, init);
255
+ }
256
+ }
257
+ }
258
+ return null;
259
+ };
260
+ // Helper to handle object export (common logic for ESM and CJS)
261
+ const handleObjectExport = (obj, config, type, setExport)=>{
262
+ if (type === 'routes') {
263
+ if (!handleRoutesArray(obj, config)) {
264
+ setExport(createRoutesExport(config));
265
+ }
266
+ } else {
267
+ addPropertyToObject(obj, config);
268
+ }
269
+ };
270
+ // Handle ESM export default
271
+ const handleEsmExport = (root, config, type)=>{
272
+ const exports = root.find(j.ExportDefaultDeclaration);
273
+ if (exports.length === 0) {
274
+ const newExport = type === 'routes' ? createRoutesExport(config) : j.objectExpression([
275
+ createProperty(config)
276
+ ]);
277
+ insertStatement(root, j.exportDefaultDeclaration(newExport), root.find(j.Statement));
278
+ } else {
279
+ exports.forEach((path)=>{
280
+ const decl = path.value.declaration;
281
+ // Find the actual object being exported
282
+ const exportedObject = findExportedObject(root, decl);
283
+ if (exportedObject) {
284
+ handleObjectExport(exportedObject, config, type, (newExport)=>{
285
+ path.value.declaration = newExport;
286
+ });
287
+ } else {
288
+ // Fallback: replace the entire export
289
+ path.value.declaration = type === 'routes' ? createRoutesExport(config) : j.objectExpression([
290
+ createProperty(config)
291
+ ]);
292
+ }
293
+ });
294
+ }
295
+ };
296
+ // Handle CJS module.exports
297
+ const handleCjsExport = (root, config, type)=>{
298
+ const exports = root.find(j.AssignmentExpression, {
299
+ left: {
300
+ type: 'MemberExpression',
301
+ object: {
302
+ name: 'module'
303
+ },
304
+ property: {
305
+ name: 'exports'
306
+ }
307
+ }
308
+ });
309
+ if (exports.length === 0) {
310
+ const newExport = type === 'routes' ? createRoutesExport(config) : j.objectExpression([
311
+ createProperty(config)
312
+ ]);
313
+ const moduleExportStmt = j.expressionStatement(j.assignmentExpression('=', j.memberExpression(j.identifier('module'), j.identifier('exports')), newExport));
314
+ insertStatement(root, moduleExportStmt, root.find(j.Statement));
315
+ } else {
316
+ exports.forEach((path)=>{
317
+ const right = path.value.right;
318
+ // Find the actual object being exported
319
+ const exportedObject = findExportedObject(root, right);
320
+ if (exportedObject) {
321
+ handleObjectExport(exportedObject, config, type, (newExport)=>{
322
+ path.value.right = newExport;
323
+ });
324
+ } else {
325
+ // Fallback: replace the entire export
326
+ path.value.right = type === 'routes' ? createRoutesExport(config) : j.objectExpression([
327
+ createProperty(config)
328
+ ]);
329
+ }
330
+ });
331
+ }
332
+ };
333
+
334
+ export { appendToFile };
335
+ //# sourceMappingURL=extend-plugin-index-files.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extend-plugin-index-files.mjs","sources":["../../../src/plops/utils/extend-plugin-index-files.ts"],"sourcesContent":["import * as jscodeshift from 'jscodeshift';\nimport camelCase from 'lodash/camelCase';\n\nconst j = jscodeshift.withParser('tsx');\n\ntype AppendType = 'content-type' | 'index' | 'routes';\n\ninterface AppendConfig {\n type: AppendType;\n singularName: string;\n}\n\n// Helper to check if a string is a valid JavaScript identifier\nconst isValidIdentifier = (str: string): boolean => {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(str);\n};\n\n// Helper to create the appropriate property based on type\nconst createProperty = (config: AppendConfig) => {\n const { type, singularName } = config;\n const camelCaseName = camelCase(singularName);\n const varName = type === 'content-type' ? `${camelCaseName}Schema` : camelCaseName;\n\n // Use string literal for key only if singularName is not a valid identifier\n const keyNode = isValidIdentifier(singularName)\n ? j.identifier(singularName)\n : j.literal(singularName);\n\n switch (type) {\n case 'content-type':\n return j.objectProperty(\n keyNode,\n j.objectExpression([j.objectProperty(j.identifier('schema'), j.identifier(varName))])\n );\n case 'index':\n return j.objectProperty(keyNode, j.identifier(varName));\n case 'routes':\n return j.spreadElement(j.memberExpression(j.identifier(varName), j.identifier('routes')));\n default:\n throw new Error(`Unknown append type: ${type}`);\n }\n};\n\n// Helper to check if property already exists\nconst hasExistingProperty = (obj: any, config: AppendConfig): boolean => {\n const { type, singularName } = config;\n if (!obj?.properties && !j.ArrayExpression.check(obj)) return false;\n\n const elements = j.ArrayExpression.check(obj) ? obj.elements : obj.properties;\n if (!elements) return false;\n\n if (type === 'routes') {\n // Check for spread elements ...camelCaseName.routes\n const camelCaseName = camelCase(singularName);\n return elements.some(\n (element: any) =>\n j.SpreadElement.check(element) &&\n j.MemberExpression.check(element.argument) &&\n j.Identifier.check(element.argument.object) &&\n element.argument.object.name === camelCaseName &&\n j.Identifier.check(element.argument.property) &&\n element.argument.property.name === 'routes'\n );\n }\n\n // For content-type and index, check for object property (both identifier and literal keys)\n return elements.some(\n (prop: any) =>\n j.ObjectProperty.check(prop) &&\n ((j.Identifier.check(prop.key) && prop.key.name === singularName) ||\n (j.Literal.check(prop.key) && prop.key.value === singularName))\n );\n};\n\n// Helper to add property to object if it doesn't exist\nconst addPropertyToObject = (obj: any, config: AppendConfig) => {\n if (!obj || hasExistingProperty(obj, config)) return;\n\n if (config.type === 'routes' && j.ArrayExpression.check(obj)) {\n obj.elements.push(createRoutesElement(config));\n } else if (obj.properties?.length >= 0) {\n obj.properties.push(createProperty(config));\n }\n};\n\n// Helper to find and add to routes array\nconst handleRoutesArray = (obj: any, config: AppendConfig) => {\n if (!obj?.properties) return false;\n\n const routesProp = obj.properties.find(\n (prop: any) =>\n j.ObjectProperty.check(prop) &&\n ((j.Identifier.check(prop.key) && prop.key.name === 'routes') ||\n (j.Literal.check(prop.key) && prop.key.value === 'routes')) &&\n j.ArrayExpression.check(prop.value)\n );\n\n if (routesProp?.value) {\n const routesArray = routesProp.value;\n if (!hasExistingProperty(routesArray, config)) {\n routesArray.elements = routesArray.elements || [];\n routesArray.elements.push(createRoutesElement(config));\n }\n return true;\n }\n\n return false;\n};\n\n// Helper to create routes array element (always returns SpreadElement for routes)\nconst createRoutesElement = (config: AppendConfig) => {\n const { singularName } = config;\n const camelCaseName = camelCase(singularName);\n return j.spreadElement(j.memberExpression(j.identifier(camelCaseName), j.identifier('routes')));\n};\n\n// Helper to create new export for routes\nconst createRoutesExport = (config: AppendConfig) => {\n return j.arrowFunctionExpression(\n [],\n j.objectExpression([\n j.objectProperty(j.identifier('type'), j.literal('content-api')),\n j.objectProperty(j.identifier('routes'), j.arrayExpression([createRoutesElement(config)])),\n ])\n );\n};\n\n// Unified append function for all types\nexport const appendToFile = (template: string, config: AppendConfig): string => {\n if (!config?.singularName || !config?.type) {\n throw new Error('Invalid config: singularName and type are required');\n }\n\n const normalizedTemplate = template?.trim() || '';\n const root = normalizedTemplate ? j(normalizedTemplate) : j(j.program([]));\n const { type, singularName } = config;\n const isEsm = detectModuleFormat(normalizedTemplate) === 'esm';\n\n const camelCaseName = camelCase(singularName);\n const varName = type === 'content-type' ? `${camelCaseName}Schema` : camelCaseName;\n const source = type === 'content-type' ? `./${singularName}/schema.json` : `./${singularName}`;\n\n addImportIfMissing(root, varName, source, isEsm);\n\n if (isEsm) {\n handleEsmExport(root, config, type);\n } else {\n handleCjsExport(root, config, type);\n }\n\n return root.toSource({ quote: 'single' });\n};\n\n// Helper to detect module format\nconst detectModuleFormat = (template: string): 'esm' | 'cjs' => {\n const hasImport = /^import\\s/.test(template) || template.includes('import ');\n const hasExportDefault = template.includes('export default');\n const hasRequire = template.includes('require(');\n const hasModuleExports = template.includes('module.exports');\n\n if (hasImport || hasExportDefault) return 'esm';\n if (hasRequire || hasModuleExports) return 'cjs';\n return 'esm'; // Default to ESM\n};\n\n// Helper to insert statement at appropriate location\nconst insertStatement = (\n root: jscodeshift.Collection<any>,\n statement: any,\n preferredLocation?: jscodeshift.Collection<any>\n) => {\n if (preferredLocation && preferredLocation.length > 0) {\n preferredLocation.at(-1).insertAfter(statement);\n } else {\n const firstStatement = root.find(j.Statement).at(0);\n if (firstStatement.length > 0) {\n firstStatement.insertBefore(statement);\n } else {\n handleEmptyFile(root, statement);\n }\n }\n};\n\n// Helper to add import/require if missing\nconst addImportIfMissing = (\n root: jscodeshift.Collection<any>,\n varName: string,\n source: string,\n isEsm: boolean\n) => {\n if (isEsm) {\n if (root.find(j.ImportDeclaration, { source: { value: source } }).length === 0) {\n const importDecl = j.importDeclaration(\n [j.importDefaultSpecifier(j.identifier(varName))],\n j.literal(source)\n );\n insertStatement(root, importDecl, root.find(j.ImportDeclaration));\n }\n } else if (\n root.find(j.VariableDeclarator, {\n id: { name: varName },\n init: { type: 'CallExpression', callee: { name: 'require' }, arguments: [{ value: source }] },\n }).length === 0\n ) {\n const requireStmt = j.variableDeclaration('const', [\n j.variableDeclarator(\n j.identifier(varName),\n j.callExpression(j.identifier('require'), [j.literal(source)])\n ),\n ]);\n\n const requires = root\n .find(j.VariableDeclaration)\n .filter((path) =>\n path.value.declarations.some(\n (decl: any) => j.CallExpression.check(decl.init) && decl.init.callee?.name === 'require'\n )\n );\n\n const useStrict = root\n .find(j.ExpressionStatement)\n .filter(\n (path: any) =>\n j.Literal.check(path.value.expression) &&\n /use strict/.test(String(path.value.expression.value))\n );\n\n insertStatement(root, requireStmt, requires.length > 0 ? requires : useStrict);\n }\n};\n\n// Helper to safely handle empty files\nconst handleEmptyFile = (root: jscodeshift.Collection<any>, firstStatement: any) => {\n try {\n // Check if we have any paths in the collection\n const paths = root.paths();\n if (paths.length === 0) {\n // Completely empty collection - create new program\n const newProgram = j.program([firstStatement]);\n // Replace the entire root with new program\n return root.replaceWith(newProgram);\n }\n\n // Get the first path (should be the program)\n const rootPath = paths[0];\n if (!rootPath || !rootPath.value) {\n // Invalid root path - create new program\n const newProgram = j.program([firstStatement]);\n return root.replaceWith(newProgram);\n }\n\n // Check if it's a valid program node\n if (j.Program.check(rootPath.value)) {\n // Ensure body exists and add statement\n if (!rootPath.value.body) {\n rootPath.value.body = [];\n }\n rootPath.value.body.push(firstStatement);\n } else {\n // Not a program node - replace with new program\n const newProgram = j.program([firstStatement]);\n rootPath.replace(newProgram);\n }\n } catch (error: any) {\n // Ultimate fallback - create a minimal working file\n console.warn('Failed to handle empty file, creating new program:', error.message);\n const newProgram = j.program([firstStatement]);\n try {\n root.replaceWith(newProgram);\n } catch (replaceError) {\n // Last resort - throw descriptive error\n throw new Error(\n `Unable to add statement to empty file: ${error.message}. Root collection may be invalid.`\n );\n }\n }\n};\n\n// Helper to find the exported object regardless of export pattern\nconst findExportedObject = (root: jscodeshift.Collection<any>, exportedValue: any): any => {\n // Case 1: Direct object export\n if (j.ObjectExpression.check(exportedValue)) {\n return exportedValue;\n }\n\n // Case 2: Function that returns an object\n if (\n j.FunctionExpression.check(exportedValue) ||\n j.ArrowFunctionExpression.check(exportedValue) ||\n j.FunctionDeclaration.check(exportedValue)\n ) {\n const body = exportedValue.body;\n // Arrow function with object expression body: () => ({...})\n if (j.ObjectExpression.check(body)) {\n return body;\n }\n // Function with return statement in block\n if (j.BlockStatement.check(body)) {\n for (const stmt of body.body) {\n if (j.ReturnStatement.check(stmt) && j.ObjectExpression.check(stmt.argument)) {\n return stmt.argument;\n }\n }\n }\n }\n\n // Case 3: Identifier reference to a variable\n if (j.Identifier.check(exportedValue)) {\n const varName = exportedValue.name;\n\n // Find the variable declaration\n const varDeclaration = root.find(j.VariableDeclarator, {\n id: { name: varName },\n });\n\n if (varDeclaration.length > 0) {\n const init = varDeclaration.get().value.init;\n\n // If it's an object, return it\n if (j.ObjectExpression.check(init)) {\n return init;\n }\n\n // If it's a function, recursively check its return value\n if (j.FunctionExpression.check(init) || j.ArrowFunctionExpression.check(init)) {\n return findExportedObject(root, init);\n }\n }\n }\n\n return null;\n};\n\n// Helper to handle object export (common logic for ESM and CJS)\nconst handleObjectExport = (\n obj: any,\n config: AppendConfig,\n type: AppendType,\n setExport: (newExport: any) => void\n) => {\n if (type === 'routes') {\n if (!handleRoutesArray(obj, config)) {\n setExport(createRoutesExport(config));\n }\n } else {\n addPropertyToObject(obj, config);\n }\n};\n\n// Handle ESM export default\nconst handleEsmExport = (\n root: jscodeshift.Collection<any>,\n config: AppendConfig,\n type: AppendType\n) => {\n const exports = root.find(j.ExportDefaultDeclaration);\n\n if (exports.length === 0) {\n const newExport =\n type === 'routes' ? createRoutesExport(config) : j.objectExpression([createProperty(config)]);\n insertStatement(root, j.exportDefaultDeclaration(newExport), root.find(j.Statement));\n } else {\n exports.forEach((path: any) => {\n const decl = path.value.declaration;\n\n // Find the actual object being exported\n const exportedObject = findExportedObject(root, decl);\n\n if (exportedObject) {\n handleObjectExport(exportedObject, config, type, (newExport) => {\n path.value.declaration = newExport;\n });\n } else {\n // Fallback: replace the entire export\n path.value.declaration =\n type === 'routes'\n ? createRoutesExport(config)\n : j.objectExpression([createProperty(config)]);\n }\n });\n }\n};\n\n// Handle CJS module.exports\nconst handleCjsExport = (\n root: jscodeshift.Collection<any>,\n config: AppendConfig,\n type: AppendType\n) => {\n const exports = root.find(j.AssignmentExpression, {\n left: { type: 'MemberExpression', object: { name: 'module' }, property: { name: 'exports' } },\n });\n\n if (exports.length === 0) {\n const newExport =\n type === 'routes' ? createRoutesExport(config) : j.objectExpression([createProperty(config)]);\n const moduleExportStmt = j.expressionStatement(\n j.assignmentExpression(\n '=',\n j.memberExpression(j.identifier('module'), j.identifier('exports')),\n newExport\n )\n );\n insertStatement(root, moduleExportStmt, root.find(j.Statement));\n } else {\n exports.forEach((path: any) => {\n const right = path.value.right;\n\n // Find the actual object being exported\n const exportedObject = findExportedObject(root, right);\n\n if (exportedObject) {\n handleObjectExport(exportedObject, config, type, (newExport) => {\n path.value.right = newExport;\n });\n } else {\n // Fallback: replace the entire export\n path.value.right =\n type === 'routes'\n ? createRoutesExport(config)\n : j.objectExpression([createProperty(config)]);\n }\n });\n }\n};\n"],"names":["j","jscodeshift","withParser","isValidIdentifier","str","test","createProperty","config","type","singularName","camelCaseName","camelCase","varName","keyNode","identifier","literal","objectProperty","objectExpression","spreadElement","memberExpression","Error","hasExistingProperty","obj","properties","ArrayExpression","check","elements","some","element","SpreadElement","MemberExpression","argument","Identifier","object","name","property","prop","ObjectProperty","key","Literal","value","addPropertyToObject","push","createRoutesElement","length","handleRoutesArray","routesProp","find","routesArray","createRoutesExport","arrowFunctionExpression","arrayExpression","appendToFile","template","normalizedTemplate","trim","root","program","isEsm","detectModuleFormat","source","addImportIfMissing","handleEsmExport","handleCjsExport","toSource","quote","hasImport","includes","hasExportDefault","hasRequire","hasModuleExports","insertStatement","statement","preferredLocation","at","insertAfter","firstStatement","Statement","insertBefore","handleEmptyFile","ImportDeclaration","importDecl","importDeclaration","importDefaultSpecifier","VariableDeclarator","id","init","callee","arguments","requireStmt","variableDeclaration","variableDeclarator","callExpression","requires","VariableDeclaration","filter","path","declarations","decl","CallExpression","useStrict","ExpressionStatement","expression","String","paths","newProgram","replaceWith","rootPath","Program","body","replace","error","console","warn","message","replaceError","findExportedObject","exportedValue","ObjectExpression","FunctionExpression","ArrowFunctionExpression","FunctionDeclaration","BlockStatement","stmt","ReturnStatement","varDeclaration","get","handleObjectExport","setExport","exports","ExportDefaultDeclaration","newExport","exportDefaultDeclaration","forEach","declaration","exportedObject","AssignmentExpression","left","moduleExportStmt","expressionStatement","assignmentExpression","right"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- declare const _default: (destination: string) => "plugins/{{ plugin }}/server" | "api/{{ id }}" | "api/{{ api }}" | "./";
1
+ declare const _default: (destination: string) => "api/{{ api }}" | "plugins/{{ plugin }}/server/src" | "." | "api/{{ id }}";
2
2
  export default _default;
3
3
  //# sourceMappingURL=get-file-path.d.ts.map
@@ -5,10 +5,10 @@ var getFilePath = ((destination)=>{
5
5
  return `api/{{ api }}`;
6
6
  }
7
7
  if (destination === 'plugin') {
8
- return `plugins/{{ plugin }}/server`;
8
+ return `plugins/{{ plugin }}/server/src`;
9
9
  }
10
10
  if (destination === 'root') {
11
- return './';
11
+ return '.';
12
12
  }
13
13
  return `api/{{ id }}`;
14
14
  });
@@ -1 +1 @@
1
- {"version":3,"file":"get-file-path.js","sources":["../../../src/plops/utils/get-file-path.ts"],"sourcesContent":["export default (destination: string) => {\n if (destination === 'api') {\n return `api/{{ api }}`;\n }\n\n if (destination === 'plugin') {\n return `plugins/{{ plugin }}/server`;\n }\n\n if (destination === 'root') {\n return './';\n }\n\n return `api/{{ id }}`;\n};\n"],"names":["destination"],"mappings":";;AAAA,kBAAe,CAAA,CAACA,WAAAA,GAAAA;AACd,IAAA,IAAIA,gBAAgB,KAAO,EAAA;QACzB,OAAO,CAAC,aAAa,CAAC;AACxB;AAEA,IAAA,IAAIA,gBAAgB,QAAU,EAAA;QAC5B,OAAO,CAAC,2BAA2B,CAAC;AACtC;AAEA,IAAA,IAAIA,gBAAgB,MAAQ,EAAA;QAC1B,OAAO,IAAA;AACT;IAEA,OAAO,CAAC,YAAY,CAAC;AACvB,CAAA;;;;"}
1
+ {"version":3,"file":"get-file-path.js","sources":["../../../src/plops/utils/get-file-path.ts"],"sourcesContent":["export default (destination: string) => {\n if (destination === 'api') {\n return `api/{{ api }}`;\n }\n\n if (destination === 'plugin') {\n return `plugins/{{ plugin }}/server/src`;\n }\n\n if (destination === 'root') {\n return '.';\n }\n\n return `api/{{ id }}`;\n};\n"],"names":["destination"],"mappings":";;AAAA,kBAAe,CAAA,CAACA,WAAAA,GAAAA;AACd,IAAA,IAAIA,gBAAgB,KAAO,EAAA;QACzB,OAAO,CAAC,aAAa,CAAC;AACxB;AAEA,IAAA,IAAIA,gBAAgB,QAAU,EAAA;QAC5B,OAAO,CAAC,+BAA+B,CAAC;AAC1C;AAEA,IAAA,IAAIA,gBAAgB,MAAQ,EAAA;QAC1B,OAAO,GAAA;AACT;IAEA,OAAO,CAAC,YAAY,CAAC;AACvB,CAAA;;;;"}
@@ -3,10 +3,10 @@ var getFilePath = ((destination)=>{
3
3
  return `api/{{ api }}`;
4
4
  }
5
5
  if (destination === 'plugin') {
6
- return `plugins/{{ plugin }}/server`;
6
+ return `plugins/{{ plugin }}/server/src`;
7
7
  }
8
8
  if (destination === 'root') {
9
- return './';
9
+ return '.';
10
10
  }
11
11
  return `api/{{ id }}`;
12
12
  });
@@ -1 +1 @@
1
- {"version":3,"file":"get-file-path.mjs","sources":["../../../src/plops/utils/get-file-path.ts"],"sourcesContent":["export default (destination: string) => {\n if (destination === 'api') {\n return `api/{{ api }}`;\n }\n\n if (destination === 'plugin') {\n return `plugins/{{ plugin }}/server`;\n }\n\n if (destination === 'root') {\n return './';\n }\n\n return `api/{{ id }}`;\n};\n"],"names":["destination"],"mappings":"AAAA,kBAAe,CAAA,CAACA,WAAAA,GAAAA;AACd,IAAA,IAAIA,gBAAgB,KAAO,EAAA;QACzB,OAAO,CAAC,aAAa,CAAC;AACxB;AAEA,IAAA,IAAIA,gBAAgB,QAAU,EAAA;QAC5B,OAAO,CAAC,2BAA2B,CAAC;AACtC;AAEA,IAAA,IAAIA,gBAAgB,MAAQ,EAAA;QAC1B,OAAO,IAAA;AACT;IAEA,OAAO,CAAC,YAAY,CAAC;AACvB,CAAA;;;;"}
1
+ {"version":3,"file":"get-file-path.mjs","sources":["../../../src/plops/utils/get-file-path.ts"],"sourcesContent":["export default (destination: string) => {\n if (destination === 'api') {\n return `api/{{ api }}`;\n }\n\n if (destination === 'plugin') {\n return `plugins/{{ plugin }}/server/src`;\n }\n\n if (destination === 'root') {\n return '.';\n }\n\n return `api/{{ id }}`;\n};\n"],"names":["destination"],"mappings":"AAAA,kBAAe,CAAA,CAACA,WAAAA,GAAAA;AACd,IAAA,IAAIA,gBAAgB,KAAO,EAAA;QACzB,OAAO,CAAC,aAAa,CAAC;AACxB;AAEA,IAAA,IAAIA,gBAAgB,QAAU,EAAA;QAC5B,OAAO,CAAC,+BAA+B,CAAC;AAC1C;AAEA,IAAA,IAAIA,gBAAgB,MAAQ,EAAA;QAC1B,OAAO,GAAA;AACT;IAEA,OAAO,CAAC,YAAY,CAAC;AACvB,CAAA;;;;"}
@@ -0,0 +1,3 @@
1
+ 'use strict';
2
+
3
+ module.exports = {};
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ const contentAPIRoutes = require('./content-api');
4
+ const adminAPIRoutes = require('./admin');
5
+
6
+ const routes = {
7
+ 'content-api': contentAPIRoutes,
8
+ admin: adminAPIRoutes,
9
+ };
10
+
11
+ module.exports = routes;
12
+
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ module.exports = () => ({
4
+ type: '{{ type }}',
5
+ routes: [],
6
+ });
@@ -0,0 +1 @@
1
+ export default {};
@@ -0,0 +1,9 @@
1
+ import contentAPIRoutes from './content-api';
2
+ import adminAPIRoutes from './admin';
3
+
4
+ const routes = {
5
+ 'content-api': contentAPIRoutes,
6
+ admin: adminAPIRoutes,
7
+ };
8
+
9
+ export default routes;
@@ -0,0 +1,4 @@
1
+ export default () => ({
2
+ type: '{{ type }}',
3
+ routes: [],
4
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/generators",
3
- "version": "5.30.0",
3
+ "version": "5.31.0",
4
4
  "description": "Interactive API generator.",
5
5
  "keywords": [
6
6
  "strapi",
@@ -49,22 +49,26 @@
49
49
  },
50
50
  "dependencies": {
51
51
  "@sindresorhus/slugify": "1.1.0",
52
- "@strapi/typescript-utils": "5.30.0",
53
- "@strapi/utils": "5.30.0",
52
+ "@strapi/typescript-utils": "5.31.0",
53
+ "@strapi/utils": "5.31.0",
54
54
  "chalk": "4.1.2",
55
55
  "copyfiles": "2.4.1",
56
56
  "fs-extra": "11.2.0",
57
57
  "handlebars": "4.7.7",
58
+ "jscodeshift": "17.3.0",
59
+ "lodash": "4.17.21",
58
60
  "plop": "4.0.1",
59
61
  "pluralize": "8.0.0"
60
62
  },
61
63
  "devDependencies": {
62
64
  "@types/fs-extra": "11.0.4",
63
- "eslint-config-custom": "5.30.0",
64
- "tsconfig": "5.30.0"
65
+ "@types/jscodeshift": "0.12.0",
66
+ "eslint-config-custom": "5.31.0",
67
+ "outdent": "^0.8.0",
68
+ "tsconfig": "5.31.0"
65
69
  },
66
70
  "engines": {
67
- "node": ">=18.0.0 <=22.x.x",
71
+ "node": ">=20.0.0 <=24.x.x",
68
72
  "npm": ">=6.0.0"
69
73
  }
70
74
  }