prismic-ts-codegen 0.0.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/constants.ts","../node_modules/@prismicio/types/dist/index.js","../src/lib/isCustomTypeModelField.ts","../src/lib/isCustomTypeModelSlice.ts","../src/lib/isSharedSliceModel.ts","../src/lib/getAPIIDPath.ts","../src/lib/getFieldDocumentationURL.ts","../src/lib/isCustomTypeModel.ts","../src/lib/getHumanReadableModelName.ts","../src/lib/getHumanReadableFieldPath.ts","../src/lib/getHumanReadableFieldType.ts","../src/lib/writeFieldDocsDescription.ts","../src/lib/buildFieldDocs.ts","../src/lib/pascalCase.ts","../src/lib/buildSharedSliceInterfaceName.ts","../src/lib/addInterfacePropertiesForFields.ts","../src/lib/addTypeAliasForCustomType.ts","../src/lib/addTypeAliasForSharedSlice.ts","../src/lib/getSourceFileText.ts","../src/generateTypes.ts"],"sourcesContent":["import type { CustomTypeModelFieldType } from \"@prismicio/types\";\nimport { stripIndent } from \"common-tags\";\n\nexport const BLANK_LINE_IDENTIFIER = \"// ___BLANK_LINE_TO_BE_REPLACED___\";\n\nexport const NON_EDITABLE_FILE_HEADER = stripIndent`\n\t// Code generated by prismic-ts-codegen. DO NOT EDIT.\n\t${BLANK_LINE_IDENTIFIER}\n`;\n\nexport const CUSTOM_TYPES_DOCUMENTATION_URL =\n\t\"https://prismic.io/docs/core-concepts/custom-types\";\n\nexport const SHARED_SLICES_DOCUMENTATION_URL =\n\t\"https://prismic.io/docs/core-concepts/reusing-slices\";\n\nexport const FIELD_DOCUMENTATION_URLS: Record<\n\tkeyof typeof CustomTypeModelFieldType,\n\tstring\n> = {\n\tUID: \"https://prismic.io/docs/core-concepts/uid\",\n\tBoolean: \"https://prismic.io/docs/core-concepts/boolean\",\n\tColor: \"https://prismic.io/docs/core-concepts/color\",\n\tDate: \"https://prismic.io/docs/core-concepts/date\",\n\tTimestamp: \"https://prismic.io/docs/core-concepts/timestamp\",\n\tNumber: \"https://prismic.io/docs/core-concepts/number\",\n\tText: \"https://prismic.io/docs/core-concepts/key-text\",\n\tSelect: \"https://prismic.io/docs/core-concepts/select\",\n\tStructuredText: \"https://prismic.io/docs/core-concepts/rich-text-title\",\n\tImage: \"https://prismic.io/docs/core-concepts/image\",\n\tLink: \"https://prismic.io/docs/core-concepts/link-content-relationship\",\n\tEmbed: \"https://prismic.io/docs/core-concepts/embed\",\n\tGeoPoint: \"https://prismic.io/docs/core-concepts/geopoint\",\n\tGroup: \"https://prismic.io/docs/core-concepts/group\",\n\tIntegrationFields: \"https://prismic.io/docs/core-concepts/integration-fields\",\n\tSlices: \"https://prismic.io/docs/core-concepts/slices\",\n};\n","const RichTextNodeType = {\n heading1: \"heading1\",\n heading2: \"heading2\",\n heading3: \"heading3\",\n heading4: \"heading4\",\n heading5: \"heading5\",\n heading6: \"heading6\",\n paragraph: \"paragraph\",\n preformatted: \"preformatted\",\n strong: \"strong\",\n em: \"em\",\n listItem: \"list-item\",\n oListItem: \"o-list-item\",\n list: \"group-list-item\",\n oList: \"group-o-list-item\",\n image: \"image\",\n embed: \"embed\",\n hyperlink: \"hyperlink\",\n label: \"label\",\n span: \"span\"\n};\nconst LinkType = {\n Any: \"Any\",\n Document: \"Document\",\n Media: \"Media\",\n Web: \"Web\"\n};\nconst OEmbedType = {\n Photo: \"photo\",\n Video: \"video\",\n Link: \"link\",\n Rich: \"rich\"\n};\n\nconst CustomTypeModelFieldType = {\n Boolean: \"Boolean\",\n Color: \"Color\",\n Date: \"Date\",\n Embed: \"Embed\",\n GeoPoint: \"GeoPoint\",\n Group: \"Group\",\n Image: \"Image\",\n IntegrationFields: \"IntegrationFields\",\n Link: \"Link\",\n Number: \"Number\",\n Select: \"Select\",\n Slices: \"Slices\",\n StructuredText: \"StructuredText\",\n Text: \"Text\",\n Timestamp: \"Timestamp\",\n UID: \"UID\"\n};\nconst CustomTypeModelLinkSelectType = {\n Document: \"document\",\n Media: \"media\"\n};\nconst CustomTypeModelSliceDisplay = {\n List: \"list\",\n Grid: \"grid\"\n};\nconst CustomTypeModelSliceType = {\n Slice: \"Slice\",\n SharedSlice: \"SharedSlice\"\n};\n\nconst WebhookType = {\n APIUpdate: \"api-update\",\n TestTrigger: \"test-trigger\"\n};\n\nconst EmbedType = OEmbedType;\n\nexport { CustomTypeModelFieldType, CustomTypeModelLinkSelectType, CustomTypeModelSliceDisplay, CustomTypeModelSliceType, EmbedType, LinkType, OEmbedType, RichTextNodeType, WebhookType };\n//# sourceMappingURL=index.js.map\n","import type { CustomTypeModelField } from \"@prismicio/types\";\n\nexport const isCustomTypeModelField = (\n\tmodel: unknown,\n): model is CustomTypeModelField => {\n\treturn (\n\t\ttypeof model === \"object\" &&\n\t\tmodel !== null &&\n\t\t\"type\" in model &&\n\t\t\"config\" in model\n\t);\n};\n","import type { CustomTypeModelSlice } from \"@prismicio/types\";\n\nexport const isCustomTypeModelSlice = (\n\tmodel: unknown,\n): model is CustomTypeModelSlice => {\n\treturn (\n\t\ttypeof model === \"object\" &&\n\t\tmodel !== null &&\n\t\t\"non-repeat\" in model &&\n\t\t\"repeat\" in model\n\t);\n};\n","import type { SharedSliceModel } from \"@prismicio/types\";\n\nexport const isSharedSliceModel = (\n\tmodel: unknown,\n): model is SharedSliceModel => {\n\treturn typeof model === \"object\" && model !== null && \"variations\" in model;\n};\n","import type {\n\tCustomTypeModel,\n\tCustomTypeModelField,\n\tCustomTypeModelSlice,\n\tSharedSliceModel,\n} from \"@prismicio/types\";\nimport { CustomTypeModelFieldType } from \"@prismicio/types\";\n\nimport { PathElement } from \"../types\";\nimport { isCustomTypeModelField } from \"./isCustomTypeModelField\";\nimport { isCustomTypeModelSlice } from \"./isCustomTypeModelSlice\";\nimport { isSharedSliceModel } from \"./isSharedSliceModel\";\n\ntype GetAPIIDPathConfig = {\n\tpath: [\n\t\tPathElement<CustomTypeModel | SharedSliceModel>,\n\t\t...PathElement<CustomTypeModelField | CustomTypeModelSlice>[]\n\t];\n};\n\nexport const getAPIIDPath = (config: GetAPIIDPathConfig): string => {\n\treturn config.path\n\t\t.map((element, i) => {\n\t\t\tif (\n\t\t\t\tisCustomTypeModelField(element.model) &&\n\t\t\t\t(element.model.type === CustomTypeModelFieldType.Group ||\n\t\t\t\t\telement.model.type === CustomTypeModelFieldType.Slices)\n\t\t\t) {\n\t\t\t\treturn `${element.id}[]`;\n\t\t\t} else {\n\t\t\t\tif (element.id === \"items\") {\n\t\t\t\t\tconst previousElement = config.path[i - 1];\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tisCustomTypeModelSlice(previousElement.model) ||\n\t\t\t\t\t\tisSharedSliceModel(previousElement.model)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn `${element.id}[]`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn element.id;\n\t\t\t}\n\t\t})\n\t\t.join(\".\");\n};\n","import type { CustomTypeModelField } from \"@prismicio/types\";\n\nimport { FIELD_DOCUMENTATION_URLS } from \"../constants\";\n\ntype GetFieldDocumentationURLConfig = {\n\tmodel: CustomTypeModelField;\n};\n\nexport const getFieldDocumentationURL = (\n\tconfig: GetFieldDocumentationURLConfig,\n): string => {\n\treturn FIELD_DOCUMENTATION_URLS[config.model.type];\n};\n","import type { CustomTypeModel } from \"@prismicio/types\";\n\nexport const isCustomTypeModel = (model: unknown): model is CustomTypeModel => {\n\treturn typeof model === \"object\" && model !== null && \"json\" in model;\n};\n","import type {\n\tCustomTypeModel,\n\tCustomTypeModelField,\n\tCustomTypeModelSlice,\n\tSharedSliceModel,\n} from \"@prismicio/types\";\n\nimport { isCustomTypeModel } from \"./isCustomTypeModel\";\nimport { isCustomTypeModelField } from \"./isCustomTypeModelField\";\nimport { isCustomTypeModelSlice } from \"./isCustomTypeModelSlice\";\nimport { isSharedSliceModel } from \"./isSharedSliceModel\";\n\ntype GetModelHumanNameConfig = {\n\tid: string;\n\tmodel:\n\t\t| CustomTypeModel\n\t\t| SharedSliceModel\n\t\t| CustomTypeModelField\n\t\t| CustomTypeModelSlice;\n};\n\nexport const getHumanReadableModelName = (\n\tconfig: GetModelHumanNameConfig,\n): string => {\n\tif (isCustomTypeModel(config.model)) {\n\t\treturn config.model.label;\n\t} else if (isSharedSliceModel(config.model)) {\n\t\treturn config.model.name;\n\t} else if (\n\t\tisCustomTypeModelField(config.model) &&\n\t\t\"label\" in config.model.config\n\t) {\n\t\treturn config.model.config.label;\n\t} else if (isCustomTypeModelSlice(config.model)) {\n\t\treturn config.model.fieldset;\n\t} else {\n\t\t// Slice Zone\n\t\treturn `Slice Zone (\\`${config.id}\\`)`;\n\t}\n};\n","import type {\n\tCustomTypeModel,\n\tCustomTypeModelField,\n\tCustomTypeModelSlice,\n\tSharedSliceModel,\n} from \"@prismicio/types\";\n\nimport { PathElement } from \"../types\";\nimport { getHumanReadableModelName } from \"./getHumanReadableModelName\";\n\ntype GetHumanReadableFieldPathConfig = {\n\tpath: [\n\t\tPathElement<CustomTypeModel | SharedSliceModel>,\n\t\t...PathElement<CustomTypeModelField | CustomTypeModelSlice>[]\n\t];\n};\n\nexport const getHumanReadableFieldPath = (\n\tconfig: GetHumanReadableFieldPathConfig,\n): string => {\n\treturn config.path\n\t\t.map((element) => {\n\t\t\tif (element.label) {\n\t\t\t\treturn element.label;\n\t\t\t} else if (element.model) {\n\t\t\t\treturn getHumanReadableModelName({\n\t\t\t\t\tid: element.id,\n\t\t\t\t\tmodel: element.model,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn element.id;\n\t\t\t}\n\t\t})\n\t\t.join(\" → \");\n};\n","import type { CustomTypeModelField } from \"@prismicio/types\";\nimport { CustomTypeModelLinkSelectType } from \"@prismicio/types\";\n\ntype GetFieldHumanReadableTypeConfig = {\n\tmodel: CustomTypeModelField;\n};\n\nexport const getHumanReadableFieldType = (\n\tconfig: GetFieldHumanReadableTypeConfig,\n): string => {\n\tswitch (config.model.type) {\n\t\tcase \"StructuredText\": {\n\t\t\tconst isTitleField =\n\t\t\t\t\"single\" in config.model.config &&\n\t\t\t\tconfig.model.config.single\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.every((blockType) => /heading/.test(blockType));\n\n\t\t\treturn isTitleField ? \"Title\" : \"Rich Text\";\n\t\t}\n\n\t\tcase \"IntegrationFields\": {\n\t\t\treturn `Integration Fields (Catalog: \\`${config.model.config.catalog}\\`)`;\n\t\t}\n\n\t\tcase \"Link\": {\n\t\t\tswitch (config.model.config.select) {\n\t\t\t\tcase CustomTypeModelLinkSelectType.Document: {\n\t\t\t\t\treturn \"Content Relationship\";\n\t\t\t\t}\n\n\t\t\t\tcase CustomTypeModelLinkSelectType.Media: {\n\t\t\t\t\treturn \"Link to Media\";\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\treturn \"Link\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcase \"Slices\": {\n\t\t\treturn \"Slice Zone\";\n\t\t}\n\n\t\tdefault: {\n\t\t\treturn config.model.type;\n\t\t}\n\t}\n};\n","import type { CodeBlockWriter } from \"ts-morph\";\n\ntype BuildFieldDocsConfig = {\n\twriter: CodeBlockWriter;\n\tdescription?: string;\n\tfieldType?: string;\n\tdefaultValue?: string | boolean;\n\tplaceholder?: string;\n\tapiIDPath?: string;\n\tdocumentationURL?: string;\n};\n\nexport const writeFieldDocsDescription = (\n\tconfig: BuildFieldDocsConfig,\n): void => {\n\tif (config.description) {\n\t\tconfig.writer.writeLine(config.description);\n\t}\n\n\tconfig.writer.blankLineIfLastNot();\n\n\tif (config.fieldType) {\n\t\tconfig.writer.writeLine(`- **Field Type**: ${config.fieldType}`);\n\t}\n\n\tif (config.placeholder) {\n\t\tconfig.writer.writeLine(`- **Placeholder**: ${config.placeholder}`);\n\t}\n\n\tif (config.defaultValue !== undefined) {\n\t\tconst stringifiedDefaultValue =\n\t\t\ttypeof config.defaultValue === \"boolean\"\n\t\t\t\t? `${config.defaultValue}`\n\t\t\t\t: config.defaultValue;\n\n\t\tconfig.writer.writeLine(`- **Default Value**: ${stringifiedDefaultValue}`);\n\t}\n\n\tif (config.apiIDPath) {\n\t\tconfig.writer.writeLine(`- **API ID Path**: ${config.apiIDPath}`);\n\t}\n\n\tif (config.documentationURL) {\n\t\tconfig.writer.writeLine(`- **Documentation**: ${config.documentationURL}`);\n\t}\n};\n","import type {\n\tCustomTypeModel,\n\tCustomTypeModelField,\n\tCustomTypeModelSlice,\n\tSharedSliceModel,\n} from \"@prismicio/types\";\nimport type { JSDocableNodeStructure } from \"ts-morph\";\n\nimport { PathElement } from \"../types\";\nimport { getAPIIDPath } from \"./getAPIIDPath\";\nimport { getFieldDocumentationURL } from \"./getFieldDocumentationURL\";\nimport { getHumanReadableFieldPath } from \"./getHumanReadableFieldPath\";\nimport { getHumanReadableFieldType } from \"./getHumanReadableFieldType\";\nimport { getHumanReadableModelName } from \"./getHumanReadableModelName\";\nimport { writeFieldDocsDescription } from \"./writeFieldDocsDescription\";\n\ntype BuildFieldDocsConfig = {\n\tid: string;\n\tmodel: CustomTypeModelField;\n\tpath: [\n\t\tPathElement<CustomTypeModel | SharedSliceModel>,\n\t\t...PathElement<CustomTypeModelField | CustomTypeModelSlice>[]\n\t];\n};\n\nexport const buildFieldDocs = (\n\tconfig: BuildFieldDocsConfig,\n): NonNullable<JSDocableNodeStructure[\"docs\"]> => {\n\treturn [\n\t\t{\n\t\t\tdescription: (writer) => {\n\t\t\t\tconst name = getHumanReadableModelName({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t});\n\t\t\t\tconst humanReadablePath = getHumanReadableFieldPath({\n\t\t\t\t\tpath: config.path,\n\t\t\t\t});\n\n\t\t\t\tconst fieldType = getHumanReadableFieldType({\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t});\n\n\t\t\t\tconst placeholder =\n\t\t\t\t\t\"placeholder\" in config.model.config &&\n\t\t\t\t\tconfig.model.config.placeholder\n\t\t\t\t\t\t? config.model.config.placeholder\n\t\t\t\t\t\t: `*None*`;\n\n\t\t\t\tconst defaultValue =\n\t\t\t\t\t\"default_value\" in config.model.config\n\t\t\t\t\t\t? config.model.config.default_value\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\tconst apiIDPath = getAPIIDPath({\n\t\t\t\t\tpath: [...config.path, { id: config.id, model: config.model }],\n\t\t\t\t});\n\n\t\t\t\twriteFieldDocsDescription({\n\t\t\t\t\twriter,\n\t\t\t\t\tdescription: `${name} field in *${humanReadablePath}*`,\n\t\t\t\t\tfieldType,\n\t\t\t\t\tplaceholder,\n\t\t\t\t\tdefaultValue,\n\t\t\t\t\tapiIDPath,\n\t\t\t\t\tdocumentationURL: getFieldDocumentationURL({ model: config.model }),\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t];\n};\n","import {\n\tpascalCase as pascalCaseBase,\n\tpascalCaseTransformMerge,\n} from \"pascal-case\";\n\nexport const pascalCase = (input: string): string =>\n\tpascalCaseBase(input, {\n\t\ttransform: pascalCaseTransformMerge,\n\t});\n","import { pascalCase } from \"./pascalCase\";\n\ntype BuildSharedSliceInterfaceNameConfig = {\n\tid: string;\n};\n\nexport const buildSharedSliceInterfaceName = (\n\tconfig: BuildSharedSliceInterfaceNameConfig,\n): string => {\n\treturn pascalCase(`${config.id} Slice`);\n};\n","import type {\n\tCustomTypeModel,\n\tCustomTypeModelField,\n\tCustomTypeModelSlice,\n\tSharedSliceModel,\n} from \"@prismicio/types\";\nimport {\n\tCustomTypeModelSliceType,\n\tCustomTypeModelLinkSelectType,\n} from \"@prismicio/types\";\nimport type { InterfaceDeclaration, SourceFile } from \"ts-morph\";\n\nimport { FieldConfigs, PathElement } from \"../types\";\nimport { buildFieldDocs } from \"./buildFieldDocs\";\nimport { buildSharedSliceInterfaceName } from \"./buildSharedSliceInterfaceName\";\nimport { getHumanReadableFieldPath } from \"./getHumanReadableFieldPath\";\nimport { pascalCase } from \"./pascalCase\";\n\ntype AddInterfacePropertyFromFieldConfig = {\n\tid: string;\n\tmodel: CustomTypeModelField;\n\tinterface: InterfaceDeclaration;\n\tsourceFile: SourceFile;\n\tpath: [\n\t\tPathElement<CustomTypeModel | SharedSliceModel>,\n\t\t...PathElement<CustomTypeModelField | CustomTypeModelSlice>[]\n\t];\n\tfieldConfigs: FieldConfigs;\n};\n\nconst addInterfacePropertyFromField = (\n\tconfig: AddInterfacePropertyFromFieldConfig,\n) => {\n\tswitch (config.model.type) {\n\t\tcase \"UID\": {\n\t\t\t// UID fields are not included in Data.\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"Boolean\": {\n\t\t\tconfig.interface.addProperty({\n\t\t\t\tname: config.id,\n\t\t\t\ttype: \"prismicT.BooleanField\",\n\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tpath: config.path,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"Color\": {\n\t\t\tconfig.interface.addProperty({\n\t\t\t\tname: config.id,\n\t\t\t\ttype: \"prismicT.ColorField\",\n\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tpath: config.path,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"Date\": {\n\t\t\tconfig.interface.addProperty({\n\t\t\t\tname: config.id,\n\t\t\t\ttype: \"prismicT.DateField\",\n\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tpath: config.path,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"Embed\": {\n\t\t\tconst providerTypes: string[] = [];\n\n\t\t\tif (config.fieldConfigs.embed?.providerTypes) {\n\t\t\t\tfor (const providerType in config.fieldConfigs.embed?.providerTypes) {\n\t\t\t\t\tconst configuredProviderType =\n\t\t\t\t\t\tconfig.fieldConfigs.embed?.providerTypes[providerType];\n\n\t\t\t\t\tproviderTypes.push(\n\t\t\t\t\t\t`({ provider_name: \"${providerType}\" } & ${configuredProviderType})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconfig.interface.addProperty({\n\t\t\t\tname: config.id,\n\t\t\t\ttype:\n\t\t\t\t\tproviderTypes.length > 0\n\t\t\t\t\t\t? `prismicT.EmbedField<prismicT.AnyOEmbed & prismicT.OEmbedExtra & (${providerTypes.join(\n\t\t\t\t\t\t\t\t\" | \",\n\t\t\t\t\t\t )})>`\n\t\t\t\t\t\t: \"prismicT.EmbedField\",\n\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tpath: config.path,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"GeoPoint\": {\n\t\t\tconfig.interface.addProperty({\n\t\t\t\tname: config.id,\n\t\t\t\ttype: \"prismicT.GeoPointField\",\n\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tpath: config.path,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"Image\": {\n\t\t\tif (config.model.config.thumbnails.length > 0) {\n\t\t\t\tconst thumbnailNames = config.model.config.thumbnails\n\t\t\t\t\t.map((thumbnail) => `\"${thumbnail.name}\"`)\n\t\t\t\t\t.join(\" | \");\n\n\t\t\t\tconfig.interface.addProperty({\n\t\t\t\t\tname: config.id,\n\t\t\t\t\ttype: `prismicT.ImageField<${thumbnailNames}>`,\n\t\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\tpath: config.path,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconfig.interface.addProperty({\n\t\t\t\t\tname: config.id,\n\t\t\t\t\ttype: \"prismicT.ImageField<null>\",\n\t\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\tpath: config.path,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"IntegrationFields\": {\n\t\t\tconst catalogType =\n\t\t\t\tconfig.fieldConfigs.integrationFields?.catalogTypes?.[\n\t\t\t\t\tconfig.model.config.catalog\n\t\t\t\t];\n\n\t\t\tconfig.interface.addProperty({\n\t\t\t\tname: config.id,\n\t\t\t\ttype: catalogType\n\t\t\t\t\t? `prismicT.IntegrationFields<${catalogType}>`\n\t\t\t\t\t: \"prismicT.IntegrationFields\",\n\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tpath: config.path,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"Link\": {\n\t\t\tswitch (config.model.config.select) {\n\t\t\t\tcase CustomTypeModelLinkSelectType.Document: {\n\t\t\t\t\tconfig.interface.addProperty({\n\t\t\t\t\t\tname: config.id,\n\t\t\t\t\t\ttype:\n\t\t\t\t\t\t\tconfig.model.config.customtypes &&\n\t\t\t\t\t\t\tconfig.model.config.customtypes.length > 0\n\t\t\t\t\t\t\t\t? `prismicT.RelationField<${config.model.config.customtypes\n\t\t\t\t\t\t\t\t\t\t.map((type) => `\"${type}\"`)\n\t\t\t\t\t\t\t\t\t\t.join(\" | \")}>`\n\t\t\t\t\t\t\t\t: \"prismicT.RelationField\",\n\t\t\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\tpath: config.path,\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase CustomTypeModelLinkSelectType.Media: {\n\t\t\t\t\tconfig.interface.addProperty({\n\t\t\t\t\t\tname: config.id,\n\t\t\t\t\t\ttype: \"prismicT.LinkToMediaField\",\n\t\t\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\tpath: config.path,\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tconfig.interface.addProperty({\n\t\t\t\t\t\tname: config.id,\n\t\t\t\t\t\ttype: \"prismicT.LinkField\",\n\t\t\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\tpath: config.path,\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"Number\": {\n\t\t\tconfig.interface.addProperty({\n\t\t\t\tname: config.id,\n\t\t\t\ttype: \"prismicT.NumberField\",\n\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tpath: config.path,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"StructuredText\": {\n\t\t\tconst isTitleField =\n\t\t\t\t\"single\" in config.model.config &&\n\t\t\t\tconfig.model.config.single\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.every((blockType) => /heading/.test(blockType));\n\n\t\t\tif (isTitleField) {\n\t\t\t\tconfig.interface.addProperty({\n\t\t\t\t\tname: config.id,\n\t\t\t\t\ttype: \"prismicT.TitleField\",\n\t\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\tpath: config.path,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconfig.interface.addProperty({\n\t\t\t\t\tname: config.id,\n\t\t\t\t\ttype: \"prismicT.RichTextField\",\n\t\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\tpath: config.path,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"Select\": {\n\t\t\tconst options = config.model.config.options\n\t\t\t\t.map((option) => `\"${option}\"`)\n\t\t\t\t.join(\" | \");\n\t\t\tconst hasDefault = Boolean(config.model.config.default_value);\n\n\t\t\tif (hasDefault) {\n\t\t\t\tconfig.interface.addProperty({\n\t\t\t\t\tname: config.id,\n\t\t\t\t\ttype: `prismicT.SelectField<${options}, \"filled\">`,\n\t\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\tpath: config.path,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconfig.interface.addProperty({\n\t\t\t\t\tname: config.id,\n\t\t\t\t\ttype: `prismicT.SelectField<${options}>`,\n\t\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\tpath: config.path,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"Text\": {\n\t\t\tconfig.interface.addProperty({\n\t\t\t\tname: config.id,\n\t\t\t\ttype: \"prismicT.KeyTextField\",\n\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tpath: config.path,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"Timestamp\": {\n\t\t\tconfig.interface.addProperty({\n\t\t\t\tname: config.id,\n\t\t\t\ttype: \"prismicT.TimestampField\",\n\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tpath: config.path,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"Group\": {\n\t\t\tconst itemInterface = config.sourceFile.addInterface({\n\t\t\t\tname: pascalCase(\n\t\t\t\t\t`${config.path[0].id} Document Data ${config.id} Item`,\n\t\t\t\t),\n\t\t\t\tdocs: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdescription: (writer) => {\n\t\t\t\t\t\t\tconst humanReadablePath = getHumanReadableFieldPath({\n\t\t\t\t\t\t\t\tpath: [\n\t\t\t\t\t\t\t\t\t...config.path,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\twriter.writeLine(`Item in ${humanReadablePath}`);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\taddInterfacePropertiesForFields({\n\t\t\t\tinterface: itemInterface,\n\t\t\t\tsourceFile: config.sourceFile,\n\t\t\t\tfields: config.model.config.fields,\n\t\t\t\tpath: [\n\t\t\t\t\t...config.path,\n\t\t\t\t\t{\n\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tfieldConfigs: config.fieldConfigs,\n\t\t\t});\n\n\t\t\tconfig.interface.addProperty({\n\t\t\t\tname: config.id,\n\t\t\t\ttype: `prismicT.GroupField<Simplify<${itemInterface.getName()}>>`,\n\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tpath: config.path,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"Slices\": {\n\t\t\tconst choiceInterfaceNames: string[] = [];\n\n\t\t\tfor (const choiceId in config.model.config.choices) {\n\t\t\t\tconst choice = config.model.config.choices[choiceId];\n\n\t\t\t\tif (choice.type === CustomTypeModelSliceType.SharedSlice) {\n\t\t\t\t\tchoiceInterfaceNames.push(\n\t\t\t\t\t\tbuildSharedSliceInterfaceName({ id: choiceId }),\n\t\t\t\t\t);\n\t\t\t\t} else if (choice.type === CustomTypeModelSliceType.Slice) {\n\t\t\t\t\tlet primaryInterface: InterfaceDeclaration | undefined;\n\t\t\t\t\tif (Object.keys(choice[\"non-repeat\"]).length > 0) {\n\t\t\t\t\t\tprimaryInterface = config.sourceFile.addInterface({\n\t\t\t\t\t\t\tname: pascalCase(\n\t\t\t\t\t\t\t\t`${config.path[0].id} Document Data ${config.id} ${choiceId} Slice Primary`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tdocs: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tdescription: (writer) => {\n\t\t\t\t\t\t\t\t\t\tconst humanReadablePath = getHumanReadableFieldPath({\n\t\t\t\t\t\t\t\t\t\t\tpath: [\n\t\t\t\t\t\t\t\t\t\t\t\t...config.path,\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: choiceId,\n\t\t\t\t\t\t\t\t\t\t\t\t\tmodel: choice,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: \"primary\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tlabel: \"Primary\",\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\twriter.writeLine(`Primary content in ${humanReadablePath}`);\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\t\t\t\t\t\taddInterfacePropertiesForFields({\n\t\t\t\t\t\t\tinterface: primaryInterface,\n\t\t\t\t\t\t\tsourceFile: config.sourceFile,\n\t\t\t\t\t\t\tfields: choice[\"non-repeat\"],\n\t\t\t\t\t\t\tpath: [\n\t\t\t\t\t\t\t\t...config.path,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: choiceId,\n\t\t\t\t\t\t\t\t\tmodel: choice,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"primary\",\n\t\t\t\t\t\t\t\t\tlabel: \"Primary\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tfieldConfigs: config.fieldConfigs,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet itemInterface: InterfaceDeclaration | undefined;\n\t\t\t\t\tif (Object.keys(choice.repeat).length > 0) {\n\t\t\t\t\t\titemInterface = config.sourceFile.addInterface({\n\t\t\t\t\t\t\tname: pascalCase(\n\t\t\t\t\t\t\t\t`${config.path[0].id} Document Data ${config.id} ${choiceId} Slice Item`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tdocs: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tdescription: (writer) => {\n\t\t\t\t\t\t\t\t\t\tconst humanReadablePath = getHumanReadableFieldPath({\n\t\t\t\t\t\t\t\t\t\t\tpath: [\n\t\t\t\t\t\t\t\t\t\t\t\t...config.path,\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: choiceId,\n\t\t\t\t\t\t\t\t\t\t\t\t\tmodel: choice,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: \"items\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tlabel: \"Items\",\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\twriter.writeLine(`Item in ${humanReadablePath}`);\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\t\t\t\t\t\taddInterfacePropertiesForFields({\n\t\t\t\t\t\t\tinterface: itemInterface,\n\t\t\t\t\t\t\tsourceFile: config.sourceFile,\n\t\t\t\t\t\t\tfields: choice.repeat,\n\t\t\t\t\t\t\tpath: [\n\t\t\t\t\t\t\t\t...config.path,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: choiceId,\n\t\t\t\t\t\t\t\t\tmodel: choice,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: \"items\",\n\t\t\t\t\t\t\t\t\tlabel: \"Items\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tfieldConfigs: config.fieldConfigs,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst sliceType = config.sourceFile.addTypeAlias({\n\t\t\t\t\t\tname: pascalCase(\n\t\t\t\t\t\t\t`${config.path[0].id} Document Data ${config.id} ${choiceId} Slice`,\n\t\t\t\t\t\t),\n\t\t\t\t\t\ttype: `prismicT.Slice<\"${choiceId}\", ${\n\t\t\t\t\t\t\tprimaryInterface\n\t\t\t\t\t\t\t\t? `Simplify<${primaryInterface.getName()}>`\n\t\t\t\t\t\t\t\t: \"Record<string, never>\"\n\t\t\t\t\t\t}, ${\n\t\t\t\t\t\t\titemInterface ? `Simplify<${itemInterface.getName()}>` : \"never\"\n\t\t\t\t\t\t}>`,\n\t\t\t\t\t});\n\n\t\t\t\t\tchoiceInterfaceNames.push(sliceType.getName());\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst slicesType = config.sourceFile.addTypeAlias({\n\t\t\t\tname: pascalCase(\n\t\t\t\t\t`${config.path[0].id} Document Data ${config.id} Slice`,\n\t\t\t\t),\n\t\t\t\ttype:\n\t\t\t\t\tchoiceInterfaceNames.length > 0\n\t\t\t\t\t\t? choiceInterfaceNames.join(\" | \")\n\t\t\t\t\t\t: \"never\",\n\t\t\t\tdocs: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdescription: (writer) => {\n\t\t\t\t\t\t\tconst humanReadablePath = getHumanReadableFieldPath({\n\t\t\t\t\t\t\t\tpath: [\n\t\t\t\t\t\t\t\t\t...config.path,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: config.id,\n\t\t\t\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\twriter.writeLine(`Slice for *${humanReadablePath}*`);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\n\t\t\tconfig.interface.addProperty({\n\t\t\t\tname: config.id,\n\t\t\t\ttype: `prismicT.SliceZone<${slicesType.getName()}>`,\n\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tpath: config.path,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault: {\n\t\t\tconfig.interface.addProperty({\n\t\t\t\tname: config.id,\n\t\t\t\ttype: \"unknown\",\n\t\t\t\tdocs: buildFieldDocs({\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tpath: config.path,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\t}\n};\n\ntype AddInterfacePropertiesForFieldsConfig = Omit<\n\tAddInterfacePropertyFromFieldConfig,\n\t\"id\" | \"model\"\n> & {\n\tfields: Record<string, AddInterfacePropertyFromFieldConfig[\"model\"]>;\n};\n\nexport const addInterfacePropertiesForFields = (\n\tconfig: AddInterfacePropertiesForFieldsConfig,\n) => {\n\tfor (const name in config.fields) {\n\t\taddInterfacePropertyFromField({\n\t\t\t...config,\n\t\t\tid: name,\n\t\t\tmodel: config.fields[name],\n\t\t});\n\t}\n};\n","import type { CustomTypeModel, CustomTypeModelField } from \"@prismicio/types\";\nimport type {\n\tSourceFile,\n\tTypeAliasDeclaration,\n\tInterfaceDeclaration,\n} from \"ts-morph\";\nimport { CUSTOM_TYPES_DOCUMENTATION_URL } from \"../constants\";\nimport { FieldConfigs } from \"../types\";\n\nimport { addInterfacePropertiesForFields } from \"./addInterfacePropertiesForFields\";\nimport { pascalCase } from \"./pascalCase\";\n\nconst collectCustomTypeFields = (\n\tmodel: CustomTypeModel,\n): Record<string, CustomTypeModelField> => {\n\treturn Object.assign({}, ...Object.values(model.json));\n};\n\ntype AddTypeAliasForCustomTypeConfig = {\n\tmodel: CustomTypeModel;\n\tsourceFile: SourceFile;\n\tlocaleIDs: string[];\n\tfieldConfigs: FieldConfigs;\n};\n\nexport const addTypeAliasForCustomType = ({\n\tmodel,\n\tsourceFile,\n\tlocaleIDs,\n\tfieldConfigs,\n}: AddTypeAliasForCustomTypeConfig): TypeAliasDeclaration => {\n\tconst { uid: uidField, ...fields } = collectCustomTypeFields(model);\n\tconst hasDataFields = Object.keys(fields).length > 0;\n\tconst hasUIDField = Boolean(uidField);\n\n\tlet dataInterface: InterfaceDeclaration | TypeAliasDeclaration;\n\tif (hasDataFields) {\n\t\tdataInterface = sourceFile.addInterface({\n\t\t\tname: pascalCase(`${model.id} Document Data`),\n\t\t\tdocs: [\n\t\t\t\t{\n\t\t\t\t\tdescription: `Content for ${model.label} documents`,\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t\taddInterfacePropertiesForFields({\n\t\t\tfields,\n\t\t\tinterface: dataInterface,\n\t\t\tsourceFile: sourceFile,\n\t\t\tpath: [\n\t\t\t\t{\n\t\t\t\t\tid: model.id,\n\t\t\t\t\tmodel: model,\n\t\t\t\t},\n\t\t\t],\n\t\t\tfieldConfigs,\n\t\t});\n\t} else {\n\t\tdataInterface = sourceFile.addTypeAlias({\n\t\t\tname: pascalCase(`${model.id} Document Data`),\n\t\t\ttype: `Record<string, never>`,\n\t\t\tdocs: [\n\t\t\t\t{\n\t\t\t\t\tdescription: `Content for ${model.label} documents`,\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n\n\treturn sourceFile.addTypeAlias({\n\t\tname: pascalCase(`${model.id} Document`),\n\t\ttypeParameters: [\n\t\t\t{\n\t\t\t\tname: \"Lang\",\n\t\t\t\tconstraint: \"string\",\n\t\t\t\tdefault:\n\t\t\t\t\tlocaleIDs.length > 0\n\t\t\t\t\t\t? localeIDs.map((localeID) => `\"${localeID}\"`).join(\" | \")\n\t\t\t\t\t\t: \"string\",\n\t\t\t},\n\t\t],\n\t\ttype: hasUIDField\n\t\t\t? `prismicT.PrismicDocumentWithUID<Simplify<${dataInterface.getName()}>, \"${\n\t\t\t\t\tmodel.id\n\t\t\t }\", Lang>`\n\t\t\t: `prismicT.PrismicDocumentWithoutUID<Simplify<${dataInterface.getName()}>, \"${\n\t\t\t\t\tmodel.id\n\t\t\t }\", Lang>`,\n\t\tdocs: [\n\t\t\t{\n\t\t\t\tdescription: (writer) => {\n\t\t\t\t\twriter.writeLine(`${model.label} document from Prismic`);\n\t\t\t\t\twriter.blankLine();\n\t\t\t\t\twriter.writeLine(`- **API ID**: \\`${model.id}\\``);\n\t\t\t\t\twriter.writeLine(`- **Repeatable**: \\`${model.repeatable}\\``);\n\t\t\t\t\twriter.writeLine(\n\t\t\t\t\t\t`- **Documentation**: ${CUSTOM_TYPES_DOCUMENTATION_URL}`,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\ttags: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttagName: \"typeParam\",\n\t\t\t\t\t\ttext: \"Lang - Language API ID of the document.\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t\tisExported: true,\n\t});\n};\n","import type { SharedSliceModel } from \"@prismicio/types\";\nimport type {\n\tInterfaceDeclaration,\n\tSourceFile,\n\tTypeAliasDeclaration,\n} from \"ts-morph\";\n\nimport { addInterfacePropertiesForFields } from \"./addInterfacePropertiesForFields\";\nimport { buildSharedSliceInterfaceName } from \"./buildSharedSliceInterfaceName\";\nimport { pascalCase } from \"./pascalCase\";\nimport { getHumanReadableFieldPath } from \"./getHumanReadableFieldPath\";\nimport { SHARED_SLICES_DOCUMENTATION_URL } from \"../constants\";\nimport { FieldConfigs } from \"../types\";\n\ntype AddTypeAliasForSharedSliceConfig = {\n\tmodel: SharedSliceModel;\n\tsourceFile: SourceFile;\n\tfieldConfigs: FieldConfigs;\n};\n\nexport const addTypeAliasForSharedSlice = (\n\tconfig: AddTypeAliasForSharedSliceConfig,\n): TypeAliasDeclaration => {\n\tconst variationTypeNames: string[] = [];\n\n\tfor (const variation of config.model.variations) {\n\t\tlet primaryInterface: InterfaceDeclaration | undefined;\n\t\tif (Object.keys(variation.primary).length > 0) {\n\t\t\tprimaryInterface = config.sourceFile.addInterface({\n\t\t\t\tname: pascalCase(\n\t\t\t\t\t`${buildSharedSliceInterfaceName({ id: config.model.id })} ${\n\t\t\t\t\t\tvariation.id\n\t\t\t\t\t} Primary`,\n\t\t\t\t),\n\t\t\t\tdocs: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdescription: (writer) => {\n\t\t\t\t\t\t\tconst humanReadablePath = getHumanReadableFieldPath({\n\t\t\t\t\t\t\t\tpath: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: config.model.id,\n\t\t\t\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: \"primary\",\n\t\t\t\t\t\t\t\t\t\tlabel: \"Primary\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\twriter.writeLine(`Primary content in ${humanReadablePath}`);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\taddInterfacePropertiesForFields({\n\t\t\t\tinterface: primaryInterface,\n\t\t\t\tsourceFile: config.sourceFile,\n\t\t\t\tfields: variation.primary,\n\t\t\t\tpath: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: config.model.id,\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"primary\",\n\t\t\t\t\t\tlabel: \"Primary\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tfieldConfigs: config.fieldConfigs,\n\t\t\t});\n\t\t}\n\n\t\tlet itemInterface: InterfaceDeclaration | undefined;\n\t\tif (Object.keys(variation.items).length > 0) {\n\t\t\titemInterface = config.sourceFile.addInterface({\n\t\t\t\tname: pascalCase(\n\t\t\t\t\t`${buildSharedSliceInterfaceName({ id: config.model.id })} ${\n\t\t\t\t\t\tvariation.id\n\t\t\t\t\t} Item`,\n\t\t\t\t),\n\t\t\t\tdocs: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdescription: (writer) => {\n\t\t\t\t\t\t\tconst humanReadablePath = getHumanReadableFieldPath({\n\t\t\t\t\t\t\t\tpath: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: config.model.id,\n\t\t\t\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: \"items\",\n\t\t\t\t\t\t\t\t\t\tlabel: \"Items\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\twriter.writeLine(`Item in ${humanReadablePath}`);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\taddInterfacePropertiesForFields({\n\t\t\t\tinterface: itemInterface,\n\t\t\t\tsourceFile: config.sourceFile,\n\t\t\t\tfields: variation.items,\n\t\t\t\tpath: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: config.model.id,\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"items\",\n\t\t\t\t\t\tlabel: \"Items\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tfieldConfigs: config.fieldConfigs,\n\t\t\t});\n\t\t}\n\n\t\tconst variationType = config.sourceFile.addTypeAlias({\n\t\t\tname: pascalCase(\n\t\t\t\t`${buildSharedSliceInterfaceName({\n\t\t\t\t\tid: config.model.id,\n\t\t\t\t})} ${variation.id}`,\n\t\t\t),\n\t\t\ttype: `prismicT.SharedSliceVariation<\"${variation.id}\", ${\n\t\t\t\tprimaryInterface\n\t\t\t\t\t? `Simplify<${primaryInterface.getName()}>`\n\t\t\t\t\t: \"Record<string, never>\"\n\t\t\t}, ${itemInterface ? `Simplify<${itemInterface.getName()}>` : \"never\"}>`,\n\t\t\tdocs: [\n\t\t\t\t{\n\t\t\t\t\tdescription: (writer) => {\n\t\t\t\t\t\twriter.writeLine(\n\t\t\t\t\t\t\t`${variation.name} variation for ${config.model.name} Slice`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\twriter.blankLine();\n\t\t\t\t\t\twriter.writeLine(`- **API ID**: \\`${variation.id}\\``);\n\t\t\t\t\t\twriter.writeLine(`- **Description**: \\`${variation.description}\\``);\n\t\t\t\t\t\twriter.writeLine(\n\t\t\t\t\t\t\t`- **Documentation**: ${SHARED_SLICES_DOCUMENTATION_URL}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\n\t\tvariationTypeNames.push(variationType.getName());\n\t}\n\n\tconst variationsType = config.sourceFile.addTypeAlias({\n\t\tname: pascalCase(`${config.model.id} Slice Variation`),\n\t\ttype:\n\t\t\tvariationTypeNames.length > 0 ? variationTypeNames.join(\" | \") : \"never\",\n\t\tdocs: [\n\t\t\t{\n\t\t\t\tdescription: (writer) => {\n\t\t\t\t\tconst humanReadablePath = getHumanReadableFieldPath({\n\t\t\t\t\t\tpath: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: config.model.id,\n\t\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\twriter.writeLine(`Slice variation for *${humanReadablePath}*`);\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t});\n\n\treturn config.sourceFile.addTypeAlias({\n\t\tname: pascalCase(\n\t\t\tbuildSharedSliceInterfaceName({\n\t\t\t\tid: config.model.id,\n\t\t\t}),\n\t\t),\n\t\ttype: `prismicT.SharedSlice<\"${\n\t\t\tconfig.model.id\n\t\t}\", ${variationsType.getName()}>`,\n\t\tdocs: [\n\t\t\t{\n\t\t\t\tdescription: (writer) => {\n\t\t\t\t\twriter.writeLine(`${config.model.name} Shared Slice`);\n\t\t\t\t\twriter.blankLine();\n\t\t\t\t\twriter.writeLine(`- **API ID**: \\`${config.model.id}\\``);\n\t\t\t\t\twriter.writeLine(\n\t\t\t\t\t\t`- **Description**: \\`${config.model.description}\\``,\n\t\t\t\t\t);\n\t\t\t\t\twriter.writeLine(\n\t\t\t\t\t\t`- **Documentation**: ${SHARED_SLICES_DOCUMENTATION_URL}`,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tisExported: true,\n\t});\n};\n","import * as tsm from \"ts-morph\";\n// import prettier from \"prettier\";\n\nimport { BLANK_LINE_IDENTIFIER } from \"../constants\";\n\nexport const getSourceFileText = (sourceFile: tsm.SourceFile): string => {\n\tconst text = sourceFile\n\t\t.print()\n\t\t.replace(new RegExp(BLANK_LINE_IDENTIFIER, \"g\"), \"\");\n\n\treturn text;\n\n\t// return prettier.format(text, { parser: \"typescript\" });\n};\n","import { Project } from \"ts-morph\";\nimport type { CustomTypeModel, SharedSliceModel } from \"@prismicio/types\";\n\nimport { BLANK_LINE_IDENTIFIER, NON_EDITABLE_FILE_HEADER } from \"./constants\";\nimport { addTypeAliasForCustomType } from \"./lib/addTypeAliasForCustomType\";\nimport { addTypeAliasForSharedSlice } from \"./lib/addTypeAliasForSharedSlice\";\nimport { getSourceFileText } from \"./lib/getSourceFileText\";\nimport { FieldConfigs } from \"./types\";\n\nexport type GenerateTypesConfig = {\n\tcustomTypeModels?: CustomTypeModel[];\n\tsharedSliceModels?: SharedSliceModel[];\n\tlocaleIDs?: string[];\n\tfieldConfigs?: FieldConfigs;\n};\n\nexport const generateTypes = (config: GenerateTypesConfig = {}) => {\n\tconst project = new Project({\n\t\tuseInMemoryFileSystem: true,\n\t});\n\n\tconst sourceFile = project.createSourceFile(\"types.d.ts\");\n\n\tsourceFile.addImportDeclaration({\n\t\tmoduleSpecifier: \"@prismicio/types\",\n\t\tnamespaceImport: \"prismicT\",\n\t\tisTypeOnly: true,\n\t\tleadingTrivia: NON_EDITABLE_FILE_HEADER,\n\t});\n\n\tsourceFile.addStatements(BLANK_LINE_IDENTIFIER);\n\n\tsourceFile.addTypeAlias({\n\t\tname: \"Simplify\",\n\t\ttypeParameters: [\n\t\t\t{\n\t\t\t\tname: \"T\",\n\t\t\t},\n\t\t],\n\t\ttype: `{ [KeyType in keyof T]: T[KeyType] }`,\n\t});\n\n\tif (config.customTypeModels) {\n\t\tfor (const model of config.customTypeModels) {\n\t\t\taddTypeAliasForCustomType({\n\t\t\t\tmodel,\n\t\t\t\tsourceFile,\n\t\t\t\tlocaleIDs: config.localeIDs || [],\n\t\t\t\tfieldConfigs: config.fieldConfigs || {},\n\t\t\t});\n\t\t}\n\t}\n\n\tif (config.sharedSliceModels) {\n\t\tfor (const model of config.sharedSliceModels) {\n\t\t\taddTypeAliasForSharedSlice({\n\t\t\t\tmodel,\n\t\t\t\tsourceFile,\n\t\t\t\tfieldConfigs: config.fieldConfigs || {},\n\t\t\t});\n\t\t}\n\t}\n\n\treturn getSourceFileText(sourceFile);\n};\n"],"names":["pascalCaseBase"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "prismic-ts-codegen",
3
+ "version": "0.0.2",
4
+ "description": "An experimental Prismic model-to-TypeScript-type generator",
5
+ "keywords": [
6
+ "typescript",
7
+ "prismic"
8
+ ],
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "ssh://git@github.com/prismicio/prismic-ts-codegen.git"
12
+ },
13
+ "license": "Apache-2.0",
14
+ "author": "Prismic <contact@prismic.io> (https://prismic.io)",
15
+ "type": "module",
16
+ "exports": {
17
+ ".": {
18
+ "require": "./dist/index.cjs",
19
+ "import": "./dist/index.js"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "main": "dist/index.cjs",
24
+ "module": "dist/index.js",
25
+ "types": "dist/index.d.ts",
26
+ "bin": {
27
+ "prismic-ts-codegen": "bin/cli.mjs"
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "src"
32
+ ],
33
+ "scripts": {
34
+ "build": "siroc build",
35
+ "dev": "siroc build --watch",
36
+ "format": "prettier --write .",
37
+ "lint": "eslint --ext .js,.ts .",
38
+ "prepare": "npm run build",
39
+ "release": "npm run test && standard-version && git push --follow-tags && npm run build && npm publish",
40
+ "release:alpha": "npm run test && standard-version --release-as major --prerelease alpha && git push --follow-tags && npm run build && npm publish --tag alpha",
41
+ "release:alpha:dry": "standard-version --release-as major --prerelease alpha --dry-run",
42
+ "release:dry": "standard-version --dry-run",
43
+ "size": "size-limit",
44
+ "test": "npm run lint && npm run unit && npm run build && npm run size",
45
+ "unit": "nyc --reporter=lcovonly --reporter=text --exclude-after-remap=false ava"
46
+ },
47
+ "dependencies": {
48
+ "@prismicio/client": "^6.3.0",
49
+ "@prismicio/custom-types-client": "^0.0.6",
50
+ "common-tags": "^1.8.2",
51
+ "fast-glob": "^3.2.11",
52
+ "jiti": "^1.13.0",
53
+ "joi": "^17.6.0",
54
+ "meow": "^10.1.2",
55
+ "node-fetch": "^3.2.0",
56
+ "pascal-case": "^3.1.2",
57
+ "prettier": "^2.5.1",
58
+ "ts-morph": "^13.0.3"
59
+ },
60
+ "devDependencies": {
61
+ "@prismicio/mock": "^0.0.8",
62
+ "@prismicio/types": "^0.1.25",
63
+ "@size-limit/preset-small-lib": "^7.0.8",
64
+ "@types/common-tags": "^1.8.1",
65
+ "@types/prettier": "^2.4.4",
66
+ "@typescript-eslint/eslint-plugin": "^5.12.0",
67
+ "@typescript-eslint/parser": "^5.12.0",
68
+ "ava": "^4.0.1",
69
+ "esbuild-register": "^3.3.2",
70
+ "eslint": "^8.9.0",
71
+ "eslint-config-prettier": "^8.3.0",
72
+ "eslint-plugin-prettier": "^4.0.0",
73
+ "eslint-plugin-tsdoc": "^0.2.14",
74
+ "nyc": "^15.1.0",
75
+ "prettier-plugin-jsdoc": "^0.3.30",
76
+ "siroc": "^0.16.0",
77
+ "size-limit": "^7.0.8",
78
+ "standard-version": "^9.3.2",
79
+ "typescript": "^4.5.5"
80
+ },
81
+ "engines": {
82
+ "node": ">=12.7.0"
83
+ },
84
+ "publishConfig": {
85
+ "access": "public"
86
+ }
87
+ }
@@ -0,0 +1,64 @@
1
+ import Joi from "joi";
2
+
3
+ import { Config } from "./types";
4
+
5
+ export const configSchema = Joi.object<Config>({
6
+ repositoryName: Joi.string(),
7
+ accessToken: Joi.string(),
8
+ customTypesAPIToken: Joi.string(),
9
+
10
+ output: Joi.string(),
11
+
12
+ locales: Joi.alternatives(
13
+ Joi.array().items(Joi.string().required()),
14
+ Joi.object({
15
+ ids: Joi.array().items(Joi.string().required()),
16
+ fetchFromRepository: Joi.boolean(),
17
+ }),
18
+ ),
19
+
20
+ models: Joi.alternatives(
21
+ Joi.array().items(Joi.string().required()),
22
+ Joi.object({
23
+ files: Joi.array().items(Joi.string().required()),
24
+ fetchFromRepository: Joi.boolean(),
25
+ }),
26
+ ),
27
+
28
+ fields: Joi.object({
29
+ embed: Joi.object({
30
+ providerTypes: Joi.object().pattern(
31
+ Joi.string(),
32
+ Joi.string().required(),
33
+ ),
34
+ }),
35
+ integrationFields: Joi.object({
36
+ catalogTypes: Joi.object().pattern(Joi.string(), Joi.string().required()),
37
+ }),
38
+ }),
39
+ })
40
+ .when(
41
+ Joi.object({
42
+ locales: Joi.object({
43
+ fetchFromRepository: Joi.valid(true),
44
+ }),
45
+ }),
46
+ {
47
+ then: Joi.object({
48
+ repositoryName: Joi.required(),
49
+ }),
50
+ },
51
+ )
52
+ .when(
53
+ Joi.object({
54
+ models: Joi.object({
55
+ fetchFromRepository: Joi.valid(true),
56
+ }),
57
+ }),
58
+ {
59
+ then: Joi.object({
60
+ repositoryName: Joi.required(),
61
+ customTypesAPIToken: Joi.required(),
62
+ }),
63
+ },
64
+ );
@@ -0,0 +1,125 @@
1
+ import { existsSync, writeFileSync } from "fs";
2
+ import { resolve as resolvePath } from "path";
3
+ import meow from "meow";
4
+ import { stripIndent } from "common-tags";
5
+
6
+ import { generateTypes } from "../index";
7
+
8
+ import { configSchema } from "./configSchema";
9
+ import { loadLocaleIDs } from "./loadLocaleIDs";
10
+ import { loadModels } from "./loadModels";
11
+ import { loadConfig } from "./loadConfig";
12
+
13
+ const cli = meow(
14
+ `
15
+ Usage:
16
+ prismic-ts-codegen [options...]
17
+ prismic-ts-codegen init [options...]
18
+
19
+ Commands:
20
+ init [options]
21
+
22
+ Options:
23
+ -c, --config <path> Path to a prismic-ts-codegen configuration file.
24
+ `,
25
+ {
26
+ importMeta: import.meta,
27
+ flags: {
28
+ config: {
29
+ type: "string",
30
+ alias: "c",
31
+ isRequired: false,
32
+ },
33
+ },
34
+ },
35
+ );
36
+
37
+ const main = async () => {
38
+ if (cli.input[0] === "init") {
39
+ const configPath = cli.flags.config || "prismicCodegen.config.ts";
40
+
41
+ if (existsSync(configPath)) {
42
+ console.info(`\n${configPath} already exists.`);
43
+ } else {
44
+ let contents = "";
45
+
46
+ if (existsSync("sm.json")) {
47
+ contents = stripIndent`
48
+ import type { Config } from "prismic-ts-codegen";
49
+
50
+ const config: Config = {
51
+ output: "./types.generated.ts",
52
+
53
+ models: ["./customtypes/**/index.json", "./slices/**/model.json"],
54
+ };
55
+
56
+ export default config;
57
+ `;
58
+ } else {
59
+ contents = stripIndent`
60
+ import type { Config } from "prismic-ts-codegen";
61
+
62
+ const config: Config = {
63
+ output: "./types.generated.ts",
64
+ };
65
+
66
+ export default config;
67
+ `;
68
+ }
69
+
70
+ writeFileSync(configPath, contents);
71
+
72
+ console.info(`\nCreated prismic-ts-codegen config file: ${configPath}`);
73
+ }
74
+ } else {
75
+ const unvalidatedConfig = loadConfig({ path: cli.flags.config });
76
+
77
+ const { value: config, error } = configSchema.validate(unvalidatedConfig);
78
+
79
+ if (config && !error) {
80
+ const { customTypeModels, sharedSliceModels } = await loadModels({
81
+ localPaths: Array.isArray(config.models)
82
+ ? config.models
83
+ : config.models?.files,
84
+ repositoryName: config.repositoryName,
85
+ customTypesAPIToken: config.customTypesAPIToken,
86
+ fetchFromRepository:
87
+ config.models &&
88
+ "fetchFromRepository" in config.models &&
89
+ config.models.fetchFromRepository,
90
+ });
91
+
92
+ const localeIDs = await loadLocaleIDs({
93
+ localeIDs: Array.isArray(config.locales)
94
+ ? config.locales
95
+ : config.locales?.ids,
96
+ repositoryName: config.repositoryName,
97
+ accessToken: config.accessToken,
98
+ fetchFromRepository:
99
+ config.locales &&
100
+ "fetchFromRepository" in config.locales &&
101
+ config.locales.fetchFromRepository,
102
+ });
103
+
104
+ const types = generateTypes({
105
+ customTypeModels,
106
+ sharedSliceModels,
107
+ localeIDs,
108
+ });
109
+
110
+ if (config.output) {
111
+ writeFileSync(resolvePath(config.output), types);
112
+ } else {
113
+ process.stdout.write(types + "\n");
114
+ }
115
+ } else {
116
+ if (error) {
117
+ console.error(error.message);
118
+
119
+ return;
120
+ }
121
+ }
122
+ }
123
+ };
124
+
125
+ main().catch((error) => console.error(error));
@@ -0,0 +1,39 @@
1
+ import _jiti from "jiti";
2
+ import { existsSync } from "fs";
3
+ import { resolve as resolvePath } from "path";
4
+
5
+ import type { Config } from "./types";
6
+
7
+ const jiti = _jiti(process.cwd());
8
+
9
+ const DEFAULT_CONFIG_PATHS = [
10
+ "prismicCodegen.config.ts",
11
+ "prismicCodegen.config.js",
12
+ ];
13
+
14
+ type LoadConfigConfig = {
15
+ path?: string;
16
+ };
17
+
18
+ export const loadConfig = (config: LoadConfigConfig): Config => {
19
+ if (config.path) {
20
+ if (existsSync(config.path)) {
21
+ return jiti(config.path);
22
+ } else {
23
+ throw new Error(`Config file does not exist: ${config.path}`);
24
+ }
25
+ } else {
26
+ for (const configPath of DEFAULT_CONFIG_PATHS) {
27
+ if (existsSync(configPath)) {
28
+ const mod = jiti(resolvePath(configPath)) as
29
+ | Config
30
+ | { default: Config };
31
+
32
+ return "default" in mod ? mod.default : mod;
33
+ }
34
+ }
35
+ }
36
+
37
+ // If no config file exists, an empty config is returned.
38
+ return {};
39
+ };
@@ -0,0 +1,34 @@
1
+ import * as prismic from "@prismicio/client";
2
+ import fetch from "node-fetch";
3
+
4
+ type LoadLocalesConfig =
5
+ | {
6
+ localeIDs?: string[];
7
+ }
8
+ | {
9
+ localeIDs?: string[];
10
+ repositoryName: string;
11
+ accessToken: string;
12
+ fetchFromRepository?: boolean;
13
+ };
14
+
15
+ export const loadLocaleIDs = async (
16
+ config: LoadLocalesConfig,
17
+ ): Promise<string[]> => {
18
+ const localeIDs = new Set<string>(config.localeIDs || []);
19
+
20
+ if ("repositoryName" in config && config.fetchFromRepository) {
21
+ const client = prismic.createClient(config.repositoryName, {
22
+ accessToken: config.accessToken,
23
+ fetch,
24
+ });
25
+
26
+ const repository = await client.getRepository();
27
+
28
+ for (const language of repository.languages) {
29
+ localeIDs.add(language.id);
30
+ }
31
+ }
32
+
33
+ return [...localeIDs];
34
+ };
@@ -0,0 +1,88 @@
1
+ import { readFileSync } from "fs";
2
+ import fg from "fast-glob";
3
+ import * as prismicCT from "@prismicio/custom-types-client";
4
+ import type { CustomTypeModel, SharedSliceModel } from "@prismicio/types";
5
+ import fetch from "node-fetch";
6
+
7
+ const isCustomTypeModel = (input: unknown): input is CustomTypeModel => {
8
+ return typeof input === "object" && input !== null && "json" in input;
9
+ };
10
+
11
+ const isSharedSliceModel = (input: unknown): input is SharedSliceModel => {
12
+ return typeof input === "object" && input !== null && "variations" in input;
13
+ };
14
+
15
+ const readJSONFromGlob = async <T>(globs: string): Promise<T[]> => {
16
+ const paths = await fg(globs.split(",").map((path) => path.trim()));
17
+
18
+ return paths.map((path) => {
19
+ const raw = readFileSync(path, "utf8");
20
+
21
+ return JSON.parse(raw);
22
+ });
23
+ };
24
+
25
+ type LoadModelsConfig =
26
+ | {
27
+ localPaths?: string[];
28
+ }
29
+ | {
30
+ localPaths?: string[];
31
+ repositoryName: string;
32
+ customTypesAPIToken: string;
33
+ fetchFromRepository?: boolean;
34
+ };
35
+
36
+ type LoadModelsReturnType = {
37
+ customTypeModels: CustomTypeModel[];
38
+ sharedSliceModels: SharedSliceModel[];
39
+ };
40
+
41
+ export const loadModels = async (
42
+ config: LoadModelsConfig,
43
+ ): Promise<LoadModelsReturnType> => {
44
+ const customTypeModels: Record<string, CustomTypeModel> = {};
45
+ const sharedSliceModels: Record<string, SharedSliceModel> = {};
46
+
47
+ if ("customTypesAPIToken" in config) {
48
+ const customTypesClient = prismicCT.createClient({
49
+ repositoryName: config.repositoryName,
50
+ token: config.customTypesAPIToken,
51
+ fetch,
52
+ });
53
+
54
+ if (config.fetchFromRepository) {
55
+ const [remoteCustomTypeModels, remoteSharedSliceModels] =
56
+ await Promise.all([
57
+ customTypesClient.getAll(),
58
+ customTypesClient.getAllSharedSlices(),
59
+ ]);
60
+
61
+ for (const customTypeModel of remoteCustomTypeModels) {
62
+ customTypeModels[customTypeModel.id] = customTypeModel;
63
+ }
64
+ for (const sharedSliceModel of remoteSharedSliceModels) {
65
+ sharedSliceModels[sharedSliceModel.id] = sharedSliceModel;
66
+ }
67
+ }
68
+ }
69
+
70
+ if (config.localPaths) {
71
+ const models = (
72
+ await Promise.all(config.localPaths.map((glob) => readJSONFromGlob(glob)))
73
+ ).flat();
74
+
75
+ for (const model of models) {
76
+ if (isCustomTypeModel(model)) {
77
+ customTypeModels[model.id] = model;
78
+ } else if (isSharedSliceModel(model)) {
79
+ sharedSliceModels[model.id] = model;
80
+ }
81
+ }
82
+ }
83
+
84
+ return {
85
+ customTypeModels: Object.values(customTypeModels),
86
+ sharedSliceModels: Object.values(sharedSliceModels),
87
+ };
88
+ };
@@ -0,0 +1,30 @@
1
+ export type Config = {
2
+ repositoryName?: string;
3
+ accessToken?: string;
4
+ customTypesAPIToken?: string;
5
+
6
+ output?: string;
7
+
8
+ locales?:
9
+ | string[]
10
+ | {
11
+ ids?: string[];
12
+ fetchFromRepository?: boolean;
13
+ };
14
+
15
+ models?:
16
+ | string[]
17
+ | {
18
+ files?: string[];
19
+ fetchFromRepository?: boolean;
20
+ };
21
+
22
+ fields?: {
23
+ embed?: {
24
+ providerTypes?: Record<string, string>;
25
+ };
26
+ integrationFields?: {
27
+ catalogTypes?: Record<string, string>;
28
+ };
29
+ };
30
+ };
@@ -0,0 +1,37 @@
1
+ import type { CustomTypeModelFieldType } from "@prismicio/types";
2
+ import { stripIndent } from "common-tags";
3
+
4
+ export const BLANK_LINE_IDENTIFIER = "// ___BLANK_LINE_TO_BE_REPLACED___";
5
+
6
+ export const NON_EDITABLE_FILE_HEADER = stripIndent`
7
+ // Code generated by prismic-ts-codegen. DO NOT EDIT.
8
+ ${BLANK_LINE_IDENTIFIER}
9
+ `;
10
+
11
+ export const CUSTOM_TYPES_DOCUMENTATION_URL =
12
+ "https://prismic.io/docs/core-concepts/custom-types";
13
+
14
+ export const SHARED_SLICES_DOCUMENTATION_URL =
15
+ "https://prismic.io/docs/core-concepts/reusing-slices";
16
+
17
+ export const FIELD_DOCUMENTATION_URLS: Record<
18
+ keyof typeof CustomTypeModelFieldType,
19
+ string
20
+ > = {
21
+ UID: "https://prismic.io/docs/core-concepts/uid",
22
+ Boolean: "https://prismic.io/docs/core-concepts/boolean",
23
+ Color: "https://prismic.io/docs/core-concepts/color",
24
+ Date: "https://prismic.io/docs/core-concepts/date",
25
+ Timestamp: "https://prismic.io/docs/core-concepts/timestamp",
26
+ Number: "https://prismic.io/docs/core-concepts/number",
27
+ Text: "https://prismic.io/docs/core-concepts/key-text",
28
+ Select: "https://prismic.io/docs/core-concepts/select",
29
+ StructuredText: "https://prismic.io/docs/core-concepts/rich-text-title",
30
+ Image: "https://prismic.io/docs/core-concepts/image",
31
+ Link: "https://prismic.io/docs/core-concepts/link-content-relationship",
32
+ Embed: "https://prismic.io/docs/core-concepts/embed",
33
+ GeoPoint: "https://prismic.io/docs/core-concepts/geopoint",
34
+ Group: "https://prismic.io/docs/core-concepts/group",
35
+ IntegrationFields: "https://prismic.io/docs/core-concepts/integration-fields",
36
+ Slices: "https://prismic.io/docs/core-concepts/slices",
37
+ };