{"version":3,"file":"index.cjs","names":["DEFAULT: Required<DatasetParserOptions>","#element","#options","#excludePaths","#normalizePath","data: Record<string, unknown>","realKey: string","#pascalToCamel","#toCamelCase","#isExcluded","#setDeepProperty","#parseValue"],"sources":["../src/DatasetParser.ts","../src/index.ts"],"sourcesContent":["// 默认参数接口\nexport interface DatasetParserOptions {\n  prefix?: string\n  parseFunction?: boolean\n  excludeKeys?: string[]\n}\n\ndeclare global {\n  interface Window {\n    [key: string]: unknown\n  }\n}\n\nconst DEFAULT: Required<DatasetParserOptions> = {\n  prefix: \"\",\n  parseFunction: true,\n  excludeKeys: [],\n}\n\nexport default class DatasetParser {\n  #element: HTMLElement\n  #options: Required<DatasetParserOptions>\n  // 存储排除路径（每项为 [\"config\",\"foo\",\"delay\"]）\n  #excludePaths: string[][]\n\n  constructor(element: HTMLElement, options: DatasetParserOptions = {}) {\n    this.#element = element\n    this.#options = { ...DEFAULT, ...options }\n\n    this.#excludePaths = this.#options.excludeKeys.map((path) =>\n      this.#normalizePath(path),\n    )\n  }\n\n  parse(): Record<string, unknown> {\n    const data: Record<string, unknown> = {}\n    const prefixLength = this.#options.prefix.length\n\n    for (const key in this.#element.dataset) {\n      const value = this.#element.dataset[key]\n      if (value === undefined) continue\n\n      let realKey: string\n      if (this.#options.prefix) {\n        if (!key.startsWith(this.#options.prefix)) continue\n        realKey = this.#pascalToCamel(key.slice(prefixLength))\n      } else {\n        realKey = this.#toCamelCase(key)\n      }\n\n      // 检查是否被排除\n      if (this.#isExcluded(realKey)) continue\n\n      this.#setDeepProperty(data, realKey, this.#parseValue(value))\n    }\n\n    return data\n  }\n\n  // 检查某路径是否在排除列表内（支持深层路径匹配）\n  #isExcluded(keyPath: string): boolean {\n    const targetPath = this.#normalizePath(keyPath)\n\n    return this.#excludePaths.some((excludePath) => {\n      // 如果 excludePath 是 targetPath 的前缀，则匹配\n      if (excludePath.length <= targetPath.length) {\n        return excludePath.every((part, i) => part === targetPath[i])\n      }\n      return false\n    })\n  }\n\n  // 规范化路径为小驼峰数组\n  #normalizePath(path: string): string[] {\n    return this.#toCamelCase(path)\n      .split(\".\")\n      .map((p) => this.#pascalToCamel(p))\n  }\n\n  #setDeepProperty(\n    obj: Record<string, unknown>,\n    keyPath: string,\n    value: unknown,\n  ): void {\n    const keys = this.#toCamelCase(keyPath).split(\".\")\n    let temp = obj\n\n    for (const [index, key] of keys.entries()) {\n      if (index === keys.length - 1) {\n        temp[key] = value\n      } else {\n        if (!temp[key] || typeof temp[key] !== \"object\") {\n          temp[key] = {}\n        }\n        temp = temp[key] as Record<string, unknown>\n      }\n    }\n  }\n\n  #parseValue(val: string): unknown {\n    const { parseFunction } = this.#options\n\n    if (parseFunction && typeof (window as Window)[val] === \"function\") {\n      return (window as Window)[val]\n    }\n\n    if (val === \"true\") return true\n    if (val === \"false\") return false\n    if (!isNaN(Number(val)) && val.trim() !== \"\") return Number(val)\n\n    if (\n      (val.startsWith(\"{\") && val.endsWith(\"}\")) ||\n      (val.startsWith(\"[\") && val.endsWith(\"]\"))\n    ) {\n      try {\n        return JSON.parse(val)\n      } catch {\n        return val\n      }\n    }\n\n    return val\n  }\n\n  #toCamelCase(str: string): string {\n    return str.replace(/-([a-z])/g, (_, p1) => p1.toUpperCase())\n  }\n\n  #pascalToCamel(str: string): string {\n    return str.charAt(0).toLowerCase() + str.slice(1)\n  }\n}\n","import DatasetParser from \"./DatasetParser.js\"\nimport type { DatasetParserOptions } from \"./DatasetParser.js\"\n\nconst datasetConfig = (\n  element: HTMLElement,\n  options?: DatasetParserOptions,\n): Record<string, unknown> => {\n  return new DatasetParser(element, options).parse()\n}\n\nexport default datasetConfig\n"],"mappings":";;AAaA,MAAMA,UAA0C;CAC9C,QAAQ;CACR,eAAe;CACf,aAAa,EAAE;CAChB;AAED,IAAqB,gBAArB,MAAmC;CACjC;CACA;CAEA;CAEA,YAAY,SAAsB,UAAgC,EAAE,EAAE;AACpE,QAAKC,UAAW;AAChB,QAAKC,UAAW;GAAE,GAAG;GAAS,GAAG;GAAS;AAE1C,QAAKC,eAAgB,MAAKD,QAAS,YAAY,KAAK,SAClD,MAAKE,cAAe,KAAK,CAC1B;;CAGH,QAAiC;EAC/B,MAAMC,OAAgC,EAAE;EACxC,MAAM,eAAe,MAAKH,QAAS,OAAO;AAE1C,OAAK,MAAM,OAAO,MAAKD,QAAS,SAAS;GACvC,MAAM,QAAQ,MAAKA,QAAS,QAAQ;AACpC,OAAI,UAAU,OAAW;GAEzB,IAAIK;AACJ,OAAI,MAAKJ,QAAS,QAAQ;AACxB,QAAI,CAAC,IAAI,WAAW,MAAKA,QAAS,OAAO,CAAE;AAC3C,cAAU,MAAKK,cAAe,IAAI,MAAM,aAAa,CAAC;SAEtD,WAAU,MAAKC,YAAa,IAAI;AAIlC,OAAI,MAAKC,WAAY,QAAQ,CAAE;AAE/B,SAAKC,gBAAiB,MAAM,SAAS,MAAKC,WAAY,MAAM,CAAC;;AAG/D,SAAO;;CAIT,YAAY,SAA0B;EACpC,MAAM,aAAa,MAAKP,cAAe,QAAQ;AAE/C,SAAO,MAAKD,aAAc,MAAM,gBAAgB;AAE9C,OAAI,YAAY,UAAU,WAAW,OACnC,QAAO,YAAY,OAAO,MAAM,MAAM,SAAS,WAAW,GAAG;AAE/D,UAAO;IACP;;CAIJ,eAAe,MAAwB;AACrC,SAAO,MAAKK,YAAa,KAAK,CAC3B,MAAM,IAAI,CACV,KAAK,MAAM,MAAKD,cAAe,EAAE,CAAC;;CAGvC,iBACE,KACA,SACA,OACM;EACN,MAAM,OAAO,MAAKC,YAAa,QAAQ,CAAC,MAAM,IAAI;EAClD,IAAI,OAAO;AAEX,OAAK,MAAM,CAAC,OAAO,QAAQ,KAAK,SAAS,CACvC,KAAI,UAAU,KAAK,SAAS,EAC1B,MAAK,OAAO;OACP;AACL,OAAI,CAAC,KAAK,QAAQ,OAAO,KAAK,SAAS,SACrC,MAAK,OAAO,EAAE;AAEhB,UAAO,KAAK;;;CAKlB,YAAY,KAAsB;EAChC,MAAM,EAAE,kBAAkB,MAAKN;AAE/B,MAAI,iBAAiB,OAAQ,OAAkB,SAAS,WACtD,QAAQ,OAAkB;AAG5B,MAAI,QAAQ,OAAQ,QAAO;AAC3B,MAAI,QAAQ,QAAS,QAAO;AAC5B,MAAI,CAAC,MAAM,OAAO,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,GAAI,QAAO,OAAO,IAAI;AAEhE,MACG,IAAI,WAAW,IAAI,IAAI,IAAI,SAAS,IAAI,IACxC,IAAI,WAAW,IAAI,IAAI,IAAI,SAAS,IAAI,CAEzC,KAAI;AACF,UAAO,KAAK,MAAM,IAAI;UAChB;AACN,UAAO;;AAIX,SAAO;;CAGT,aAAa,KAAqB;AAChC,SAAO,IAAI,QAAQ,cAAc,GAAG,OAAO,GAAG,aAAa,CAAC;;CAG9D,eAAe,KAAqB;AAClC,SAAO,IAAI,OAAO,EAAE,CAAC,aAAa,GAAG,IAAI,MAAM,EAAE;;;;;;AC9HrD,MAAM,iBACJ,SACA,YAC4B;AAC5B,QAAO,IAAI,cAAc,SAAS,QAAQ,CAAC,OAAO;;AAGpD,kBAAe"}