UNPKG

map-transform-cjs

Version:
1 lines 3.93 kB
{"version":3,"sources":["../../src/transformers/map.ts","../../src/utils/escape.ts"],"sourcesContent":["import mapAny from 'map-any-cjs'\nimport { escapeValue, unescapeValue } from '../utils/escape.js'\nimport type {\n Dictionary,\n DictionaryValue,\n Dictionaries,\n TransformerProps,\n Transformer,\n} from '../types.js'\n\nexport interface Props extends TransformerProps {\n dictionary?: Dictionary | string\n}\n\nconst isSupportedValue = (data: unknown): data is DictionaryValue =>\n ['string', 'number', 'boolean'].includes(typeof data) ||\n data === null ||\n data === undefined\n\nfunction findFirstMatch(\n value: DictionaryValue,\n dictionary: Dictionary,\n direction: 0 | 1\n) {\n // eslint-disable-next-line security/detect-object-injection\n const match = dictionary.find((dict) => dict[direction] === value)\n return match ? match[1 - direction] : undefined\n}\n\nfunction translate(data: unknown, dictionary: Dictionary, rev: boolean) {\n const direction = Number(rev) as 0 | 1\n return mapAny((data: unknown) => {\n const value = isSupportedValue(data) ? data : undefined\n const match = findFirstMatch(value, dictionary, direction)\n if (match === undefined || match === '*') {\n const starMatch = findFirstMatch('*', dictionary, direction)\n return starMatch === undefined ? match : starMatch\n }\n return match\n }, data)\n}\n\nfunction extractDictionary(\n dictionary?: Dictionary | string,\n dictionaries?: Dictionaries\n) {\n if (typeof dictionary === 'string') {\n return dictionaries && dictionaries[dictionary] // eslint-disable-line security/detect-object-injection\n } else {\n return dictionary\n }\n}\n\nconst escapeDictionary = (dictionary?: Dictionary): Dictionary | undefined =>\n dictionary\n ? dictionary.map(([from, to]) => [escapeValue(from), escapeValue(to)])\n : undefined\n\nconst transformer: Transformer<Props> = function map(props) {\n return (options) => {\n const dictionary = escapeDictionary(\n extractDictionary(props.dictionary, options && options.dictionaries)\n )\n if (!dictionary) {\n return () => undefined\n }\n return (data, state) => {\n const { rev = false } = state\n const match = translate(escapeValue(data), dictionary, rev)\n return match === '*' ? data : unescapeValue(match)\n }\n }\n}\n\nexport default transformer\n","export const escapeValue = <T = unknown>(value: T | string) =>\n value === undefined ? '**undefined**' : value\n\nexport const unescapeValue = <T = unknown>(value: T | undefined) =>\n value === '**undefined**' ? undefined : value\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAmB;;;ACAZ,IAAM,cAAc,CAAc,UACvC,UAAU,SAAY,kBAAkB;AAEnC,IAAM,gBAAgB,CAAc,UACzC,UAAU,kBAAkB,SAAY;;;ADU1C,IAAM,mBAAmB,CAAC,SACxB,CAAC,UAAU,UAAU,SAAS,EAAE,SAAS,OAAO,IAAI,KACpD,SAAS,QACT,SAAS;AAEX,SAAS,eACP,OACA,YACA,WACA;AAEA,QAAM,QAAQ,WAAW,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM,KAAK;AACjE,SAAO,QAAQ,MAAM,IAAI,SAAS,IAAI;AACxC;AAEA,SAAS,UAAU,MAAe,YAAwB,KAAc;AACtE,QAAM,YAAY,OAAO,GAAG;AAC5B,aAAO,mBAAAA,SAAO,CAACC,UAAkB;AAC/B,UAAM,QAAQ,iBAAiBA,KAAI,IAAIA,QAAO;AAC9C,UAAM,QAAQ,eAAe,OAAO,YAAY,SAAS;AACzD,QAAI,UAAU,UAAa,UAAU,KAAK;AACxC,YAAM,YAAY,eAAe,KAAK,YAAY,SAAS;AAC3D,aAAO,cAAc,SAAY,QAAQ;AAAA,IAC3C;AACA,WAAO;AAAA,EACT,GAAG,IAAI;AACT;AAEA,SAAS,kBACP,YACA,cACA;AACA,MAAI,OAAO,eAAe,UAAU;AAClC,WAAO,gBAAgB,aAAa,UAAU;AAAA,EAChD,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEA,IAAM,mBAAmB,CAAC,eACxB,aACI,WAAW,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,GAAG,YAAY,EAAE,CAAC,CAAC,IACnE;AAEN,IAAM,cAAkC,SAAS,IAAI,OAAO;AAC1D,SAAO,CAAC,YAAY;AAClB,UAAM,aAAa;AAAA,MACjB,kBAAkB,MAAM,YAAY,WAAW,QAAQ,YAAY;AAAA,IACrE;AACA,QAAI,CAAC,YAAY;AACf,aAAO,MAAM;AAAA,IACf;AACA,WAAO,CAAC,MAAM,UAAU;AACtB,YAAM,EAAE,MAAM,MAAM,IAAI;AACxB,YAAM,QAAQ,UAAU,YAAY,IAAI,GAAG,YAAY,GAAG;AAC1D,aAAO,UAAU,MAAM,OAAO,cAAc,KAAK;AAAA,IACnD;AAAA,EACF;AACF;AAEA,IAAO,cAAQ;","names":["mapAny","data"]}