UNPKG

@lbu/code-gen

Version:

Generate various boring parts of your server

79 lines (62 loc) 1.75 kB
import { isNil, isPlainObject } from "@lbu/stdlib"; import { ObjectType } from "./ObjectType.js"; import { TypeBuilder } from "./TypeBuilder.js"; import { buildOrInfer } from "./utils.js"; export class OmitType extends TypeBuilder { static baseData = { keys: [], }; build() { if (isNil(this.builder)) { // Force an error this.object(undefined); } const buildResult = buildOrInfer(this.builder); if (isNil(this.data.name) && !isNil(buildResult.name)) { this.name(`${buildResult.name}Omit`); } const thisResult = super.build(); // Overwrite name, even if it may be undefined buildResult.uniqueName = thisResult.uniqueName; buildResult.group = thisResult.group; buildResult.name = thisResult.name; // also copy over default value, as that is most likely the expected behaviour buildResult.defaultValue = thisResult.defaultValue ?? buildResult.defaultValue; for (const key of thisResult.keys) { delete buildResult.keys[key]; } return buildResult; } constructor(group, name) { super("omit", group, name); this.data = { ...this.data, ...OmitType.getBaseData(), }; } /** * @param {ObjectType|TypeBuilderLikeObject} builder * @returns {OmitType} */ object(builder) { if ( isNil(builder) || (!(builder instanceof ObjectType) && !isPlainObject(builder)) ) { throw new TypeError( `T.omit() expects a ObjectType or plain Javascript object as the first argument`, ); } this.builder = builder; return this; } /** * @param {...string} keys * @returns {OmitType} */ keys(...keys) { this.data.keys.push(...keys); return this; } }