deneric2
Version:
Zero-dependency JSON-to-Entity parser with schema support
1 lines • 19.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/utils.ts","../src/Deneric.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Lightweight utility functions replacing lodash dependencies.\n * Covers: get, set, cloneDeep, isPlainObject\n */\n\n/**\n * Parse a dot-notation path string into an array of keys.\n * Supports bracket notation: \"a.b[0].c\" → [\"a\", \"b\", \"0\", \"c\"]\n */\nfunction parsePath(path: string): string[] {\n if (!path) return []\n const result: string[] = []\n const regex = /[^.[\\]]+/g\n let match: RegExpExecArray | null\n while ((match = regex.exec(path)) !== null) {\n result.push(match[0])\n }\n return result\n}\n\n/**\n * Get a value from an object by dot-notation path.\n * @example get({ a: { b: 1 } }, 'a.b') // → 1\n */\nexport function get(obj: any, path: string): any {\n if (obj == null) return undefined\n const keys = parsePath(path)\n let current = obj\n for (const key of keys) {\n if (current == null) return undefined\n current = current[key]\n }\n return current\n}\n\n/**\n * Set a value on an object by dot-notation path, creating intermediate\n * objects/arrays as needed.\n * @example set({}, 'a.b', 1) // → { a: { b: 1 } }\n */\nexport function set(obj: any, path: string, value: any): any {\n if (obj == null || typeof obj !== 'object') return obj\n const keys = parsePath(path)\n if (keys.length === 0) return obj\n\n let current = obj\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]\n const nextKey = keys[i + 1]\n if (current[key] == null || typeof current[key] !== 'object') {\n // Create array if next key is numeric, otherwise object\n current[key] = /^\\d+$/.test(nextKey) ? [] : {}\n }\n current = current[key]\n }\n current[keys[keys.length - 1]] = value\n return obj\n}\n\n/**\n * Deep clone a value.\n * Uses manual recursive cloning to support objects containing\n * non-serializable values like functions/constructors (used in schemas).\n */\nexport function cloneDeep<T>(value: T): T {\n if (value === null || value === undefined) return value\n if (typeof value !== 'object') return value\n\n if (Array.isArray(value)) {\n return value.map(item => cloneDeep(item)) as unknown as T\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime()) as unknown as T\n }\n\n if (value instanceof RegExp) {\n return new RegExp(value.source, value.flags) as unknown as T\n }\n\n const result = Object.create(Object.getPrototypeOf(value))\n for (const key of Object.keys(value)) {\n (result as any)[key] = cloneDeep((value as any)[key])\n }\n return result\n}\n\n/**\n * Check if a value is a plain object (not null, not array, not Date, etc.)\n */\nexport function isPlainObject(value: any): value is Record<string, any> {\n if (value === null || value === undefined) return false\n if (typeof value !== 'object') return false\n if (Array.isArray(value)) return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n","import { get, set, cloneDeep, isPlainObject } from './utils'\n\ntype CommonType = StringConstructor | NumberConstructor | BooleanConstructor | ArrayConstructor | ObjectConstructor\ntype SingleType = CommonType | Deneric | typeof Deneric\ntype TDataType = SingleType | ComplexDataType\ntype Newable = { new(value?: any): Deneric }\nexport type DenericSchema = { [key: string]: [dataPath: string, dataType: TDataType, jsonIgnore?: boolean, defaultValue?: any] }\nconst COMMON_DATA_TYPES: CommonType[] = [String, Number, Boolean, Array, Object]\nconst DENERIC_SCHEMA_PATH: string = '__deneric_schema'\n\nabstract class ComplexDataType {\n abstract itemType: SingleType | ComplexDataType\n\n isArray: boolean = false\n isMap: boolean = false\n}\n\nclass ArrayDataType extends ComplexDataType {\n isArray = true\n\n constructor(public itemType: SingleType | ComplexDataType) {\n super()\n }\n}\n\nclass MapDataType extends ComplexDataType {\n isMap = true\n\n constructor(public itemType: SingleType | ComplexDataType) {\n super()\n }\n}\n\nconst Utils = Object.freeze({\n getValue(data: any, dataPath: string) {\n if (!!dataPath) {\n return get(data, dataPath)\n }\n return data\n },\n getValueFromJson(data: any, dataType: TDataType, defaultValue: any, strict: boolean): any {\n // Handle dataType is Deneric Instance\n if ((dataType as typeof Deneric).prototype instanceof Deneric) {\n return new (dataType as unknown as Newable)(data)\n }\n\n // Handle dataType is ComplexDataType\n if (dataType instanceof ComplexDataType) {\n const complexDataType = dataType as ComplexDataType\n if (complexDataType.isArray) {\n return Array.isArray(data) ? data.map(item => Utils.getValueFromJson(item, complexDataType.itemType, Utils.getDefaultValue(complexDataType.itemType), strict)) : defaultValue\n }\n if (complexDataType.isMap && isPlainObject(data)) {\n return Object.keys(data).reduce((prev, key) => {\n set(prev, key, Utils.getValueFromJson(Utils.getValue(data, key), complexDataType.itemType, Utils.getDefaultValue(complexDataType.itemType), strict))\n return prev\n }, {})\n }\n return defaultValue\n }\n\n const dataIsNil = data === null || data === undefined\n // Handle dataType is not common types\n if (!COMMON_DATA_TYPES.includes(dataType as CommonType)) {\n return dataIsNil ? defaultValue : data\n }\n\n // Handle dataType is common types with strict rule\n if (strict) {\n switch (dataType) {\n case String:\n return typeof data === 'string' ? data : defaultValue\n case Number:\n return typeof data === 'number' ? data : defaultValue\n case Boolean:\n return typeof data === 'boolean' ? data : defaultValue\n case Array:\n return Array.isArray(data) ? data : defaultValue\n case Object:\n return isPlainObject(data) ? data : defaultValue\n }\n }\n\n // Handle dataType is common types with no-strict rule and data is not Nil\n if (!strict && !dataIsNil) {\n switch (dataType) {\n case String:\n return String(data)\n case Number:\n return Number(data)\n case Boolean:\n return Boolean(data)\n case Array:\n return [].concat(data)\n case Object:\n return Object(data)\n }\n }\n\n return defaultValue\n },\n getValueFromDeneric(data: any, dataType: TDataType, defaultValue: any): any {\n switch (dataType) {\n case String:\n return typeof data === 'string' ? data : defaultValue\n case Number:\n return typeof data === 'number' ? data : defaultValue\n case Boolean:\n return typeof data === 'boolean' ? data : defaultValue\n case Array:\n return Array.isArray(data) ? data : defaultValue\n case Object:\n return isPlainObject(data) ? cloneDeep(data) : defaultValue\n }\n if (dataType instanceof ComplexDataType) {\n const complexDataType = dataType as ComplexDataType\n if (complexDataType.isArray) {\n return Array.isArray(data) ? data.map(item => Utils.getValueFromDeneric(item, complexDataType.itemType, Utils.getDefaultValue(complexDataType.itemType))) : defaultValue\n }\n if (complexDataType.isMap) {\n data = isPlainObject(data) ? data : {}\n return Object.keys(data).reduce((prev, key) => {\n set(prev, key, Utils.getValueFromDeneric(data[key], complexDataType.itemType, Utils.getDefaultValue(complexDataType.itemType)))\n return prev\n }, {})\n }\n }\n\n if ((dataType as typeof Deneric).prototype instanceof Deneric) {\n return (data as Deneric).toJson()\n }\n\n return data\n },\n getDefaultValue(dataType: TDataType) {\n if (dataType instanceof ComplexDataType) {\n const complexDataType = dataType as ComplexDataType\n if (complexDataType.isArray) {\n return []\n }\n if (complexDataType.isMap) {\n return {}\n }\n }\n\n switch (dataType) {\n case String:\n return ''\n case Number:\n return 0\n case Boolean:\n return false\n case Array:\n return []\n case Object:\n return {}\n }\n return undefined\n },\n setSchema(instance: Deneric, schema: DenericSchema): void {\n // if (!Object.getOwnPropertyNames(instance).includes(DENERIC_SCHEMA_PATH)) {\n // Object.defineProperty(instance, DENERIC_SCHEMA_PATH,{\n // enumerable: false,\n // writable: true,\n // })\n // }\n set(instance, DENERIC_SCHEMA_PATH, schema)\n },\n getSchema(instance: Deneric): DenericSchema {\n return get(instance, DENERIC_SCHEMA_PATH) || {} as DenericSchema\n }\n})\n\nabstract class Deneric {\n static Array = (dataType: TDataType) => new ArrayDataType(dataType)\n static Map = (valueDataType: TDataType) => new MapDataType(valueDataType)\n static Utils = Utils\n\n // private __proto__!: { schema: DenericSchema }\n\n constructor(schema: DenericSchema) {\n if (!schema) {\n throw new TypeError('Invalid schema: ' + this.constructor.name)\n }\n Utils.setSchema(this, schema)\n }\n\n clone<T extends Deneric>(): T {\n return cloneDeep(this) as unknown as T\n }\n\n fromJson<T extends Deneric>(data: any, strict: boolean = true): T {\n const schema: DenericSchema = Utils.getSchema(this)\n Object.keys(schema).forEach(key => {\n const [dataPath, dataType] = schema[key]\n let defaultValue = get(this, key) ?? Utils.getDefaultValue(dataType)\n\n if (schema[key][3] === undefined) {\n schema[key][3] = defaultValue\n } else {\n defaultValue = schema[key][3] ?? Utils.getDefaultValue(dataType)\n }\n const value = Utils.getValueFromJson(cloneDeep(Utils.getValue(data, dataPath)), dataType, defaultValue, strict)\n set(this, key, value)\n })\n return this as unknown as T\n }\n\n toJson(): object {\n const schema: DenericSchema = Utils.getSchema(this)\n const json = {}\n Object.keys(schema).forEach(key => {\n const [dataPath, dataType, jsonIgnore, defaultValueFromSchema] = schema[key]\n if (!jsonIgnore) {\n set(json, dataPath, Utils.getValueFromDeneric(get(this, key), dataType, defaultValueFromSchema || Utils.getDefaultValue(dataType)))\n }\n })\n return json\n }\n}\n\nexport default Deneric"]}