staticql
Version:
Type-safe query engine for static content including Markdown, YAML, JSON, and more.
28 lines (27 loc) • 1.33 kB
TypeScript
import { SourceRecord } from "../SourceConfigResolver.js";
export type JoinableKeys<T> = {
[K in keyof T]: NonNullable<T[K]> extends SourceRecord | SourceRecord[] ? `${Extract<K, string>}` : never;
}[keyof T];
type Prev = [never, 0, 1, 2, 3, 4, 5];
type IsAny<T> = 0 extends 1 & T ? true : false;
type NestedIndexKeys<T, Prefix extends string = "", Depth extends number = 3> = [Depth] extends [never] ? never : T extends (infer U)[] ? NestedIndexKeys<U, Prefix, Depth> : T extends object ? {
[K in keyof T]: NonNullable<T[K]> extends {
__brand: "index";
} ? IsAny<T[K]> extends true ? never : `${Prefix}${Prefix extends "" ? "" : "."}${Extract<K, string>}` : NonNullable<T[K]> extends object ? NestedIndexKeys<NonNullable<T[K]>, `${Prefix}${Prefix extends "" ? "" : "."}${Extract<K, string>}`, Prev[Depth]> : never;
}[keyof T] : never;
export type Fields<T> = NestedIndexKeys<T>;
export type PrefixIndexDepth = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;
export type PrefixIndexDefinition = Record<string, {
dir: string;
depth: PrefixIndexDepth;
}>;
export type PrefixIndexLine = {
v: string;
vs: string;
ref: Record<string, Record<"slug" | string, string[]>>;
};
export type RawPrefixIndexLine = {
slug: string;
values: Record<string, Record<string, string | string[]>>;
};
export {};