UNPKG

gatsby-source-prismic

Version:

Gatsby source plugin for building websites using Prismic as a data source

1 lines 19.9 kB
{"version":3,"file":"normalizeDocument.cjs","sources":["../../../src/lib/normalizeDocument.ts"],"sourcesContent":["import * as prismic from \"@prismicio/client\";\nimport type { NodeInput, NodePluginArgs } from \"gatsby\";\n\nimport type { FieldModelValueType, PrismicDocumentForModel } from \"../types\";\nimport type { PluginOptions } from \"../types\";\n\nimport { createCachedRemoteFileNode } from \"./createCachedRemoteFileNode\";\nimport { defaultTransformFieldName } from \"./defaultTransformFieldName\";\nimport { fmtLog } from \"./fmtLog\";\nimport { pascalCase } from \"./pascalCase\";\nimport { shouldDownloadFile } from \"./shouldDownloadFile\";\nimport { withoutURLParameter } from \"./withoutURLParameter\";\n\ntype NormalizeDocumentFieldArgs<\n\tModel extends prismic.CustomTypeModelField = prismic.CustomTypeModelField,\n> = {\n\tmodel: Model;\n\tvalue: FieldModelValueType<Model>;\n\tpath: string[];\n\tgatsbyNodeArgs: NodePluginArgs;\n\tpluginOptions: PluginOptions;\n\tsharedSliceModels: prismic.SharedSliceModel[];\n};\n\ntype NormalizeDocumentFieldReturnType<\n\tModel extends prismic.CustomTypeModelField = prismic.CustomTypeModelField,\n> = Model extends prismic.CustomTypeModelGroupField\n\t? prismic.GroupField<{\n\t\t\t[P in keyof NonNullable<\n\t\t\t\tNonNullable<Model[\"config\"]>[\"fields\"]\n\t\t\t>]: NormalizeDocumentFieldReturnType<\n\t\t\t\tNonNullable<NonNullable<Model[\"config\"]>[\"fields\"]>[P]\n\t\t\t>;\n\t }>\n\t: Model extends prismic.CustomTypeModelLinkField\n\t? FieldModelValueType<Model> & { localFile: string | null }\n\t: Model extends prismic.CustomTypeModelEmbedField\n\t? string | null\n\t: Model extends prismic.CustomTypeModelImageField<infer ThumbnailNames>\n\t? FieldModelValueType<Model> & { localFile: string | null } & {\n\t\t\t[ThumbnailName in keyof ThumbnailNames]: prismic.ImageFieldImage & {\n\t\t\t\tlocalFile: string | null;\n\t\t\t};\n\t }\n\t: Model extends prismic.CustomTypeModelIntegrationField\n\t? string | null\n\t: FieldModelValueType<Model>;\n\nconst normalizeDocumentField = async <\n\tModel extends prismic.CustomTypeModelField,\n>(\n\targs: NormalizeDocumentFieldArgs<Model>,\n): Promise<NormalizeDocumentFieldReturnType<Model>> => {\n\tconst model = args.model;\n\n\tswitch (model.type) {\n\t\tcase prismic.CustomTypeModelFieldType.Slices: {\n\t\t\tconst value = args.value as prismic.SliceZone;\n\n\t\t\tif (prismic.isFilled.sliceZone(value)) {\n\t\t\t\treturn (await Promise.all(\n\t\t\t\t\tvalue.map(async (slice) => {\n\t\t\t\t\t\tconst sliceModel = model.config?.choices?.[slice.slice_type];\n\t\t\t\t\t\tif (!sliceModel) {\n\t\t\t\t\t\t\t// TODO: Should an error be thrown or a warning logged if a Slice's model cannot be found?\n\t\t\t\t\t\t\treturn slice;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tswitch (sliceModel.type) {\n\t\t\t\t\t\t\tcase prismic.CustomTypeModelSliceType.SharedSlice: {\n\t\t\t\t\t\t\t\tconst sharedSlice = slice as prismic.SharedSlice;\n\t\t\t\t\t\t\t\tconst sharedSliceModel = args.sharedSliceModels.find(\n\t\t\t\t\t\t\t\t\t(model) => {\n\t\t\t\t\t\t\t\t\t\treturn model.id === sharedSlice.slice_type;\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\tconst sharedSliceVariationModel =\n\t\t\t\t\t\t\t\t\tsharedSliceModel?.variations.find((variationModel) => {\n\t\t\t\t\t\t\t\t\t\treturn variationModel.id === sharedSlice.variation;\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (sharedSliceModel && sharedSliceVariationModel) {\n\t\t\t\t\t\t\t\t\tconst [primary, items] = await Promise.all([\n\t\t\t\t\t\t\t\t\t\tnormalizeDocumentFieldRecord({\n\t\t\t\t\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\t\t\t\t\tmodels: sharedSliceVariationModel.primary || {},\n\t\t\t\t\t\t\t\t\t\t\trecord: sharedSlice.primary,\n\t\t\t\t\t\t\t\t\t\t\tpath: [\n\t\t\t\t\t\t\t\t\t\t\t\tsharedSliceModel.id,\n\t\t\t\t\t\t\t\t\t\t\t\tsharedSliceVariationModel.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\"primary\",\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t...sharedSlice.items.map(async (item) => {\n\t\t\t\t\t\t\t\t\t\t\treturn await normalizeDocumentFieldRecord({\n\t\t\t\t\t\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\t\t\t\t\t\tmodels: sharedSliceVariationModel.items || {},\n\t\t\t\t\t\t\t\t\t\t\t\trecord: item,\n\t\t\t\t\t\t\t\t\t\t\t\tpath: [\n\t\t\t\t\t\t\t\t\t\t\t\t\tsharedSliceModel.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\tsharedSliceVariationModel.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"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\t\t\t\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t...sharedSlice,\n\t\t\t\t\t\t\t\t\t\tprimary,\n\t\t\t\t\t\t\t\t\t\titems,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// TODO: Improve error handling.\n\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t`A Shared Slice model with ID \"${slice.slice_type}\" was not found.`,\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\tcase prismic.CustomTypeModelSliceType.Slice: {\n\t\t\t\t\t\t\t\tconst [primary, ...items] = await Promise.all([\n\t\t\t\t\t\t\t\t\tnormalizeDocumentFieldRecord({\n\t\t\t\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\t\t\t\tmodels: sliceModel[\"non-repeat\"] || {},\n\t\t\t\t\t\t\t\t\t\trecord: slice.primary,\n\t\t\t\t\t\t\t\t\t\tpath: [...args.path, slice.slice_type, \"primary\"],\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t...slice.items.map(async (item) => {\n\t\t\t\t\t\t\t\t\t\treturn await normalizeDocumentFieldRecord({\n\t\t\t\t\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\t\t\t\t\tmodels: sliceModel.repeat || {},\n\t\t\t\t\t\t\t\t\t\t\trecord: item,\n\t\t\t\t\t\t\t\t\t\t\tpath: [...args.path, slice.slice_type, \"items\"],\n\t\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]);\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...slice,\n\t\t\t\t\t\t\t\t\tprimary,\n\t\t\t\t\t\t\t\t\titems,\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\tdefault: {\n\t\t\t\t\t\t\t\t// Unsupport legacy Slice format\n\t\t\t\t\t\t\t\treturn slice;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t)) as NormalizeDocumentFieldReturnType<Model>;\n\t\t\t} else {\n\t\t\t\treturn [] as NormalizeDocumentFieldReturnType<Model>;\n\t\t\t}\n\t\t}\n\n\t\tcase prismic.CustomTypeModelFieldType.Group: {\n\t\t\tconst value = args.value as prismic.GroupField;\n\n\t\t\tif (prismic.isFilled.group(value)) {\n\t\t\t\treturn (await Promise.all(\n\t\t\t\t\tvalue.map(async (item) => {\n\t\t\t\t\t\treturn normalizeDocumentFieldRecord({\n\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\tmodels: model.config?.fields || {},\n\t\t\t\t\t\t\trecord: item,\n\t\t\t\t\t\t});\n\t\t\t\t\t}),\n\t\t\t\t)) as NormalizeDocumentFieldReturnType<Model>;\n\t\t\t} else {\n\t\t\t\treturn [] as NormalizeDocumentFieldReturnType<Model>;\n\t\t\t}\n\t\t}\n\n\t\tcase prismic.CustomTypeModelFieldType.Link: {\n\t\t\tconst value = args.value as prismic.LinkField;\n\n\t\t\tif (\n\t\t\t\tprismic.isFilled.link(value) &&\n\t\t\t\tvalue.link_type === prismic.LinkType.Media &&\n\t\t\t\t(await shouldDownloadFile({\n\t\t\t\t\tfield: value,\n\t\t\t\t\tpath: args.path,\n\t\t\t\t\tpluginOptions: args.pluginOptions,\n\t\t\t\t}))\n\t\t\t) {\n\t\t\t\tconst fileNode = await createCachedRemoteFileNode({\n\t\t\t\t\turl: value.url,\n\t\t\t\t\tgatsbyNodeArgs: args.gatsbyNodeArgs,\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\t...value,\n\t\t\t\t\tlocalFile: fileNode.id,\n\t\t\t\t} as NormalizeDocumentFieldReturnType<Model>;\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\t...value,\n\t\t\t\t\tlocalFile: null,\n\t\t\t\t} as NormalizeDocumentFieldReturnType<Model>;\n\t\t\t}\n\t\t}\n\n\t\tcase prismic.CustomTypeModelFieldType.Image: {\n\t\t\tconst value = args.value as prismic.ImageField<string>;\n\n\t\t\tconst thumbnails: Record<\n\t\t\t\tstring,\n\t\t\t\tprismic.ImageFieldImage & { localFile: string | null }\n\t\t\t> = {};\n\t\t\tif (model.config?.thumbnails) {\n\t\t\t\tfor (const thumbnailModel of model.config.thumbnails) {\n\t\t\t\t\tconst thumbnailValue = value[thumbnailModel.name];\n\t\t\t\t\tconst transformedThumbnailName = args.pluginOptions.transformFieldName\n\t\t\t\t\t\t? args.pluginOptions.transformFieldName(thumbnailModel.name)\n\t\t\t\t\t\t: defaultTransformFieldName(thumbnailModel.name);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tprismic.isFilled.imageThumbnail(thumbnailValue) &&\n\t\t\t\t\t\t(await shouldDownloadFile({\n\t\t\t\t\t\t\tfield: thumbnailValue,\n\t\t\t\t\t\t\tpath: args.path,\n\t\t\t\t\t\t\tpluginOptions: args.pluginOptions,\n\t\t\t\t\t\t}))\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst fileNode = await createCachedRemoteFileNode({\n\t\t\t\t\t\t\turl: withoutURLParameter(thumbnailValue.url, \"auto\"),\n\t\t\t\t\t\t\tgatsbyNodeArgs: args.gatsbyNodeArgs,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tthumbnails[transformedThumbnailName] = {\n\t\t\t\t\t\t\t...thumbnailValue,\n\t\t\t\t\t\t\tlocalFile: fileNode.id,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthumbnails[transformedThumbnailName] = {\n\t\t\t\t\t\t\t...thumbnailValue,\n\t\t\t\t\t\t\tlocalFile: null,\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\tif (\n\t\t\t\tprismic.isFilled.image(value) &&\n\t\t\t\t(await shouldDownloadFile({\n\t\t\t\t\tfield: value,\n\t\t\t\t\tpath: args.path,\n\t\t\t\t\tpluginOptions: args.pluginOptions,\n\t\t\t\t}))\n\t\t\t) {\n\t\t\t\tconst fileNode = await createCachedRemoteFileNode({\n\t\t\t\t\turl: withoutURLParameter(value.url, \"auto\"),\n\t\t\t\t\tgatsbyNodeArgs: args.gatsbyNodeArgs,\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\t...value,\n\t\t\t\t\t...thumbnails,\n\t\t\t\t\tlocalFile: fileNode.id,\n\t\t\t\t} as NormalizeDocumentFieldReturnType<Model>;\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\t...value,\n\t\t\t\t\t...thumbnails,\n\t\t\t\t\tlocalFile: null,\n\t\t\t\t} as NormalizeDocumentFieldReturnType<Model>;\n\t\t\t}\n\t\t}\n\n\t\tcase prismic.CustomTypeModelFieldType.Embed: {\n\t\t\tconst value = args.value as prismic.EmbedField;\n\n\t\t\tif (prismic.isFilled.embed(value)) {\n\t\t\t\tconst node: NodeInput = {\n\t\t\t\t\t...value,\n\t\t\t\t\tid: args.gatsbyNodeArgs.createNodeId(value.embed_url),\n\t\t\t\t\tinternal: {\n\t\t\t\t\t\ttype: pascalCase(\n\t\t\t\t\t\t\t\"Prismic\",\n\t\t\t\t\t\t\targs.pluginOptions.typePrefix,\n\t\t\t\t\t\t\t\"EmbedField\",\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcontentDigest: args.gatsbyNodeArgs.createContentDigest(value),\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\targs.gatsbyNodeArgs.actions.createNode(node);\n\n\t\t\t\treturn node.id as NormalizeDocumentFieldReturnType<Model>;\n\t\t\t} else {\n\t\t\t\treturn null as NormalizeDocumentFieldReturnType<Model>;\n\t\t\t}\n\t\t}\n\n\t\tcase prismic.CustomTypeModelFieldType.Integration: {\n\t\t\tconst value = args.value as prismic.IntegrationField;\n\n\t\t\tif (!model.config?.catalog) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tfmtLog(\n\t\t\t\t\t\targs.pluginOptions.repositoryName,\n\t\t\t\t\t\t`Integration fields must have a catalog configured, but none was found for this field: ${args.path.join(\n\t\t\t\t\t\t\t\".\",\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\tif (prismic.isFilled.integrationField(value)) {\n\t\t\t\tconst contentDigest = args.gatsbyNodeArgs.createContentDigest(value);\n\t\t\t\tconst node: NodeInput = {\n\t\t\t\t\t...value,\n\t\t\t\t\tid: contentDigest,\n\t\t\t\t\tinternal: {\n\t\t\t\t\t\ttype: pascalCase(\n\t\t\t\t\t\t\t\"Prismic\",\n\t\t\t\t\t\t\targs.pluginOptions.typePrefix,\n\t\t\t\t\t\t\tmodel.config.catalog,\n\t\t\t\t\t\t\t\"IntegrationItem\",\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcontentDigest,\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\t// `id` is overridden by Gatsby's node, so the original value must be aliased.\n\t\t\t\tif (value.id) {\n\t\t\t\t\tnode.prismicId = value.id;\n\t\t\t\t}\n\n\t\t\t\t// `internal` is overridden by Gatsby's node, so the original value must be aliased.\n\t\t\t\tif (value.internal) {\n\t\t\t\t\tnode.prismicInternal = value.internal;\n\t\t\t\t}\n\n\t\t\t\targs.gatsbyNodeArgs.actions.createNode(node);\n\n\t\t\t\treturn node.id as NormalizeDocumentFieldReturnType<Model>;\n\t\t\t} else {\n\t\t\t\treturn null as NormalizeDocumentFieldReturnType<Model>;\n\t\t\t}\n\t\t}\n\n\t\tdefault: {\n\t\t\treturn args.value as NormalizeDocumentFieldReturnType<Model>;\n\t\t}\n\t}\n};\n\ntype NormalizeDocumentFieldRecordArgs<\n\tModels extends Record<string, prismic.CustomTypeModelField>,\n> = Omit<NormalizeDocumentFieldArgs, \"model\" | \"value\"> & {\n\tmodels: Models;\n\trecord: { [P in keyof Models]: FieldModelValueType<Models[P]> };\n};\n\nconst normalizeDocumentFieldRecord = async <\n\tModels extends Record<string, prismic.CustomTypeModelField>,\n>(\n\targs: NormalizeDocumentFieldRecordArgs<Models>,\n): Promise<Record<string, NormalizeDocumentFieldReturnType>> => {\n\tconst result: Record<string, NormalizeDocumentFieldReturnType> = {};\n\n\tconst fieldNames = Object.keys(args.models);\n\n\tawait Promise.all(\n\t\tfieldNames.map(async (fieldName) => {\n\t\t\tif (fieldName !== \"uid\") {\n\t\t\t\tconst transformedFieldName = args.pluginOptions.transformFieldName\n\t\t\t\t\t? args.pluginOptions.transformFieldName(fieldName)\n\t\t\t\t\t: defaultTransformFieldName(fieldName);\n\n\t\t\t\tresult[transformedFieldName] = await normalizeDocumentField({\n\t\t\t\t\t...args,\n\t\t\t\t\tmodel: args.models[fieldName],\n\t\t\t\t\tvalue: args.record[fieldName],\n\t\t\t\t\tpath: [...args.path, transformedFieldName],\n\t\t\t\t});\n\t\t\t}\n\t\t}),\n\t);\n\n\treturn result;\n};\n\ntype NormalizeDocumentArgs<Model extends prismic.CustomTypeModel> = Omit<\n\tNormalizeDocumentFieldArgs,\n\t\"model\" | \"value\" | \"path\"\n> & {\n\tdocument: PrismicDocumentForModel<Model>;\n\tmodel: Model;\n};\n\nexport const normalizeDocument = async <Model extends prismic.CustomTypeModel>(\n\targs: NormalizeDocumentArgs<Model>,\n): Promise<\n\tOmit<PrismicDocumentForModel<Model>, \"data\"> & {\n\t\tdata: Record<string, NormalizeDocumentFieldReturnType>;\n\t}\n> => {\n\tconst models: Model[\"json\"][string] = Object.assign(\n\t\t{},\n\t\t...Object.values(args.model.json),\n\t);\n\n\tconst normalizedData = await normalizeDocumentFieldRecord({\n\t\t...args,\n\t\tmodels: models,\n\t\tpath: [args.model.id],\n\t\trecord: args.document.data,\n\t});\n\n\treturn {\n\t\t...args.document,\n\t\tdata: normalizedData,\n\t};\n};\n"],"names":["prismic","_b","_a","model","shouldDownloadFile","createCachedRemoteFileNode","defaultTransformFieldName","withoutURLParameter","pascalCase","fmtLog"],"mappings":"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"}