import type { Modding } from "@flamework/core"; import { Boba } from "@rbxts/boba"; import type { HasRest, RestType, SplitRest } from "@rbxts/serio/metadata/tuples"; import type { IsLiteral, IsUnion } from "type-fest"; type ArrayMetadata> = [T] extends [ { length: number; } ] ? TupleMetadata : ListMetadata; type ListMetadata> = ["_list", T] extends [ keyof T, { _list?: [infer V]; } ] ? ["list", ValidateMetadata] : ["list", ValidateMetadata]; type TupleMetadata> = ["_tuple", T] extends [ keyof T, { _tuple?: [infer V extends Array]; } ] ? [ "tuple", SplitRest extends infer A ? { [K in keyof A]: ValidateMetadata; } : never, HasRest extends true ? ValidateMetadata> : undefined ] : [ "tuple", SplitRest extends infer A ? { [K in keyof A]: ValidateMetadata; } : never, HasRest extends true ? ValidateMetadata> : undefined ]; /** * Recursive type-level mapping from a Luau data shape to the Serio-based validation metadata format * consumed by {@link createDataStoreValidator}. * * @typeParam T - The Luau type to encode as validation metadata. */ export type ValidateMetadata = IsLiteral extends true ? ["literal", Array>] : unknown extends T ? never : undefined extends T ? ["optional", ValidateMetadata>] : [T] extends [boolean] ? ["bool"] : [T] extends [number] ? ["number"] : ["_string", T] extends [keyof T, { _string?: infer _V; }] ? [ "map", ["string"], ValidateMetadata ] : [T] extends [string] ? ["string"] : ["_set", T] extends [keyof T, { _set?: [infer V]; }] ? ["set", ValidateMetadata] : [T] extends [ReadonlySet] ? ["set", ValidateMetadata, ValidateMetadata] : ["_map", T] extends [keyof T, { _map?: [infer K, infer V]; }] ? ["map", ValidateMetadata, ValidateMetadata] : [T] extends [ReadonlyMap] ? ["map", ValidateMetadata, ValidateMetadata] : [T] extends [ReadonlyArray] ? ["list", ValidateMetadata] : [T] extends [Array] ? ArrayMetadata : IsUnion extends true ? [ "union", Array : never> ] : true extends IsNominal ? never : T extends object ? [ "object", Array<{ [K in keyof T]-?: [K, ValidateMetadata]; }[keyof T]> ] : never; /** Discriminated union of all possible validation schema nodes produced by {@link ValidateMetadata}. */ export type ValidateSchema = ["bool"] | ["string"] | ["number"] | ["set", ValidateSchema] | ["list", ValidateSchema] | ["literal", Array] | ["optional", ValidateSchema] | ["map", ValidateSchema, ValidateSchema] | ["union", Array<[unknown, ValidateSchema]>] | ["object", Array<[string, ValidateSchema]>] | ["tuple", Array, ValidateSchema]; /** * Creates a `Boba` const v function for a specific type. * * @param meta * @metadata macro */ export declare function createDataStoreValidator(raw?: A, meta?: Modding.Many>): A extends true ? Boba : (x: unknown) => asserts x is T; export {};