@strapi/typescript-utils 0.0.0-experimental.6340da17068c3bed7fb006e7bcc554c71129e282 → 0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc

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 (225) hide show
  1. package/dist/compile.d.ts +5 -0
  2. package/dist/compile.d.ts.map +1 -0
  3. package/dist/compile.js +12 -0
  4. package/dist/compile.js.map +1 -0
  5. package/dist/compile.mjs +10 -0
  6. package/dist/compile.mjs.map +1 -0
  7. package/dist/compilers/basic.d.ts +11 -0
  8. package/dist/compilers/basic.d.ts.map +1 -0
  9. package/dist/compilers/basic.js +58 -0
  10. package/dist/compilers/basic.js.map +1 -0
  11. package/dist/compilers/basic.mjs +36 -0
  12. package/dist/compilers/basic.mjs.map +1 -0
  13. package/dist/compilers/index.d.ts +3 -0
  14. package/dist/compilers/index.d.ts.map +1 -0
  15. package/dist/compilers/index.js +8 -0
  16. package/dist/compilers/index.js.map +1 -0
  17. package/dist/compilers/index.mjs +3 -0
  18. package/dist/compilers/index.mjs.map +1 -0
  19. package/dist/generators/common/compare.d.ts +14 -0
  20. package/dist/generators/common/compare.d.ts.map +1 -0
  21. package/dist/generators/common/compare.js +25 -0
  22. package/dist/generators/common/compare.js.map +1 -0
  23. package/dist/generators/common/compare.mjs +22 -0
  24. package/dist/generators/common/compare.mjs.map +1 -0
  25. package/dist/generators/common/imports.d.ts +5 -0
  26. package/dist/generators/common/imports.d.ts.map +1 -0
  27. package/dist/generators/common/imports.js +42 -0
  28. package/dist/generators/common/imports.js.map +1 -0
  29. package/dist/generators/common/imports.mjs +19 -0
  30. package/dist/generators/common/imports.mjs.map +1 -0
  31. package/dist/generators/common/index.d.ts +4 -0
  32. package/dist/generators/common/index.d.ts.map +1 -0
  33. package/dist/generators/common/interface-names.d.ts +16 -0
  34. package/dist/generators/common/interface-names.d.ts.map +1 -0
  35. package/dist/generators/common/interface-names.js +54 -0
  36. package/dist/generators/common/interface-names.js.map +1 -0
  37. package/dist/generators/common/interface-names.mjs +52 -0
  38. package/dist/generators/common/interface-names.mjs.map +1 -0
  39. package/dist/generators/common/models/attributes.d.ts +38 -0
  40. package/dist/generators/common/models/attributes.d.ts.map +1 -0
  41. package/dist/generators/common/models/attributes.js +205 -0
  42. package/dist/generators/common/models/attributes.js.map +1 -0
  43. package/dist/generators/common/models/attributes.mjs +176 -0
  44. package/dist/generators/common/models/attributes.mjs.map +1 -0
  45. package/dist/generators/common/models/index.d.ts +7 -0
  46. package/dist/generators/common/models/index.d.ts.map +1 -0
  47. package/dist/generators/common/models/mappers.d.ts +9 -0
  48. package/dist/generators/common/models/mappers.d.ts.map +1 -0
  49. package/dist/generators/common/models/mappers.js +227 -0
  50. package/dist/generators/common/models/mappers.js.map +1 -0
  51. package/dist/generators/common/models/mappers.mjs +202 -0
  52. package/dist/generators/common/models/mappers.mjs.map +1 -0
  53. package/dist/generators/common/models/schema.d.ts +8 -0
  54. package/dist/generators/common/models/schema.d.ts.map +1 -0
  55. package/dist/generators/common/models/schema.js +78 -0
  56. package/dist/generators/common/models/schema.js.map +1 -0
  57. package/dist/generators/common/models/schema.mjs +56 -0
  58. package/dist/generators/common/models/schema.mjs.map +1 -0
  59. package/dist/generators/common/models/utils.d.ts +57 -0
  60. package/dist/generators/common/models/utils.d.ts.map +1 -0
  61. package/dist/generators/common/models/utils.js +110 -0
  62. package/dist/generators/common/models/utils.js.map +1 -0
  63. package/dist/generators/common/models/utils.mjs +82 -0
  64. package/dist/generators/common/models/utils.mjs.map +1 -0
  65. package/dist/generators/common/sources.d.ts +133 -0
  66. package/dist/generators/common/sources.d.ts.map +1 -0
  67. package/dist/generators/common/sources.js +354 -0
  68. package/dist/generators/common/sources.js.map +1 -0
  69. package/dist/generators/common/sources.mjs +318 -0
  70. package/dist/generators/common/sources.mjs.map +1 -0
  71. package/dist/generators/components/index.d.ts +9 -0
  72. package/dist/generators/components/index.d.ts.map +1 -0
  73. package/dist/generators/components/index.js +84 -0
  74. package/dist/generators/components/index.js.map +1 -0
  75. package/dist/generators/components/index.mjs +62 -0
  76. package/dist/generators/components/index.mjs.map +1 -0
  77. package/dist/generators/constants.d.ts +3 -0
  78. package/dist/generators/constants.d.ts.map +1 -0
  79. package/dist/generators/constants.js +8 -0
  80. package/dist/generators/constants.js.map +1 -0
  81. package/dist/generators/constants.mjs +5 -0
  82. package/dist/generators/constants.mjs.map +1 -0
  83. package/dist/generators/content-types/index.d.ts +9 -0
  84. package/dist/generators/content-types/index.d.ts.map +1 -0
  85. package/dist/generators/content-types/index.js +84 -0
  86. package/dist/generators/content-types/index.js.map +1 -0
  87. package/dist/generators/content-types/index.mjs +62 -0
  88. package/dist/generators/content-types/index.mjs.map +1 -0
  89. package/dist/generators/controllers/index.d.ts +35 -0
  90. package/dist/generators/controllers/index.d.ts.map +1 -0
  91. package/dist/generators/controllers/index.js +88 -0
  92. package/dist/generators/controllers/index.js.map +1 -0
  93. package/dist/generators/controllers/index.mjs +86 -0
  94. package/dist/generators/controllers/index.mjs.map +1 -0
  95. package/dist/generators/index.d.ts +31 -0
  96. package/dist/generators/index.d.ts.map +1 -0
  97. package/dist/generators/index.js +150 -0
  98. package/dist/generators/index.js.map +1 -0
  99. package/dist/generators/index.mjs +142 -0
  100. package/dist/generators/index.mjs.map +1 -0
  101. package/dist/generators/middlewares/index.d.ts +30 -0
  102. package/dist/generators/middlewares/index.d.ts.map +1 -0
  103. package/dist/generators/middlewares/index.js +163 -0
  104. package/dist/generators/middlewares/index.js.map +1 -0
  105. package/dist/generators/middlewares/index.mjs +141 -0
  106. package/dist/generators/middlewares/index.mjs.map +1 -0
  107. package/dist/generators/plugins/index.d.ts +9 -0
  108. package/dist/generators/plugins/index.d.ts.map +1 -0
  109. package/dist/generators/plugins/index.js +225 -0
  110. package/dist/generators/plugins/index.js.map +1 -0
  111. package/dist/generators/plugins/index.mjs +200 -0
  112. package/dist/generators/plugins/index.mjs.map +1 -0
  113. package/dist/generators/policies/index.d.ts +29 -0
  114. package/dist/generators/policies/index.d.ts.map +1 -0
  115. package/dist/generators/policies/index.js +135 -0
  116. package/dist/generators/policies/index.js.map +1 -0
  117. package/dist/generators/policies/index.mjs +113 -0
  118. package/dist/generators/policies/index.mjs.map +1 -0
  119. package/dist/generators/services/index.d.ts +35 -0
  120. package/dist/generators/services/index.d.ts.map +1 -0
  121. package/dist/generators/services/index.js +87 -0
  122. package/dist/generators/services/index.js.map +1 -0
  123. package/dist/generators/services/index.mjs +85 -0
  124. package/dist/generators/services/index.mjs.map +1 -0
  125. package/dist/generators/strict/index.d.ts +13 -0
  126. package/dist/generators/strict/index.d.ts.map +1 -0
  127. package/dist/generators/strict/index.js +24 -0
  128. package/dist/generators/strict/index.js.map +1 -0
  129. package/dist/generators/strict/index.mjs +22 -0
  130. package/dist/generators/strict/index.mjs.map +1 -0
  131. package/dist/generators/utils.d.ts +68 -0
  132. package/dist/generators/utils.d.ts.map +1 -0
  133. package/dist/generators/utils.js +201 -0
  134. package/dist/generators/utils.js.map +1 -0
  135. package/dist/generators/utils.mjs +166 -0
  136. package/dist/generators/utils.mjs.map +1 -0
  137. package/dist/index.d.ts +5 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +28 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/index.mjs +14 -0
  142. package/dist/index.mjs.map +1 -0
  143. package/dist/utils/format-host.d.ts +3 -0
  144. package/dist/utils/format-host.d.ts.map +1 -0
  145. package/dist/utils/format-host.js +33 -0
  146. package/dist/utils/format-host.js.map +1 -0
  147. package/dist/utils/format-host.mjs +11 -0
  148. package/dist/utils/format-host.mjs.map +1 -0
  149. package/dist/utils/get-config-path.d.ts +10 -0
  150. package/dist/utils/get-config-path.d.ts.map +1 -0
  151. package/dist/utils/get-config-path.js +43 -0
  152. package/dist/utils/get-config-path.js.map +1 -0
  153. package/dist/utils/get-config-path.mjs +18 -0
  154. package/dist/utils/get-config-path.mjs.map +1 -0
  155. package/dist/utils/index.d.ts +9 -0
  156. package/dist/utils/index.d.ts.map +1 -0
  157. package/dist/utils/is-using-typescript-sync.d.ts +5 -0
  158. package/dist/utils/is-using-typescript-sync.d.ts.map +1 -0
  159. package/dist/utils/is-using-typescript-sync.js +20 -0
  160. package/dist/utils/is-using-typescript-sync.js.map +1 -0
  161. package/dist/utils/is-using-typescript-sync.mjs +14 -0
  162. package/dist/utils/is-using-typescript-sync.mjs.map +1 -0
  163. package/dist/utils/is-using-typescript.d.ts +5 -0
  164. package/dist/utils/is-using-typescript.d.ts.map +1 -0
  165. package/dist/utils/is-using-typescript.js +20 -0
  166. package/dist/utils/is-using-typescript.js.map +1 -0
  167. package/dist/utils/is-using-typescript.mjs +14 -0
  168. package/dist/utils/is-using-typescript.mjs.map +1 -0
  169. package/dist/utils/report-diagnostics.d.ts +6 -0
  170. package/dist/utils/report-diagnostics.d.ts.map +1 -0
  171. package/dist/utils/report-diagnostics.js +37 -0
  172. package/dist/utils/report-diagnostics.js.map +1 -0
  173. package/dist/utils/report-diagnostics.mjs +15 -0
  174. package/dist/utils/report-diagnostics.mjs.map +1 -0
  175. package/dist/utils/resolve-config-options.d.ts +12 -0
  176. package/dist/utils/resolve-config-options.d.ts.map +1 -0
  177. package/dist/utils/resolve-config-options.js +39 -0
  178. package/dist/utils/resolve-config-options.js.map +1 -0
  179. package/dist/utils/resolve-config-options.mjs +17 -0
  180. package/dist/utils/resolve-config-options.mjs.map +1 -0
  181. package/dist/utils/resolve-outdir-sync.d.ts +5 -0
  182. package/dist/utils/resolve-outdir-sync.d.ts.map +1 -0
  183. package/dist/utils/resolve-outdir-sync.js +19 -0
  184. package/dist/utils/resolve-outdir-sync.js.map +1 -0
  185. package/dist/utils/resolve-outdir-sync.mjs +13 -0
  186. package/dist/utils/resolve-outdir-sync.mjs.map +1 -0
  187. package/dist/utils/resolve-outdir.d.ts +5 -0
  188. package/dist/utils/resolve-outdir.d.ts.map +1 -0
  189. package/dist/utils/resolve-outdir.js +19 -0
  190. package/dist/utils/resolve-outdir.js.map +1 -0
  191. package/dist/utils/resolve-outdir.mjs +13 -0
  192. package/dist/utils/resolve-outdir.mjs.map +1 -0
  193. package/package.json +27 -12
  194. package/.eslintrc.cjs +0 -16
  195. package/index.d.ts +0 -5
  196. package/jest.config.js +0 -6
  197. package/lib/__tests__/generators/schemas/attributes.test.js +0 -903
  198. package/lib/__tests__/generators/schemas/imports.test.js +0 -56
  199. package/lib/__tests__/generators/schemas/utils.test.js +0 -314
  200. package/lib/compile.js +0 -10
  201. package/lib/compilers/basic.js +0 -50
  202. package/lib/compilers/index.js +0 -7
  203. package/lib/generators/common/imports.js +0 -34
  204. package/lib/generators/common/index.js +0 -9
  205. package/lib/generators/common/models/attributes.js +0 -198
  206. package/lib/generators/common/models/index.js +0 -15
  207. package/lib/generators/common/models/mappers.js +0 -144
  208. package/lib/generators/common/models/schema.js +0 -93
  209. package/lib/generators/common/models/utils.js +0 -178
  210. package/lib/generators/components/index.js +0 -74
  211. package/lib/generators/constants.js +0 -6
  212. package/lib/generators/content-types/index.js +0 -74
  213. package/lib/generators/index.js +0 -122
  214. package/lib/generators/utils.js +0 -216
  215. package/lib/index.js +0 -13
  216. package/lib/utils/format-host.js +0 -15
  217. package/lib/utils/get-config-path.js +0 -29
  218. package/lib/utils/index.js +0 -21
  219. package/lib/utils/is-using-typescript-sync.js +0 -19
  220. package/lib/utils/is-using-typescript.js +0 -17
  221. package/lib/utils/report-diagnostics.js +0 -19
  222. package/lib/utils/resolve-config-options.js +0 -23
  223. package/lib/utils/resolve-outdir-sync.js +0 -18
  224. package/lib/utils/resolve-outdir.js +0 -18
  225. package/lint-staged.config.mjs +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/generators/content-types/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AASjD;;GAEG;AACH,eAAO,MAAM,+BAA+B,GAC1C,UAAS,gBAAyC;;;EAyDnD,CAAC"}
