{"version":3,"file":"index.umd.production.min.cjs","sources":["../src/index.ts"],"sourcesContent":["import { array_unique_indexOf } from '@lazy-array/util-unique';\nimport { ITSArrayListMaybeReadonly } from 'ts-type/lib/type/base';\n\n/**\n * 對物件的鍵進行排序並返回新物件\n * Sort object keys and return a new object\n *\n * 應用情境：\n * - 確保物件鍵順序一致，便於測試和比對\n * - 自訂鍵的排列順序\n * - 產生穩定的物件結構用於序列化\n * - Ensure consistent object key order for testing and comparison\n * - Custom key ordering\n * - Generate stable object structure for serialization\n *\n * @param object - 要排序的物件 / Object to sort\n * @param sortWith - 排序方式：自訂函式、鍵陣列或選項物件 / Sort method: custom function, key array, or options object\n * @returns 排序後的新物件 / Sorted new object\n *\n * @example\n * // 基本排序\n * sortObjectKeys({ c: 1, b: 2, a: 3 }); // => { a: 3, b: 2, c: 1 }\n *\n * // 自訂鍵順序\n * sortObjectKeys({ c: 1, b: 2, a: 3 }, ['b', 'a', 'c']); // => { b: 2, a: 3, c: 1 }\n *\n * // 自訂排序函式\n * sortObjectKeys({ key2: 1, key10: 1, key1: 1 }, (a, b) => {\n *   return a.localeCompare(b, undefined, { numeric: true });\n * }); // => { key1: 1, key2: 1, key10: 1 }\n */\nexport function sortObjectKeys<T extends Record<any, any>>(object: T, sortFn: IOptions<T>[\"sort\"]): T\nexport function sortObjectKeys<T extends Record<any, any>>(object: T, keyOrders: IOptions<T>[\"keys\"]): T\nexport function sortObjectKeys<T extends Record<any, any>>(object: T, options?: Omit<IOptions<T>, 'keys' | 'onlyKeys'> & {\n\tkeys: IOptions<T>[\"keys\"],\n\tonlyKeys: true,\n}): Partial<T>\nexport function sortObjectKeys<T extends Record<any, any>>(object: T, options?: Omit<IOptions<T>, 'useSource'> & {\n\tuseSource: true,\n}): T\nexport function sortObjectKeys<T extends Record<any, any>>(object: T, options?: IOptions<T>): T\nexport function sortObjectKeys<T extends Record<any, any>>(object: T, sortWith: unknown): T | Partial<T>\n{\n\tlet options: IOptions<T> = {};\n\n\tif (typeof sortWith === 'function')\n\t{\n\t\toptions.sort = sortWith as IOptions<T>[\"sort\"];\n\t}\n\telse if (Array.isArray(sortWith))\n\t{\n\t\toptions.keys = sortWith;\n\t}\n\telse\n\t{\n\t\toptions = Object.assign(options, sortWith);\n\t}\n\n\tlet {\n\t\tkeys = [],\n\t\tuseSource,\n\t} = options as {\n\t\tkeys: any[],\n\t\tuseSource: boolean,\n\t};\n\n\tif (Array.isArray(keys))\n\t{\n\t\tkeys = keys.slice();\n\t}\n\n\tif (options.onlyKeys)\n\t{\n\t\tuseSource = false;\n\n\t\tif (typeof keys.length !== 'number' || keys.length === 0)\n\t\t{\n\t\t\tthrow new ReferenceError(`options.key is empty or not exists.`)\n\t\t}\n\t}\n\telse\n\t{\n\t\tkeys = keys\n\t\t\t.concat(Object.keys(object).sort(options.sort))\n\t\t;\n\t}\n\n\tkeys = array_unique_indexOf(keys);\n\n\tif (options.desc)\n\t{\n\t\tkeys = keys.reverse()\n\t}\n\n\tlet ret = keys.reduce(function (total, key)\n\t{\n\t\tif (options.allowNotExists || key in object)\n\t\t{\n\t\t\ttotal[key] = object[key];\n\t\t}\n\n\t\treturn total;\n\t}, {} as Partial<T>);\n\n\tif (useSource)\n\t{\n\t\t(Object.keys(ret) as IOptions<T>[\"keys\"])\n\t\t\t.forEach(function (key)\n\t\t\t{\n\t\t\t\tdelete object[key];\n\t\t\t\tobject[key] = ret[key];\n\t\t\t})\n\t\t;\n\n\t\treturn object;\n\t}\n\n\treturn ret;\n}\n\n/**\n * 排序物件鍵的選項介面\n * Options interface for sorting object keys\n *\n * @property keys - 指定鍵的順序 / Key order\n * @property onlyKeys - 只返回指定的鍵 / Return only specified keys\n * @property sort - 自訂排序函式 / Custom sort function\n * @property desc - 降序排列 / Sort in descending order\n * @property allowNotExists - 允許返回不存在的鍵 / Allow returning non-existent keys\n * @property useSource - 直接修改原物件 / Modify source object directly\n */\nexport interface IOptions<T extends Record<any, any> = Record<any, any> , K extends string = Extract<keyof T, string>>\n{\n\t/**\n\t * key order\n\t */\n\tkeys?: ITSArrayListMaybeReadonly<string | K>,\n\t/**\n\t * return Object only keys\n\t * will disable useSource\n\t */\n\tonlyKeys?: boolean,\n\t/**\n\t * sort callback\n\t *\n\t * @param a\n\t * @param b\n\t * @returns {any}\n\t */\n\tsort?: (a: string | K, b: string | K) => number,\n\t/**\n\t * return reversed Object\n\t */\n\tdesc?: boolean,\n\tallowNotExists?: boolean,\n\t/**\n\t * return source Object\n\t */\n\tuseSource?: boolean,\n}\n\nexport { sortObjectKeys as sortObject }\n\nif (process.env.TSDX_FORMAT !== 'esm')\n{\n\n\tObject.defineProperty(sortObjectKeys, 'sortObjectKeys', { value: sortObjectKeys });\n\tObject.defineProperty(sortObjectKeys, 'sortObject', { value: sortObjectKeys });\n\tObject.defineProperty(sortObjectKeys, 'default', { value: sortObjectKeys });\n\tObject.defineProperty(sortObjectKeys, \"__esModule\", { value: true });\n\n}\n\nexport default sortObjectKeys;\n"],"names":["sortObjectKeys","object","sortWith","options","sort","Array","isArray","keys","Object","assign","useSource","slice","onlyKeys","length","ReferenceError","concat","array_unique_indexOf","desc","reverse","ret","reduce","total","key","allowNotExists","forEach","defineProperty","value"],"mappings":";;;;EAyCgB,SAAAA,eAA2CC,GAAWC;IAErE,IAAIC,IAAuB,CAAA;IAEH,qBAAbD,IAEVC,EAAQC,OAAOF,IAEPG,MAAMC,QAAQJ,KAEtBC,EAAQI,OAAOL,IAIfC,IAAUK,OAAOC,OAAON,GAASD;IAGlC,KAAIK,MACHA,IAAO,IAAEG,WACTA,KACGP;IAUJ,IALIE,MAAMC,QAAQC,OAEjBA,IAAOA,EAAKI,UAGTR,EAAQS;MAIX,IAFAF,KAAY,GAEe,mBAAhBH,EAAKM,UAAuC,MAAhBN,EAAKM,QAE3C,MAAM,IAAIC,eAAe;WAK1BP,IAAOA,EACLQ,OAAOP,OAAOD,KAAKN,GAAQG,KAAKD,EAAQC;IAI3CG,IAAOS,EAAAA,qBAAqBT,IAExBJ,EAAQc,SAEXV,IAAOA,EAAKW;IAGb,IAAIC,IAAMZ,EAAKa,OAAO,SAAUC,GAAOC;MAOtC,QALInB,EAAQoB,kBAAkBD,KAAOrB,OAEpCoB,EAAMC,KAAOrB,EAAOqB,KAGdD;AACP,OAAE,CAAgB;IAEnB,OAAIX,KAEFF,OAAOD,KAAKY,GACXK,QAAQ,SAAUF;aAEXrB,EAAOqB,IACdrB,EAAOqB,KAAOH,EAAIG;AACnB,QAGMrB,KAGDkB;AACR;EAgDCX,OAAOiB,eAAezB,gBAAgB,kBAAkB;IAAE0B,OAAO1B;MACjEQ,OAAOiB,eAAezB,gBAAgB,cAAc;IAAE0B,OAAO1B;MAC7DQ,OAAOiB,eAAezB,gBAAgB,WAAW;IAAE0B,OAAO1B;MAC1DQ,OAAOiB,eAAezB,gBAAgB,cAAc;IAAE0B,QAAO;;;;;"}