{"version":3,"sources":["../src/collection/namedDict.ts"],"names":["getNamedItemName","item","defaultItem","opts","name","getByPath","isNothing","normalizeNamedItem","finalItem","isPlainObject","deepMerge","NamedDict","items","options","assignObject","defaultItemValue","results","itemName","defaultNums","keys"],"mappings":";;;;AASA,SAASA,CAAiBC,CAAAA,CAAAA,CAAO,EAAC,CAAGC,CAAmB,CAAA,EAAIC,CAAAA,CAAAA,CAAkC,CAC1F,IAAIC,CACA,CAAA,OAAOD,EAAK,OAAW,EAAA,UAAA,CAAaA,CAAK,CAAA,OAAA,CAAQF,CAAI,CAAA,CAAII,GAAUJ,CAAAA,CAAAA,CAAME,CAAK,CAAA,OAAO,CAEzF,CAAA,OAAIG,GAAUF,CAAAA,CAAI,CAAKD,EAAAA,CAAAA,CAAK,SAAWA,CAAK,CAAA,OAAA,IAAWF,CACnDG,GAAAA,CAAAA,CAAOC,GAAUA,CAAAA,GAAAA,CAAUJ,CAAME,CAAAA,CAAAA,CAAK,OAAO,CAAA,CAAG,MAAQ,CAAA,CACpD,YAAc,CAAA,CAAA,EAAG,IAAK,CAAA,GAAA,EAAK,CAAG,EAAA,IAAA,CAAK,MAAO,EAAA,CAAI,GAAI,CAAA,CACtD,CAAC,CAAA,CAAA,CAEEC,CACX,CAEA,SAASG,CAAmBN,CAAAA,CAAAA,CAAWC,CAAkBC,CAAAA,CAAAA,CAAkC,CACvF,IAAIK,EAAiC,MAAO,CAAA,MAAA,CAAO,EAAC,CAAGN,CAAe,EAAA,EAAE,CAAA,CACxE,OAAIO,GAAAA,CAAcR,CAAI,CAAA,CAClBO,CAAYE,CAAAA,GAAAA,CAAUF,CAAWP,CAAAA,CAAI,EAGhCK,GAAUH,CAAAA,CAAAA,CAAK,OAAO,CAAA,GACvBK,CAAUL,CAAAA,CAAAA,CAAK,OAAO,CAAA,CAAIF,CAG3BO,CAAAA,CAAAA,CACX,CAmCO,SAASG,CACZC,CAAAA,CAAAA,CACAV,CACAW,CAAAA,GAAAA,CACiB,CACjB,IAAMV,CAAAA,CAAOW,CACT,CAAA,CACI,QAAU,CAAA,CAAC,OAAO,CAAA,CAClB,OAAS,CAAA,MAAA,CACT,kBAAoB,CAAA,IAAA,CACpB,OAAS,CAAA,OAAA,CACT,SAAW,CAAA,IACf,EACAD,GACJ,CAAA,CAEA,GAAIP,GAAAA,CAAUM,CAAK,CAAA,CAAG,OAAO,GAC7B,IAAIG,CAAAA,CAAmB,OAAOb,CAAAA,EAAgB,UAAaA,CAAAA,CAAAA,EAAgBA,CAAAA,CAAAA,CACtEO,IAAcM,CAAgB,CAAA,GAAGA,CAAmB,CAAA,EAEzD,CAAA,CAAA,IAAMC,CAA6B,CAAA,EACnC,CAAA,GAAI,KAAM,CAAA,OAAA,CAAQJ,CAAK,CAAA,CACnB,IAASX,IAAAA,CAAAA,IAAQW,EAAO,CACpB,IAAIG,CAAmBb,CAAAA,CAAAA,CACnB,OAAOA,CAAAA,EAAgB,UACvBa,GAAAA,CAAAA,CAAmBb,CAAYD,CAAAA,CAAI,CAEvC,CAAA,CAAA,IAAIO,CAAYD,CAAAA,CAAAA,CAAmBN,CAAMc,CAAAA,CAAAA,CAAkBZ,CAAI,CAEzDc,CAAAA,CAAAA,CAAWjB,CAAiBQ,CAAAA,CAAAA,CAAWO,CAAkBZ,CAAAA,CAAI,CAG/DG,CAAAA,GAAAA,CAAUE,CAAU,CAAA,IAAI,CACxBA,GAAAA,CAAAA,CAAU,IAAOS,CAAAA,CAAAA,CAAAA,CAGjB,OAAOd,CAAAA,CAAK,WAAc,UAAYK,GAAAA,CAAAA,CAAYL,CAAK,CAAA,SAAA,CAAUK,CAAS,CAAA,CAAA,CAC5EQ,CAAgBC,CAAAA,CAAQ,EAAIT,EAClC,CAAA,KAGS,IAAA,GAAA,CAACJ,CAAMH,CAAAA,CAAI,CAAK,GAAA,MAAA,CAAO,QAAQW,CAAK,CAAA,CAAG,CAC5C,IAAMJ,CAAYD,CAAAA,CAAAA,CAAmBN,CAAMc,CAAAA,CAAAA,CAAkBZ,CAAI,CAAA,CAC7DA,CAAK,CAAA,OAAA,GAAY,MAAUG,EAAAA,GAAAA,CAAUE,CAAU,CAAA,IAAI,IACnDA,CAAU,CAAA,IAAA,CAAOJ,CAGjB,CAAA,CAAA,OAAOD,CAAK,CAAA,SAAA,EAAc,UAAYA,EAAAA,CAAAA,CAAK,UAAUK,CAAS,CAAA,CAChEQ,CAAgBZ,CAAAA,CAAI,CAAII,CAAAA,EAC9B,CAGJ,GACI,OAAO,MAAOQ,CAAAA,CAAO,CAAE,CAAA,MAAA,CACnB,CAACE,CAAAA,CAAajB,CAAWA,GAAAA,CAAAA,CAAa,OAAY,GAAA,IAAA,CAAOiB,CAAc,CAAA,CAAA,CAAIA,CAC3E,CAAA,CACJ,CAAM,GAAA,CAAA,CACR,CACE,IAAMC,CAAAA,CAAO,MAAO,CAAA,IAAA,CAAKH,CAAO,CAAA,CAC5BG,CAAK,CAAA,MAAA,CAAS,IAAIH,CAAQG,CAAAA,CAAAA,CAAK,CAAC,CAAC,CAAU,CAAA,OAAA,CAAU,IAC7D,EAAA,CAEA,OAAOH,CACX","file":"chunk-LSSNSR33.mjs","sourcesContent":["import { isNothing } from '../typecheck/isNothing'\nimport { isPlainObject } from '../typecheck/isPlainObject'\nimport { getByPath } from '../object/getByPath'\nimport { deepMerge } from '../object/deepMerge'\nimport { assignObject } from '../object'\n/**\n * 从item中提取名称值，确保一定会有一个name,如果没有名称，则会自动生成一个随机名称\n *\n */\nfunction getNamedItemName(item = {}, defaultItem: any = {}, opts: Required<NamedDictOptions>) {\n    let name =\n        typeof opts.nameKey == 'function' ? opts.nameKey(item) : getByPath(item, opts.nameKey)\n    // 如果没有找到，且默认从default指定的字段提取\n    if (isNothing(name) && opts.default && opts.default in item) {\n        name = getByPath(getByPath(item, opts.default), 'name', {\n            defaultValue: `${Date.now()}${Math.random() * 1000}`,\n        })\n    }\n    return name\n}\n\nfunction normalizeNamedItem(item: any, defaultItem: any, opts: Required<NamedDictOptions>) {\n    let finalItem: Record<string, any> = Object.assign({}, defaultItem || {})\n    if (isPlainObject(item)) {\n        finalItem = deepMerge(finalItem, item)\n    } else {\n        // 如果item不是一个{}，则代表启用的缩写模式。当启用缩写模式时，必须指定缩写的是item的哪一个成员\n        if (!isNothing(opts.default)) {\n            finalItem[opts.default] = item\n        }\n    }\n    return finalItem\n}\n\nexport interface NamedDictOptions {\n    requires?: string[] // item项必选字段名称列表\n    // item名称键名,代表名称是从item[nameKey]提取,如果是class:name代表是由item.class字段的name提取，当然，此时item.class必须是一个对象或者是{}才行\n    nameKey?: string | ((value: any) => string)\n    ignoreInvalidItems?: boolean // 忽略无效项，如果=false则会触发错误，否则会直接无视\n    // 正常情况下定义一个命名容器是[{name,...},{name:...},....{}]\n    // 某些情况下允许采用缩写形式，如[AClass,BClass,....],这样存在命名容器没有名称的问题,这种情况下\n    // 可以指定default=\"class\"，代表缩写的是成员的class字段值\n    // 然后再从AClass[nameKey],BClass[nameKey]提取名称\n    default: string // 默认项名称，比如default=“class\"，代表可以不需要输入完整的{}，而只输入class，在这种情况下，名称只能从其中提取\n    normalize: (item: any) => any // 提供一个函数normalize(item)用来对成员项进行规范化处理\n}\n\n/**\n *  封装一个具备名称的数据容器，\n *  该数据容器具有以下特点：\n *  1. 容器的数据项均具有一个唯一的名称，一般是具有一个name的字段\n *  2. 数据项里面有些字段是必须的，不能为空：即不能是null,undefined\n *  3. 支持两种构造方法，即NamedDict([{name,...},{name,...}...])和NamedDict({name:{...},name:{...}})\n *  4. 支持为每一项指定默认值\n *  5. 当校验数据项无效时，可以指定是忽略或者返回错误\n *\n *  如:\n *      以下class是必须的不能为空必选的项\n *    items = NamedDict([{name,class,...},{name,class,...},...],{requires:[\"class\"]})\n *    返回的items：\n\n *\n * @param items                 支持数组或者{}\n * @param defaultItem           默认项，可以是{} 也可以是一个返回{}的函数\n * @param options\n * @constructor\n */\nexport function NamedDict<T>(\n    items: any[],\n    defaultItem?: T,\n    options?: NamedDictOptions,\n): Record<string, T> {\n    const opts = assignObject(\n        {\n            requires: ['class'], // item项必选字段名称列表\n            nameKey: 'name', // item名称键名,代表名称是从item[nameKey]提取,如果是class:name代表是由item.class字段的name提取，当然，此时item.class必须是一个对象或者是{}才行\n            ignoreInvalidItems: true, // 忽略无效项，如果=false则会触发错误，否则会直接无视\n            default: 'class', // 默认项名称，比如default=“class\"，代表可以不需要输入完整的{}，而只输入class，在这种情况下，名称只能从其中提取\n            normalize: null, // 提供一个函数normalize(item)用来对成员项进行规范化处理\n        },\n        options,\n    ) as Required<NamedDictOptions>\n\n    if (isNothing(items)) return {}\n    let defaultItemValue = typeof defaultItem === 'function' ? defaultItem() : defaultItem\n    if (!isPlainObject(defaultItemValue)) defaultItemValue = {} // 如果函数返回了无效值，则需要设置为{}以免后续合并时出错\n\n    const results: Record<string, T> = {}\n    if (Array.isArray(items)) {\n        for (let item of items) {\n            let defaultItemValue = defaultItem\n            if (typeof defaultItem === 'function') {\n                defaultItemValue = defaultItem(item)\n            }\n            let finalItem = normalizeNamedItem(item, defaultItemValue, opts)\n            // 获取成员名称\n            const itemName = getNamedItemName(finalItem, defaultItemValue, opts)\n            //finalItem.name = itemName\n            // 如果名称不是从name字段读取的opts.nameKey!==\"name\" &&\n            if (isNothing(finalItem.name)) {\n                finalItem.name = itemName\n            }\n            // 对成员进行规范化处理\n            if (typeof opts.normalize === 'function') finalItem = opts.normalize(finalItem)\n            ;(results as any)[itemName] = finalItem\n        }\n    } else {\n        // 如果输入已经是一个字典，则其key就是名称\n        for (let [name, item] of Object.entries(items)) {\n            const finalItem = normalizeNamedItem(item, defaultItemValue, opts)\n            if (opts.nameKey !== 'name' && isNothing(finalItem.name)) {\n                finalItem.name = name\n            }\n            // 对成员进行规范化处理\n            if (typeof opts.normalize === 'function') opts.normalize(finalItem)\n            ;(results as any)[name] = finalItem\n        }\n    }\n    // 保证至少一项的default=true,至少有一个默认项\n    if (\n        Object.values(results).reduce(\n            (defaultNums, item) => ((item as any).default === true ? defaultNums + 1 : defaultNums),\n            0,\n        ) === 0\n    ) {\n        const keys = Object.keys(results)\n        if (keys.length > 0) (results[keys[0]] as any).default = true\n    }\n\n    return results\n}\n"]}