@bemedev/decompose
Version:
Decompose object and so more
1 lines • 3.56 kB
Source Map (JSON)
{"version":3,"file":"recompose.cjs","names":[],"sources":["../src/recompose.ts"],"sourcesContent":["import { merge } from 'ts-deepmerge';\nimport { SEPARATOR } from './constants/strings';\nimport type { Recompose, Ru } from './types.types';\n\nexport function recomposeObjectUrl<T>(shape: string, value: T) {\n const obj: Ru = {};\n if (shape.length <= 0) return obj;\n\n const keys = shape.split(SEPARATOR);\n if (keys.length === 1) {\n const key = keys.shift();\n obj[key!] = value;\n } else {\n const key = keys.shift();\n obj[key!] = recomposeObjectUrl(keys.join(SEPARATOR), value);\n }\n\n return obj;\n}\n\n/**\n * Recompose a flatten object \n * @example\n * \n * { 'data.age': 10, 'human.login': 'login' }\n * will become\n * {\n data: {\n age: 10,\n },\n human: {\n login: 'login',\n },\n }\n * @remark \n * The generated typescript type takes too much ressources\n\n * @todo\n Add type to the return\n */\ntype Recompose_F = <const T extends Ru>(shape: T) => Recompose<T>;\ntype _Recompose_F = (shape: any) => any;\ntype _Recompose2_F = <T extends Ru>(shape: T) => Recompose<T>;\n\nexport type Recomposer = _Recompose2_F & {\n strict: Recompose_F;\n low: _Recompose_F;\n};\n\nconst _recompose: _Recompose_F = shape => {\n const entries = Object.entries(shape);\n if (entries.length === 0) return {};\n const arr: any[] = [];\n entries.forEach(([key, value]) => {\n arr.push(recomposeObjectUrl(key, value));\n });\n return _recompose2(merge(...arr));\n};\n\nconst _recompose2: _Recompose_F = shape => {\n const mustReturn =\n Array.isArray(shape) || typeof shape !== 'object' || shape === null;\n if (mustReturn) return shape;\n\n const entries = Object.entries(shape).sort(([a], [b]) =>\n a.localeCompare(b),\n );\n\n const isEmpty = entries.length === 0;\n if (isEmpty) return {};\n\n const isArray = entries.every(\n ([key]) => key.startsWith('[') && key.endsWith(']'),\n );\n if (isArray) {\n const arr: any[] = [];\n entries.forEach(([key, value]) => {\n const index = parseInt(key.slice(1, -1), 10);\n arr[index] = _recompose2(value);\n });\n return arr;\n }\n\n return entries.reduce((acc, [key, value]) => {\n acc[key] = _recompose2(value);\n return acc;\n }, {} as any);\n};\n\nexport const recompose: Recomposer = shape => _recompose(shape);\nrecompose.low = _recompose;\nrecompose.strict = _recompose;\n"],"mappings":";;;;AAIA,SAAgB,mBAAsB,OAAe,OAAU;CAC7D,MAAM,MAAU,EAAE;AAClB,KAAI,MAAM,UAAU,EAAG,QAAO;CAE9B,MAAM,OAAO,MAAM,MAAA,IAAgB;AACnC,KAAI,KAAK,WAAW,GAAG;EACrB,MAAM,MAAM,KAAK,OAAO;AACxB,MAAI,OAAQ;QACP;EACL,MAAM,MAAM,KAAK,OAAO;AACxB,MAAI,OAAQ,mBAAmB,KAAK,KAAA,IAAe,EAAE,MAAM;;AAG7D,QAAO;;AAgCT,MAAM,cAA2B,UAAS;CACxC,MAAM,UAAU,OAAO,QAAQ,MAAM;AACrC,KAAI,QAAQ,WAAW,EAAG,QAAO,EAAE;CACnC,MAAM,MAAa,EAAE;AACrB,SAAQ,SAAS,CAAC,KAAK,WAAW;AAChC,MAAI,KAAK,mBAAmB,KAAK,MAAM,CAAC;GACxC;AACF,QAAO,aAAA,GAAA,aAAA,OAAkB,GAAG,IAAI,CAAC;;AAGnC,MAAM,eAA4B,UAAS;AAGzC,KADE,MAAM,QAAQ,MAAM,IAAI,OAAO,UAAU,YAAY,UAAU,KACjD,QAAO;CAEvB,MAAM,UAAU,OAAO,QAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAChD,EAAE,cAAc,EAAE,CACnB;AAGD,KADgB,QAAQ,WAAW,EACtB,QAAO,EAAE;AAKtB,KAHgB,QAAQ,OACrB,CAAC,SAAS,IAAI,WAAW,IAAI,IAAI,IAAI,SAAS,IAAI,CACpD,EACY;EACX,MAAM,MAAa,EAAE;AACrB,UAAQ,SAAS,CAAC,KAAK,WAAW;GAChC,MAAM,QAAQ,SAAS,IAAI,MAAM,GAAG,GAAG,EAAE,GAAG;AAC5C,OAAI,SAAS,YAAY,MAAM;IAC/B;AACF,SAAO;;AAGT,QAAO,QAAQ,QAAQ,KAAK,CAAC,KAAK,WAAW;AAC3C,MAAI,OAAO,YAAY,MAAM;AAC7B,SAAO;IACN,EAAE,CAAQ;;AAGf,MAAa,aAAwB,UAAS,WAAW,MAAM;AAC/D,UAAU,MAAM;AAChB,UAAU,SAAS"}