- Wrap snapshot updates in transactions with error context for each child table - Add sidecar retry with exponential backoff (3 attempts, 2s base, 10s max, 30% jitter) - Add HTTP timeout (30s per request) and SEC rate limiting (10 req/s) in Rust - Add XBRL validation with status reporting (checks root element, tag balance)
57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
export function asRecord(value: unknown): Record<string, unknown> {
|
|
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
return {};
|
|
}
|
|
return value as Record<string, unknown>;
|
|
}
|
|
|
|
export function asOptionalRecord(value: unknown): Record<string, unknown> | null {
|
|
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
return null;
|
|
}
|
|
return value as Record<string, unknown>;
|
|
}
|
|
|
|
export function asPositiveNumber(value: unknown): number | null {
|
|
const parsed = typeof value === 'number' ? value : Number(value);
|
|
return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
|
|
}
|
|
|
|
export function asBoolean(value: unknown, fallback = false): boolean {
|
|
if (typeof value === 'boolean') {
|
|
return value;
|
|
}
|
|
|
|
if (typeof value === 'string') {
|
|
const normalized = value.trim().toLowerCase();
|
|
if (normalized === 'true' || normalized === '1' || normalized === 'yes') {
|
|
return true;
|
|
}
|
|
if (normalized === 'false' || normalized === '0' || normalized === 'no') {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return fallback;
|
|
}
|
|
|
|
export function asStringArray(value: unknown): string[] {
|
|
const source = Array.isArray(value)
|
|
? value
|
|
: typeof value === 'string'
|
|
? value.split(',')
|
|
: [];
|
|
|
|
const unique = new Set<string>();
|
|
for (const entry of source) {
|
|
if (typeof entry !== 'string') continue;
|
|
const tag = entry.trim();
|
|
if (tag) unique.add(tag);
|
|
}
|
|
return [...unique];
|
|
}
|
|
|
|
export function asEnum<T extends string>(value: unknown, allowed: readonly T[]): T | undefined {
|
|
return allowed.includes(value as T) ? (value as T) : undefined;
|
|
}
|