UNPKG

dataset-config

Version:

Parse HTML data attributes into a structured object with automatic type conversion.

1 lines 8.15 kB
{"version":3,"file":"index.mjs","sources":["../../src/DatasetParser.js","../../src/index.js"],"sourcesContent":["// 默认参数\nconst DEFAULT = {\n // 数据属性名称前缀,用于筛选指定前缀的属性\n prefix: \"\",\n // 是否将函数名解析为实际的函数引用\n parseFunction: true,\n // 排除的属性名称集合\n excludeKeys: [],\n}\n\n// 数据集解析器类\nclass DatasetParser {\n // 传入的元素对象\n #element\n // 用户配置选项\n #options\n // 排除的属性名称集合(驼峰格式)\n #excludeSet\n\n /**\n * 构造函数\n * @param {HTMLElement} element - 要解析的元素\n * @param {Object} options - 配置选项\n */\n constructor(element, options = {}) {\n this.#element = element\n\n // 合并默认选项和用户选项\n this.#options = {\n ...DEFAULT,\n ...options,\n }\n // 将排除的属性名称转换为驼峰格式并存储为 Set\n this.#excludeSet = new Set(this.#options.excludeKeys.map(this.#toCamelCase))\n }\n\n /**\n * 解析 data-* 属性为对象\n * @returns {Object} 解析后的数据对象\n */\n parse() {\n const data = {}\n const prefixLength = this.#options.prefix.length\n\n for (const key in this.#element.dataset) {\n if (this.#options.prefix) {\n // 如果设置了前缀且属性名称不匹配,则跳过\n if (!key.startsWith(this.#options.prefix)) continue\n\n // 去除前缀后的属性名称,并转换为小驼峰格式\n const realKey = this.#pascalToCamel(key.slice(prefixLength))\n\n // 取基础名称(用于排除检查)\n const baseKey = realKey.split(\".\")[0]\n\n if (this.#excludeSet.has(baseKey)) continue\n\n // 深度设置属性值\n this.#setDeepProperty(\n data,\n realKey,\n this.#parseValue(this.#element.dataset[key]),\n )\n } else {\n // 没有前缀\n const camelKey = this.#toCamelCase(key)\n const baseKey = camelKey.split(\".\")[0]\n\n if (this.#excludeSet.has(baseKey)) continue\n\n this.#setDeepProperty(\n data,\n key,\n this.#parseValue(this.#element.dataset[key]),\n )\n }\n }\n\n return data\n }\n\n /**\n * 深度设置对象属性\n * @param {Object} obj - 目标对象\n * @param {string} keyPath - 属性路径(以点分隔)\n * @param {*} value - 要设置的值\n */\n #setDeepProperty(obj, keyPath, value) {\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]\n }\n }\n }\n\n /**\n * 解析数据值,将字符串转换为实际类型\n * @param {string} val - 要解析的值\n * @returns {*} 解析后的值\n */\n #parseValue(val) {\n if (this.#options.parseFunction && typeof window[val] === \"function\") {\n return window[val]\n }\n if (val === \"true\") return true\n if (val === \"false\") return false\n if (!isNaN(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 (e) {\n return val\n }\n }\n\n return val\n }\n\n /**\n * 将连字符格式转换为驼峰格式\n * @param {string} str - 要转换的字符串\n * @returns {string} 转换后的驼峰格式字符串\n */\n #toCamelCase(str) {\n return str.replace(/-([a-z])/g, (_, p1) => p1.toUpperCase())\n }\n\n /**\n * 将 PascalCase 转换为 camelCase\n * @param {string} str - 要转换的 PascalCase 字符串\n * @returns {string} 转换后的 camelCase 字符串\n */\n #pascalToCamel(str) {\n return str.charAt(0).toLowerCase() + str.slice(1)\n }\n}\n\nexport default DatasetParser\n","import DatasetParser from \"./DatasetParser\"\n\nconst datasetConfig = (elment, options) => {\n return new DatasetParser(elment, options).parse()\n}\n\nexport default datasetConfig\n"],"names":["DEFAULT","prefix","parseFunction","excludeKeys","DatasetParser","constructor","element","options","Set","map","parse","data","prefixLength","length","key","dataset","startsWith","realKey","slice","baseKey","split","has","camelKey","#setDeepProperty","obj","keyPath","value","keys","temp","index","entries","#parseValue","val","window","isNaN","trim","Number","endsWith","JSON","e","#toCamelCase","str","replace","_","p1","toUpperCase","#pascalToCamel","charAt","toLowerCase","datasetConfig","elment"],"mappings":"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"}