@kontent-ai/model-generator
Version:
This utility generates strongly-typed models for Delivery JS SDK, Migration toolkit or just general scripting to improve the experience when referencing Kontent.ai related objects.
117 lines • 5.71 kB
JavaScript
import { match } from "ts-pattern";
import { mapFilename, mapName, resolveCase } from "../../core/resolvers.js";
import { deliveryEntityUtils } from "./utils/delivery-entity.utils.js";
export function getDeliveryEntityNamesGenerator(config) {
const deliveryUtils = deliveryEntityUtils();
return {
getEntityNames: () => {
const { filenameResolver, nameResolver } = getNameAndFilenameResolver(config);
const entityTypeName = {
camelCase: resolveCase(config.entityType, "camelCase"),
pascalCase: resolveCase(config.entityType, "pascalCase"),
pluralCamelCase: resolveCase(deliveryUtils.getPluralName(config.entityType), "camelCase"),
};
const entityNames = {
codenamesTypeName: `${entityTypeName.pascalCase}Codenames`,
codenamesValuePropertyName: `${entityTypeName.camelCase}Codenames`,
codenamesTypeguardFunctionName: `is${entityTypeName.pascalCase}Codename`,
overviewFilename: mapFilename((c) => c.codename)({ codename: entityTypeName.pluralCamelCase }, true),
folderName: entityTypeName.pluralCamelCase,
getEntityName: mapName(nameResolver, "pascalCase"),
getCodenameTypeName: mapName(nameResolver, "pascalCase", { suffix: "Codename" }),
getTypeguardFunctionName: mapName(nameResolver, "pascalCase", {
prefix: "is",
suffix: "Codename",
}),
getEntityFilename: mapFilename(filenameResolver, {}),
termsNames: config.entityType === "Taxonomy"
? {
valuesPropertyName: mapName(nameResolver, "camelCase", { suffix: "TermCodenames" }),
codenamesTypeName: mapName(nameResolver, "pascalCase", { suffix: "TermCodenames" }),
typeguardFunctionName: mapName(nameResolver, "pascalCase", { prefix: "is", suffix: "TermCodename" }),
}
: undefined,
stepsNames: config.entityType === "Workflow"
? {
valuesPropertyName: mapName(nameResolver, "camelCase", { suffix: "StepCodenames" }),
codenamesTypeName: mapName(nameResolver, "pascalCase", { suffix: "StepCodenames" }),
typeguardFunctionName: mapName(nameResolver, "pascalCase", { prefix: "is", suffix: "StepCodename" }),
}
: undefined,
allStepsNames: config.entityType === "Workflow"
? {
valuesPropertyName: resolveCase("workflowStepCodenames", "camelCase"),
codenamesTypeName: resolveCase("workflowStepCodenames", "pascalCase"),
typeguardFunctionName: resolveCase("isWorkflowStepCodename", "camelCase"),
}
: undefined,
typeNames: config.entityType === "Type"
? {
contentItemTypeguardFunctionName: mapName(nameResolver, "pascalCase", { prefix: "is" }),
}
: undefined,
};
return entityNames;
},
};
}
function getNameAndFilenameResolver(config) {
const defaultNameResolver = (item) => `${item.name}${config.entityType}`;
const defaultFilenameResolver = (item) => `${item.name}.${config.entityType}`;
return match(config.entityType)
.returnType()
.with("Type", () => ({
nameResolver: config.nameResolvers?.contentType
? config.nameResolvers.contentType
: defaultNameResolver,
filenameResolver: config.fileResolvers?.contentType
? config.fileResolvers.contentType
: defaultFilenameResolver,
}))
.with("Snippet", () => ({
nameResolver: config.nameResolvers?.snippet
? config.nameResolvers.snippet
: defaultNameResolver,
filenameResolver: config.fileResolvers?.snippet
? config.fileResolvers.snippet
: defaultFilenameResolver,
}))
.with("Taxonomy", () => ({
nameResolver: config.nameResolvers?.taxonomy
? config.nameResolvers.taxonomy
: defaultNameResolver,
filenameResolver: config.fileResolvers?.taxonomy
? config.fileResolvers.taxonomy
: defaultFilenameResolver,
}))
.with("Language", () => ({
nameResolver: config.nameResolvers?.language
? config.nameResolvers.language
: defaultNameResolver,
filenameResolver: config.fileResolvers?.language
? config.fileResolvers.language
: defaultFilenameResolver,
}))
.with("Workflow", () => ({
nameResolver: config.nameResolvers?.workflow
? config.nameResolvers.workflow
: defaultNameResolver,
filenameResolver: config.fileResolvers?.workflow
? config.fileResolvers.workflow
: defaultFilenameResolver,
}))
.with("Collection", () => ({
nameResolver: config.nameResolvers?.collection
? config.nameResolvers.collection
: defaultNameResolver,
filenameResolver: config.fileResolvers?.collection
? config.fileResolvers.collection
: defaultFilenameResolver,
}))
.with("Element", () => ({
nameResolver: (item) => item.codename,
filenameResolver: (item) => item.codename,
}))
.exhaustive();
}
//# sourceMappingURL=delivery-entity-name.generator.js.map