@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.
- package/dist/compile.d.ts +5 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +12 -0
- package/dist/compile.js.map +1 -0
- package/dist/compile.mjs +10 -0
- package/dist/compile.mjs.map +1 -0
- package/dist/compilers/basic.d.ts +11 -0
- package/dist/compilers/basic.d.ts.map +1 -0
- package/dist/compilers/basic.js +58 -0
- package/dist/compilers/basic.js.map +1 -0
- package/dist/compilers/basic.mjs +36 -0
- package/dist/compilers/basic.mjs.map +1 -0
- package/dist/compilers/index.d.ts +3 -0
- package/dist/compilers/index.d.ts.map +1 -0
- package/dist/compilers/index.js +8 -0
- package/dist/compilers/index.js.map +1 -0
- package/dist/compilers/index.mjs +3 -0
- package/dist/compilers/index.mjs.map +1 -0
- package/dist/generators/common/compare.d.ts +14 -0
- package/dist/generators/common/compare.d.ts.map +1 -0
- package/dist/generators/common/compare.js +25 -0
- package/dist/generators/common/compare.js.map +1 -0
- package/dist/generators/common/compare.mjs +22 -0
- package/dist/generators/common/compare.mjs.map +1 -0
- package/dist/generators/common/imports.d.ts +5 -0
- package/dist/generators/common/imports.d.ts.map +1 -0
- package/dist/generators/common/imports.js +42 -0
- package/dist/generators/common/imports.js.map +1 -0
- package/dist/generators/common/imports.mjs +19 -0
- package/dist/generators/common/imports.mjs.map +1 -0
- package/dist/generators/common/index.d.ts +4 -0
- package/dist/generators/common/index.d.ts.map +1 -0
- package/dist/generators/common/interface-names.d.ts +16 -0
- package/dist/generators/common/interface-names.d.ts.map +1 -0
- package/dist/generators/common/interface-names.js +54 -0
- package/dist/generators/common/interface-names.js.map +1 -0
- package/dist/generators/common/interface-names.mjs +52 -0
- package/dist/generators/common/interface-names.mjs.map +1 -0
- package/dist/generators/common/models/attributes.d.ts +38 -0
- package/dist/generators/common/models/attributes.d.ts.map +1 -0
- package/dist/generators/common/models/attributes.js +205 -0
- package/dist/generators/common/models/attributes.js.map +1 -0
- package/dist/generators/common/models/attributes.mjs +176 -0
- package/dist/generators/common/models/attributes.mjs.map +1 -0
- package/dist/generators/common/models/index.d.ts +7 -0
- package/dist/generators/common/models/index.d.ts.map +1 -0
- package/dist/generators/common/models/mappers.d.ts +9 -0
- package/dist/generators/common/models/mappers.d.ts.map +1 -0
- package/dist/generators/common/models/mappers.js +227 -0
- package/dist/generators/common/models/mappers.js.map +1 -0
- package/dist/generators/common/models/mappers.mjs +202 -0
- package/dist/generators/common/models/mappers.mjs.map +1 -0
- package/dist/generators/common/models/schema.d.ts +8 -0
- package/dist/generators/common/models/schema.d.ts.map +1 -0
- package/dist/generators/common/models/schema.js +78 -0
- package/dist/generators/common/models/schema.js.map +1 -0
- package/dist/generators/common/models/schema.mjs +56 -0
- package/dist/generators/common/models/schema.mjs.map +1 -0
- package/dist/generators/common/models/utils.d.ts +57 -0
- package/dist/generators/common/models/utils.d.ts.map +1 -0
- package/dist/generators/common/models/utils.js +110 -0
- package/dist/generators/common/models/utils.js.map +1 -0
- package/dist/generators/common/models/utils.mjs +82 -0
- package/dist/generators/common/models/utils.mjs.map +1 -0
- package/dist/generators/common/sources.d.ts +133 -0
- package/dist/generators/common/sources.d.ts.map +1 -0
- package/dist/generators/common/sources.js +354 -0
- package/dist/generators/common/sources.js.map +1 -0
- package/dist/generators/common/sources.mjs +318 -0
- package/dist/generators/common/sources.mjs.map +1 -0
- package/dist/generators/components/index.d.ts +9 -0
- package/dist/generators/components/index.d.ts.map +1 -0
- package/dist/generators/components/index.js +84 -0
- package/dist/generators/components/index.js.map +1 -0
- package/dist/generators/components/index.mjs +62 -0
- package/dist/generators/components/index.mjs.map +1 -0
- package/dist/generators/constants.d.ts +3 -0
- package/dist/generators/constants.d.ts.map +1 -0
- package/dist/generators/constants.js +8 -0
- package/dist/generators/constants.js.map +1 -0
- package/dist/generators/constants.mjs +5 -0
- package/dist/generators/constants.mjs.map +1 -0
- package/dist/generators/content-types/index.d.ts +9 -0
- package/dist/generators/content-types/index.d.ts.map +1 -0
- package/dist/generators/content-types/index.js +84 -0
- package/dist/generators/content-types/index.js.map +1 -0
- package/dist/generators/content-types/index.mjs +62 -0
- package/dist/generators/content-types/index.mjs.map +1 -0
- package/dist/generators/controllers/index.d.ts +35 -0
- package/dist/generators/controllers/index.d.ts.map +1 -0
- package/dist/generators/controllers/index.js +88 -0
- package/dist/generators/controllers/index.js.map +1 -0
- package/dist/generators/controllers/index.mjs +86 -0
- package/dist/generators/controllers/index.mjs.map +1 -0
- package/dist/generators/index.d.ts +31 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +150 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/index.mjs +142 -0
- package/dist/generators/index.mjs.map +1 -0
- package/dist/generators/middlewares/index.d.ts +30 -0
- package/dist/generators/middlewares/index.d.ts.map +1 -0
- package/dist/generators/middlewares/index.js +163 -0
- package/dist/generators/middlewares/index.js.map +1 -0
- package/dist/generators/middlewares/index.mjs +141 -0
- package/dist/generators/middlewares/index.mjs.map +1 -0
- package/dist/generators/plugins/index.d.ts +9 -0
- package/dist/generators/plugins/index.d.ts.map +1 -0
- package/dist/generators/plugins/index.js +225 -0
- package/dist/generators/plugins/index.js.map +1 -0
- package/dist/generators/plugins/index.mjs +200 -0
- package/dist/generators/plugins/index.mjs.map +1 -0
- package/dist/generators/policies/index.d.ts +29 -0
- package/dist/generators/policies/index.d.ts.map +1 -0
- package/dist/generators/policies/index.js +135 -0
- package/dist/generators/policies/index.js.map +1 -0
- package/dist/generators/policies/index.mjs +113 -0
- package/dist/generators/policies/index.mjs.map +1 -0
- package/dist/generators/services/index.d.ts +35 -0
- package/dist/generators/services/index.d.ts.map +1 -0
- package/dist/generators/services/index.js +87 -0
- package/dist/generators/services/index.js.map +1 -0
- package/dist/generators/services/index.mjs +85 -0
- package/dist/generators/services/index.mjs.map +1 -0
- package/dist/generators/strict/index.d.ts +13 -0
- package/dist/generators/strict/index.d.ts.map +1 -0
- package/dist/generators/strict/index.js +24 -0
- package/dist/generators/strict/index.js.map +1 -0
- package/dist/generators/strict/index.mjs +22 -0
- package/dist/generators/strict/index.mjs.map +1 -0
- package/dist/generators/utils.d.ts +68 -0
- package/dist/generators/utils.d.ts.map +1 -0
- package/dist/generators/utils.js +201 -0
- package/dist/generators/utils.js.map +1 -0
- package/dist/generators/utils.mjs +166 -0
- package/dist/generators/utils.mjs.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +14 -0
- package/dist/index.mjs.map +1 -0
- package/dist/utils/format-host.d.ts +3 -0
- package/dist/utils/format-host.d.ts.map +1 -0
- package/dist/utils/format-host.js +33 -0
- package/dist/utils/format-host.js.map +1 -0
- package/dist/utils/format-host.mjs +11 -0
- package/dist/utils/format-host.mjs.map +1 -0
- package/dist/utils/get-config-path.d.ts +10 -0
- package/dist/utils/get-config-path.d.ts.map +1 -0
- package/dist/utils/get-config-path.js +43 -0
- package/dist/utils/get-config-path.js.map +1 -0
- package/dist/utils/get-config-path.mjs +18 -0
- package/dist/utils/get-config-path.mjs.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/is-using-typescript-sync.d.ts +5 -0
- package/dist/utils/is-using-typescript-sync.d.ts.map +1 -0
- package/dist/utils/is-using-typescript-sync.js +20 -0
- package/dist/utils/is-using-typescript-sync.js.map +1 -0
- package/dist/utils/is-using-typescript-sync.mjs +14 -0
- package/dist/utils/is-using-typescript-sync.mjs.map +1 -0
- package/dist/utils/is-using-typescript.d.ts +5 -0
- package/dist/utils/is-using-typescript.d.ts.map +1 -0
- package/dist/utils/is-using-typescript.js +20 -0
- package/dist/utils/is-using-typescript.js.map +1 -0
- package/dist/utils/is-using-typescript.mjs +14 -0
- package/dist/utils/is-using-typescript.mjs.map +1 -0
- package/dist/utils/report-diagnostics.d.ts +6 -0
- package/dist/utils/report-diagnostics.d.ts.map +1 -0
- package/dist/utils/report-diagnostics.js +37 -0
- package/dist/utils/report-diagnostics.js.map +1 -0
- package/dist/utils/report-diagnostics.mjs +15 -0
- package/dist/utils/report-diagnostics.mjs.map +1 -0
- package/dist/utils/resolve-config-options.d.ts +12 -0
- package/dist/utils/resolve-config-options.d.ts.map +1 -0
- package/dist/utils/resolve-config-options.js +39 -0
- package/dist/utils/resolve-config-options.js.map +1 -0
- package/dist/utils/resolve-config-options.mjs +17 -0
- package/dist/utils/resolve-config-options.mjs.map +1 -0
- package/dist/utils/resolve-outdir-sync.d.ts +5 -0
- package/dist/utils/resolve-outdir-sync.d.ts.map +1 -0
- package/dist/utils/resolve-outdir-sync.js +19 -0
- package/dist/utils/resolve-outdir-sync.js.map +1 -0
- package/dist/utils/resolve-outdir-sync.mjs +13 -0
- package/dist/utils/resolve-outdir-sync.mjs.map +1 -0
- package/dist/utils/resolve-outdir.d.ts +5 -0
- package/dist/utils/resolve-outdir.d.ts.map +1 -0
- package/dist/utils/resolve-outdir.js +19 -0
- package/dist/utils/resolve-outdir.js.map +1 -0
- package/dist/utils/resolve-outdir.mjs +13 -0
- package/dist/utils/resolve-outdir.mjs.map +1 -0
- package/package.json +27 -12
- package/.eslintrc.cjs +0 -16
- package/index.d.ts +0 -5
- package/jest.config.js +0 -6
- package/lib/__tests__/generators/schemas/attributes.test.js +0 -903
- package/lib/__tests__/generators/schemas/imports.test.js +0 -56
- package/lib/__tests__/generators/schemas/utils.test.js +0 -314
- package/lib/compile.js +0 -10
- package/lib/compilers/basic.js +0 -50
- package/lib/compilers/index.js +0 -7
- package/lib/generators/common/imports.js +0 -34
- package/lib/generators/common/index.js +0 -9
- package/lib/generators/common/models/attributes.js +0 -198
- package/lib/generators/common/models/index.js +0 -15
- package/lib/generators/common/models/mappers.js +0 -144
- package/lib/generators/common/models/schema.js +0 -93
- package/lib/generators/common/models/utils.js +0 -178
- package/lib/generators/components/index.js +0 -74
- package/lib/generators/constants.js +0 -6
- package/lib/generators/content-types/index.js +0 -74
- package/lib/generators/index.js +0 -122
- package/lib/generators/utils.js +0 -216
- package/lib/index.js +0 -13
- package/lib/utils/format-host.js +0 -15
- package/lib/utils/get-config-path.js +0 -29
- package/lib/utils/index.js +0 -21
- package/lib/utils/is-using-typescript-sync.js +0 -19
- package/lib/utils/is-using-typescript.js +0 -17
- package/lib/utils/report-diagnostics.js +0 -19
- package/lib/utils/resolve-config-options.js +0 -23
- package/lib/utils/resolve-outdir-sync.js +0 -18
- package/lib/utils/resolve-outdir.js +0 -18
- 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
|