UNPKG

class-constructor

Version:

Tool to implement builder pattern that actually uses class constructor with ease

1 lines 19.6 kB
{"version":3,"sources":["../src/lib/metadata-storage/metadata-storage.ts","../src/lib/util/get-global.ts","../src/lib/storage.ts","../src/lib/util/get-class-plain-properties.ts","../src/lib/util/private-key-to-desired.ts","../src/lib/parametrized-builder.ts","../src/lib/decorators/builder-accessors.ts","../src/lib/to-builder-method.ts"],"sourcesContent":["import { BuilderObject } from '../parametrized-builder';\nimport { Clazz, InstantiableClazz } from '../types';\nimport { BuilderAccessorsMetadata } from './types/builder-accessors-metadata';\nimport { ClassPropertyMetadata } from './types/class-metadata';\n\nexport class MetadataStorage {\n private readonly _builderAccessorsMetadata: Map<\n Clazz,\n Map<PropertyKey, ClassPropertyMetadata<BuilderAccessorsMetadata>>\n > = new Map();\n private _ancestorsMap = new Map<Clazz, Clazz[]>();\n private readonly _initializedAccessorsClasses = new Set<Clazz>();\n private readonly _cachedBuilderObjects = new Map<InstantiableClazz, Partial<BuilderObject>>();\n\n addBuilderAccessorsMetadata(metadata: ClassPropertyMetadata<BuilderAccessorsMetadata>): void {\n if (!this._builderAccessorsMetadata.has(metadata.target)) {\n this._builderAccessorsMetadata.set(\n metadata.target,\n new Map<PropertyKey, ClassPropertyMetadata<BuilderAccessorsMetadata>>(),\n );\n }\n this._builderAccessorsMetadata.get(metadata.target)!.set(metadata.propertyKey, metadata);\n }\n\n findBuilderAccessorsMetadata(\n target: Clazz,\n propertyName: string,\n ): ClassPropertyMetadata<BuilderAccessorsMetadata> | undefined {\n return this.findMetadata(this._builderAccessorsMetadata, target, propertyName);\n }\n\n getBuilderAccessors(target: Clazz): ClassPropertyMetadata<BuilderAccessorsMetadata>[] {\n return this.getMetadata(this._builderAccessorsMetadata, target);\n }\n\n clear(): void {\n this._ancestorsMap.clear();\n this._builderAccessorsMetadata.clear();\n this._initializedAccessorsClasses.clear();\n this._cachedBuilderObjects.clear();\n }\n\n private getMetadata<T>(\n metadataMap: Map<Clazz, Map<PropertyKey, ClassPropertyMetadata<T>>>,\n target: Clazz,\n ): ClassPropertyMetadata<T>[] {\n const metadataFromTargetMap = metadataMap.get(target);\n let metadataFromTarget: ClassPropertyMetadata<T>[] = [];\n if (metadataFromTargetMap) {\n metadataFromTarget = Array.from(metadataFromTargetMap.values());\n }\n\n const metadataFromAncestors: ClassPropertyMetadata<T>[] = [];\n for (const ancestor of this.getAncestors(target) ?? []) {\n const ancestorMetadataMap = metadataMap.get(ancestor);\n if (ancestorMetadataMap) {\n metadataFromAncestors.push(...Array.from(ancestorMetadataMap.values()));\n }\n }\n\n return metadataFromAncestors.concat(metadataFromTarget);\n }\n\n private findMetadata<T>(\n metadataMap: Map<Clazz, Map<PropertyKey, ClassPropertyMetadata<T>>>,\n target: Clazz,\n propertyKey: PropertyKey,\n ): ClassPropertyMetadata<T> | undefined {\n const metadataFromTargetMap = metadataMap.get(target);\n if (metadataFromTargetMap) {\n const metadataFromTarget = metadataFromTargetMap.get(propertyKey);\n if (metadataFromTarget) {\n return metadataFromTarget;\n }\n }\n\n for (const ancestor of this.getAncestors(target) ?? []) {\n const ancestorMetadataMap = metadataMap.get(ancestor);\n if (ancestorMetadataMap) {\n const ancestorResult = ancestorMetadataMap.get(propertyKey);\n if (ancestorResult) {\n return ancestorResult;\n }\n }\n }\n\n return undefined;\n }\n\n private getAncestors(target: Clazz): Clazz[] | undefined {\n if (!target) return [];\n if (!this._ancestorsMap.has(target)) {\n const ancestors: Clazz[] = [];\n\n for (\n let baseClass = target.prototype?.constructor\n ? Object.getPrototypeOf(target.prototype?.constructor)\n : undefined;\n typeof baseClass?.prototype !== 'undefined';\n baseClass = Object.getPrototypeOf(baseClass.prototype?.constructor)\n ) {\n ancestors.push(baseClass);\n }\n this._ancestorsMap.set(target, ancestors);\n }\n return this._ancestorsMap.get(target);\n }\n\n addInitializedAccessorsClass(clazz: Clazz): void {\n this._initializedAccessorsClasses.add(clazz);\n }\n\n hasInitializedAccessors(clazz: Clazz): boolean {\n return this._initializedAccessorsClasses.has(clazz);\n }\n\n getCachedBuilderObject<TClass extends InstantiableClazz>(\n classConstructor: TClass,\n ): Partial<BuilderObject> | undefined {\n return this._cachedBuilderObjects.get(classConstructor);\n }\n\n setCachedBuilderObject<TClass extends InstantiableClazz>(\n classConstructor: TClass,\n builderObject: Partial<BuilderObject>,\n ): void {\n this._cachedBuilderObjects.set(classConstructor, builderObject);\n }\n}\n","// get global function from https://github.com/typestack/class-transformer\n/**\n * This function returns the global object across Node and browsers.\n *\n * Note: `globalThis` is the standardized approach however it has been added to\n * Node.js in version 12. We need to include this snippet until Node 12 EOL.\n */\nexport function getGlobal(): Record<PropertyKey, unknown> {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n\n if (typeof global !== 'undefined') {\n return global;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore: Cannot find name 'window'.\n if (typeof window !== 'undefined') {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore: Cannot find name 'window'.\n return window;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore: Cannot find name 'self'.\n if (typeof self !== 'undefined') {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore: Cannot find name 'self'.\n return self;\n }\n\n throw new Error('Failed to get global object');\n}\n","import { MetadataStorage } from './metadata-storage';\nimport { getGlobal } from './util';\n\nconst globalScope = getGlobal();\nconst METADATA_STORAGE_KEY = Symbol.for('typescriptClassBuilderMetadataStorage');\n\nif (!globalScope[METADATA_STORAGE_KEY]) {\n globalScope[METADATA_STORAGE_KEY] = new MetadataStorage();\n}\n\nexport const getMetadataStorage = () => globalScope[METADATA_STORAGE_KEY] as MetadataStorage;\n","export function getClassPlainProperties<TClass extends object>(instance: TClass): Set<string> {\n const propertyNames = Object.getOwnPropertyNames(instance);\n return new Set(\n propertyNames.filter((propertyName) => {\n const descriptor = Object.getOwnPropertyDescriptor(instance, propertyName);\n return descriptor && !descriptor.get && !descriptor.set;\n }),\n );\n}\n","export function privateKeyToDesired(key: string) {\n if (!key.startsWith('_')) {\n return key;\n }\n\n return key.slice(1);\n}\n","import { getMetadataStorage } from './storage';\nimport { Builder, ClassInstance, Clazz, InstantiableClazz } from './types';\nimport { getClassPlainProperties } from './util/get-class-plain-properties';\nimport { privateKeyToDesired } from './util/private-key-to-desired';\n\nfunction setAccessorsForClassProperties<TClass extends Clazz>(\n classConstructor: TClass,\n instance: ClassInstance<TClass>,\n) {\n const metadataStorage = getMetadataStorage();\n const propertySet = getClassPlainProperties(instance);\n propertySet.forEach((property) => {\n const hasMetadata = !!metadataStorage.findBuilderAccessorsMetadata(classConstructor, property);\n // do not override existing getters and setters metadata\n if (!hasMetadata) {\n metadataStorage.addBuilderAccessorsMetadata({\n target: classConstructor,\n propertyKey: property,\n get: (target: object) => (target as Record<string, unknown>)[property],\n set: (target: object, value: unknown) => {\n (target as Record<string, unknown>)[property] = value;\n },\n });\n }\n });\n metadataStorage.addInitializedAccessorsClass(classConstructor);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface BuilderObject<TClass extends InstantiableClazz = any> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n instance: any;\n [key: string]: ((value: unknown) => BuilderObject<TClass>) | (() => unknown);\n build: () => ClassInstance<TClass>;\n}\n\nfunction createClassBuilderObject<TClass extends InstantiableClazz>(classConstructor: TClass) {\n const metadataStorage = getMetadataStorage();\n const builderAccessors = metadataStorage.getBuilderAccessors(classConstructor);\n\n const builder: Partial<BuilderObject> = {\n build: function (this: BuilderObject<TClass>) {\n return this.instance;\n },\n };\n\n builderAccessors.sort((a, b) => {\n const aStartsWithUnderscore = a.propertyKey.toString().startsWith('_');\n const bStartsWithUnderscore = b.propertyKey.toString().startsWith('_');\n if (aStartsWithUnderscore && !bStartsWithUnderscore) return 1;\n if (!aStartsWithUnderscore && bStartsWithUnderscore) return -1;\n return 0;\n });\n\n builderAccessors.forEach((accessor) => {\n const propertyKey = accessor.propertyKey.toString();\n let builderPropertyKey = propertyKey;\n if (propertyKey.startsWith('_') && !(privateKeyToDesired(propertyKey) in builder)) {\n builderPropertyKey = privateKeyToDesired(propertyKey);\n }\n\n builder[builderPropertyKey] = function (this: BuilderObject<TClass>, ...args: unknown[]) {\n const value = args[0];\n if (0 === args.length) {\n return accessor.get(this.instance);\n }\n accessor.set(this.instance, value);\n return this;\n };\n });\n\n return Object.freeze(builder);\n}\n\n/**\n * Creates a builder for a class with required constructor parameters and optional properties.\n *\n * @param classConstructor - The class to build\n * @param parameters - Required constructor parameters\n * @returns A builder instance that provides fluent methods for setting optional properties\n *\n */\nexport function ParametrizedBuilder<TClass extends InstantiableClazz, TOptionals = ClassInstance<TClass>>(\n classConstructor: TClass,\n parameters: ConstructorParameters<TClass>,\n): Builder<TOptionals, ClassInstance<TClass>> {\n const metadataStorage = getMetadataStorage();\n const instance: ClassInstance<TClass> = new classConstructor(...parameters);\n\n if (!metadataStorage.hasInitializedAccessors(classConstructor)) {\n setAccessorsForClassProperties(classConstructor, instance);\n }\n\n const builderObject =\n metadataStorage.getCachedBuilderObject(classConstructor) || createClassBuilderObject(classConstructor);\n metadataStorage.setCachedBuilderObject(classConstructor, builderObject);\n const builder = Object.setPrototypeOf({ instance: instance }, builderObject);\n\n return builder as Builder<TOptionals, ClassInstance<TClass>>;\n}\n","import { BuilderAccessorsMetadata } from '../metadata-storage/types';\nimport { getMetadataStorage } from '../storage';\n\n/**\n * Decorator that specifies custom getter and setter functions for a builder property.\n * This allows customizing how properties are accessed and modified during the build process.\n *\n * @param get - Function to get the property value from the target object\n * @param set - Function to set the property value on the target object\n * @returns PropertyDecorator function\n *\n * @example\n * ```typescript\n * class MyClass {\n * @BuilderAccessors(\n * (target) => target._property,\n * (target, value) => target.property = value\n * )\n * private _property?: string;\n *\n * set property(value: string) {\n * this._property = value.toUpperCase();\n * }\n * }\n * ```\n */\nexport function BuilderAccessors<T extends object, V>(get: (target: T) => V, set: (target: T, value: V) => void) {\n return function (target: T, propertyKey: string): void {\n const metadataStorage = getMetadataStorage();\n const metadata: BuilderAccessorsMetadata = {\n get: get as (target: object) => unknown,\n set: set as (target: object, value: unknown) => void,\n };\n\n metadataStorage.addBuilderAccessorsMetadata({\n target: target.constructor as new (...args: unknown[]) => unknown,\n propertyKey,\n ...metadata,\n });\n };\n}\n","// Rename `createBuilderMethodFactory` to `toBuilder` as `toBuilderMethod(MyClass).withOptionals<MyClassOptionals>()` and `toBuilderMethod(MyClass).classAsOptionals()` ?\nimport { ParametrizedBuilder } from './parametrized-builder';\nimport { Builder, ClassInstance, InstantiableClazz } from './types';\n\nexport interface BuilderMethodFactory<TClass extends InstantiableClazz> {\n withOptionals<TOptionals>(): (...args: ConstructorParameters<TClass>) => Builder<TOptionals, ClassInstance<TClass>>;\n classAsOptionals(): (...args: ConstructorParameters<TClass>) => Builder<ClassInstance<TClass>, ClassInstance<TClass>>;\n}\n\n/**\n * Creates a builder method factory for a class that can generate builders with different optional property configurations.\n *\n * @param clazz - The class to create a builder for\n * @returns A factory object with methods to create different types of builders\n *\n * @example\n * ```typescript\n *\n * interface MyOptionals {\n * optional?: string;\n * }\n *\n * class MyClass {\n * constructor(public required: string) {}\n * private _optional?: string;\n *\n * static builder = toBuilderMethod(MyClass).withOptionals<MyOptionals>();\n * }\n * ```\n * @example\n * ```typescript\n *\n * class MyClass {\n * constructor(public required: string) {}\n * public optional?: string;\n *\n * static builder = toBuilderMethod(MyClass).classAsOptionals();\n * }\n * ```\n */\nexport function toBuilderMethod<TClass extends InstantiableClazz>(clazz: TClass): BuilderMethodFactory<TClass> {\n return {\n withOptionals: <TOptionals>() => {\n return (...args: ConstructorParameters<TClass>) => {\n return ParametrizedBuilder<TClass, TOptionals>(clazz, args);\n };\n },\n classAsOptionals: () => {\n return (...args: ConstructorParameters<TClass>) => {\n return ParametrizedBuilder<TClass, ClassInstance<TClass>>(clazz, args);\n };\n },\n };\n}\n"],"mappings":"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","names":["MetadataStorage","metadata","target","propertyName","metadataMap","metadataFromTargetMap","metadataFromTarget","metadataFromAncestors","ancestor","ancestorMetadataMap","propertyKey","ancestorResult","_a","_b","_c","ancestors","baseClass","clazz","classConstructor","builderObject","getGlobal","globalScope","getGlobal","METADATA_STORAGE_KEY","MetadataStorage","getMetadataStorage","getClassPlainProperties","instance","propertyNames","propertyName","descriptor","privateKeyToDesired","key","setAccessorsForClassProperties","classConstructor","instance","metadataStorage","getMetadataStorage","getClassPlainProperties","property","target","value","createClassBuilderObject","builderAccessors","builder","a","b","aStartsWithUnderscore","bStartsWithUnderscore","accessor","propertyKey","builderPropertyKey","privateKeyToDesired","args","ParametrizedBuilder","parameters","builderObject","BuilderAccessors","get","set","target","propertyKey","metadataStorage","getMetadataStorage","metadata","toBuilderMethod","clazz","args","ParametrizedBuilder"]}