@iotechpis/strapi-plugin-schemas-to-ts
Version:
A Strapi plugin that automatically generates Typescript interfaces for Strapi entities and components.
97 lines (96 loc) • 4.32 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Converter = void 0;
const lodash_1 = require("lodash");
const pascal_case_1 = require("pascal-case");
const prettier_1 = __importDefault(require("prettier"));
const schemaSource_1 = require("../models/schemaSource");
const register_1 = require("../register");
const commonHelpers_1 = require("./commonHelpers");
const fileHelpers_1 = require("./fileHelpers");
const interfaceBuilder_1 = require("./interface-builders/interfaceBuilder");
class Converter {
constructor(strapi, config) {
this.config = config;
this.contentTypes = (0, lodash_1.cloneDeep)(strapi.contentTypes);
this.commonHelpers = new commonHelpers_1.CommonHelpers(config);
this.interfaceBuilder = new interfaceBuilder_1.InterfaceBuilder(config);
this.commonHelpers.printVerboseLog(`${register_1.pluginName} configuration`, this.config);
}
async setPrettierOptions() {
this.prettierOptions = await this.commonHelpers.getPrettierOptions();
}
SchemasToTs() {
const currentNodeEnv = process.env.NODE_ENV ?? '';
const acceptedNodeEnvs = this.config.acceptedNodeEnvs ?? [];
if (!acceptedNodeEnvs.includes(currentNodeEnv)) {
console.log(`${register_1.pluginName} plugin's acceptedNodeEnvs property does not include '${currentNodeEnv}' environment. Skipping conversion of schemas to Typescript.`);
return;
}
const schemas = [];
for (const uid in this.contentTypes) {
if (this.interfaceBuilder.shouldSkipSchema(uid)) {
console.log(`Skipping schema ${uid}`);
continue;
}
if (this.contentTypes[uid].info.singularName == 'file') {
this.contentTypes[uid].info.singularName = 'media';
}
schemas.push(this.parseSchema(this.contentTypes[uid], schemaSource_1.SchemaSource.Api));
}
for (const schema of schemas) {
this.interfaceBuilder.convertSchemaToInterfaces(schema, schemas);
}
this.writeInterfacesFile(schemas);
}
parseSchema(schema, schemaSource) {
let schemaName = '';
switch (schemaSource) {
case schemaSource_1.SchemaSource.Api:
schemaName = schema.info.singularName;
break;
case schemaSource_1.SchemaSource.Common:
schemaName = schema.info.displayName;
break;
case schemaSource_1.SchemaSource.Component:
// let fileNameWithoutExtension = path.basename(file, path.extname(file));
// schemaName = fileNameWithoutExtension;
// folder = path.join(path.dirname(file), this.componentInterfacesFolderName);
// if (!FileHelpers.folderExists(folder)) {
// fs.mkdirSync(folder);
// }
break;
}
let pascalName = (0, pascal_case_1.pascalCase)(schemaName);
let needsComponentSuffix = schemaSource === schemaSource_1.SchemaSource.Component && this.config.alwaysAddComponentSuffix;
if (needsComponentSuffix) {
pascalName += 'Component';
}
return {
schema: schema,
schemaName: schemaName,
pascalName: pascalName,
needsComponentSuffix: needsComponentSuffix,
source: schemaSource,
interfaceAsText: '',
plainInterfaceAsText: '',
enums: [],
};
}
async writeInterfacesFile(schemas) {
let interfacesFileContent = await this.interfaceBuilder.buildInterfacesFileContent(schemas);
await this.setPrettierOptions();
if (this.prettierOptions) {
const options = this.prettierOptions;
if (!options.parser) {
options.parser = 'typescript';
}
interfacesFileContent = await prettier_1.default.format(interfacesFileContent, options);
}
fileHelpers_1.FileHelpers.writeInterfaceFile('', 'contentTypes.d.ts', interfacesFileContent);
}
}
exports.Converter = Converter;