{"version":3,"file":"serializer.mjs","names":[],"sources":["../../../src/utils/transformers/serializer.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { types } from './types.js';\nimport { piped, identity, evolve, map } from 'remeda';\n\nexport function prepareSerializer<T>(schema: any): (input: T) => T {\n  const transformer = prepareTransformer(schema);\n  return piped(\n    reorderKeys(schema),\n    transformer ? evolve(transformer) : identity,\n    // (obj) => {\n    //   console.log(JSON.stringify(obj, null, 2));\n    //   return obj;\n    // },\n  ) as any as (input: T) => T;\n}\n\nfunction reduceXSDType(str: string): string {\n  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n  return str.split('|')[0]!;\n}\n\ninterface Schema {\n  [k: string]: string | Schema;\n}\n\ninterface Transformer {\n  // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n  [k: string]: (input: any) => any | Transformer;\n}\n\nfunction prepareTransformer(schema: Schema): null | Transformer {\n  return Object.keys(schema).reduce((prev: null | Transformer, curr) => {\n    let key = curr;\n    let isArray = false;\n\n    /**\n     * If the current key marks an array, we need to map over the values instead of just trying\n     * to transform the value.\n     *\n     * We also need to assign the correct key to the transformer.\n     */\n    if (curr.endsWith('[]')) {\n      key = curr.slice(0, -2);\n      isArray = true;\n    }\n\n    if (typeof schema[curr] === 'string') {\n      const type = reduceXSDType(schema[curr]);\n\n      if ((types as any)[type]?.input) {\n        const transformer = (types as any)[type].input;\n        return { ...prev, [key]: isArray ? map(transformer) : transformer };\n      }\n    } else if (typeof schema[curr] === 'object') {\n      const subItem = prepareTransformer(schema[curr]);\n      if (subItem) {\n        return {\n          ...prev,\n          [key]: isArray ? map(evolve(subItem)) : subItem,\n        };\n      }\n    }\n\n    return prev;\n  }, null);\n}\n\nexport function reorderKeys<O extends { [key: string]: any }>(\n  schema: Schema,\n): (obj: O) => O {\n  return (obj: O): O => {\n    // console.log(JSON.stringify(schema, null, 2));\n    // console.log(JSON.stringify(obj, null, 2));\n\n    // Loop through schema, pull property from Object\n    return Object.keys(schema).reduce<any>((prev, curr) => {\n      const lookupKey: string = curr.replace(/\\[\\]$/, '');\n      const isArrayExpected: boolean = curr.endsWith('[]');\n\n      if (!(lookupKey in obj)) {\n        return prev;\n      }\n\n      const currSchema = schema[curr];\n\n      if (typeof currSchema === 'string') {\n        prev[lookupKey] = obj[lookupKey];\n        return prev;\n      }\n\n      if (typeof currSchema === 'object') {\n        if (\n          Object.keys(currSchema).filter(\n            (k) => k !== 'targetNSAlias' && k !== 'targetNamespace',\n          ).length\n        ) {\n          prev[lookupKey] =\n            isArrayExpected && obj[lookupKey] && Array.isArray(obj[lookupKey])\n              ? obj[lookupKey].map(reorderKeys(currSchema))\n              : reorderKeys(currSchema)(obj[lookupKey]);\n          return prev;\n        }\n\n        prev[lookupKey] = obj[lookupKey];\n        return prev;\n      }\n\n      return prev;\n    }, {});\n  };\n}\n"],"mappings":";;;AAQA,SAAgB,kBAAqB,QAA8B;CACjE,MAAM,cAAc,mBAAmB,OAAO;AAC9C,QAAO,MACL,YAAY,OAAO,EACnB,cAAc,OAAO,YAAY,GAAG,SAKrC;;AAGH,SAAS,cAAc,KAAqB;AAE1C,QAAO,IAAI,MAAM,IAAI,CAAC;;AAYxB,SAAS,mBAAmB,QAAoC;AAC9D,QAAO,OAAO,KAAK,OAAO,CAAC,QAAQ,MAA0B,SAAS;EACpE,IAAI,MAAM;EACV,IAAI,UAAU;;;;;;;AAQd,MAAI,KAAK,SAAS,KAAK,EAAE;AACvB,SAAM,KAAK,MAAM,GAAG,GAAG;AACvB,aAAU;;AAGZ,MAAI,OAAO,OAAO,UAAU,UAAU;GACpC,MAAM,OAAO,cAAc,OAAO,MAAM;AAExC,OAAK,MAAc,OAAO,OAAO;IAC/B,MAAM,cAAe,MAAc,MAAM;AACzC,WAAO;KAAE,GAAG;MAAO,MAAM,UAAU,IAAI,YAAY,GAAG;KAAa;;aAE5D,OAAO,OAAO,UAAU,UAAU;GAC3C,MAAM,UAAU,mBAAmB,OAAO,MAAM;AAChD,OAAI,QACF,QAAO;IACL,GAAG;KACF,MAAM,UAAU,IAAI,OAAO,QAAQ,CAAC,GAAG;IACzC;;AAIL,SAAO;IACN,KAAK;;AAGV,SAAgB,YACd,QACe;AACf,SAAQ,QAAc;AAKpB,SAAO,OAAO,KAAK,OAAO,CAAC,QAAa,MAAM,SAAS;GACrD,MAAM,YAAoB,KAAK,QAAQ,SAAS,GAAG;GACnD,MAAM,kBAA2B,KAAK,SAAS,KAAK;AAEpD,OAAI,EAAE,aAAa,KACjB,QAAO;GAGT,MAAM,aAAa,OAAO;AAE1B,OAAI,OAAO,eAAe,UAAU;AAClC,SAAK,aAAa,IAAI;AACtB,WAAO;;AAGT,OAAI,OAAO,eAAe,UAAU;AAClC,QACE,OAAO,KAAK,WAAW,CAAC,QACrB,MAAM,MAAM,mBAAmB,MAAM,kBACvC,CAAC,QACF;AACA,UAAK,aACH,mBAAmB,IAAI,cAAc,MAAM,QAAQ,IAAI,WAAW,GAC9D,IAAI,WAAW,IAAI,YAAY,WAAW,CAAC,GAC3C,YAAY,WAAW,CAAC,IAAI,WAAW;AAC7C,YAAO;;AAGT,SAAK,aAAa,IAAI;AACtB,WAAO;;AAGT,UAAO;KACN,EAAE,CAAC"}