rotorise 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Rotorise.cjs.map +1 -1
- package/dist/Rotorise.d.cts +13 -13
- package/dist/Rotorise.d.ts +13 -13
- package/dist/Rotorise.js.map +1 -1
- package/package.json +1 -1
package/dist/Rotorise.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Rotorise.ts"],"sourcesContent":["type KeysOfUnion<ObjectType> = ObjectType extends unknown\n ? keyof ObjectType\n : never\ntype IsEqual<T, U> = (<G>() => G extends T ? 1 : 2) extends <G>() => G extends U\n ? 1\n : 2\n ? true\n : false\n\ntype ArrayElement<T> = T extends readonly unknown[] ? T[0] : never\n\ntype ExactObject<ParameterType, InputType> = {\n [Key in keyof ParameterType]: Exact<\n ParameterType[Key],\n Key extends keyof InputType ? InputType[Key] : never\n >\n} & Record<Exclude<keyof InputType, KeysOfUnion<ParameterType>>, never>\n\ntype Exact<ParameterType, InputType> = IsEqual<\n ParameterType,\n InputType\n> extends true\n ? ParameterType\n : // Convert union of array to array of union: A[] & B[] => (A & B)[]\n ParameterType extends unknown[]\n ? Array<Exact<ArrayElement<ParameterType>, ArrayElement<InputType>>>\n : // In TypeScript, Array is a subtype of ReadonlyArray, so always test Array before ReadonlyArray.\n ParameterType extends readonly unknown[]\n ? ReadonlyArray<\n Exact<ArrayElement<ParameterType>, ArrayElement<InputType>>\n >\n : ParameterType extends object\n ? ExactObject<ParameterType, InputType>\n : ParameterType\n\ntype ValueOf<\n ObjectType,\n ValueType extends keyof ObjectType = keyof ObjectType,\n> = ObjectType[ValueType]\n\nexport type evaluate<T> = T extends unknown\n ? { [K in keyof T]: T[K] } & unknown\n : never\n\ntype SliceFromStart<\n T extends unknown[],\n End extends number,\n Target extends unknown[] = [],\n> = T['length'] | End extends 0\n ? []\n : Target['length'] extends End\n ? Target\n : T extends [infer A, ...infer R]\n ? SliceFromStart<R, End, [...Target, A]>\n : never\n\ntype DistributivePick<T, K> = T extends unknown\n ? K extends keyof T\n ? Pick<T, K>\n : never\n : never\n\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown\n ? Omit<T, K>\n : never\n\ntype Slices<\n rest extends unknown[],\n minLength extends number = 0,\n slice extends unknown[] = [],\n passedSkip extends 1 | 0 = slice['length'] extends minLength ? 1 : 0,\n> =\n | (passedSkip extends 1 ? slice : never)\n | (rest extends [infer h, ...infer R]\n ? Slices<\n R,\n minLength,\n [...slice, h],\n [...slice, h]['length'] extends minLength ? 1 : passedSkip\n >\n : never)\n\nexport type CompositeKeyParams<\n Entity extends Record<string, unknown>,\n Spec extends InputSpec<Entity>[],\n skip extends number = 1,\n P extends InputSpec<Entity>[] = SliceFromStart<\n Spec,\n IsLiteral<skip> extends true ? skip : 1\n >,\n> = Entity extends unknown\n ? P extends unknown\n ? evaluate<\n {\n [K in extractHeadOrPass<P[number]> & string]: Entity[K]\n } & {\n [K in extractHeadOrPass<\n Exclude<Spec[number], P[number]>\n >]?: Entity[K & keyof Entity]\n }\n >\n : never\n : never\ntype IsLiteral<a> = [a] extends [null | undefined]\n ? true\n : [a] extends [string]\n ? string extends a\n ? false\n : true\n : [a] extends [number]\n ? number extends a\n ? false\n : true\n : [a] extends [boolean]\n ? boolean extends a\n ? false\n : true\n : [a] extends [symbol]\n ? symbol extends a\n ? false\n : true\n : [a] extends [bigint]\n ? bigint extends a\n ? false\n : true\n : false\n\nexport type CompositeKeyBuilder<\n Entity extends Record<string, unknown>,\n Spec extends InputSpec<Entity>[],\n Delimiter extends string = '#',\n Deep extends number = Spec['length'],\n isPartial extends boolean = false,\n> = Entity extends unknown\n ? CompositeKeyBuilderImpl<\n Entity,\n IsLiteral<Deep> extends true ? SliceFromStart<Spec, Deep> : Spec\n > extends infer Values extends joinablePair[]\n ? Join<\n isPartial & IsLiteral<isPartial> extends false\n ? Values\n : Slices<Values>,\n Delimiter\n >\n : never\n : never\n\ntype joinable = string | number | bigint | boolean | null | undefined\ntype joinablePair = [joinable, joinable]\n\ntype Join<\n Pairs extends joinablePair[],\n Delimiter extends string,\n> = Pairs extends [joinablePair]\n ? `${Pairs[0][0]}${Delimiter}${Pairs[0][1]}`\n : Pairs extends [joinablePair, ...infer Tail extends joinablePair[]]\n ? `${Pairs[0][0]}${Delimiter}${Pairs[0][1]}${Delimiter}${Join<\n Tail,\n Delimiter\n >}`\n : never\n\ntype CompositeKeyBuilderImpl<\n Entity extends Record<string, unknown>,\n Spec extends InputSpec<Entity>[],\n Pairs extends joinablePair[] = [],\n> = Spec extends [infer F, ...infer R extends InputSpec<Entity>[]]\n ? F extends keyof Entity & string\n ? Entity[F] extends joinable\n ? CompositeKeyBuilderImpl<\n Entity,\n R,\n [...Pairs, [Uppercase<F>, Entity[F]]]\n >\n : never\n : F extends [keyof Entity & string, (...x: (infer _)[]) => infer Tr]\n ? Tr extends joinable\n ? CompositeKeyBuilderImpl<\n Entity,\n R,\n [...Pairs, [Uppercase<F[0]>, Tr]]\n >\n : never\n : never\n : Pairs\n\nexport type TableEntry<\n Entity extends Record<string, unknown>,\n Schema extends Record<string, FullKeySpec<Entity>>,\n Delimiter extends string = '#',\n> = Entity extends unknown\n ? Entity & {\n [Key in keyof Schema]: Schema[Key] extends keyof Entity\n ? Entity[Schema[Key]]\n : Schema[Key] extends FullKeySpecSimple<Entity>\n ? CompositeKeyBuilder<Entity, Schema[Key], Delimiter>\n : Schema[Key] extends DiscriminatedSchema<Entity>\n ? ValueOf<{\n [K in Schema[Key]['discriminator']]: {\n [V in keyof Schema[Key]['spec']]: Schema[Key]['spec'][V] extends keyof Entity\n ? Extract<\n Entity,\n {\n [k in K]: V\n }\n >[Schema[Key]['spec'][V]]\n : Schema[Key]['spec'][V] extends InputSpec<\n Extract<\n Entity,\n {\n [k in K]: V\n }\n >\n >[]\n ? CompositeKeyBuilder<\n Extract<\n Entity,\n {\n [k in K]: V\n }\n >,\n Schema[Key]['spec'][V],\n Delimiter\n >\n : never\n }[Extract<\n Entity,\n {\n [k in K]: unknown\n }\n >[K] &\n keyof Schema[Key]['spec']]\n }>\n : never\n }\n : never\n\ntype Unionize<T extends object> = {\n [k in keyof T]: { k: k; v: T[k] }\n}[keyof T]\ntype KVPair = { k: PropertyKey; v: unknown }\n\ntype InputSpec<\n Entity extends Record<string, unknown>,\n KV extends KVPair = Unionize<Entity>,\n> = evaluate<\n {\n [key in keyof Entity]:\n | [key, (key: Extract<KV, { k: key }>['v']) => unknown]\n | key\n }[keyof Entity]\n>\n\ntype extractHeadOrPass<T> = T extends unknown[] ? T[0] : T\ntype numeric = number | bigint\ntype keysWithNumericValue<\n Entity extends object,\n KVs extends KVPair = Unionize<Entity>,\n K_wNumber extends PropertyKey = Extract<KVs, { v: numeric }>['k'],\n K_woNumber extends PropertyKey = Exclude<\n KVs,\n { k: K_wNumber; v: numeric }\n >['k'],\n> = Exclude<K_wNumber, K_woNumber>\n\ntype FullKeySpecSimple<Entity extends Record<string, unknown>> =\n | InputSpec<Entity>[]\n | (keysWithNumericValue<Entity> & keyof Entity)\n\ntype entries =\n | { a: 'a1'; b: 1n; c: true; z: '1' }\n | { a: 'a2'; b: 2; c: 0; z: '2' }\n\ntype DiscriminatedSchema<\n Entity extends Record<string, unknown>,\n KVs extends KVPair = Unionize<\n Pick<Entity, keyof Entity> /* Pick common keys */\n >,\n KVs_ extends { k: PropertyKey; v: PropertyKey } = Extract<\n KVs,\n { v: PropertyKey }\n >,\n> = KVs_ extends unknown\n ? {\n discriminator: KVs_['k']\n spec: {\n [val in KVs_['v']]: FullKeySpecSimple<\n Extract<\n Entity,\n {\n [k in KVs_['k']]: val\n }\n >\n > | null\n }\n }\n : never\n\ntype FullKeySpec<Entity extends Record<string, unknown>> =\n | FullKeySpecSimple<Entity>\n | DiscriminatedSchema<Entity>\n\ntype t = DiscriminatedSchema<entries>\n\ntype R = ValueOf<{\n [K in t['discriminator']]: evaluate<\n ValueOf<{\n [V in keyof Extract<t, { discriminator: K }>['spec']]: {\n narrow: {\n [k in K]: V\n }\n spec: Extract<\n Extract<t, { discriminator: K }>['spec'],\n { [k in V]: unknown }\n >[V]\n }\n }>\n >\n}>\n\nconst chainableNoOpProxy: unknown = new Proxy(() => chainableNoOpProxy, {\n get: () => chainableNoOpProxy,\n})\n\nconst createPathProxy = <T>(path = ''): T => {\n return new Proxy(() => {}, {\n get: (target, prop, receiver) => {\n if (typeof prop === 'string') {\n if (prop === 'toString') {\n return () => path\n }\n\n return createPathProxy(\n path === ''\n ? prop\n : !Number.isNaN(Number.parseInt(prop))\n ? `${path}[${prop}]`\n : `${path}.${prop}`,\n )\n }\n },\n }) as T\n}\n\nconst key =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<\n string,\n | InputSpec<Entity>[]\n | keyof Entity\n | {\n discriminator: keyof Entity\n spec: {\n [val in string]: InputSpec<Entity>[] | keyof Entity | null\n }\n }\n >,\n Separator extends string = '#',\n >(\n schema: Schema,\n separator: Separator = '#' as Separator,\n ) =>\n <\n const Key extends keyof Schema,\n const Config extends { depth?: number; allowPartial?: boolean },\n const Attributes extends Partial<Entity>,\n >(\n key: Key,\n attributes: Attributes,\n config?: Config,\n ): string | undefined => {\n const case_ = schema[key]\n\n if (case_ === undefined) {\n throw new Error(`Key ${key.toString()} not found in schema`)\n }\n let structure: InputSpec<Entity>[]\n\n if (Array.isArray(case_)) {\n structure = case_\n } else if (typeof case_ === 'object') {\n const discriminator =\n attributes[case_.discriminator as keyof Attributes]\n if (discriminator === undefined) {\n throw new Error(\n `Discriminator ${case_.discriminator.toString()} not found in ${JSON.stringify(attributes)}`,\n )\n }\n const val = case_.spec[discriminator as keyof typeof case_.spec]\n if (val === undefined) {\n throw new Error(\n `Discriminator value ${discriminator?.toString()} not found in ${JSON.stringify(attributes)}`,\n )\n }\n if (val === null) {\n return undefined\n }\n\n if (!Array.isArray(val)) {\n return attributes[val as keyof Attributes] as never\n }\n\n structure = val\n } else {\n return attributes[case_ as keyof Attributes] as never\n }\n\n if (config?.depth !== undefined) {\n structure = structure.slice(0, config.depth) as never\n }\n const composite: string[] = []\n\n for (const keySpec of structure) {\n const [key, transform] = Array.isArray(keySpec)\n ? keySpec\n : [keySpec]\n const value = attributes[key as keyof Attributes]\n if (value !== undefined && value !== null && value !== '') {\n composite.push(key.toString().toUpperCase())\n composite.push(\n `${transform ? transform(value as never) : value}`,\n )\n } else if (config?.allowPartial) {\n break\n } else {\n throw new Error(\n `buildCompositeKey: Attribute ${key.toString()} not found in ${JSON.stringify(attributes)}`,\n )\n }\n }\n\n return composite.join(separator) as never\n }\n\nconst toEntry =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<\n string,\n | InputSpec<Entity>[]\n | keyof Entity\n | {\n discriminator: keyof Entity\n spec: {\n [val in string]: InputSpec<Entity>[] | keyof Entity | null\n }\n }\n >,\n Separator extends string = '#',\n >(\n schema: Schema,\n separator: Separator = '#' as Separator,\n ) =>\n <const ExactEntity extends Entity>(\n item: ExactEntity,\n ): ExactEntity extends infer E extends Entity\n ? Schema extends Record<string, FullKeySpec<E>>\n ? TableEntry<E, Schema, Separator>\n : never\n : never => {\n const entry = { ...item }\n\n for (const key_ in schema) {\n const val = key<Entity>()(schema, separator)(key_, item)\n if (val !== undefined) {\n entry[key_] = val satisfies string as never\n }\n }\n // console.log({ entry })\n return entry as never\n }\n\nconst fromEntry =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<string, FullKeySpec<Entity>>,\n Separator extends string = '#',\n >(\n schema: Schema,\n ) =>\n <const Entry extends TableEntry<Entity, Schema, Separator>>(\n entry: Entry,\n ): DistributiveOmit<Entry, keyof Schema> => {\n const item = { ...entry }\n\n for (const key_ in schema) {\n delete item[key_]\n }\n // console.log({ item })\n return item as never\n }\n\ntype TableEntryDefinition<\n Entity extends Record<string, unknown>,\n Schema extends Record<string, FullKeySpec<Entity>>,\n Separator extends string = '#',\n> = {\n toEntry: <const ExactEntity extends Exact<Entity, ExactEntity>>(\n item: ExactEntity,\n ) => ExactEntity extends infer E extends Entity\n ? Schema extends Record<string, FullKeySpec<E>>\n ? TableEntry<E, Schema, Separator>\n : never\n : never\n fromEntry: <const Entry extends TableEntry<Entity, Schema, Separator>>(\n entry: Entry,\n ) => DistributiveOmit<Entry, keyof Schema>\n key: <\n const Key extends keyof Schema,\n const Config extends Schema[Key] extends keyof Entity\n ? never\n : { depth?: number; allowPartial?: boolean },\n const Attributes extends Schema[Key] extends keyof Entity\n ? DistributivePick<Entity, Schema[Key] & keyof Entity>\n : Schema[Key] extends InputSpec<Entity>[]\n ? CompositeKeyParams<\n Entity,\n Schema[Key],\n Config['allowPartial'] extends true\n ? 1\n : Schema[Key]['length']\n >\n : Schema[Key] extends DiscriminatedSchema<Entity>\n ? ValueOf<{\n [K in Schema[Key]['discriminator']]: evaluate<\n ValueOf<{\n [V in keyof Extract<\n Schema[Key],\n { discriminator: K }\n >['spec']]: Entity & {\n [k in K]: V\n } extends infer E extends Record<string, unknown>\n ? Extract<\n Extract<\n Schema[Key],\n { discriminator: K }\n >['spec'],\n { [k in V]: unknown }\n >[V] extends infer S\n ? (\n S extends keyof E\n ? DistributivePick<\n E,\n S & keyof E\n >\n : S extends InputSpec<E>[]\n ? CompositeKeyParams<\n E,\n S,\n Config['allowPartial'] extends true\n ? 1\n : S['length']\n >\n : never\n ) extends infer P\n ? [P] extends [never]\n ? {\n [k in K]: V\n }\n : P & {\n [k in K]: V\n }\n : never\n : never\n : never\n }>\n >\n }>\n : never,\n >(\n key: Key,\n attributes: Attributes,\n config?: Config,\n ) => Schema[Key] extends keyof Entity\n ? ValueOf<Attributes>\n : Schema[Key] extends FullKeySpecSimple<Entity & Attributes>\n ? CompositeKeyBuilder<\n Entity & Attributes,\n Schema[Key],\n Separator,\n Exclude<Config['depth'], undefined>,\n Exclude<Config['allowPartial'], undefined>\n >\n : Schema[Key] extends DiscriminatedSchema<Entity>\n ? ValueOf<{\n [K in Schema[Key]['discriminator']]: {\n [V in keyof Schema[Key]['spec']]: Schema[Key]['spec'][V] extends keyof Entity\n ? Extract<\n Entity,\n {\n [k in K]: V\n }\n >[Schema[Key]['spec'][V]]\n : Schema[Key]['spec'][V] extends InputSpec<\n Extract<\n Entity,\n {\n [k in K]: V\n }\n >\n >[]\n ? CompositeKeyBuilder<\n Extract<\n Entity,\n {\n [k in K]: V\n }\n >,\n Schema[Key]['spec'][V],\n Separator,\n Exclude<Config['depth'], undefined>,\n Exclude<Config['allowPartial'], undefined>\n >\n : Schema[Key]['spec'][V] extends null\n ? undefined\n : never\n }[Extract<\n Entity & Attributes,\n {\n [k in K]: unknown\n }\n >[K] &\n keyof Schema[Key]['spec']]\n }>\n : never\n\n infer: TableEntry<Entity, Schema, Separator>\n path: () => TableEntry<Entity, Schema, Separator>\n}\n\nexport const tableEntry =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<string, FullKeySpec<Entity>>,\n Separator extends string = '#',\n >(\n schema: Schema,\n separator: Separator = '#' as Separator,\n ): TableEntryDefinition<Entity, Schema, Separator> => {\n return {\n toEntry: toEntry<Entity>()(schema as never, separator) as never,\n fromEntry: fromEntry<Entity>()(schema),\n key: key<Entity>()(schema as never, separator) as never,\n infer: chainableNoOpProxy as TableEntry<Entity, Schema, Separator>,\n path: () =>\n createPathProxy<TableEntry<Entity, Schema, Separator>>(),\n }\n }\n"],"mappings":"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","names":["key"]}
|
|
1
|
+
{"version":3,"sources":["../src/Rotorise.ts"],"sourcesContent":["type KeysOfUnion<ObjectType> = ObjectType extends unknown\n ? keyof ObjectType\n : never\ntype IsEqual<T, U> = (<G>() => G extends T ? 1 : 2) extends <G>() => G extends U\n ? 1\n : 2\n ? true\n : false\n\ntype ArrayElement<T> = T extends readonly unknown[] ? T[0] : never\n\ntype ExactObject<ParameterType, InputType> = {\n [Key in keyof ParameterType]: Exact<\n ParameterType[Key],\n Key extends keyof InputType ? InputType[Key] : never\n >\n} & Record<Exclude<keyof InputType, KeysOfUnion<ParameterType>>, never>\n\ntype Exact<ParameterType, InputType> = IsEqual<\n ParameterType,\n InputType\n> extends true\n ? ParameterType\n : // Convert union of array to array of union: A[] & B[] => (A & B)[]\n ParameterType extends unknown[]\n ? Array<Exact<ArrayElement<ParameterType>, ArrayElement<InputType>>>\n : // In TypeScript, Array is a subtype of ReadonlyArray, so always test Array before ReadonlyArray.\n ParameterType extends readonly unknown[]\n ? ReadonlyArray<\n Exact<ArrayElement<ParameterType>, ArrayElement<InputType>>\n >\n : ParameterType extends object\n ? ExactObject<ParameterType, InputType>\n : ParameterType\n\ntype ValueOf<\n ObjectType,\n ValueType extends keyof ObjectType = keyof ObjectType,\n> = ObjectType[ValueType]\n\nexport type evaluate<T> = T extends unknown\n ? { [K in keyof T]: T[K] } & unknown\n : never\n\ntype SliceFromStart<\n T extends unknown[],\n End extends number,\n Target extends unknown[] = [],\n> = T['length'] | End extends 0\n ? []\n : Target['length'] extends End\n ? Target\n : T extends [infer A, ...infer R]\n ? SliceFromStart<R, End, [...Target, A]>\n : never\n\ntype DistributivePick<T, K> = T extends unknown\n ? K extends keyof T\n ? Pick<T, K>\n : never\n : never\n\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown\n ? Omit<T, K>\n : never\n\ntype Slices<\n rest extends unknown[],\n minLength extends number = 0,\n slice extends unknown[] = [],\n passedSkip extends 1 | 0 = slice['length'] extends minLength ? 1 : 0,\n> =\n | (passedSkip extends 1 ? slice : never)\n | (rest extends [infer h, ...infer R]\n ? Slices<\n R,\n minLength,\n [...slice, h],\n [...slice, h]['length'] extends minLength ? 1 : passedSkip\n >\n : never)\n\nexport type CompositeKeyParams<\n Entity extends Record<string, unknown>,\n Spec extends InputSpec<Entity>[],\n skip extends number = 1,\n P extends InputSpec<Entity>[] = SliceFromStart<\n Spec,\n IsLiteral<skip> extends true ? skip : 1\n >,\n> = Entity extends unknown\n ? P extends unknown\n ? evaluate<\n {\n [K in extractHeadOrPass<P[number]> & string]: Entity[K]\n } & {\n [K in extractHeadOrPass<\n Exclude<Spec[number], P[number]>\n >]?: Entity[K & keyof Entity]\n }\n >\n : never\n : never\ntype IsLiteral<a> = [a] extends [null | undefined]\n ? true\n : [a] extends [string]\n ? string extends a\n ? false\n : true\n : [a] extends [number]\n ? number extends a\n ? false\n : true\n : [a] extends [boolean]\n ? boolean extends a\n ? false\n : true\n : [a] extends [symbol]\n ? symbol extends a\n ? false\n : true\n : [a] extends [bigint]\n ? bigint extends a\n ? false\n : true\n : false\n\nexport type CompositeKeyBuilder<\n Entity extends Record<string, unknown>,\n Spec extends InputSpec<Entity>[],\n Delimiter extends string = '#',\n Deep extends number = Spec['length'],\n isPartial extends boolean = false,\n> = Entity extends unknown\n ? CompositeKeyBuilderImpl<\n Entity,\n IsLiteral<Deep> extends true ? SliceFromStart<Spec, Deep> : Spec\n > extends infer Values extends joinablePair[]\n ? Join<\n isPartial & IsLiteral<isPartial> extends false\n ? Values\n : Slices<Values>,\n Delimiter\n >\n : never\n : never\n\ntype joinable = string | number | bigint | boolean | null | undefined\ntype joinablePair = [joinable, joinable]\n\ntype Join<\n Pairs extends joinablePair[],\n Delimiter extends string,\n> = Pairs extends [joinablePair]\n ? `${Pairs[0][0]}${Delimiter}${Pairs[0][1]}`\n : Pairs extends [joinablePair, ...infer Tail extends joinablePair[]]\n ? `${Pairs[0][0]}${Delimiter}${Pairs[0][1]}${Delimiter}${Join<\n Tail,\n Delimiter\n >}`\n : never\n\ntype CompositeKeyBuilderImpl<\n Entity extends Record<string, unknown>,\n Spec extends InputSpec<Entity>[],\n Pairs extends joinablePair[] = [],\n> = Spec extends [infer F, ...infer R extends InputSpec<Entity>[]]\n ? F extends keyof Entity & string\n ? Entity[F] extends joinable\n ? CompositeKeyBuilderImpl<\n Entity,\n R,\n [...Pairs, [Uppercase<F>, Entity[F]]]\n >\n : never\n : F extends [keyof Entity & string, (...x: (infer _)[]) => infer Tr]\n ? Tr extends joinable\n ? CompositeKeyBuilderImpl<\n Entity,\n R,\n [...Pairs, [Uppercase<F[0]>, Tr]]\n >\n : never\n : never\n : Pairs\n\nexport type TableEntry<\n Entity extends Record<string, unknown>,\n Schema extends Record<string, FullKeySpec<Entity>>,\n Delimiter extends string = '#',\n> = Entity extends unknown\n ? Entity & {\n [Key in keyof Schema]: Schema[Key] extends keyof Entity\n ? Entity[Schema[Key]]\n : Schema[Key] extends FullKeySpecSimple<Entity>\n ? CompositeKeyBuilder<Entity, Schema[Key], Delimiter>\n : Schema[Key] extends DiscriminatedSchema<Entity>\n ? ValueOf<{\n [K in Schema[Key]['discriminator']]: {\n [V in keyof Schema[Key]['spec']]: Schema[Key]['spec'][V] extends keyof Entity\n ? Extract<\n Entity,\n {\n [k in K]: V\n }\n >[Schema[Key]['spec'][V]]\n : Schema[Key]['spec'][V] extends InputSpec<\n Extract<\n Entity,\n {\n [k in K]: V\n }\n >\n >[]\n ? CompositeKeyBuilder<\n Extract<\n Entity,\n {\n [k in K]: V\n }\n >,\n Schema[Key]['spec'][V],\n Delimiter\n >\n : never\n }[Extract<\n Entity,\n {\n [k in K]: unknown\n }\n >[K] &\n keyof Schema[Key]['spec']]\n }>\n : never\n }\n : never\n\ntype Unionize<T extends object> = {\n [k in keyof T]: { k: k; v: T[k] }\n}[keyof T]\ntype KVPair = { k: PropertyKey; v: unknown }\n\ntype InputSpec<\n Entity extends Record<string, unknown>,\n KV extends KVPair = Unionize<Entity>,\n> = evaluate<\n {\n [key in keyof Entity]:\n | [key, (key: Extract<KV, { k: key }>['v']) => unknown]\n | key\n }[keyof Entity]\n>\n\ntype extractHeadOrPass<T> = T extends unknown[] ? T[0] : T\ntype numeric = number | bigint\ntype keysWithNumericValue<\n Entity extends object,\n KVs extends KVPair = Unionize<Entity>,\n K_wNumber extends PropertyKey = Extract<KVs, { v: numeric }>['k'],\n K_woNumber extends PropertyKey = Exclude<\n KVs,\n { k: K_wNumber; v: numeric }\n >['k'],\n> = Exclude<K_wNumber, K_woNumber>\n\ntype FullKeySpecSimple<Entity extends Record<string, unknown>> =\n | InputSpec<Entity>[]\n | (keysWithNumericValue<Entity> & keyof Entity)\n\ntype entries =\n | { a: 'a1'; b: 1n; c: true; z: '1' }\n | { a: 'a2'; b: 2; c: 0; z: '2' }\n\ntype DiscriminatedSchema<\n Entity extends Record<string, unknown>,\n KVs extends KVPair = Unionize<\n Pick<Entity, keyof Entity> /* Pick common keys */\n >,\n KVs_ extends { k: PropertyKey; v: PropertyKey } = Extract<\n KVs,\n { v: PropertyKey }\n >,\n> = KVs_ extends unknown\n ? {\n discriminator: KVs_['k']\n spec: {\n [val in KVs_['v']]: FullKeySpecSimple<\n Extract<\n Entity,\n {\n [k in KVs_['k']]: val\n }\n >\n > | null\n }\n }\n : never\n\ntype FullKeySpec<Entity extends Record<string, unknown>> =\n | FullKeySpecSimple<Entity>\n | DiscriminatedSchema<Entity>\n\ntype t = DiscriminatedSchema<entries>\n\ntype R = ValueOf<{\n [K in t['discriminator']]: evaluate<\n ValueOf<{\n [V in keyof Extract<t, { discriminator: K }>['spec']]: {\n narrow: {\n [k in K]: V\n }\n spec: Extract<\n Extract<t, { discriminator: K }>['spec'],\n { [k in V]: unknown }\n >[V]\n }\n }>\n >\n}>\n\nconst chainableNoOpProxy: unknown = new Proxy(() => chainableNoOpProxy, {\n get: () => chainableNoOpProxy,\n})\n\nconst createPathProxy = <T>(path = ''): T => {\n return new Proxy(() => {}, {\n get: (target, prop, receiver) => {\n if (typeof prop === 'string') {\n if (prop === 'toString') {\n return () => path\n }\n\n return createPathProxy(\n path === ''\n ? prop\n : !Number.isNaN(Number.parseInt(prop))\n ? `${path}[${prop}]`\n : `${path}.${prop}`,\n )\n }\n },\n }) as T\n}\n\nconst key =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<\n string,\n | InputSpec<Entity>[]\n | keyof Entity\n | {\n discriminator: keyof Entity\n spec: {\n [val in string]: InputSpec<Entity>[] | keyof Entity | null\n }\n }\n >,\n Separator extends string = '#',\n >(\n schema: Schema,\n separator: Separator = '#' as Separator,\n ) =>\n <\n const Key extends keyof Schema,\n const Config extends { depth?: number; allowPartial?: boolean },\n const Attributes extends Partial<Entity>,\n >(\n key: Key,\n attributes: Attributes,\n config?: Config,\n ): string | undefined => {\n const case_ = schema[key]\n\n if (case_ === undefined) {\n throw new Error(`Key ${key.toString()} not found in schema`)\n }\n let structure: InputSpec<Entity>[]\n\n if (Array.isArray(case_)) {\n structure = case_\n } else if (typeof case_ === 'object') {\n const discriminator =\n attributes[case_.discriminator as keyof Attributes]\n if (discriminator === undefined) {\n throw new Error(\n `Discriminator ${case_.discriminator.toString()} not found in ${JSON.stringify(attributes)}`,\n )\n }\n const val = case_.spec[discriminator as keyof typeof case_.spec]\n if (val === undefined) {\n throw new Error(\n `Discriminator value ${discriminator?.toString()} not found in ${JSON.stringify(attributes)}`,\n )\n }\n if (val === null) {\n return undefined\n }\n\n if (!Array.isArray(val)) {\n return attributes[val as keyof Attributes] as never\n }\n\n structure = val\n } else {\n return attributes[case_ as keyof Attributes] as never\n }\n\n if (config?.depth !== undefined) {\n structure = structure.slice(0, config.depth) as never\n }\n const composite: string[] = []\n\n for (const keySpec of structure) {\n const [key, transform] = Array.isArray(keySpec)\n ? keySpec\n : [keySpec]\n const value = attributes[key as keyof Attributes]\n if (value !== undefined && value !== null && value !== '') {\n composite.push(key.toString().toUpperCase())\n composite.push(\n `${transform ? transform(value as never) : value}`,\n )\n } else if (config?.allowPartial) {\n break\n } else {\n throw new Error(\n `buildCompositeKey: Attribute ${key.toString()} not found in ${JSON.stringify(attributes)}`,\n )\n }\n }\n\n return composite.join(separator) as never\n }\n\nconst toEntry =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<\n string,\n | InputSpec<Entity>[]\n | keyof Entity\n | {\n discriminator: keyof Entity\n spec: {\n [val in string]: InputSpec<Entity>[] | keyof Entity | null\n }\n }\n >,\n Separator extends string = '#',\n >(\n schema: Schema,\n separator: Separator = '#' as Separator,\n ) =>\n <const ExactEntity extends Entity>(\n item: ExactEntity,\n ): ExactEntity extends infer E extends Entity\n ? Schema extends Record<string, FullKeySpec<E>>\n ? TableEntry<E, Schema, Separator>\n : never\n : never => {\n const entry = { ...item }\n\n for (const key_ in schema) {\n const val = key<Entity>()(schema, separator)(key_, item)\n if (val !== undefined) {\n entry[key_] = val satisfies string as never\n }\n }\n // console.log({ entry })\n return entry as never\n }\n\nconst fromEntry =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<string, FullKeySpec<Entity>>,\n Separator extends string = '#',\n >(\n schema: Schema,\n ) =>\n <const Entry extends TableEntry<Entity, Schema, Separator>>(\n entry: Entry,\n ): DistributiveOmit<Entry, keyof Schema> => {\n const item = { ...entry }\n\n for (const key_ in schema) {\n delete item[key_]\n }\n // console.log({ item })\n return item as never\n }\n\ntype TableEntryDefinition<\n Entity extends Record<string, unknown>,\n Schema extends Record<string, FullKeySpec<Entity>>,\n Separator extends string = '#',\n> = {\n toEntry: <const ExactEntity extends Exact<Entity, ExactEntity>>(\n item: ExactEntity,\n ) => ExactEntity extends infer E extends Entity\n ? Schema extends Record<string, FullKeySpec<E>>\n ? TableEntry<E, Schema, Separator>\n : never\n : never\n fromEntry: <const Entry extends TableEntry<Entity, Schema, Separator>>(\n entry: Entry,\n ) => DistributiveOmit<Entry, keyof Schema>\n key: <\n const Key extends string,\n const Config extends IsLiteral<Spec> extends true\n ? never\n : {\n depth?: number\n allowPartial?: boolean\n },\n const Attributes extends IsLiteral<Spec> extends true\n ? DistributivePick<Entity, Spec & keyof Entity>\n : Spec extends InputSpec<Entity>[]\n ? CompositeKeyParams<\n Entity,\n Spec,\n Config['allowPartial'] extends true ? 1 : Spec['length']\n >\n : Spec extends DiscriminatedSchema<Entity>\n ? ValueOf<{\n [K in Spec['discriminator']]: evaluate<\n ValueOf<{\n [V in keyof Extract<\n Spec,\n {\n discriminator: K\n }\n >['spec']]: Entity & {\n [k in K]: V\n } extends infer E extends Record<string, unknown>\n ? Extract<\n Extract<\n Spec,\n {\n discriminator: K\n }\n >['spec'],\n {\n [k in V]: unknown\n }\n >[V] extends infer S\n ? (\n S extends keyof E\n ? DistributivePick<\n E,\n S & keyof E\n >\n : S extends InputSpec<E>[]\n ? CompositeKeyParams<\n E,\n S,\n Config['allowPartial'] extends true\n ? 1\n : S['length']\n >\n : never\n ) extends infer P\n ? [P] extends [never]\n ? {\n [k in K]: V\n }\n : P & {\n [k in K]: V\n }\n : never\n : never\n : never\n }>\n >\n }>\n : never,\n NarrowEntity extends Entity = Entity & Attributes,\n Spec extends FullKeySpec<Entity> = Key extends keyof Schema\n ? Schema[Key]\n : never,\n >(\n key: Key & keyof Schema,\n attributes: Attributes,\n config?: Config,\n ) => Spec extends keyof Entity\n ? ValueOf<Attributes>\n : Spec extends FullKeySpecSimple<NarrowEntity>\n ? CompositeKeyBuilder<\n NarrowEntity,\n Spec,\n Separator,\n Exclude<Config['depth'], undefined>,\n Exclude<Config['allowPartial'], undefined>\n >\n : Spec extends DiscriminatedSchema<NarrowEntity>\n ? ValueOf<{\n [K in Spec['discriminator']]: {\n [V in keyof Spec['spec']]: Spec['spec'][V] extends keyof NarrowEntity\n ? Extract<\n NarrowEntity,\n {\n [k in K]: V\n }\n >[Spec['spec'][V]]\n : Spec['spec'][V] extends InputSpec<\n Extract<\n NarrowEntity,\n {\n [k in K]: V\n }\n >\n >[]\n ? CompositeKeyBuilder<\n Extract<\n NarrowEntity,\n {\n [k in K]: V\n }\n >,\n Spec['spec'][V],\n Separator,\n Exclude<Config['depth'], undefined>,\n Exclude<Config['allowPartial'], undefined>\n >\n : Spec['spec'][V] extends null\n ? undefined\n : never\n }[Extract<\n NarrowEntity,\n {\n [k in K]: unknown\n }\n >[K] &\n keyof Spec['spec']]\n }>\n : never\n infer: TableEntry<Entity, Schema, Separator>\n path: () => TableEntry<Entity, Schema, Separator>\n}\n\nexport const tableEntry =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<string, FullKeySpec<Entity>>,\n Separator extends string = '#',\n >(\n schema: Schema,\n separator: Separator = '#' as Separator,\n ): TableEntryDefinition<Entity, Schema, Separator> => {\n return {\n toEntry: toEntry<Entity>()(schema as never, separator) as never,\n fromEntry: fromEntry<Entity>()(schema),\n key: key<Entity>()(schema as never, separator) as never,\n infer: chainableNoOpProxy as TableEntry<Entity, Schema, Separator>,\n path: () =>\n createPathProxy<TableEntry<Entity, Schema, Separator>>(),\n }\n }\n"],"mappings":"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","names":["key"]}
|
package/dist/Rotorise.d.cts
CHANGED
|
@@ -92,16 +92,16 @@ type FullKeySpec<Entity extends Record<string, unknown>> = FullKeySpecSimple<Ent
|
|
|
92
92
|
type TableEntryDefinition<Entity extends Record<string, unknown>, Schema extends Record<string, FullKeySpec<Entity>>, Separator extends string = '#'> = {
|
|
93
93
|
toEntry: <const ExactEntity extends Exact<Entity, ExactEntity>>(item: ExactEntity) => ExactEntity extends infer E extends Entity ? Schema extends Record<string, FullKeySpec<E>> ? TableEntry<E, Schema, Separator> : never : never;
|
|
94
94
|
fromEntry: <const Entry extends TableEntry<Entity, Schema, Separator>>(entry: Entry) => DistributiveOmit<Entry, keyof Schema>;
|
|
95
|
-
key: <const Key extends
|
|
95
|
+
key: <const Key extends string, const Config extends IsLiteral<Spec> extends true ? never : {
|
|
96
96
|
depth?: number;
|
|
97
97
|
allowPartial?: boolean;
|
|
98
|
-
}, const Attributes extends
|
|
99
|
-
[K in
|
|
100
|
-
[V in keyof Extract<
|
|
98
|
+
}, const Attributes extends IsLiteral<Spec> extends true ? DistributivePick<Entity, Spec & keyof Entity> : Spec extends InputSpec<Entity>[] ? CompositeKeyParams<Entity, Spec, Config['allowPartial'] extends true ? 1 : Spec['length']> : Spec extends DiscriminatedSchema<Entity> ? ValueOf<{
|
|
99
|
+
[K in Spec['discriminator']]: evaluate<ValueOf<{
|
|
100
|
+
[V in keyof Extract<Spec, {
|
|
101
101
|
discriminator: K;
|
|
102
102
|
}>['spec']]: Entity & {
|
|
103
103
|
[k in K]: V;
|
|
104
|
-
} extends infer E extends Record<string, unknown> ? Extract<Extract<
|
|
104
|
+
} extends infer E extends Record<string, unknown> ? Extract<Extract<Spec, {
|
|
105
105
|
discriminator: K;
|
|
106
106
|
}>['spec'], {
|
|
107
107
|
[k in V]: unknown;
|
|
@@ -111,18 +111,18 @@ type TableEntryDefinition<Entity extends Record<string, unknown>, Schema extends
|
|
|
111
111
|
[k in K]: V;
|
|
112
112
|
} : never : never : never;
|
|
113
113
|
}>>;
|
|
114
|
-
}> : never>(key: Key, attributes: Attributes, config?: Config) =>
|
|
115
|
-
[K in
|
|
116
|
-
[V in keyof
|
|
114
|
+
}> : never, NarrowEntity extends Entity = Entity & Attributes, Spec extends FullKeySpec<Entity> = Key extends keyof Schema ? Schema[Key] : never>(key: Key & keyof Schema, attributes: Attributes, config?: Config) => Spec extends keyof Entity ? ValueOf<Attributes> : Spec extends FullKeySpecSimple<NarrowEntity> ? CompositeKeyBuilder<NarrowEntity, Spec, Separator, Exclude<Config['depth'], undefined>, Exclude<Config['allowPartial'], undefined>> : Spec extends DiscriminatedSchema<NarrowEntity> ? ValueOf<{
|
|
115
|
+
[K in Spec['discriminator']]: {
|
|
116
|
+
[V in keyof Spec['spec']]: Spec['spec'][V] extends keyof NarrowEntity ? Extract<NarrowEntity, {
|
|
117
117
|
[k in K]: V;
|
|
118
|
-
}>[
|
|
118
|
+
}>[Spec['spec'][V]] : Spec['spec'][V] extends InputSpec<Extract<NarrowEntity, {
|
|
119
119
|
[k in K]: V;
|
|
120
|
-
}>>[] ? CompositeKeyBuilder<Extract<
|
|
120
|
+
}>>[] ? CompositeKeyBuilder<Extract<NarrowEntity, {
|
|
121
121
|
[k in K]: V;
|
|
122
|
-
}>,
|
|
123
|
-
}[Extract<
|
|
122
|
+
}>, Spec['spec'][V], Separator, Exclude<Config['depth'], undefined>, Exclude<Config['allowPartial'], undefined>> : Spec['spec'][V] extends null ? undefined : never;
|
|
123
|
+
}[Extract<NarrowEntity, {
|
|
124
124
|
[k in K]: unknown;
|
|
125
|
-
}>[K] & keyof
|
|
125
|
+
}>[K] & keyof Spec['spec']];
|
|
126
126
|
}> : never;
|
|
127
127
|
infer: TableEntry<Entity, Schema, Separator>;
|
|
128
128
|
path: () => TableEntry<Entity, Schema, Separator>;
|
package/dist/Rotorise.d.ts
CHANGED
|
@@ -92,16 +92,16 @@ type FullKeySpec<Entity extends Record<string, unknown>> = FullKeySpecSimple<Ent
|
|
|
92
92
|
type TableEntryDefinition<Entity extends Record<string, unknown>, Schema extends Record<string, FullKeySpec<Entity>>, Separator extends string = '#'> = {
|
|
93
93
|
toEntry: <const ExactEntity extends Exact<Entity, ExactEntity>>(item: ExactEntity) => ExactEntity extends infer E extends Entity ? Schema extends Record<string, FullKeySpec<E>> ? TableEntry<E, Schema, Separator> : never : never;
|
|
94
94
|
fromEntry: <const Entry extends TableEntry<Entity, Schema, Separator>>(entry: Entry) => DistributiveOmit<Entry, keyof Schema>;
|
|
95
|
-
key: <const Key extends
|
|
95
|
+
key: <const Key extends string, const Config extends IsLiteral<Spec> extends true ? never : {
|
|
96
96
|
depth?: number;
|
|
97
97
|
allowPartial?: boolean;
|
|
98
|
-
}, const Attributes extends
|
|
99
|
-
[K in
|
|
100
|
-
[V in keyof Extract<
|
|
98
|
+
}, const Attributes extends IsLiteral<Spec> extends true ? DistributivePick<Entity, Spec & keyof Entity> : Spec extends InputSpec<Entity>[] ? CompositeKeyParams<Entity, Spec, Config['allowPartial'] extends true ? 1 : Spec['length']> : Spec extends DiscriminatedSchema<Entity> ? ValueOf<{
|
|
99
|
+
[K in Spec['discriminator']]: evaluate<ValueOf<{
|
|
100
|
+
[V in keyof Extract<Spec, {
|
|
101
101
|
discriminator: K;
|
|
102
102
|
}>['spec']]: Entity & {
|
|
103
103
|
[k in K]: V;
|
|
104
|
-
} extends infer E extends Record<string, unknown> ? Extract<Extract<
|
|
104
|
+
} extends infer E extends Record<string, unknown> ? Extract<Extract<Spec, {
|
|
105
105
|
discriminator: K;
|
|
106
106
|
}>['spec'], {
|
|
107
107
|
[k in V]: unknown;
|
|
@@ -111,18 +111,18 @@ type TableEntryDefinition<Entity extends Record<string, unknown>, Schema extends
|
|
|
111
111
|
[k in K]: V;
|
|
112
112
|
} : never : never : never;
|
|
113
113
|
}>>;
|
|
114
|
-
}> : never>(key: Key, attributes: Attributes, config?: Config) =>
|
|
115
|
-
[K in
|
|
116
|
-
[V in keyof
|
|
114
|
+
}> : never, NarrowEntity extends Entity = Entity & Attributes, Spec extends FullKeySpec<Entity> = Key extends keyof Schema ? Schema[Key] : never>(key: Key & keyof Schema, attributes: Attributes, config?: Config) => Spec extends keyof Entity ? ValueOf<Attributes> : Spec extends FullKeySpecSimple<NarrowEntity> ? CompositeKeyBuilder<NarrowEntity, Spec, Separator, Exclude<Config['depth'], undefined>, Exclude<Config['allowPartial'], undefined>> : Spec extends DiscriminatedSchema<NarrowEntity> ? ValueOf<{
|
|
115
|
+
[K in Spec['discriminator']]: {
|
|
116
|
+
[V in keyof Spec['spec']]: Spec['spec'][V] extends keyof NarrowEntity ? Extract<NarrowEntity, {
|
|
117
117
|
[k in K]: V;
|
|
118
|
-
}>[
|
|
118
|
+
}>[Spec['spec'][V]] : Spec['spec'][V] extends InputSpec<Extract<NarrowEntity, {
|
|
119
119
|
[k in K]: V;
|
|
120
|
-
}>>[] ? CompositeKeyBuilder<Extract<
|
|
120
|
+
}>>[] ? CompositeKeyBuilder<Extract<NarrowEntity, {
|
|
121
121
|
[k in K]: V;
|
|
122
|
-
}>,
|
|
123
|
-
}[Extract<
|
|
122
|
+
}>, Spec['spec'][V], Separator, Exclude<Config['depth'], undefined>, Exclude<Config['allowPartial'], undefined>> : Spec['spec'][V] extends null ? undefined : never;
|
|
123
|
+
}[Extract<NarrowEntity, {
|
|
124
124
|
[k in K]: unknown;
|
|
125
|
-
}>[K] & keyof
|
|
125
|
+
}>[K] & keyof Spec['spec']];
|
|
126
126
|
}> : never;
|
|
127
127
|
infer: TableEntry<Entity, Schema, Separator>;
|
|
128
128
|
path: () => TableEntry<Entity, Schema, Separator>;
|
package/dist/Rotorise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Rotorise.ts"],"sourcesContent":["type KeysOfUnion<ObjectType> = ObjectType extends unknown\n ? keyof ObjectType\n : never\ntype IsEqual<T, U> = (<G>() => G extends T ? 1 : 2) extends <G>() => G extends U\n ? 1\n : 2\n ? true\n : false\n\ntype ArrayElement<T> = T extends readonly unknown[] ? T[0] : never\n\ntype ExactObject<ParameterType, InputType> = {\n [Key in keyof ParameterType]: Exact<\n ParameterType[Key],\n Key extends keyof InputType ? InputType[Key] : never\n >\n} & Record<Exclude<keyof InputType, KeysOfUnion<ParameterType>>, never>\n\ntype Exact<ParameterType, InputType> = IsEqual<\n ParameterType,\n InputType\n> extends true\n ? ParameterType\n : // Convert union of array to array of union: A[] & B[] => (A & B)[]\n ParameterType extends unknown[]\n ? Array<Exact<ArrayElement<ParameterType>, ArrayElement<InputType>>>\n : // In TypeScript, Array is a subtype of ReadonlyArray, so always test Array before ReadonlyArray.\n ParameterType extends readonly unknown[]\n ? ReadonlyArray<\n Exact<ArrayElement<ParameterType>, ArrayElement<InputType>>\n >\n : ParameterType extends object\n ? ExactObject<ParameterType, InputType>\n : ParameterType\n\ntype ValueOf<\n ObjectType,\n ValueType extends keyof ObjectType = keyof ObjectType,\n> = ObjectType[ValueType]\n\nexport type evaluate<T> = T extends unknown\n ? { [K in keyof T]: T[K] } & unknown\n : never\n\ntype SliceFromStart<\n T extends unknown[],\n End extends number,\n Target extends unknown[] = [],\n> = T['length'] | End extends 0\n ? []\n : Target['length'] extends End\n ? Target\n : T extends [infer A, ...infer R]\n ? SliceFromStart<R, End, [...Target, A]>\n : never\n\ntype DistributivePick<T, K> = T extends unknown\n ? K extends keyof T\n ? Pick<T, K>\n : never\n : never\n\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown\n ? Omit<T, K>\n : never\n\ntype Slices<\n rest extends unknown[],\n minLength extends number = 0,\n slice extends unknown[] = [],\n passedSkip extends 1 | 0 = slice['length'] extends minLength ? 1 : 0,\n> =\n | (passedSkip extends 1 ? slice : never)\n | (rest extends [infer h, ...infer R]\n ? Slices<\n R,\n minLength,\n [...slice, h],\n [...slice, h]['length'] extends minLength ? 1 : passedSkip\n >\n : never)\n\nexport type CompositeKeyParams<\n Entity extends Record<string, unknown>,\n Spec extends InputSpec<Entity>[],\n skip extends number = 1,\n P extends InputSpec<Entity>[] = SliceFromStart<\n Spec,\n IsLiteral<skip> extends true ? skip : 1\n >,\n> = Entity extends unknown\n ? P extends unknown\n ? evaluate<\n {\n [K in extractHeadOrPass<P[number]> & string]: Entity[K]\n } & {\n [K in extractHeadOrPass<\n Exclude<Spec[number], P[number]>\n >]?: Entity[K & keyof Entity]\n }\n >\n : never\n : never\ntype IsLiteral<a> = [a] extends [null | undefined]\n ? true\n : [a] extends [string]\n ? string extends a\n ? false\n : true\n : [a] extends [number]\n ? number extends a\n ? false\n : true\n : [a] extends [boolean]\n ? boolean extends a\n ? false\n : true\n : [a] extends [symbol]\n ? symbol extends a\n ? false\n : true\n : [a] extends [bigint]\n ? bigint extends a\n ? false\n : true\n : false\n\nexport type CompositeKeyBuilder<\n Entity extends Record<string, unknown>,\n Spec extends InputSpec<Entity>[],\n Delimiter extends string = '#',\n Deep extends number = Spec['length'],\n isPartial extends boolean = false,\n> = Entity extends unknown\n ? CompositeKeyBuilderImpl<\n Entity,\n IsLiteral<Deep> extends true ? SliceFromStart<Spec, Deep> : Spec\n > extends infer Values extends joinablePair[]\n ? Join<\n isPartial & IsLiteral<isPartial> extends false\n ? Values\n : Slices<Values>,\n Delimiter\n >\n : never\n : never\n\ntype joinable = string | number | bigint | boolean | null | undefined\ntype joinablePair = [joinable, joinable]\n\ntype Join<\n Pairs extends joinablePair[],\n Delimiter extends string,\n> = Pairs extends [joinablePair]\n ? `${Pairs[0][0]}${Delimiter}${Pairs[0][1]}`\n : Pairs extends [joinablePair, ...infer Tail extends joinablePair[]]\n ? `${Pairs[0][0]}${Delimiter}${Pairs[0][1]}${Delimiter}${Join<\n Tail,\n Delimiter\n >}`\n : never\n\ntype CompositeKeyBuilderImpl<\n Entity extends Record<string, unknown>,\n Spec extends InputSpec<Entity>[],\n Pairs extends joinablePair[] = [],\n> = Spec extends [infer F, ...infer R extends InputSpec<Entity>[]]\n ? F extends keyof Entity & string\n ? Entity[F] extends joinable\n ? CompositeKeyBuilderImpl<\n Entity,\n R,\n [...Pairs, [Uppercase<F>, Entity[F]]]\n >\n : never\n : F extends [keyof Entity & string, (...x: (infer _)[]) => infer Tr]\n ? Tr extends joinable\n ? CompositeKeyBuilderImpl<\n Entity,\n R,\n [...Pairs, [Uppercase<F[0]>, Tr]]\n >\n : never\n : never\n : Pairs\n\nexport type TableEntry<\n Entity extends Record<string, unknown>,\n Schema extends Record<string, FullKeySpec<Entity>>,\n Delimiter extends string = '#',\n> = Entity extends unknown\n ? Entity & {\n [Key in keyof Schema]: Schema[Key] extends keyof Entity\n ? Entity[Schema[Key]]\n : Schema[Key] extends FullKeySpecSimple<Entity>\n ? CompositeKeyBuilder<Entity, Schema[Key], Delimiter>\n : Schema[Key] extends DiscriminatedSchema<Entity>\n ? ValueOf<{\n [K in Schema[Key]['discriminator']]: {\n [V in keyof Schema[Key]['spec']]: Schema[Key]['spec'][V] extends keyof Entity\n ? Extract<\n Entity,\n {\n [k in K]: V\n }\n >[Schema[Key]['spec'][V]]\n : Schema[Key]['spec'][V] extends InputSpec<\n Extract<\n Entity,\n {\n [k in K]: V\n }\n >\n >[]\n ? CompositeKeyBuilder<\n Extract<\n Entity,\n {\n [k in K]: V\n }\n >,\n Schema[Key]['spec'][V],\n Delimiter\n >\n : never\n }[Extract<\n Entity,\n {\n [k in K]: unknown\n }\n >[K] &\n keyof Schema[Key]['spec']]\n }>\n : never\n }\n : never\n\ntype Unionize<T extends object> = {\n [k in keyof T]: { k: k; v: T[k] }\n}[keyof T]\ntype KVPair = { k: PropertyKey; v: unknown }\n\ntype InputSpec<\n Entity extends Record<string, unknown>,\n KV extends KVPair = Unionize<Entity>,\n> = evaluate<\n {\n [key in keyof Entity]:\n | [key, (key: Extract<KV, { k: key }>['v']) => unknown]\n | key\n }[keyof Entity]\n>\n\ntype extractHeadOrPass<T> = T extends unknown[] ? T[0] : T\ntype numeric = number | bigint\ntype keysWithNumericValue<\n Entity extends object,\n KVs extends KVPair = Unionize<Entity>,\n K_wNumber extends PropertyKey = Extract<KVs, { v: numeric }>['k'],\n K_woNumber extends PropertyKey = Exclude<\n KVs,\n { k: K_wNumber; v: numeric }\n >['k'],\n> = Exclude<K_wNumber, K_woNumber>\n\ntype FullKeySpecSimple<Entity extends Record<string, unknown>> =\n | InputSpec<Entity>[]\n | (keysWithNumericValue<Entity> & keyof Entity)\n\ntype entries =\n | { a: 'a1'; b: 1n; c: true; z: '1' }\n | { a: 'a2'; b: 2; c: 0; z: '2' }\n\ntype DiscriminatedSchema<\n Entity extends Record<string, unknown>,\n KVs extends KVPair = Unionize<\n Pick<Entity, keyof Entity> /* Pick common keys */\n >,\n KVs_ extends { k: PropertyKey; v: PropertyKey } = Extract<\n KVs,\n { v: PropertyKey }\n >,\n> = KVs_ extends unknown\n ? {\n discriminator: KVs_['k']\n spec: {\n [val in KVs_['v']]: FullKeySpecSimple<\n Extract<\n Entity,\n {\n [k in KVs_['k']]: val\n }\n >\n > | null\n }\n }\n : never\n\ntype FullKeySpec<Entity extends Record<string, unknown>> =\n | FullKeySpecSimple<Entity>\n | DiscriminatedSchema<Entity>\n\ntype t = DiscriminatedSchema<entries>\n\ntype R = ValueOf<{\n [K in t['discriminator']]: evaluate<\n ValueOf<{\n [V in keyof Extract<t, { discriminator: K }>['spec']]: {\n narrow: {\n [k in K]: V\n }\n spec: Extract<\n Extract<t, { discriminator: K }>['spec'],\n { [k in V]: unknown }\n >[V]\n }\n }>\n >\n}>\n\nconst chainableNoOpProxy: unknown = new Proxy(() => chainableNoOpProxy, {\n get: () => chainableNoOpProxy,\n})\n\nconst createPathProxy = <T>(path = ''): T => {\n return new Proxy(() => {}, {\n get: (target, prop, receiver) => {\n if (typeof prop === 'string') {\n if (prop === 'toString') {\n return () => path\n }\n\n return createPathProxy(\n path === ''\n ? prop\n : !Number.isNaN(Number.parseInt(prop))\n ? `${path}[${prop}]`\n : `${path}.${prop}`,\n )\n }\n },\n }) as T\n}\n\nconst key =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<\n string,\n | InputSpec<Entity>[]\n | keyof Entity\n | {\n discriminator: keyof Entity\n spec: {\n [val in string]: InputSpec<Entity>[] | keyof Entity | null\n }\n }\n >,\n Separator extends string = '#',\n >(\n schema: Schema,\n separator: Separator = '#' as Separator,\n ) =>\n <\n const Key extends keyof Schema,\n const Config extends { depth?: number; allowPartial?: boolean },\n const Attributes extends Partial<Entity>,\n >(\n key: Key,\n attributes: Attributes,\n config?: Config,\n ): string | undefined => {\n const case_ = schema[key]\n\n if (case_ === undefined) {\n throw new Error(`Key ${key.toString()} not found in schema`)\n }\n let structure: InputSpec<Entity>[]\n\n if (Array.isArray(case_)) {\n structure = case_\n } else if (typeof case_ === 'object') {\n const discriminator =\n attributes[case_.discriminator as keyof Attributes]\n if (discriminator === undefined) {\n throw new Error(\n `Discriminator ${case_.discriminator.toString()} not found in ${JSON.stringify(attributes)}`,\n )\n }\n const val = case_.spec[discriminator as keyof typeof case_.spec]\n if (val === undefined) {\n throw new Error(\n `Discriminator value ${discriminator?.toString()} not found in ${JSON.stringify(attributes)}`,\n )\n }\n if (val === null) {\n return undefined\n }\n\n if (!Array.isArray(val)) {\n return attributes[val as keyof Attributes] as never\n }\n\n structure = val\n } else {\n return attributes[case_ as keyof Attributes] as never\n }\n\n if (config?.depth !== undefined) {\n structure = structure.slice(0, config.depth) as never\n }\n const composite: string[] = []\n\n for (const keySpec of structure) {\n const [key, transform] = Array.isArray(keySpec)\n ? keySpec\n : [keySpec]\n const value = attributes[key as keyof Attributes]\n if (value !== undefined && value !== null && value !== '') {\n composite.push(key.toString().toUpperCase())\n composite.push(\n `${transform ? transform(value as never) : value}`,\n )\n } else if (config?.allowPartial) {\n break\n } else {\n throw new Error(\n `buildCompositeKey: Attribute ${key.toString()} not found in ${JSON.stringify(attributes)}`,\n )\n }\n }\n\n return composite.join(separator) as never\n }\n\nconst toEntry =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<\n string,\n | InputSpec<Entity>[]\n | keyof Entity\n | {\n discriminator: keyof Entity\n spec: {\n [val in string]: InputSpec<Entity>[] | keyof Entity | null\n }\n }\n >,\n Separator extends string = '#',\n >(\n schema: Schema,\n separator: Separator = '#' as Separator,\n ) =>\n <const ExactEntity extends Entity>(\n item: ExactEntity,\n ): ExactEntity extends infer E extends Entity\n ? Schema extends Record<string, FullKeySpec<E>>\n ? TableEntry<E, Schema, Separator>\n : never\n : never => {\n const entry = { ...item }\n\n for (const key_ in schema) {\n const val = key<Entity>()(schema, separator)(key_, item)\n if (val !== undefined) {\n entry[key_] = val satisfies string as never\n }\n }\n // console.log({ entry })\n return entry as never\n }\n\nconst fromEntry =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<string, FullKeySpec<Entity>>,\n Separator extends string = '#',\n >(\n schema: Schema,\n ) =>\n <const Entry extends TableEntry<Entity, Schema, Separator>>(\n entry: Entry,\n ): DistributiveOmit<Entry, keyof Schema> => {\n const item = { ...entry }\n\n for (const key_ in schema) {\n delete item[key_]\n }\n // console.log({ item })\n return item as never\n }\n\ntype TableEntryDefinition<\n Entity extends Record<string, unknown>,\n Schema extends Record<string, FullKeySpec<Entity>>,\n Separator extends string = '#',\n> = {\n toEntry: <const ExactEntity extends Exact<Entity, ExactEntity>>(\n item: ExactEntity,\n ) => ExactEntity extends infer E extends Entity\n ? Schema extends Record<string, FullKeySpec<E>>\n ? TableEntry<E, Schema, Separator>\n : never\n : never\n fromEntry: <const Entry extends TableEntry<Entity, Schema, Separator>>(\n entry: Entry,\n ) => DistributiveOmit<Entry, keyof Schema>\n key: <\n const Key extends keyof Schema,\n const Config extends Schema[Key] extends keyof Entity\n ? never\n : { depth?: number; allowPartial?: boolean },\n const Attributes extends Schema[Key] extends keyof Entity\n ? DistributivePick<Entity, Schema[Key] & keyof Entity>\n : Schema[Key] extends InputSpec<Entity>[]\n ? CompositeKeyParams<\n Entity,\n Schema[Key],\n Config['allowPartial'] extends true\n ? 1\n : Schema[Key]['length']\n >\n : Schema[Key] extends DiscriminatedSchema<Entity>\n ? ValueOf<{\n [K in Schema[Key]['discriminator']]: evaluate<\n ValueOf<{\n [V in keyof Extract<\n Schema[Key],\n { discriminator: K }\n >['spec']]: Entity & {\n [k in K]: V\n } extends infer E extends Record<string, unknown>\n ? Extract<\n Extract<\n Schema[Key],\n { discriminator: K }\n >['spec'],\n { [k in V]: unknown }\n >[V] extends infer S\n ? (\n S extends keyof E\n ? DistributivePick<\n E,\n S & keyof E\n >\n : S extends InputSpec<E>[]\n ? CompositeKeyParams<\n E,\n S,\n Config['allowPartial'] extends true\n ? 1\n : S['length']\n >\n : never\n ) extends infer P\n ? [P] extends [never]\n ? {\n [k in K]: V\n }\n : P & {\n [k in K]: V\n }\n : never\n : never\n : never\n }>\n >\n }>\n : never,\n >(\n key: Key,\n attributes: Attributes,\n config?: Config,\n ) => Schema[Key] extends keyof Entity\n ? ValueOf<Attributes>\n : Schema[Key] extends FullKeySpecSimple<Entity & Attributes>\n ? CompositeKeyBuilder<\n Entity & Attributes,\n Schema[Key],\n Separator,\n Exclude<Config['depth'], undefined>,\n Exclude<Config['allowPartial'], undefined>\n >\n : Schema[Key] extends DiscriminatedSchema<Entity>\n ? ValueOf<{\n [K in Schema[Key]['discriminator']]: {\n [V in keyof Schema[Key]['spec']]: Schema[Key]['spec'][V] extends keyof Entity\n ? Extract<\n Entity,\n {\n [k in K]: V\n }\n >[Schema[Key]['spec'][V]]\n : Schema[Key]['spec'][V] extends InputSpec<\n Extract<\n Entity,\n {\n [k in K]: V\n }\n >\n >[]\n ? CompositeKeyBuilder<\n Extract<\n Entity,\n {\n [k in K]: V\n }\n >,\n Schema[Key]['spec'][V],\n Separator,\n Exclude<Config['depth'], undefined>,\n Exclude<Config['allowPartial'], undefined>\n >\n : Schema[Key]['spec'][V] extends null\n ? undefined\n : never\n }[Extract<\n Entity & Attributes,\n {\n [k in K]: unknown\n }\n >[K] &\n keyof Schema[Key]['spec']]\n }>\n : never\n\n infer: TableEntry<Entity, Schema, Separator>\n path: () => TableEntry<Entity, Schema, Separator>\n}\n\nexport const tableEntry =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<string, FullKeySpec<Entity>>,\n Separator extends string = '#',\n >(\n schema: Schema,\n separator: Separator = '#' as Separator,\n ): TableEntryDefinition<Entity, Schema, Separator> => {\n return {\n toEntry: toEntry<Entity>()(schema as never, separator) as never,\n fromEntry: fromEntry<Entity>()(schema),\n key: key<Entity>()(schema as never, separator) as never,\n infer: chainableNoOpProxy as TableEntry<Entity, Schema, Separator>,\n path: () =>\n createPathProxy<TableEntry<Entity, Schema, Separator>>(),\n }\n }\n"],"mappings":"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","names":["key"]}
|
|
1
|
+
{"version":3,"sources":["../src/Rotorise.ts"],"sourcesContent":["type KeysOfUnion<ObjectType> = ObjectType extends unknown\n ? keyof ObjectType\n : never\ntype IsEqual<T, U> = (<G>() => G extends T ? 1 : 2) extends <G>() => G extends U\n ? 1\n : 2\n ? true\n : false\n\ntype ArrayElement<T> = T extends readonly unknown[] ? T[0] : never\n\ntype ExactObject<ParameterType, InputType> = {\n [Key in keyof ParameterType]: Exact<\n ParameterType[Key],\n Key extends keyof InputType ? InputType[Key] : never\n >\n} & Record<Exclude<keyof InputType, KeysOfUnion<ParameterType>>, never>\n\ntype Exact<ParameterType, InputType> = IsEqual<\n ParameterType,\n InputType\n> extends true\n ? ParameterType\n : // Convert union of array to array of union: A[] & B[] => (A & B)[]\n ParameterType extends unknown[]\n ? Array<Exact<ArrayElement<ParameterType>, ArrayElement<InputType>>>\n : // In TypeScript, Array is a subtype of ReadonlyArray, so always test Array before ReadonlyArray.\n ParameterType extends readonly unknown[]\n ? ReadonlyArray<\n Exact<ArrayElement<ParameterType>, ArrayElement<InputType>>\n >\n : ParameterType extends object\n ? ExactObject<ParameterType, InputType>\n : ParameterType\n\ntype ValueOf<\n ObjectType,\n ValueType extends keyof ObjectType = keyof ObjectType,\n> = ObjectType[ValueType]\n\nexport type evaluate<T> = T extends unknown\n ? { [K in keyof T]: T[K] } & unknown\n : never\n\ntype SliceFromStart<\n T extends unknown[],\n End extends number,\n Target extends unknown[] = [],\n> = T['length'] | End extends 0\n ? []\n : Target['length'] extends End\n ? Target\n : T extends [infer A, ...infer R]\n ? SliceFromStart<R, End, [...Target, A]>\n : never\n\ntype DistributivePick<T, K> = T extends unknown\n ? K extends keyof T\n ? Pick<T, K>\n : never\n : never\n\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown\n ? Omit<T, K>\n : never\n\ntype Slices<\n rest extends unknown[],\n minLength extends number = 0,\n slice extends unknown[] = [],\n passedSkip extends 1 | 0 = slice['length'] extends minLength ? 1 : 0,\n> =\n | (passedSkip extends 1 ? slice : never)\n | (rest extends [infer h, ...infer R]\n ? Slices<\n R,\n minLength,\n [...slice, h],\n [...slice, h]['length'] extends minLength ? 1 : passedSkip\n >\n : never)\n\nexport type CompositeKeyParams<\n Entity extends Record<string, unknown>,\n Spec extends InputSpec<Entity>[],\n skip extends number = 1,\n P extends InputSpec<Entity>[] = SliceFromStart<\n Spec,\n IsLiteral<skip> extends true ? skip : 1\n >,\n> = Entity extends unknown\n ? P extends unknown\n ? evaluate<\n {\n [K in extractHeadOrPass<P[number]> & string]: Entity[K]\n } & {\n [K in extractHeadOrPass<\n Exclude<Spec[number], P[number]>\n >]?: Entity[K & keyof Entity]\n }\n >\n : never\n : never\ntype IsLiteral<a> = [a] extends [null | undefined]\n ? true\n : [a] extends [string]\n ? string extends a\n ? false\n : true\n : [a] extends [number]\n ? number extends a\n ? false\n : true\n : [a] extends [boolean]\n ? boolean extends a\n ? false\n : true\n : [a] extends [symbol]\n ? symbol extends a\n ? false\n : true\n : [a] extends [bigint]\n ? bigint extends a\n ? false\n : true\n : false\n\nexport type CompositeKeyBuilder<\n Entity extends Record<string, unknown>,\n Spec extends InputSpec<Entity>[],\n Delimiter extends string = '#',\n Deep extends number = Spec['length'],\n isPartial extends boolean = false,\n> = Entity extends unknown\n ? CompositeKeyBuilderImpl<\n Entity,\n IsLiteral<Deep> extends true ? SliceFromStart<Spec, Deep> : Spec\n > extends infer Values extends joinablePair[]\n ? Join<\n isPartial & IsLiteral<isPartial> extends false\n ? Values\n : Slices<Values>,\n Delimiter\n >\n : never\n : never\n\ntype joinable = string | number | bigint | boolean | null | undefined\ntype joinablePair = [joinable, joinable]\n\ntype Join<\n Pairs extends joinablePair[],\n Delimiter extends string,\n> = Pairs extends [joinablePair]\n ? `${Pairs[0][0]}${Delimiter}${Pairs[0][1]}`\n : Pairs extends [joinablePair, ...infer Tail extends joinablePair[]]\n ? `${Pairs[0][0]}${Delimiter}${Pairs[0][1]}${Delimiter}${Join<\n Tail,\n Delimiter\n >}`\n : never\n\ntype CompositeKeyBuilderImpl<\n Entity extends Record<string, unknown>,\n Spec extends InputSpec<Entity>[],\n Pairs extends joinablePair[] = [],\n> = Spec extends [infer F, ...infer R extends InputSpec<Entity>[]]\n ? F extends keyof Entity & string\n ? Entity[F] extends joinable\n ? CompositeKeyBuilderImpl<\n Entity,\n R,\n [...Pairs, [Uppercase<F>, Entity[F]]]\n >\n : never\n : F extends [keyof Entity & string, (...x: (infer _)[]) => infer Tr]\n ? Tr extends joinable\n ? CompositeKeyBuilderImpl<\n Entity,\n R,\n [...Pairs, [Uppercase<F[0]>, Tr]]\n >\n : never\n : never\n : Pairs\n\nexport type TableEntry<\n Entity extends Record<string, unknown>,\n Schema extends Record<string, FullKeySpec<Entity>>,\n Delimiter extends string = '#',\n> = Entity extends unknown\n ? Entity & {\n [Key in keyof Schema]: Schema[Key] extends keyof Entity\n ? Entity[Schema[Key]]\n : Schema[Key] extends FullKeySpecSimple<Entity>\n ? CompositeKeyBuilder<Entity, Schema[Key], Delimiter>\n : Schema[Key] extends DiscriminatedSchema<Entity>\n ? ValueOf<{\n [K in Schema[Key]['discriminator']]: {\n [V in keyof Schema[Key]['spec']]: Schema[Key]['spec'][V] extends keyof Entity\n ? Extract<\n Entity,\n {\n [k in K]: V\n }\n >[Schema[Key]['spec'][V]]\n : Schema[Key]['spec'][V] extends InputSpec<\n Extract<\n Entity,\n {\n [k in K]: V\n }\n >\n >[]\n ? CompositeKeyBuilder<\n Extract<\n Entity,\n {\n [k in K]: V\n }\n >,\n Schema[Key]['spec'][V],\n Delimiter\n >\n : never\n }[Extract<\n Entity,\n {\n [k in K]: unknown\n }\n >[K] &\n keyof Schema[Key]['spec']]\n }>\n : never\n }\n : never\n\ntype Unionize<T extends object> = {\n [k in keyof T]: { k: k; v: T[k] }\n}[keyof T]\ntype KVPair = { k: PropertyKey; v: unknown }\n\ntype InputSpec<\n Entity extends Record<string, unknown>,\n KV extends KVPair = Unionize<Entity>,\n> = evaluate<\n {\n [key in keyof Entity]:\n | [key, (key: Extract<KV, { k: key }>['v']) => unknown]\n | key\n }[keyof Entity]\n>\n\ntype extractHeadOrPass<T> = T extends unknown[] ? T[0] : T\ntype numeric = number | bigint\ntype keysWithNumericValue<\n Entity extends object,\n KVs extends KVPair = Unionize<Entity>,\n K_wNumber extends PropertyKey = Extract<KVs, { v: numeric }>['k'],\n K_woNumber extends PropertyKey = Exclude<\n KVs,\n { k: K_wNumber; v: numeric }\n >['k'],\n> = Exclude<K_wNumber, K_woNumber>\n\ntype FullKeySpecSimple<Entity extends Record<string, unknown>> =\n | InputSpec<Entity>[]\n | (keysWithNumericValue<Entity> & keyof Entity)\n\ntype entries =\n | { a: 'a1'; b: 1n; c: true; z: '1' }\n | { a: 'a2'; b: 2; c: 0; z: '2' }\n\ntype DiscriminatedSchema<\n Entity extends Record<string, unknown>,\n KVs extends KVPair = Unionize<\n Pick<Entity, keyof Entity> /* Pick common keys */\n >,\n KVs_ extends { k: PropertyKey; v: PropertyKey } = Extract<\n KVs,\n { v: PropertyKey }\n >,\n> = KVs_ extends unknown\n ? {\n discriminator: KVs_['k']\n spec: {\n [val in KVs_['v']]: FullKeySpecSimple<\n Extract<\n Entity,\n {\n [k in KVs_['k']]: val\n }\n >\n > | null\n }\n }\n : never\n\ntype FullKeySpec<Entity extends Record<string, unknown>> =\n | FullKeySpecSimple<Entity>\n | DiscriminatedSchema<Entity>\n\ntype t = DiscriminatedSchema<entries>\n\ntype R = ValueOf<{\n [K in t['discriminator']]: evaluate<\n ValueOf<{\n [V in keyof Extract<t, { discriminator: K }>['spec']]: {\n narrow: {\n [k in K]: V\n }\n spec: Extract<\n Extract<t, { discriminator: K }>['spec'],\n { [k in V]: unknown }\n >[V]\n }\n }>\n >\n}>\n\nconst chainableNoOpProxy: unknown = new Proxy(() => chainableNoOpProxy, {\n get: () => chainableNoOpProxy,\n})\n\nconst createPathProxy = <T>(path = ''): T => {\n return new Proxy(() => {}, {\n get: (target, prop, receiver) => {\n if (typeof prop === 'string') {\n if (prop === 'toString') {\n return () => path\n }\n\n return createPathProxy(\n path === ''\n ? prop\n : !Number.isNaN(Number.parseInt(prop))\n ? `${path}[${prop}]`\n : `${path}.${prop}`,\n )\n }\n },\n }) as T\n}\n\nconst key =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<\n string,\n | InputSpec<Entity>[]\n | keyof Entity\n | {\n discriminator: keyof Entity\n spec: {\n [val in string]: InputSpec<Entity>[] | keyof Entity | null\n }\n }\n >,\n Separator extends string = '#',\n >(\n schema: Schema,\n separator: Separator = '#' as Separator,\n ) =>\n <\n const Key extends keyof Schema,\n const Config extends { depth?: number; allowPartial?: boolean },\n const Attributes extends Partial<Entity>,\n >(\n key: Key,\n attributes: Attributes,\n config?: Config,\n ): string | undefined => {\n const case_ = schema[key]\n\n if (case_ === undefined) {\n throw new Error(`Key ${key.toString()} not found in schema`)\n }\n let structure: InputSpec<Entity>[]\n\n if (Array.isArray(case_)) {\n structure = case_\n } else if (typeof case_ === 'object') {\n const discriminator =\n attributes[case_.discriminator as keyof Attributes]\n if (discriminator === undefined) {\n throw new Error(\n `Discriminator ${case_.discriminator.toString()} not found in ${JSON.stringify(attributes)}`,\n )\n }\n const val = case_.spec[discriminator as keyof typeof case_.spec]\n if (val === undefined) {\n throw new Error(\n `Discriminator value ${discriminator?.toString()} not found in ${JSON.stringify(attributes)}`,\n )\n }\n if (val === null) {\n return undefined\n }\n\n if (!Array.isArray(val)) {\n return attributes[val as keyof Attributes] as never\n }\n\n structure = val\n } else {\n return attributes[case_ as keyof Attributes] as never\n }\n\n if (config?.depth !== undefined) {\n structure = structure.slice(0, config.depth) as never\n }\n const composite: string[] = []\n\n for (const keySpec of structure) {\n const [key, transform] = Array.isArray(keySpec)\n ? keySpec\n : [keySpec]\n const value = attributes[key as keyof Attributes]\n if (value !== undefined && value !== null && value !== '') {\n composite.push(key.toString().toUpperCase())\n composite.push(\n `${transform ? transform(value as never) : value}`,\n )\n } else if (config?.allowPartial) {\n break\n } else {\n throw new Error(\n `buildCompositeKey: Attribute ${key.toString()} not found in ${JSON.stringify(attributes)}`,\n )\n }\n }\n\n return composite.join(separator) as never\n }\n\nconst toEntry =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<\n string,\n | InputSpec<Entity>[]\n | keyof Entity\n | {\n discriminator: keyof Entity\n spec: {\n [val in string]: InputSpec<Entity>[] | keyof Entity | null\n }\n }\n >,\n Separator extends string = '#',\n >(\n schema: Schema,\n separator: Separator = '#' as Separator,\n ) =>\n <const ExactEntity extends Entity>(\n item: ExactEntity,\n ): ExactEntity extends infer E extends Entity\n ? Schema extends Record<string, FullKeySpec<E>>\n ? TableEntry<E, Schema, Separator>\n : never\n : never => {\n const entry = { ...item }\n\n for (const key_ in schema) {\n const val = key<Entity>()(schema, separator)(key_, item)\n if (val !== undefined) {\n entry[key_] = val satisfies string as never\n }\n }\n // console.log({ entry })\n return entry as never\n }\n\nconst fromEntry =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<string, FullKeySpec<Entity>>,\n Separator extends string = '#',\n >(\n schema: Schema,\n ) =>\n <const Entry extends TableEntry<Entity, Schema, Separator>>(\n entry: Entry,\n ): DistributiveOmit<Entry, keyof Schema> => {\n const item = { ...entry }\n\n for (const key_ in schema) {\n delete item[key_]\n }\n // console.log({ item })\n return item as never\n }\n\ntype TableEntryDefinition<\n Entity extends Record<string, unknown>,\n Schema extends Record<string, FullKeySpec<Entity>>,\n Separator extends string = '#',\n> = {\n toEntry: <const ExactEntity extends Exact<Entity, ExactEntity>>(\n item: ExactEntity,\n ) => ExactEntity extends infer E extends Entity\n ? Schema extends Record<string, FullKeySpec<E>>\n ? TableEntry<E, Schema, Separator>\n : never\n : never\n fromEntry: <const Entry extends TableEntry<Entity, Schema, Separator>>(\n entry: Entry,\n ) => DistributiveOmit<Entry, keyof Schema>\n key: <\n const Key extends string,\n const Config extends IsLiteral<Spec> extends true\n ? never\n : {\n depth?: number\n allowPartial?: boolean\n },\n const Attributes extends IsLiteral<Spec> extends true\n ? DistributivePick<Entity, Spec & keyof Entity>\n : Spec extends InputSpec<Entity>[]\n ? CompositeKeyParams<\n Entity,\n Spec,\n Config['allowPartial'] extends true ? 1 : Spec['length']\n >\n : Spec extends DiscriminatedSchema<Entity>\n ? ValueOf<{\n [K in Spec['discriminator']]: evaluate<\n ValueOf<{\n [V in keyof Extract<\n Spec,\n {\n discriminator: K\n }\n >['spec']]: Entity & {\n [k in K]: V\n } extends infer E extends Record<string, unknown>\n ? Extract<\n Extract<\n Spec,\n {\n discriminator: K\n }\n >['spec'],\n {\n [k in V]: unknown\n }\n >[V] extends infer S\n ? (\n S extends keyof E\n ? DistributivePick<\n E,\n S & keyof E\n >\n : S extends InputSpec<E>[]\n ? CompositeKeyParams<\n E,\n S,\n Config['allowPartial'] extends true\n ? 1\n : S['length']\n >\n : never\n ) extends infer P\n ? [P] extends [never]\n ? {\n [k in K]: V\n }\n : P & {\n [k in K]: V\n }\n : never\n : never\n : never\n }>\n >\n }>\n : never,\n NarrowEntity extends Entity = Entity & Attributes,\n Spec extends FullKeySpec<Entity> = Key extends keyof Schema\n ? Schema[Key]\n : never,\n >(\n key: Key & keyof Schema,\n attributes: Attributes,\n config?: Config,\n ) => Spec extends keyof Entity\n ? ValueOf<Attributes>\n : Spec extends FullKeySpecSimple<NarrowEntity>\n ? CompositeKeyBuilder<\n NarrowEntity,\n Spec,\n Separator,\n Exclude<Config['depth'], undefined>,\n Exclude<Config['allowPartial'], undefined>\n >\n : Spec extends DiscriminatedSchema<NarrowEntity>\n ? ValueOf<{\n [K in Spec['discriminator']]: {\n [V in keyof Spec['spec']]: Spec['spec'][V] extends keyof NarrowEntity\n ? Extract<\n NarrowEntity,\n {\n [k in K]: V\n }\n >[Spec['spec'][V]]\n : Spec['spec'][V] extends InputSpec<\n Extract<\n NarrowEntity,\n {\n [k in K]: V\n }\n >\n >[]\n ? CompositeKeyBuilder<\n Extract<\n NarrowEntity,\n {\n [k in K]: V\n }\n >,\n Spec['spec'][V],\n Separator,\n Exclude<Config['depth'], undefined>,\n Exclude<Config['allowPartial'], undefined>\n >\n : Spec['spec'][V] extends null\n ? undefined\n : never\n }[Extract<\n NarrowEntity,\n {\n [k in K]: unknown\n }\n >[K] &\n keyof Spec['spec']]\n }>\n : never\n infer: TableEntry<Entity, Schema, Separator>\n path: () => TableEntry<Entity, Schema, Separator>\n}\n\nexport const tableEntry =\n <const Entity extends Record<string, unknown>>() =>\n <\n const Schema extends Record<string, FullKeySpec<Entity>>,\n Separator extends string = '#',\n >(\n schema: Schema,\n separator: Separator = '#' as Separator,\n ): TableEntryDefinition<Entity, Schema, Separator> => {\n return {\n toEntry: toEntry<Entity>()(schema as never, separator) as never,\n fromEntry: fromEntry<Entity>()(schema),\n key: key<Entity>()(schema as never, separator) as never,\n infer: chainableNoOpProxy as TableEntry<Entity, Schema, Separator>,\n path: () =>\n createPathProxy<TableEntry<Entity, Schema, Separator>>(),\n }\n }\n"],"mappings":"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","names":["key"]}
|