Files
payload/src/bin/generateTypes.ts
2023-01-19 14:16:21 -05:00

59 lines
1.9 KiB
TypeScript

/* 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();
}