import type { Entity } from '../../../entity/index.js'; import type { Always, AnyOfSchema, AnySchema, ItemSchema, ItemUnextendedValue, ListExtendedValue, ListSchema, MapExtendedValue, MapSchema, Never, NumberExtendedValue, NumberSchema, Paths, PrimitiveSchema, RecordExtendedValue, RecordSchema, ResolveAnySchema, ResolvePrimitiveSchema, ResolveStringSchema, Schema, SchemaExtendedValue, SetExtendedValue, SetSchema, ValidValue } from '../../../schema/index.js'; import type { Extends, If, Not, Optional, Overwrite } from '../../../types/index.js'; import type { $ADD, $APPEND, $DELETE, $GET, $PREPEND, $REMOVE, $SET, $SUBTRACT, $SUM, ADD, APPEND, DELETE, Extended, GET, PREPEND, REMOVE, SET, SUBTRACT, SUM, Unextended } from './symbols/index.js'; export type ReferenceExtension = { type: '*'; value: Extended<{ [$GET]: [ref: string, fallback?: SchemaExtendedValue]; }>; }; export type UpdateItemInputExtension = ReferenceExtension | { type: '*'; value: Extended<{ [$REMOVE]: true; }>; } | { type: 'number'; value: Extended<{ [$ADD]: number; }> | Extended<{ [$SUM]: [ NumberExtendedValue, NumberExtendedValue ]; }> | Extended<{ [$SUBTRACT]: [ NumberExtendedValue, NumberExtendedValue ]; }>; } | { type: 'set'; value: Extended<{ [$ADD]: SetExtendedValue; } | { [$DELETE]: SetExtendedValue; }>; } | { type: 'list'; value: Unextended<{ [INDEX in number]: SchemaExtendedValue | undefined; }> | Extended<{ [$SET]: ListExtendedValue; }> | Extended<{ [$APPEND]: SchemaExtendedValue | SchemaExtendedValue[]; } | { [$PREPEND]: SchemaExtendedValue | SchemaExtendedValue[]; }>; } | { type: 'map'; value: Extended<{ [$SET]: MapExtendedValue; }>; } | { type: 'record'; value: Extended<{ [$SET]: RecordExtendedValue; }>; }; /** * User input of an UPDATE command for a given Entity or Schema * * @param Schema Entity | Schema * @param RequireDefaults Boolean * @return Object */ export type UpdateItemInput = Entity extends SCHEMA ? ItemUnextendedValue : UpdateValueInput; interface UpdateInputOptions { filled?: boolean; defined?: boolean; extended?: boolean; } type MustBeDefined = If, true, If, Extends, If>, false, If, Not>, Not>>>>>; type IsExtended = Not>; type OptionalKeys = { [KEY in keyof SCHEMA['attributes']]: If, never, KEY>; }[keyof SCHEMA['attributes']]; type CanBeRemoved = Extends; export type Reference = GET<[ ref: AVAILABLE_PATHS, fallback?: ValidValue | Reference ]>; type NumberUpdate = number | (SCHEMA['props'] extends { big: true; } ? bigint : never); /** * User input of an UPDATE command for a given Schema * * @param Schema Schema * @param RequireDefaults Boolean * @return Any */ export type UpdateValueInput = Schema extends SCHEMA ? SchemaExtendedValue | undefined : SCHEMA extends ItemSchema ? Optional<{ [KEY in keyof SCHEMA['attributes']]: UpdateValueInput, Paths>; }, OptionalKeys>> : If, never, undefined> | If, If, REMOVE, never> | GET<[ ref: AVAILABLE_PATHS, fallback?: ValidValue | Reference ]>> | (SCHEMA extends AnySchema ? ResolveAnySchema | unknown : never) | (SCHEMA extends PrimitiveSchema ? ResolvePrimitiveSchema : never) | (SCHEMA extends NumberSchema ? If, ADD> | SUM | GET<[ ref: AVAILABLE_PATHS, fallback?: NumberUpdate | Reference ]>, NumberUpdate | GET<[ ref: AVAILABLE_PATHS, fallback?: NumberUpdate | Reference ]>> | SUBTRACT | GET<[ ref: AVAILABLE_PATHS, fallback?: NumberUpdate | Reference ]>, NumberUpdate | GET<[ ref: AVAILABLE_PATHS, fallback?: NumberUpdate | Reference ]>>> : never) | (SCHEMA extends SetSchema ? Unextended>> | If, ADD>> | DELETE>>> : never) | (SCHEMA extends ListSchema ? Unextended<{ [INDEX in number]?: UpdateValueInput, AVAILABLE_PATHS> | REMOVE; }> | If, SET[]> | APPEND[] | Reference ]> | ValidValue[]> | PREPEND[] | Reference ]> | ValidValue[]>> : never) | (SCHEMA extends MapSchema ? Unextended, AVAILABLE_PATHS>; }, OptionalKeys>>> | If, SET>> : never) | (SCHEMA extends RecordSchema ? Unextended<{ [KEY in ResolveStringSchema]?: UpdateValueInput, AVAILABLE_PATHS> | REMOVE; }> | If, SET>> : never) | (SCHEMA extends AnyOfSchema ? UpdateValueInput : never); export {};