@modern-kit/utils
Version:
1 lines • 4.14 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../../src/string/serialize/internal.ts","../../../src/string/serialize/index.ts"],"sourcesContent":["import { isArray } from '../../validator';\n\nexport interface SerializeOptions {\n skipNull?: boolean;\n skipEmptyString?: boolean;\n skipUndefined?: boolean;\n}\n\nexport const isValidValue = <T>(\n value: T,\n {\n skipNull = true,\n skipEmptyString = true,\n skipUndefined = true,\n }: SerializeOptions = {}\n) =>\n !(skipUndefined && value === undefined) &&\n !(skipNull && value === null) &&\n !(skipEmptyString && value === '');\n\nexport const serializeKeyValue = <T>(\n key: string,\n value: T,\n options: SerializeOptions\n) => {\n return isValidValue(value, options) ? `${key}=${value}` : '';\n};\n\nconst serializeArray = <T>(\n key: string,\n arr: T[] | readonly T[],\n options: SerializeOptions\n) => {\n let result = '';\n\n for (const value of arr) {\n const serializedValue = serializeKeyValue(key, value, options);\n if (serializedValue) {\n result += result ? `&${serializedValue}` : serializedValue;\n }\n }\n\n return result;\n};\n\nexport const serializeByType = <T>(\n key: string,\n value: T,\n options: SerializeOptions\n) => {\n if (isArray(value)) {\n return serializeArray(key, value, options);\n }\n return serializeKeyValue(key, value, options);\n};\n","import { type SerializeOptions, serializeByType } from './internal';\n\n/**\n * @description 인자로 들어온 객체를 직렬화합니다.\n *\n * 기본적으로 null, empty string, undefined에 대해서는 제외하나 두번째 인자로 옵션을 넣어 이를 포함시킬 수 있습니다.\n *\n * @template T - 직렬화 할 객체의 유형입니다.\n * @param {T} obj - 직렬화할 객체입니다.\n * @param {SerializeOptions} options - 직렬화 옵션입니다.\n * @returns {string} - 직렬화된 문자열을 반환합니다.\n *\n * @example\n * const value = { str: 'foo', num: 1, a: null, b: '', c: undefined }\n * const option = { skipNull: false, skipEmptyString: false, skipUndefined: false }\n *\n * serialize(value)\n * // 'str=foo&num=1'\n *\n * serialize(value, option)\n * // 'str=foo&num=1&a=null&b=&c=undefined'\n */\n\nexport function serialize<T extends Record<PropertyKey, any>>(\n obj: T,\n options: SerializeOptions = {}\n): string {\n const keys = Object.keys(obj);\n let result = '';\n\n for (const key of keys) {\n const target = obj[key];\n const serializedValue = serializeByType(key, target, options);\n\n if (serializedValue) {\n result += result ? `&${serializedValue}` : serializedValue;\n }\n }\n\n return result;\n}\n"],"names":["isArray"],"mappings":";;;;AAQO,MAAM,YAAA,GAAe,CAC1B,KAAA,EACA;AAAA,EACE,QAAA,GAAW,IAAA;AAAA,EACX,eAAA,GAAkB,IAAA;AAAA,EAClB,aAAA,GAAgB;AAClB,CAAA,GAAsB,EAAC,KAEvB,EAAE,aAAA,IAAiB,KAAA,KAAU,MAAA,CAAA,IAC7B,EAAE,QAAA,IAAY,KAAA,KAAU,IAAA,CAAA,IACxB,EAAE,eAAA,IAAmB,KAAA,KAAU,EAAA,CAAA;AAE1B,MAAM,iBAAA,GAAoB,CAC/B,GAAA,EACA,KAAA,EACA,OAAA,KACG;AACH,EAAA,OAAO,YAAA,CAAa,OAAO,OAAO,CAAA,GAAI,GAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAA;AAC5D,CAAA;AAEA,MAAM,cAAA,GAAiB,CACrB,GAAA,EACA,GAAA,EACA,OAAA,KACG;AACH,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,KAAA,MAAW,SAAS,GAAA,EAAK;AACvB,IAAA,MAAM,eAAA,GAAkB,iBAAA,CAAkB,GAAA,EAAK,KAAA,EAAO,OAAO,CAAA;AAC7D,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAA,IAAU,MAAA,GAAS,CAAA,CAAA,EAAI,eAAe,CAAA,CAAA,GAAK,eAAA;AAAA,IAC7C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAEO,MAAM,eAAA,GAAkB,CAC7B,GAAA,EACA,KAAA,EACA,OAAA,KACG;AACH,EAAA,IAAIA,wBAAA,CAAQ,KAAK,CAAA,EAAG;AAClB,IAAA,OAAO,cAAA,CAAe,GAAA,EAAK,KAAA,EAAO,OAAO,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,iBAAA,CAAkB,GAAA,EAAK,KAAA,EAAO,OAAO,CAAA;AAC9C,CAAA;;AC/BO,SAAS,SAAA,CACd,GAAA,EACA,OAAA,GAA4B,EAAC,EACrB;AACR,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,MAAA,GAAS,IAAI,GAAG,CAAA;AACtB,IAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AAE5D,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAA,IAAU,MAAA,GAAS,CAAA,CAAA,EAAI,eAAe,CAAA,CAAA,GAAK,eAAA;AAAA,IAC7C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;;"}