/* eslint-disable no-nested-ternary */ import fs from 'fs'; import type { JSONSchema4 } from 'json-schema'; import { compile } from 'json-schema-to-typescript'; import Logger from '../utilities/logger'; import { SanitizedConfig } from '../config/types'; import loadConfig from '../config/load'; import { entityToJsonSchema, generateEntityObject } from '../utilities/entityToJSONSchema'; function configToJsonSchema(config: SanitizedConfig): JSONSchema4 { return { title: 'Config', type: 'object', additionalProperties: false, properties: { collections: generateEntityObject(config, 'collections'), globals: generateEntityObject(config, 'globals'), }, required: ['collections', 'globals'], definitions: Object.fromEntries( [ ...config.globals.map((global) => [ global.slug, entityToJsonSchema(config, global), ]), ...config.collections.map((collection) => [ collection.slug, entityToJsonSchema(config, collection), ]), ], ), }; } export function generateTypes(): void { const logger = Logger(); const config = loadConfig(); const outputFile = process.env.PAYLOAD_TS_OUTPUT_PATH || config.typescript.outputFile; logger.info('Compiling TS types for Collections and Globals...'); const jsonSchema = configToJsonSchema(config); compile(jsonSchema, 'Config', { bannerComment: '/* tslint:disable */\n/**\n* This file was automatically generated by Payload CMS.\n* DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config,\n* and re-run `payload generate:types` to regenerate this file.\n*/', style: { singleQuote: true, }, }).then((compiled) => { fs.writeFileSync(outputFile, compiled); logger.info(`Types written to ${outputFile}`); }); } // when generateTypes.js is launched directly if (module.id === require.main.id) { generateTypes(); }