{"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"]}