59 lines
1.9 KiB
TypeScript
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();
|
|
}
|