mirror of
https://github.com/nicotsx/ironmount.git
synced 2025-12-10 12:10:51 +01:00
137 lines
2.9 KiB
TypeScript
137 lines
2.9 KiB
TypeScript
// This file is auto-generated by @hey-api/openapi-ts
|
|
|
|
/**
|
|
* JSON-friendly union that mirrors what Pinia Colada can hash.
|
|
*/
|
|
export type JsonValue =
|
|
| null
|
|
| string
|
|
| number
|
|
| boolean
|
|
| JsonValue[]
|
|
| { [key: string]: JsonValue };
|
|
|
|
/**
|
|
* Replacer that converts non-JSON values (bigint, Date, etc.) to safe substitutes.
|
|
*/
|
|
export const queryKeyJsonReplacer = (_key: string, value: unknown) => {
|
|
if (
|
|
value === undefined ||
|
|
typeof value === 'function' ||
|
|
typeof value === 'symbol'
|
|
) {
|
|
return undefined;
|
|
}
|
|
if (typeof value === 'bigint') {
|
|
return value.toString();
|
|
}
|
|
if (value instanceof Date) {
|
|
return value.toISOString();
|
|
}
|
|
return value;
|
|
};
|
|
|
|
/**
|
|
* Safely stringifies a value and parses it back into a JsonValue.
|
|
*/
|
|
export const stringifyToJsonValue = (input: unknown): JsonValue | undefined => {
|
|
try {
|
|
const json = JSON.stringify(input, queryKeyJsonReplacer);
|
|
if (json === undefined) {
|
|
return undefined;
|
|
}
|
|
return JSON.parse(json) as JsonValue;
|
|
} catch {
|
|
return undefined;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Detects plain objects (including objects with a null prototype).
|
|
*/
|
|
const isPlainObject = (value: unknown): value is Record<string, unknown> => {
|
|
if (value === null || typeof value !== 'object') {
|
|
return false;
|
|
}
|
|
const prototype = Object.getPrototypeOf(value as object);
|
|
return prototype === Object.prototype || prototype === null;
|
|
};
|
|
|
|
/**
|
|
* Turns URLSearchParams into a sorted JSON object for deterministic keys.
|
|
*/
|
|
const serializeSearchParams = (params: URLSearchParams): JsonValue => {
|
|
const entries = Array.from(params.entries()).sort(([a], [b]) =>
|
|
a.localeCompare(b),
|
|
);
|
|
const result: Record<string, JsonValue> = {};
|
|
|
|
for (const [key, value] of entries) {
|
|
const existing = result[key];
|
|
if (existing === undefined) {
|
|
result[key] = value;
|
|
continue;
|
|
}
|
|
|
|
if (Array.isArray(existing)) {
|
|
(existing as string[]).push(value);
|
|
} else {
|
|
result[key] = [existing, value];
|
|
}
|
|
}
|
|
|
|
return result;
|
|
};
|
|
|
|
/**
|
|
* Normalizes any accepted value into a JSON-friendly shape for query keys.
|
|
*/
|
|
export const serializeQueryKeyValue = (
|
|
value: unknown,
|
|
): JsonValue | undefined => {
|
|
if (value === null) {
|
|
return null;
|
|
}
|
|
|
|
if (
|
|
typeof value === 'string' ||
|
|
typeof value === 'number' ||
|
|
typeof value === 'boolean'
|
|
) {
|
|
return value;
|
|
}
|
|
|
|
if (
|
|
value === undefined ||
|
|
typeof value === 'function' ||
|
|
typeof value === 'symbol'
|
|
) {
|
|
return undefined;
|
|
}
|
|
|
|
if (typeof value === 'bigint') {
|
|
return value.toString();
|
|
}
|
|
|
|
if (value instanceof Date) {
|
|
return value.toISOString();
|
|
}
|
|
|
|
if (Array.isArray(value)) {
|
|
return stringifyToJsonValue(value);
|
|
}
|
|
|
|
if (
|
|
typeof URLSearchParams !== 'undefined' &&
|
|
value instanceof URLSearchParams
|
|
) {
|
|
return serializeSearchParams(value);
|
|
}
|
|
|
|
if (isPlainObject(value)) {
|
|
return stringifyToJsonValue(value);
|
|
}
|
|
|
|
return undefined;
|
|
};
|