@@ -0,0 +1,84 @@
1
+ 'use strict';
2
+
3
+ var ts = require('typescript');
4
+ var _ = require('lodash');
5
+ var schema = require('../common/models/schema.js');
6
+ var imports = require('../common/imports.js');
7
+ var interfaceNames = require('../common/interface-names.js');
8
+ var utils = require('../utils.js');
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var ts__namespace = /*#__PURE__*/_interopNamespace(ts);
29
+
30
+ const { factory } = ts__namespace;
31
+ const NO_CONTENT_TYPE_PLACEHOLDER_COMMENT = `/*
32
+ * The app doesn't have any content-types yet.
33
+ */
34
+ `;
35
+ /**
36
+ * Generate type definitions for Strapi Content-Types
37
+ */ const generateContentTypesDefinitions = async (options = {})=>{
38
+ const { strapi, strict = false } = options;
39
+ const { contentTypes } = strapi;
40
+ const schemas = _.sortBy(Object.values(contentTypes ?? {}), 'uid');
41
+ const interfaceNames$1 = interfaceNames.resolveInterfaceNames(schemas.map(({ uid })=>uid), options.logger, {
42
+ strict
43
+ });
44
+ const contentTypesDefinitions = schemas.map((contentType)=>({
45
+ uid: contentType.uid,
46
+ definition: schema.generateSchemaDefinition(contentType, interfaceNames$1.get(contentType.uid), {
47
+ strict
48
+ })
49
+ }));
50
+ options.logger.debug(`Found ${contentTypesDefinitions.length} content-types.`);
51
+ if (contentTypesDefinitions.length === 0) {
52
+ return {
53
+ output: NO_CONTENT_TYPE_PLACEHOLDER_COMMENT,
54
+ stats: {}
55
+ };
56
+ }
57
+ const formattedSchemasDefinitions = contentTypesDefinitions.reduce((acc, def)=>{
58
+ acc.push(// Definition
59
+ def.definition, // Add a newline between each interface declaration
60
+ factory.createIdentifier('\n'));
61
+ return acc;
62
+ }, []);
63
+ const allDefinitions = [
64
+ // Imports
65
+ ...imports.generateImportDefinition(),
66
+ // Add a newline after the import statement
67
+ factory.createIdentifier('\n'),
68
+ // Schemas
69
+ ...formattedSchemasDefinitions,
70
+ // Global
71
+ utils.generateSharedExtensionDefinition('ContentTypeSchemas', contentTypesDefinitions, {
72
+ strict
73
+ })
74
+ ];
75
+ const output = utils.emitDefinitions(allDefinitions);
76
+ const formattedOutput = await utils.format(output);
77
+ return {
78
+ output: formattedOutput,
79
+ stats: {}
80
+ };
81
+ };
82
+
83
+ exports.generateContentTypesDefinitions = generateContentTypesDefinitions;
84
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/generators/content-types/index.ts"],"sourcesContent":["import * as ts from 'typescript';\nimport { sortBy } from 'lodash';\n\nimport { models } from '../common';\nimport { resolveInterfaceNames } from '../common/interface-names';\nimport { emitDefinitions, format, generateSharedExtensionDefinition } from '../utils';\nimport type { GeneratorOptions } from '../utils';\n\nconst { factory } = ts;\n\nconst NO_CONTENT_TYPE_PLACEHOLDER_COMMENT = `/*\n * The app doesn't have any content-types yet.\n */\n`;\n\n/**\n * Generate type definitions for Strapi Content-Types\n */\nexport const generateContentTypesDefinitions = async (\n options: GeneratorOptions = {} as GeneratorOptions\n) => {\n const { strapi, strict = false } = options;\n\n const { contentTypes } = strapi;\n\n const schemas = sortBy(Object.values<models.utils.Schema>(contentTypes ?? {}), 'uid');\n const interfaceNames = resolveInterfaceNames(\n schemas.map(({ uid }) => uid),\n options.logger,\n { strict }\n );\n const contentTypesDefinitions = schemas.map((contentType) => ({\n uid: contentType.uid,\n definition: models.schema.generateSchemaDefinition(\n contentType,\n interfaceNames.get(contentType.uid),\n { strict }\n ),\n }));\n\n options.logger.debug(`Found ${contentTypesDefinitions.length} content-types.`);\n\n if (contentTypesDefinitions.length === 0) {\n return { output: NO_CONTENT_TYPE_PLACEHOLDER_COMMENT, stats: {} };\n }\n\n const formattedSchemasDefinitions = contentTypesDefinitions.reduce<any[]>((acc, def) => {\n acc.push(\n // Definition\n def.definition,\n\n // Add a newline between each interface declaration\n factory.createIdentifier('\\n')\n );\n\n return acc;\n }, []);\n\n const allDefinitions = [\n // Imports\n ...models.imports.generateImportDefinition(),\n\n // Add a newline after the import statement\n factory.createIdentifier('\\n'),\n\n // Schemas\n ...formattedSchemasDefinitions,\n\n // Global\n generateSharedExtensionDefinition('ContentTypeSchemas', contentTypesDefinitions, { strict }),\n ];\n\n const output = emitDefinitions(allDefinitions);\n const formattedOutput = await format(output);\n\n return { output: formattedOutput, stats: {} };\n};\n"],"names":["factory","ts","NO_CONTENT_TYPE_PLACEHOLDER_COMMENT","generateContentTypesDefinitions","options","strapi","strict","contentTypes","schemas","sortBy","Object","values","interfaceNames","resolveInterfaceNames","map","uid","logger","contentTypesDefinitions","contentType","definition","models","get","debug","length","output","stats","formattedSchemasDefinitions","reduce","acc","def","push","createIdentifier","allDefinitions","generateSharedExtensionDefinition","emitDefinitions","formattedOutput","format"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,MAAM,EAAEA,OAAO,EAAE,GAAGC,aAAAA;AAEpB,MAAMC,sCAAsC,CAAC;;;AAG7C,CAAC;AAED;;AAEC,IACM,MAAMC,+BAAAA,GAAkC,OAC7CC,OAAAA,GAA4B,EAAsB,GAAA;AAElD,IAAA,MAAM,EAAEC,MAAM,EAAEC,MAAAA,GAAS,KAAK,EAAE,GAAGF,OAAAA;IAEnC,MAAM,EAAEG,YAAY,EAAE,GAAGF,MAAAA;AAEzB,IAAA,MAAMG,UAAUC,QAAAA,CAAOC,MAAAA,CAAOC,MAAM,CAAsBJ,YAAAA,IAAgB,EAAC,CAAA,EAAI,KAAA,CAAA;AAC/E,IAAA,MAAMK,gBAAAA,GAAiBC,oCAAAA,CACrBL,OAAAA,CAAQM,GAAG,CAAC,CAAC,EAAEC,GAAG,EAAE,GAAKA,GAAAA,CAAAA,EACzBX,OAAAA,CAAQY,MAAM,EACd;AAAEV,QAAAA;AAAO,KAAA,CAAA;AAEX,IAAA,MAAMW,0BAA0BT,OAAAA,CAAQM,GAAG,CAAC,CAACI,eAAiB;AAC5DH,YAAAA,GAAAA,EAAKG,YAAYH,GAAG;YACpBI,UAAAA,EAAYC,+BAAsC,CAChDF,WAAAA,EACAN,gBAAAA,CAAeS,GAAG,CAACH,WAAAA,CAAYH,GAAG,CAAA,EAClC;AAAET,gBAAAA;AAAO,aAAA;SAEb,CAAA,CAAA;IAEAF,OAAAA,CAAQY,MAAM,CAACM,KAAK,CAAC,CAAC,MAAM,EAAEL,uBAAAA,CAAwBM,MAAM,CAAC,eAAe,CAAC,CAAA;IAE7E,IAAIN,uBAAAA,CAAwBM,MAAM,KAAK,CAAA,EAAG;QACxC,OAAO;YAAEC,MAAAA,EAAQtB,mCAAAA;AAAqCuB,YAAAA,KAAAA,EAAO;AAAG,SAAA;AAClE,IAAA;AAEA,IAAA,MAAMC,2BAAAA,GAA8BT,uBAAAA,CAAwBU,MAAM,CAAQ,CAACC,GAAAA,EAAKC,GAAAA,GAAAA;QAC9ED,GAAAA,CAAIE,IAAI;QAEND,GAAAA,CAAIV,UAAU;AAGdnB,QAAAA,OAAAA,CAAQ+B,gBAAgB,CAAC,IAAA,CAAA,CAAA;QAG3B,OAAOH,GAAAA;AACT,IAAA,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAMI,cAAAA,GAAiB;;WAElBZ,gCAAuC,EAAA;;AAG1CpB,QAAAA,OAAAA,CAAQ+B,gBAAgB,CAAC,IAAA,CAAA;;AAGtBL,QAAAA,GAAAA,2BAAAA;;AAGHO,QAAAA,uCAAAA,CAAkC,sBAAsBhB,uBAAAA,EAAyB;AAAEX,YAAAA;AAAO,SAAA;AAC3F,KAAA;AAED,IAAA,MAAMkB,SAASU,qBAAAA,CAAgBF,cAAAA,CAAAA;IAC/B,MAAMG,eAAAA,GAAkB,MAAMC,YAAAA,CAAOZ,MAAAA,CAAAA;IAErC,OAAO;QAAEA,MAAAA,EAAQW,eAAAA;AAAiBV,QAAAA,KAAAA,EAAO;AAAG,KAAA;AAC9C;;;;"}
@@ -0,0 +1,62 @@
1
+ import * as ts from 'typescript';
2
+ import { sortBy } from 'lodash';
3
+ import { generateSchemaDefinition } from '../common/models/schema.mjs';
4
+ import { generateImportDefinition } from '../common/imports.mjs';
5
+ import { resolveInterfaceNames } from '../common/interface-names.mjs';
6
+ import { generateSharedExtensionDefinition, emitDefinitions, format } from '../utils.mjs';
7
+
8
+ const { factory } = ts;
9
+ const NO_CONTENT_TYPE_PLACEHOLDER_COMMENT = `/*
10
+ * The app doesn't have any content-types yet.
11
+ */
12
+ `;
13
+ /**
14
+ * Generate type definitions for Strapi Content-Types
15
+ */ const generateContentTypesDefinitions = async (options = {})=>{
16
+ const { strapi, strict = false } = options;
17
+ const { contentTypes } = strapi;
18
+ const schemas = sortBy(Object.values(contentTypes ?? {}), 'uid');
19
+ const interfaceNames = resolveInterfaceNames(schemas.map(({ uid })=>uid), options.logger, {
20
+ strict
21
+ });
22
+ const contentTypesDefinitions = schemas.map((contentType)=>({
23
+ uid: contentType.uid,
24
+ definition: generateSchemaDefinition(contentType, interfaceNames.get(contentType.uid), {
25
+ strict
26
+ })
27
+ }));
28
+ options.logger.debug(`Found ${contentTypesDefinitions.length} content-types.`);
29
+ if (contentTypesDefinitions.length === 0) {
30
+ return {
31
+ output: NO_CONTENT_TYPE_PLACEHOLDER_COMMENT,
32
+ stats: {}
33
+ };
34
+ }
35
+ const formattedSchemasDefinitions = contentTypesDefinitions.reduce((acc, def)=>{
36
+ acc.push(// Definition
37
+ def.definition, // Add a newline between each interface declaration
38
+ factory.createIdentifier('\n'));
39
+ return acc;
40
+ }, []);
41
+ const allDefinitions = [
42
+ // Imports
43
+ ...generateImportDefinition(),
44
+ // Add a newline after the import statement
45
+ factory.createIdentifier('\n'),
46
+ // Schemas
47
+ ...formattedSchemasDefinitions,
48
+ // Global
49
+ generateSharedExtensionDefinition('ContentTypeSchemas', contentTypesDefinitions, {
50
+ strict
51
+ })
52
+ ];
53
+ const output = emitDefinitions(allDefinitions);
54
+ const formattedOutput = await format(output);
55
+ return {
56
+ output: formattedOutput,
57
+ stats: {}
58
+ };
59
+ };
60
+
61
+ export { generateContentTypesDefinitions };
62
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/generators/content-types/index.ts"],"sourcesContent":["import * as ts from 'typescript';\nimport { sortBy } from 'lodash';\n\nimport { models } from '../common';\nimport { resolveInterfaceNames } from '../common/interface-names';\nimport { emitDefinitions, format, generateSharedExtensionDefinition } from '../utils';\nimport type { GeneratorOptions } from '../utils';\n\nconst { factory } = ts;\n\nconst NO_CONTENT_TYPE_PLACEHOLDER_COMMENT = `/*\n * The app doesn't have any content-types yet.\n */\n`;\n\n/**\n * Generate type definitions for Strapi Content-Types\n */\nexport const generateContentTypesDefinitions = async (\n options: GeneratorOptions = {} as GeneratorOptions\n) => {\n const { strapi, strict = false } = options;\n\n const { contentTypes } = strapi;\n\n const schemas = sortBy(Object.values<models.utils.Schema>(contentTypes ?? {}), 'uid');\n const interfaceNames = resolveInterfaceNames(\n schemas.map(({ uid }) => uid),\n options.logger,\n { strict }\n );\n const contentTypesDefinitions = schemas.map((contentType) => ({\n uid: contentType.uid,\n definition: models.schema.generateSchemaDefinition(\n contentType,\n interfaceNames.get(contentType.uid),\n { strict }\n ),\n }));\n\n options.logger.debug(`Found ${contentTypesDefinitions.length} content-types.`);\n\n if (contentTypesDefinitions.length === 0) {\n return { output: NO_CONTENT_TYPE_PLACEHOLDER_COMMENT, stats: {} };\n }\n\n const formattedSchemasDefinitions = contentTypesDefinitions.reduce<any[]>((acc, def) => {\n acc.push(\n // Definition\n def.definition,\n\n // Add a newline between each interface declaration\n factory.createIdentifier('\\n')\n );\n\n return acc;\n }, []);\n\n const allDefinitions = [\n // Imports\n ...models.imports.generateImportDefinition(),\n\n // Add a newline after the import statement\n factory.createIdentifier('\\n'),\n\n // Schemas\n ...formattedSchemasDefinitions,\n\n // Global\n generateSharedExtensionDefinition('ContentTypeSchemas', contentTypesDefinitions, { strict }),\n ];\n\n const output = emitDefinitions(allDefinitions);\n const formattedOutput = await format(output);\n\n return { output: formattedOutput, stats: {} };\n};\n"],"names":["factory","ts","NO_CONTENT_TYPE_PLACEHOLDER_COMMENT","generateContentTypesDefinitions","options","strapi","strict","contentTypes","schemas","sortBy","Object","values","interfaceNames","resolveInterfaceNames","map","uid","logger","contentTypesDefinitions","contentType","definition","models","get","debug","length","output","stats","formattedSchemasDefinitions","reduce","acc","def","push","createIdentifier","allDefinitions","generateSharedExtensionDefinition","emitDefinitions","formattedOutput","format"],"mappings":";;;;;;;AAQA,MAAM,EAAEA,OAAO,EAAE,GAAGC,EAAAA;AAEpB,MAAMC,sCAAsC,CAAC;;;AAG7C,CAAC;AAED;;AAEC,IACM,MAAMC,+BAAAA,GAAkC,OAC7CC,OAAAA,GAA4B,EAAsB,GAAA;AAElD,IAAA,MAAM,EAAEC,MAAM,EAAEC,MAAAA,GAAS,KAAK,EAAE,GAAGF,OAAAA;IAEnC,MAAM,EAAEG,YAAY,EAAE,GAAGF,MAAAA;AAEzB,IAAA,MAAMG,UAAUC,MAAAA,CAAOC,MAAAA,CAAOC,MAAM,CAAsBJ,YAAAA,IAAgB,EAAC,CAAA,EAAI,KAAA,CAAA;AAC/E,IAAA,MAAMK,cAAAA,GAAiBC,qBAAAA,CACrBL,OAAAA,CAAQM,GAAG,CAAC,CAAC,EAAEC,GAAG,EAAE,GAAKA,GAAAA,CAAAA,EACzBX,OAAAA,CAAQY,MAAM,EACd;AAAEV,QAAAA;AAAO,KAAA,CAAA;AAEX,IAAA,MAAMW,0BAA0BT,OAAAA,CAAQM,GAAG,CAAC,CAACI,eAAiB;AAC5DH,YAAAA,GAAAA,EAAKG,YAAYH,GAAG;YACpBI,UAAAA,EAAYC,wBAAsC,CAChDF,WAAAA,EACAN,cAAAA,CAAeS,GAAG,CAACH,WAAAA,CAAYH,GAAG,CAAA,EAClC;AAAET,gBAAAA;AAAO,aAAA;SAEb,CAAA,CAAA;IAEAF,OAAAA,CAAQY,MAAM,CAACM,KAAK,CAAC,CAAC,MAAM,EAAEL,uBAAAA,CAAwBM,MAAM,CAAC,eAAe,CAAC,CAAA;IAE7E,IAAIN,uBAAAA,CAAwBM,MAAM,KAAK,CAAA,EAAG;QACxC,OAAO;YAAEC,MAAAA,EAAQtB,mCAAAA;AAAqCuB,YAAAA,KAAAA,EAAO;AAAG,SAAA;AAClE,IAAA;AAEA,IAAA,MAAMC,2BAAAA,GAA8BT,uBAAAA,CAAwBU,MAAM,CAAQ,CAACC,GAAAA,EAAKC,GAAAA,GAAAA;QAC9ED,GAAAA,CAAIE,IAAI;QAEND,GAAAA,CAAIV,UAAU;AAGdnB,QAAAA,OAAAA,CAAQ+B,gBAAgB,CAAC,IAAA,CAAA,CAAA;QAG3B,OAAOH,GAAAA;AACT,IAAA,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAMI,cAAAA,GAAiB;;WAElBZ,wBAAuC,EAAA;;AAG1CpB,QAAAA,OAAAA,CAAQ+B,gBAAgB,CAAC,IAAA,CAAA;;AAGtBL,QAAAA,GAAAA,2BAAAA;;AAGHO,QAAAA,iCAAAA,CAAkC,sBAAsBhB,uBAAAA,EAAyB;AAAEX,YAAAA;AAAO,SAAA;AAC3F,KAAA;AAED,IAAA,MAAMkB,SAASU,eAAAA,CAAgBF,cAAAA,CAAAA;IAC/B,MAAMG,eAAAA,GAAkB,MAAMC,MAAAA,CAAOZ,MAAAA,CAAAA;IAErC,OAAO;QAAEA,MAAAA,EAAQW,eAAAA;AAAiBV,QAAAA,KAAAA,EAAO;AAAG,KAAA;AAC9C;;;;"}
@@ -0,0 +1,35 @@
1
+ import type { GeneratorOptions } from '../utils';
2
+ /**
3
+ * Generate type definitions for the application's controllers (api::*)
4
+ *
5
+ * Controllers are typed from their source file, so only the ones with a source in src/api are emitted.
6
+ * Plugin and admin controllers are left to the packages themselves (Strapi.Registries.PackageControllers).
7
+ *
8
+ * declare global {
9
+ * namespace Strapi {
10
+ * namespace Registries {
11
+ * interface AppControllers {
12
+ * 'api::<api>.<controller>': ControllerInstance<typeof import('<relative path to the source>')>;
13
+ * 'api::<api>.<controller>': ControllerContractOf<import('<relative path to the source>').ControllerContract>;
14
+ * }
15
+ * interface InferredControllers {
16
+ * 'api::<api>.<controller>': true;
17
+ * }
18
+ * }
19
+ * }
20
+ * }
21
+ *
22
+ * A controller whose module exports a `ControllerContract` type registers that contract; any other
23
+ * controller registers the type its default export provides. A JS source registers as `unknown`:
24
+ * without `allowJs` its import is an error type. So do a controller module, a default export and a
25
+ * contract typed `any`.
26
+ *
27
+ * `InferredControllers` lists the TypeScript controllers registered without a contract, whose type
28
+ * is read from the factory itself: `Core.ControllerFactory` rejects their uid. It is not emitted when
29
+ * there are none.
30
+ */
31
+ export declare const generateControllersDefinitions: (options?: GeneratorOptions) => Promise<{
32
+ output: string;
33
+ stats: {};
34
+ }>;
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/generators/controllers/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAgBjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,8BAA8B,GACzC,UAAS,gBAAyC;;;EAkEnD,CAAC"}
@@ -0,0 +1,88 @@
1
+ 'use strict';
2
+
3
+ var sources = require('../common/sources.js');
4
+
5
+ const REGISTRY = 'AppControllers';
6
+ // Same helper as the services generator's ServiceInstance
7
+ const INSTANCE_HELPER = 'ControllerInstance';
8
+ const CONTRACT_EXPORT = 'ControllerContract';
9
+ const CONTRACT_HELPER = 'ControllerContractOf';
10
+ const INFERRED_REGISTRY = 'InferredControllers';
11
+ const NO_CONTROLLER_PLACEHOLDER_COMMENT = `/*
12
+ * The app doesn't have any controllers yet.
13
+ */
14
+
15
+ export {};
16
+ `;
17
+ /**
18
+ * Generate type definitions for the application's controllers (api::*)
19
+ *
20
+ * Controllers are typed from their source file, so only the ones with a source in src/api are emitted.
21
+ * Plugin and admin controllers are left to the packages themselves (Strapi.Registries.PackageControllers).
22
+ *
23
+ * declare global {
24
+ * namespace Strapi {
25
+ * namespace Registries {
26
+ * interface AppControllers {
27
+ * 'api::<api>.<controller>': ControllerInstance<typeof import('<relative path to the source>')>;
28
+ * 'api::<api>.<controller>': ControllerContractOf<import('<relative path to the source>').ControllerContract>;
29
+ * }
30
+ * interface InferredControllers {
31
+ * 'api::<api>.<controller>': true;
32
+ * }
33
+ * }
34
+ * }
35
+ * }
36
+ *
37
+ * A controller whose module exports a `ControllerContract` type registers that contract; any other
38
+ * controller registers the type its default export provides. A JS source registers as `unknown`:
39
+ * without `allowJs` its import is an error type. So do a controller module, a default export and a
40
+ * contract typed `any`.
41
+ *
42
+ * `InferredControllers` lists the TypeScript controllers registered without a contract, whose type
43
+ * is read from the factory itself: `Core.ControllerFactory` rejects their uid. It is not emitted when
44
+ * there are none.
45
+ */ const generateControllersDefinitions = async (options = {})=>{
46
+ const { strapi, logger, pwd: outDir } = options;
47
+ if (!outDir) {
48
+ throw new Error('The controllers generator needs the output directory to resolve source imports');
49
+ }
50
+ const sources$1 = await sources.collectAppSources('controllers', {
51
+ api: strapi.dirs.app.api
52
+ }, outDir, logger);
53
+ const controllersDefinitions = sources.filterRegisteredSources(sources$1, strapi.controllers, logger);
54
+ logger.debug(`Found ${controllersDefinitions.length} controllers.`);
55
+ const contract = {
56
+ exportName: CONTRACT_EXPORT,
57
+ helper: CONTRACT_HELPER,
58
+ uids: await sources.findTypeExports(controllersDefinitions, CONTRACT_EXPORT, logger)
59
+ };
60
+ if (controllersDefinitions.length === 0) {
61
+ return {
62
+ output: NO_CONTROLLER_PLACEHOLDER_COMMENT,
63
+ stats: {}
64
+ };
65
+ }
66
+ const inferredUIDs = controllersDefinitions.filter(sources.isInferredSource(contract)).map(({ uid })=>uid);
67
+ // Each helper is only emitted when an entry reads it: `noUnusedLocals` reports an unused one
68
+ const output = await sources.emitRegistryDefinitions(REGISTRY, [
69
+ ...inferredUIDs.length > 0 ? [
70
+ sources.generateInstanceHelperDefinition(INSTANCE_HELPER, '*\n * Type of the controller exposed by a controller module: the return type of its default export\n * when it is a factory, the default export itself otherwise.\n ')
71
+ ] : [],
72
+ ...contract.uids.size > 0 ? [
73
+ sources.generateContractHelperDefinition(CONTRACT_HELPER, '*\n * Contract a controller module exports as `ControllerContract`, `unknown` when it is typed `any`.\n ')
74
+ ] : []
75
+ ], controllersDefinitions, sources.instanceTypeOf(INSTANCE_HELPER, logger, contract), [
76
+ {
77
+ registry: INFERRED_REGISTRY,
78
+ uids: inferredUIDs
79
+ }
80
+ ]);
81
+ return {
82
+ output,
83
+ stats: {}
84
+ };
85
+ };
86
+
87
+ exports.generateControllersDefinitions = generateControllersDefinitions;
88
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/generators/controllers/index.ts"],"sourcesContent":["import {\n collectAppSources,\n emitRegistryDefinitions,\n filterRegisteredSources,\n findTypeExports,\n generateContractHelperDefinition,\n generateInstanceHelperDefinition,\n instanceTypeOf,\n isInferredSource,\n} from '../common/sources';\nimport type { GeneratorOptions } from '../utils';\n\nconst REGISTRY = 'AppControllers';\n// Same helper as the services generator's ServiceInstance\nconst INSTANCE_HELPER = 'ControllerInstance';\nconst CONTRACT_EXPORT = 'ControllerContract';\nconst CONTRACT_HELPER = 'ControllerContractOf';\nconst INFERRED_REGISTRY = 'InferredControllers';\n\nconst NO_CONTROLLER_PLACEHOLDER_COMMENT = `/*\n * The app doesn't have any controllers yet.\n */\n\nexport {};\n`;\n\n/**\n * Generate type definitions for the application's controllers (api::*)\n *\n * Controllers are typed from their source file, so only the ones with a source in src/api are emitted.\n * Plugin and admin controllers are left to the packages themselves (Strapi.Registries.PackageControllers).\n *\n * declare global {\n * namespace Strapi {\n * namespace Registries {\n * interface AppControllers {\n * 'api::<api>.<controller>': ControllerInstance<typeof import('<relative path to the source>')>;\n * 'api::<api>.<controller>': ControllerContractOf<import('<relative path to the source>').ControllerContract>;\n * }\n * interface InferredControllers {\n * 'api::<api>.<controller>': true;\n * }\n * }\n * }\n * }\n *\n * A controller whose module exports a `ControllerContract` type registers that contract; any other\n * controller registers the type its default export provides. A JS source registers as `unknown`:\n * without `allowJs` its import is an error type. So do a controller module, a default export and a\n * contract typed `any`.\n *\n * `InferredControllers` lists the TypeScript controllers registered without a contract, whose type\n * is read from the factory itself: `Core.ControllerFactory` rejects their uid. It is not emitted when\n * there are none.\n */\nexport const generateControllersDefinitions = async (\n options: GeneratorOptions = {} as GeneratorOptions\n) => {\n const { strapi, logger, pwd: outDir } = options;\n\n if (!outDir) {\n throw new Error(\n 'The controllers generator needs the output directory to resolve source imports'\n );\n }\n\n const sources = await collectAppSources(\n 'controllers',\n { api: strapi.dirs.app.api },\n outDir,\n logger\n );\n const controllersDefinitions = filterRegisteredSources(sources, strapi.controllers, logger);\n\n logger.debug(`Found ${controllersDefinitions.length} controllers.`);\n\n const contract = {\n exportName: CONTRACT_EXPORT,\n helper: CONTRACT_HELPER,\n uids: await findTypeExports(controllersDefinitions, CONTRACT_EXPORT, logger),\n };\n\n if (controllersDefinitions.length === 0) {\n return { output: NO_CONTROLLER_PLACEHOLDER_COMMENT, stats: {} };\n }\n\n const inferredUIDs = controllersDefinitions\n .filter(isInferredSource(contract))\n .map(({ uid }) => uid);\n\n // Each helper is only emitted when an entry reads it: `noUnusedLocals` reports an unused one\n const output = await emitRegistryDefinitions(\n REGISTRY,\n [\n ...(inferredUIDs.length > 0\n ? [\n generateInstanceHelperDefinition(\n INSTANCE_HELPER,\n '*\\n * Type of the controller exposed by a controller module: the return type of its default export\\n * when it is a factory, the default export itself otherwise.\\n '\n ),\n ]\n : []),\n ...(contract.uids.size > 0\n ? [\n generateContractHelperDefinition(\n CONTRACT_HELPER,\n '*\\n * Contract a controller module exports as `ControllerContract`, `unknown` when it is typed `any`.\\n '\n ),\n ]\n : []),\n ],\n controllersDefinitions,\n instanceTypeOf(INSTANCE_HELPER, logger, contract),\n [\n {\n registry: INFERRED_REGISTRY,\n uids: inferredUIDs,\n },\n ]\n );\n\n return { output, stats: {} };\n};\n"],"names":["REGISTRY","INSTANCE_HELPER","CONTRACT_EXPORT","CONTRACT_HELPER","INFERRED_REGISTRY","NO_CONTROLLER_PLACEHOLDER_COMMENT","generateControllersDefinitions","options","strapi","logger","pwd","outDir","Error","sources","collectAppSources","api","dirs","app","controllersDefinitions","filterRegisteredSources","controllers","debug","length","contract","exportName","helper","uids","findTypeExports","output","stats","inferredUIDs","filter","isInferredSource","map","uid","emitRegistryDefinitions","generateInstanceHelperDefinition","size","generateContractHelperDefinition","instanceTypeOf","registry"],"mappings":";;;;AAYA,MAAMA,QAAAA,GAAW,gBAAA;AACjB;AACA,MAAMC,eAAAA,GAAkB,oBAAA;AACxB,MAAMC,eAAAA,GAAkB,oBAAA;AACxB,MAAMC,eAAAA,GAAkB,sBAAA;AACxB,MAAMC,iBAAAA,GAAoB,qBAAA;AAE1B,MAAMC,oCAAoC,CAAC;;;;;AAK3C,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BC,IACM,MAAMC,8BAAAA,GAAiC,OAC5CC,OAAAA,GAA4B,EAAsB,GAAA;IAElD,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAEC,GAAAA,EAAKC,MAAM,EAAE,GAAGJ,OAAAA;AAExC,IAAA,IAAI,CAACI,MAAAA,EAAQ;AACX,QAAA,MAAM,IAAIC,KAAAA,CACR,gFAAA,CAAA;AAEJ,IAAA;IAEA,MAAMC,SAAAA,GAAU,MAAMC,yBAAAA,CACpB,aAAA,EACA;AAAEC,QAAAA,GAAAA,EAAKP,MAAAA,CAAOQ,IAAI,CAACC,GAAG,CAACF;AAAI,KAAA,EAC3BJ,MAAAA,EACAF,MAAAA,CAAAA;AAEF,IAAA,MAAMS,sBAAAA,GAAyBC,+BAAAA,CAAwBN,SAAAA,EAASL,MAAAA,CAAOY,WAAW,EAAEX,MAAAA,CAAAA;IAEpFA,MAAAA,CAAOY,KAAK,CAAC,CAAC,MAAM,EAAEH,sBAAAA,CAAuBI,MAAM,CAAC,aAAa,CAAC,CAAA;AAElE,IAAA,MAAMC,QAAAA,GAAW;QACfC,UAAAA,EAAYtB,eAAAA;QACZuB,MAAAA,EAAQtB,eAAAA;QACRuB,IAAAA,EAAM,MAAMC,uBAAAA,CAAgBT,sBAAAA,EAAwBhB,eAAAA,EAAiBO,MAAAA;AACvE,KAAA;IAEA,IAAIS,sBAAAA,CAAuBI,MAAM,KAAK,CAAA,EAAG;QACvC,OAAO;YAAEM,MAAAA,EAAQvB,iCAAAA;AAAmCwB,YAAAA,KAAAA,EAAO;AAAG,SAAA;AAChE,IAAA;AAEA,IAAA,MAAMC,YAAAA,GAAeZ,sBAAAA,CAClBa,MAAM,CAACC,wBAAAA,CAAiBT,QAAAA,CAAAA,CAAAA,CACxBU,GAAG,CAAC,CAAC,EAAEC,GAAG,EAAE,GAAKA,GAAAA,CAAAA;;IAGpB,MAAMN,MAAAA,GAAS,MAAMO,+BAAAA,CACnBnC,QAAAA,EACA;WACM8B,YAAAA,CAAaR,MAAM,GAAG,CAAA,GACtB;AACEc,YAAAA,wCAAAA,CACEnC,eAAAA,EACA,sKAAA;AAEH,SAAA,GACD,EAAE;AACFsB,QAAAA,GAAAA,QAAAA,CAASG,IAAI,CAACW,IAAI,GAAG,CAAA,GACrB;AACEC,YAAAA,wCAAAA,CACEnC,eAAAA,EACA,0GAAA;AAEH,SAAA,GACD;AACL,KAAA,EACDe,sBAAAA,EACAqB,sBAAAA,CAAetC,eAAAA,EAAiBQ,MAAAA,EAAQc,QAAAA,CAAAA,EACxC;AACE,QAAA;YACEiB,QAAAA,EAAUpC,iBAAAA;YACVsB,IAAAA,EAAMI;AACR;AACD,KAAA,CAAA;IAGH,OAAO;AAAEF,QAAAA,MAAAA;AAAQC,QAAAA,KAAAA,EAAO;AAAG,KAAA;AAC7B;;;;"}
@@ -0,0 +1,86 @@
1
+ import { collectAppSources, filterRegisteredSources, findTypeExports, isInferredSource, emitRegistryDefinitions, generateInstanceHelperDefinition, generateContractHelperDefinition, instanceTypeOf } from '../common/sources.mjs';
2
+
3
+ const REGISTRY = 'AppControllers';
4
+ // Same helper as the services generator's ServiceInstance
5
+ const INSTANCE_HELPER = 'ControllerInstance';
6
+ const CONTRACT_EXPORT = 'ControllerContract';
7
+ const CONTRACT_HELPER = 'ControllerContractOf';
8
+ const INFERRED_REGISTRY = 'InferredControllers';
9
+ const NO_CONTROLLER_PLACEHOLDER_COMMENT = `/*
10
+ * The app doesn't have any controllers yet.
11
+ */
12
+
13
+ export {};
14
+ `;
15
+ /**
16
+ * Generate type definitions for the application's controllers (api::*)
17
+ *
18
+ * Controllers are typed from their source file, so only the ones with a source in src/api are emitted.
19
+ * Plugin and admin controllers are left to the packages themselves (Strapi.Registries.PackageControllers).
20
+ *
21
+ * declare global {
22
+ * namespace Strapi {
23
+ * namespace Registries {
24
+ * interface AppControllers {
25
+ * 'api::<api>.<controller>': ControllerInstance<typeof import('<relative path to the source>')>;
26
+ * 'api::<api>.<controller>': ControllerContractOf<import('<relative path to the source>').ControllerContract>;
27
+ * }
28
+ * interface InferredControllers {
29
+ * 'api::<api>.<controller>': true;
30
+ * }
31
+ * }
32
+ * }
33
+ * }
34
+ *
35
+ * A controller whose module exports a `ControllerContract` type registers that contract; any other
36
+ * controller registers the type its default export provides. A JS source registers as `unknown`:
37
+ * without `allowJs` its import is an error type. So do a controller module, a default export and a
38
+ * contract typed `any`.
39
+ *
40
+ * `InferredControllers` lists the TypeScript controllers registered without a contract, whose type
41
+ * is read from the factory itself: `Core.ControllerFactory` rejects their uid. It is not emitted when
42
+ * there are none.
43
+ */ const generateControllersDefinitions = async (options = {})=>{
44
+ const { strapi, logger, pwd: outDir } = options;
45
+ if (!outDir) {
46
+ throw new Error('The controllers generator needs the output directory to resolve source imports');
47
+ }
48
+ const sources = await collectAppSources('controllers', {
49
+ api: strapi.dirs.app.api
50
+ }, outDir, logger);
51
+ const controllersDefinitions = filterRegisteredSources(sources, strapi.controllers, logger);
52
+ logger.debug(`Found ${controllersDefinitions.length} controllers.`);
53
+ const contract = {
54
+ exportName: CONTRACT_EXPORT,
55
+ helper: CONTRACT_HELPER,
56
+ uids: await findTypeExports(controllersDefinitions, CONTRACT_EXPORT, logger)
57
+ };
58
+ if (controllersDefinitions.length === 0) {
59
+ return {
60
+ output: NO_CONTROLLER_PLACEHOLDER_COMMENT,
61
+ stats: {}
62
+ };
63
+ }
64
+ const inferredUIDs = controllersDefinitions.filter(isInferredSource(contract)).map(({ uid })=>uid);
65
+ // Each helper is only emitted when an entry reads it: `noUnusedLocals` reports an unused one
66
+ const output = await emitRegistryDefinitions(REGISTRY, [
67
+ ...inferredUIDs.length > 0 ? [
68
+ generateInstanceHelperDefinition(INSTANCE_HELPER, '*\n * Type of the controller exposed by a controller module: the return type of its default export\n * when it is a factory, the default export itself otherwise.\n ')
69
+ ] : [],
70
+ ...contract.uids.size > 0 ? [
71
+ generateContractHelperDefinition(CONTRACT_HELPER, '*\n * Contract a controller module exports as `ControllerContract`, `unknown` when it is typed `any`.\n ')
72
+ ] : []
73
+ ], controllersDefinitions, instanceTypeOf(INSTANCE_HELPER, logger, contract), [
74
+ {
75
+ registry: INFERRED_REGISTRY,
76
+ uids: inferredUIDs
77
+ }
78
+ ]);
79
+ return {
80
+ output,
81
+ stats: {}
82
+ };
83
+ };
84
+
85
+ export { generateControllersDefinitions };
86
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/generators/controllers/index.ts"],"sourcesContent":["import {\n collectAppSources,\n emitRegistryDefinitions,\n filterRegisteredSources,\n findTypeExports,\n generateContractHelperDefinition,\n generateInstanceHelperDefinition,\n instanceTypeOf,\n isInferredSource,\n} from '../common/sources';\nimport type { GeneratorOptions } from '../utils';\n\nconst REGISTRY = 'AppControllers';\n// Same helper as the services generator's ServiceInstance\nconst INSTANCE_HELPER = 'ControllerInstance';\nconst CONTRACT_EXPORT = 'ControllerContract';\nconst CONTRACT_HELPER = 'ControllerContractOf';\nconst INFERRED_REGISTRY = 'InferredControllers';\n\nconst NO_CONTROLLER_PLACEHOLDER_COMMENT = `/*\n * The app doesn't have any controllers yet.\n */\n\nexport {};\n`;\n\n/**\n * Generate type definitions for the application's controllers (api::*)\n *\n * Controllers are typed from their source file, so only the ones with a source in src/api are emitted.\n * Plugin and admin controllers are left to the packages themselves (Strapi.Registries.PackageControllers).\n *\n * declare global {\n * namespace Strapi {\n * namespace Registries {\n * interface AppControllers {\n * 'api::<api>.<controller>': ControllerInstance<typeof import('<relative path to the source>')>;\n * 'api::<api>.<controller>': ControllerContractOf<import('<relative path to the source>').ControllerContract>;\n * }\n * interface InferredControllers {\n * 'api::<api>.<controller>': true;\n * }\n * }\n * }\n * }\n *\n * A controller whose module exports a `ControllerContract` type registers that contract; any other\n * controller registers the type its default export provides. A JS source registers as `unknown`:\n * without `allowJs` its import is an error type. So do a controller module, a default export and a\n * contract typed `any`.\n *\n * `InferredControllers` lists the TypeScript controllers registered without a contract, whose type\n * is read from the factory itself: `Core.ControllerFactory` rejects their uid. It is not emitted when\n * there are none.\n */\nexport const generateControllersDefinitions = async (\n options: GeneratorOptions = {} as GeneratorOptions\n) => {\n const { strapi, logger, pwd: outDir } = options;\n\n if (!outDir) {\n throw new Error(\n 'The controllers generator needs the output directory to resolve source imports'\n );\n }\n\n const sources = await collectAppSources(\n 'controllers',\n { api: strapi.dirs.app.api },\n outDir,\n logger\n );\n const controllersDefinitions = filterRegisteredSources(sources, strapi.controllers, logger);\n\n logger.debug(`Found ${controllersDefinitions.length} controllers.`);\n\n const contract = {\n exportName: CONTRACT_EXPORT,\n helper: CONTRACT_HELPER,\n uids: await findTypeExports(controllersDefinitions, CONTRACT_EXPORT, logger),\n };\n\n if (controllersDefinitions.length === 0) {\n return { output: NO_CONTROLLER_PLACEHOLDER_COMMENT, stats: {} };\n }\n\n const inferredUIDs = controllersDefinitions\n .filter(isInferredSource(contract))\n .map(({ uid }) => uid);\n\n // Each helper is only emitted when an entry reads it: `noUnusedLocals` reports an unused one\n const output = await emitRegistryDefinitions(\n REGISTRY,\n [\n ...(inferredUIDs.length > 0\n ? [\n generateInstanceHelperDefinition(\n INSTANCE_HELPER,\n '*\\n * Type of the controller exposed by a controller module: the return type of its default export\\n * when it is a factory, the default export itself otherwise.\\n '\n ),\n ]\n : []),\n ...(contract.uids.size > 0\n ? [\n generateContractHelperDefinition(\n CONTRACT_HELPER,\n '*\\n * Contract a controller module exports as `ControllerContract`, `unknown` when it is typed `any`.\\n '\n ),\n ]\n : []),\n ],\n controllersDefinitions,\n instanceTypeOf(INSTANCE_HELPER, logger, contract),\n [\n {\n registry: INFERRED_REGISTRY,\n uids: inferredUIDs,\n },\n ]\n );\n\n return { output, stats: {} };\n};\n"],"names":["REGISTRY","INSTANCE_HELPER","CONTRACT_EXPORT","CONTRACT_HELPER","INFERRED_REGISTRY","NO_CONTROLLER_PLACEHOLDER_COMMENT","generateControllersDefinitions","options","strapi","logger","pwd","outDir","Error","sources","collectAppSources","api","dirs","app","controllersDefinitions","filterRegisteredSources","controllers","debug","length","contract","exportName","helper","uids","findTypeExports","output","stats","inferredUIDs","filter","isInferredSource","map","uid","emitRegistryDefinitions","generateInstanceHelperDefinition","size","generateContractHelperDefinition","instanceTypeOf","registry"],"mappings":";;AAYA,MAAMA,QAAAA,GAAW,gBAAA;AACjB;AACA,MAAMC,eAAAA,GAAkB,oBAAA;AACxB,MAAMC,eAAAA,GAAkB,oBAAA;AACxB,MAAMC,eAAAA,GAAkB,sBAAA;AACxB,MAAMC,iBAAAA,GAAoB,qBAAA;AAE1B,MAAMC,oCAAoC,CAAC;;;;;AAK3C,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BC,IACM,MAAMC,8BAAAA,GAAiC,OAC5CC,OAAAA,GAA4B,EAAsB,GAAA;IAElD,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAEC,GAAAA,EAAKC,MAAM,EAAE,GAAGJ,OAAAA;AAExC,IAAA,IAAI,CAACI,MAAAA,EAAQ;AACX,QAAA,MAAM,IAAIC,KAAAA,CACR,gFAAA,CAAA;AAEJ,IAAA;IAEA,MAAMC,OAAAA,GAAU,MAAMC,iBAAAA,CACpB,aAAA,EACA;AAAEC,QAAAA,GAAAA,EAAKP,MAAAA,CAAOQ,IAAI,CAACC,GAAG,CAACF;AAAI,KAAA,EAC3BJ,MAAAA,EACAF,MAAAA,CAAAA;AAEF,IAAA,MAAMS,sBAAAA,GAAyBC,uBAAAA,CAAwBN,OAAAA,EAASL,MAAAA,CAAOY,WAAW,EAAEX,MAAAA,CAAAA;IAEpFA,MAAAA,CAAOY,KAAK,CAAC,CAAC,MAAM,EAAEH,sBAAAA,CAAuBI,MAAM,CAAC,aAAa,CAAC,CAAA;AAElE,IAAA,MAAMC,QAAAA,GAAW;QACfC,UAAAA,EAAYtB,eAAAA;QACZuB,MAAAA,EAAQtB,eAAAA;QACRuB,IAAAA,EAAM,MAAMC,eAAAA,CAAgBT,sBAAAA,EAAwBhB,eAAAA,EAAiBO,MAAAA;AACvE,KAAA;IAEA,IAAIS,sBAAAA,CAAuBI,MAAM,KAAK,CAAA,EAAG;QACvC,OAAO;YAAEM,MAAAA,EAAQvB,iCAAAA;AAAmCwB,YAAAA,KAAAA,EAAO;AAAG,SAAA;AAChE,IAAA;AAEA,IAAA,MAAMC,YAAAA,GAAeZ,sBAAAA,CAClBa,MAAM,CAACC,gBAAAA,CAAiBT,QAAAA,CAAAA,CAAAA,CACxBU,GAAG,CAAC,CAAC,EAAEC,GAAG,EAAE,GAAKA,GAAAA,CAAAA;;IAGpB,MAAMN,MAAAA,GAAS,MAAMO,uBAAAA,CACnBnC,QAAAA,EACA;WACM8B,YAAAA,CAAaR,MAAM,GAAG,CAAA,GACtB;AACEc,YAAAA,gCAAAA,CACEnC,eAAAA,EACA,sKAAA;AAEH,SAAA,GACD,EAAE;AACFsB,QAAAA,GAAAA,QAAAA,CAASG,IAAI,CAACW,IAAI,GAAG,CAAA,GACrB;AACEC,YAAAA,gCAAAA,CACEnC,eAAAA,EACA,0GAAA;AAEH,SAAA,GACD;AACL,KAAA,EACDe,sBAAAA,EACAqB,cAAAA,CAAetC,eAAAA,EAAiBQ,MAAAA,EAAQc,QAAAA,CAAAA,EACxC;AACE,QAAA;YACEiB,QAAAA,EAAUpC,iBAAAA;YACVsB,IAAAA,EAAMI;AACR;AACD,KAAA,CAAA;IAGH,OAAO;AAAEF,QAAAA,MAAAA;AAAQC,QAAAA,KAAAA,EAAO;AAAG,KAAA;AAC7B;;;;"}
@@ -0,0 +1,31 @@
1
+ export interface GenerateConfig {
2
+ strapi: any;
3
+ pwd: string;
4
+ rootDir?: string;
5
+ /**
6
+ * Artifacts to generate. `true` generates the artifact, `false` removes the file a previous
7
+ * run may have generated for it, unset leaves it untouched.
8
+ * `services`, `controllers`, `policies`, `middlewares` and `strict` are the strict types artifacts
9
+ * (`typescript.strictTypes`).
10
+ */
11
+ artifacts?: {
12
+ contentTypes?: boolean;
13
+ components?: boolean;
14
+ plugins?: boolean;
15
+ services?: boolean;
16
+ strict?: boolean;
17
+ controllers?: boolean;
18
+ policies?: boolean;
19
+ middlewares?: boolean;
20
+ };
21
+ logger?: {
22
+ silent?: boolean;
23
+ debug?: boolean;
24
+ verbose?: boolean;
25
+ };
26
+ }
27
+ /**
28
+ * Generate types definitions based on the given configuration
29
+ */
30
+ export declare const generate: (config?: GenerateConfig) => Promise<Record<string, any>>;
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAkDA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,GAAG,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,SAAS,CAAC,EAAE;QACV,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAU,SAAQ,cAAqC,iCAkI3E,CAAC"}
@@ -0,0 +1,150 @@
1
+ 'use strict';
2
+
3
+ var path = require('node:path');
4
+ var fs = require('node:fs/promises');
5
+ var chalk = require('chalk');
6
+ var constants = require('./constants.js');
7
+ var utils = require('./utils.js');
8
+ var index$7 = require('./content-types/index.js');
9
+ var index$6 = require('./components/index.js');
10
+ var index$5 = require('./plugins/index.js');
11
+ var index$4 = require('./services/index.js');
12
+ var index$3 = require('./controllers/index.js');
13
+ var index$2 = require('./policies/index.js');
14
+ var index$1 = require('./middlewares/index.js');
15
+ var index = require('./strict/index.js');
16
+
17
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
18
+
19
+ var path__default = /*#__PURE__*/_interopDefault(path);
20
+ var fs__default = /*#__PURE__*/_interopDefault(fs);
21
+ var chalk__default = /*#__PURE__*/_interopDefault(chalk);
22
+
23
+ const GENERATORS = {
24
+ contentTypes: index$7.generateContentTypesDefinitions,
25
+ components: index$6.generateComponentsDefinitions,
26
+ plugins: index$5.generatePluginDefinitions,
27
+ services: index$4.generateServicesDefinitions,
28
+ controllers: index$3.generateControllersDefinitions,
29
+ policies: index$2.generatePoliciesDefinitions,
30
+ middlewares: index$1.generateMiddlewaresDefinitions,
31
+ strict: index.generateStrictDefinitions
32
+ };
33
+ /**
34
+ * Artifacts written as `.ts` rather than `.d.ts`: they import the application's sources, and a
35
+ * reference that no longer resolves (a moved source, a renamed contract) is reported by `tsc` even
36
+ * with `skipLibCheck`, rather than silently typing the lookup as `any`. The other artifacts only
37
+ * hold declarations generated from the schemas, and stay `.d.ts`.
38
+ */ const SOURCE_ARTIFACTS = new Set([
39
+ 'services',
40
+ 'controllers',
41
+ 'policies',
42
+ 'middlewares'
43
+ ]);
44
+ /**
45
+ * The application's linters would check the `.ts` artifacts, whose helpers use `any`.
46
+ */ const LINT_DISABLE_HEADER = '/* eslint-disable */\n/* oxlint-disable */\n';
47
+ const isSourceArtifact = (artifact)=>SOURCE_ARTIFACTS.has(artifact);
48
+ const filenameOf = (artifact)=>isSourceArtifact(artifact) === true ? `${artifact}.ts` : `${artifact}.d.ts`;
49
+ /**
50
+ * File name an earlier generation wrote the artifact to, removed with the artifact's own file
51
+ */ const previousFilenameOf = (artifact)=>isSourceArtifact(artifact) === true ? `${artifact}.d.ts` : undefined;
52
+ /**
53
+ * Generate types definitions based on the given configuration
54
+ */ const generate = async (config = {})=>{
55
+ const { pwd, rootDir = constants.TYPES_ROOT_DIR, strapi, artifacts = {}, logger: loggerConfig } = config;
56
+ const reports = {};
57
+ const logger = utils.createLogger(loggerConfig);
58
+ const psTimer = utils.timer().start();
59
+ const registryPwd = path__default.default.join(pwd, rootDir, constants.GENERATED_OUT_DIR);
60
+ // Strict mode reads only the global schema registries, so schemas use that form with the opt-in.
61
+ const strict = artifacts.strict === true;
62
+ const generatorConfig = {
63
+ strapi,
64
+ pwd: registryPwd,
65
+ appDir: pwd,
66
+ logger,
67
+ strict
68
+ };
69
+ const returnWithMessage = ()=>{
70
+ const nbWarnings = chalk__default.default.yellow(`${logger.warnings} warning(s)`);
71
+ const nbErrors = chalk__default.default.red(`${logger.errors} error(s)`);
72
+ const status = logger.errors > 0 ? chalk__default.default.red('errored') : chalk__default.default.green('completed successfully');
73
+ psTimer.end();
74
+ logger.info(`The task ${status} with ${nbWarnings} and ${nbErrors} in ${psTimer.duration}s.`);
75
+ return reports;
76
+ };
77
+ const enabledArtifacts = Object.keys(artifacts).filter((p)=>artifacts[p] === true);
78
+ const disabledArtifacts = Object.keys(artifacts).filter((p)=>artifacts[p] === false && p in GENERATORS);
79
+ logger.info('Starting the type generation process');
80
+ logger.debug(`Enabled artifacts: ${enabledArtifacts.join(', ')}`);
81
+ for (const artifact of enabledArtifacts){
82
+ const boldArtifact = chalk__default.default.bold(artifact); // used for log messages
83
+ logger.info(`Generating types for ${boldArtifact}`);
84
+ if (artifact in GENERATORS) {
85
+ const generator = GENERATORS[artifact];
86
+ try {
87
+ const artifactGenTimer = utils.timer().start();
88
+ reports[artifact] = await generator(generatorConfig);
89
+ artifactGenTimer.end();
90
+ logger.debug(`Generated ${boldArtifact} in ${artifactGenTimer.duration}s`);
91
+ } catch (e) {
92
+ logger.error(`Failed to generate types for ${boldArtifact}: ${e.message ?? e.toString()}. Exiting`);
93
+ return returnWithMessage();
94
+ }
95
+ } else {
96
+ logger.warn(`The types generator for ${boldArtifact} is not implemented, skipping`);
97
+ }
98
+ }
99
+ for (const artifact of Object.keys(reports)){
100
+ const boldArtifact = chalk__default.default.bold(artifact); // used for log messages
101
+ const artifactFsTimer = utils.timer().start();
102
+ const report = reports[artifact];
103
+ const filename = filenameOf(artifact);
104
+ const previousFilename = previousFilenameOf(artifact);
105
+ const content = isSourceArtifact(artifact) === true ? `${LINT_DISABLE_HEADER}${report.output}` : report.output;
106
+ try {
107
+ const outPath = await utils.saveDefinitionToFileSystem(registryPwd, filename, content);
108
+ // A stale `.d.ts` would declare the registry entries a second time
109
+ if (previousFilename !== undefined) {
110
+ await fs__default.default.rm(path__default.default.join(registryPwd, previousFilename), {
111
+ force: true
112
+ });
113
+ }
114
+ const relativeOutPath = path__default.default.relative(process.cwd(), outPath);
115
+ artifactFsTimer.end();
116
+ logger.info(`Saved ${boldArtifact} types in ${chalk__default.default.bold(relativeOutPath)}`);
117
+ logger.debug(`Saved ${boldArtifact} in ${artifactFsTimer.duration}s`);
118
+ } catch (e) {
119
+ logger.error(`An error occurred while saving ${boldArtifact} types to the filesystem: ${e.message ?? e.toString()}. Exiting`);
120
+ return returnWithMessage();
121
+ }
122
+ }
123
+ // Disabled artifacts are removed so that a stale generated file does not keep applying
124
+ for (const artifact of disabledArtifacts){
125
+ const boldArtifact = chalk__default.default.bold(artifact); // used for log messages
126
+ const previousFilename = previousFilenameOf(artifact);
127
+ const outPaths = [
128
+ filenameOf(artifact),
129
+ ...previousFilename === undefined ? [] : [
130
+ previousFilename
131
+ ]
132
+ ].map((filename)=>path__default.default.join(registryPwd, filename));
133
+ try {
134
+ for (const outPath of outPaths){
135
+ if (await utils.pathExists(outPath) === false) {
136
+ continue;
137
+ }
138
+ await fs__default.default.rm(outPath);
139
+ logger.info(`Removed ${boldArtifact} types from ${chalk__default.default.bold(path__default.default.relative(process.cwd(), outPath))} (artifact disabled)`);
140
+ }
141
+ } catch (e) {
142
+ logger.error(`An error occurred while removing ${boldArtifact} types from the filesystem: ${e.message ?? e.toString()}. Exiting`);
143
+ return returnWithMessage();
144
+ }
145
+ }
146
+ return returnWithMessage();
147
+ };
148
+
149
+ exports.generate = generate;
150
+ //# sourceMappingURL=index.js.map