UNPKG

string-converters

Version:

A utility library for converting data types and working with arrays. Provides converters for boolean, number, and string values, along with array conversion functions and support for values with predefined options.

1 lines 2.47 kB
{"version":3,"sources":["../src/createOneOfConverter/index.ts"],"names":[],"mappings":";AAYA,IAAM,WAAW,CAAC,OAAY,QAC5B,IAAI,MAAM,GAAG,0BAA0B,IAAI,KAAK,IAAI,IAAI;AAU1D,IAAM,uBAAuB,CAC3B,kBACA,mBAC0B;AAC1B,QAAM,MAAoB,MAAM,QAAQ,cAAc,IAClD,iBACA,OAAO,OAAO,cAAc;AAEhC,QAAM,cAAc,oBAAI,IAAY;AAEpC,WAAS,IAAI,IAAI,QAAQ,OAAO;AAC9B,gBAAY,IAAI,iBAAiB,UAAU,IAAI,CAAC,CAAQ,CAAE;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL,MAAM,OAAO;AACX,UAAI,YAAY,IAAI,KAAK,GAAG;AAC1B,eAAO,iBAAiB,MAAM,KAAK;AAAA,MACrC;AAEA,YAAM,SAAS,OAAO,GAAG;AAAA,IAC3B;AAAA,IACA,UAAU,OAAO;AACf,YAAM,kBAAkB,iBAAiB;AAAA,QACvC;AAAA,MACF;AAEA,UAAI,YAAY,IAAI,eAAgB,GAAG;AACrC,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,OAAO,GAAG;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,IAAO,+BAAQ","sourcesContent":["import { Converter } from \"../types\";\n\ntype AnyArray<T> = Array<T> | ReadonlyArray<T>;\n\ntype ValueOf<T> = T extends AnyArray<infer K>\n ? K\n : T extends {}\n ? T[keyof T]\n : never;\n\ntype Generalize<T> = T extends string ? string : T extends number ? number : T;\n\nconst getError = (value: any, arr: any[]) =>\n new Error(`${value} is not found in [${arr.join(\", \")}]`);\n\n/**\n * Creates a converter for values that should be one of the specified options.\n *\n * @template T - The type of the possible values.\n * @param {Converter<Generalize<ValueOf<T>>>} generalConverter - The converter for the generalized value type.\n * @param {T} possibleValues - The possible values that the input should match.\n * @returns {Converter<ValueOf<T>>} The converter for the specified options.\n */\nconst createOneOfConverter = <const T extends {} | []>(\n generalConverter: Converter<Generalize<ValueOf<T>>>,\n possibleValues: T\n): Converter<ValueOf<T>> => {\n const arr: ValueOf<T>[] = Array.isArray(possibleValues)\n ? possibleValues\n : Object.values(possibleValues);\n\n const possibleSet = new Set<string>();\n\n for (let i = arr.length; i--; ) {\n possibleSet.add(generalConverter.stringify(arr[i] as any)!);\n }\n\n return {\n parse(value) {\n if (possibleSet.has(value)) {\n return generalConverter.parse(value) as ValueOf<T>;\n }\n\n throw getError(value, arr);\n },\n stringify(value) {\n const serializedValue = generalConverter.stringify(\n value as Generalize<ValueOf<T>>\n );\n\n if (possibleSet.has(serializedValue!)) {\n return serializedValue;\n }\n\n throw getError(value, arr);\n },\n };\n};\n\nexport default createOneOfConverter;\n"]}