api-wizard
Version:
A powerful TypeScript wrapper for native Fetch API with token management, interceptors, and type-safe HTTP requests
57 lines (56 loc) • 2.07 kB
JavaScript
/** 평탄화: string | undefined 만 남기기 */
function normalizeQueryLike(input) {
const out = {};
for (const [k, v] of Object.entries(input ?? {})) {
if (typeof v === "string" || v === undefined)
out[k] = v;
else if (Array.isArray(v)) {
const first = v.find((x) => typeof x === "string");
out[k] = first ?? undefined;
}
else {
out[k] = undefined; // 중첩 객체는 버림
}
}
return out;
}
export function createParsedParams(schema, opts = {}) {
const numberDefault = opts.numberDefault ?? 0;
const stringDefault = opts.stringDefault ?? "";
const allowUnknown = opts.allowUnknown ?? true;
async function parse(inputs) {
const flats = inputs.map(normalizeQueryLike);
const out = {};
for (const key in schema) {
const field = schema[key];
const raws = flats.map(f => f[key]).filter(x => x !== undefined);
const val = raws[0];
if (field.type === "number") {
const n = val == null ? NaN : parseInt(val, 10);
const parsed = Number.isNaN(n)
? (field.default ?? numberDefault)
: n;
out[key] = parsed;
}
else {
const parsed = val ?? field.default ?? stringDefault;
out[key] = parsed;
}
}
if (allowUnknown) {
const allKeys = new Set();
for (const f of flats)
for (const k of Object.keys(f))
allKeys.add(k);
for (const k of allKeys) {
if (k in schema)
continue; // 이미 처리됨
const raws = flats.map(f => f[k]).filter(x => x !== undefined);
const val = raws[0];
out[k] = (val ?? stringDefault); // ← 항상 string 보장
}
}
return out;
}
return Object.assign(parse, { normalize: normalizeQueryLike });
}