import { detectTypesProvider, generateTypes } from "prismic-ts-codegen"; import { PluginSystemActions } from "../createPluginSystemActions"; import { GLOBAL_TYPESCRIPT_TYPES_FILENAME, NON_EDITABLE_FILE_BANNER, } from "./constants"; import { writeProjectFile, WriteProjectFileArgs } from "./writeProjectFile"; /** * Arguments for `upsertGlobalContentTypes()`. */ export type UpsertGlobalTypeScriptTypesArgs = { filename?: string; actions: PluginSystemActions; } & Omit; /** * Creates a globally accessible TypeScript file containing types representing * the Prismic repository's content. * * @returns The file path to the written file. */ export const upsertGlobalTypeScriptTypes = async ( args: UpsertGlobalTypeScriptTypesArgs, ): Promise => { const project = await args.helpers.getProject(); const [customTypeModelDescriptors, sharedSliceModelDescriptors] = await Promise.all([ args.actions.readAllCustomTypeModels(), args.actions.readAllSliceModels(), ]); const customTypeModels = customTypeModelDescriptors.map( (customTypeModelDescriptors) => { return customTypeModelDescriptors.model; }, ); const sharedSliceModels = sharedSliceModelDescriptors.map( (sharedSliceModelDescriptors) => { return sharedSliceModelDescriptors.model; }, ); let contents = generateTypes({ customTypeModels, sharedSliceModels, clientIntegration: { includeCreateClientInterface: true, includeContentNamespace: true, }, typesProvider: await detectTypesProvider({ cwd: project.root }), }); contents = `${NON_EDITABLE_FILE_BANNER}\n\n${contents}`; return await writeProjectFile({ ...args, filename: args.filename || GLOBAL_TYPESCRIPT_TYPES_FILENAME, contents, }); };