@signalium/query 0.0.0 → 0.0.2

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.
Files changed (95) hide show
  1. package/.turbo/turbo-build.log +12 -0
  2. package/CHANGELOG.md +17 -0
  3. package/dist/cjs/EntityMap.js +46 -0
  4. package/dist/cjs/EntityMap.js.map +1 -0
  5. package/dist/cjs/QueryClient.js +368 -0
  6. package/dist/cjs/QueryClient.js.map +1 -0
  7. package/dist/cjs/QueryStore.js +222 -0
  8. package/dist/cjs/QueryStore.js.map +1 -0
  9. package/dist/cjs/errors.js +105 -0
  10. package/dist/cjs/errors.js.map +1 -0
  11. package/dist/cjs/index.js +24 -0
  12. package/dist/cjs/index.js.map +1 -0
  13. package/dist/cjs/parseEntities.js +127 -0
  14. package/dist/cjs/parseEntities.js.map +1 -0
  15. package/dist/cjs/pathInterpolator.js +69 -0
  16. package/dist/cjs/pathInterpolator.js.map +1 -0
  17. package/dist/cjs/proxy.js +187 -0
  18. package/dist/cjs/proxy.js.map +1 -0
  19. package/dist/cjs/query.js +41 -0
  20. package/dist/cjs/query.js.map +1 -0
  21. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  22. package/dist/cjs/typeDefs.js +249 -0
  23. package/dist/cjs/typeDefs.js.map +1 -0
  24. package/dist/cjs/types.js +15 -0
  25. package/dist/cjs/types.js.map +1 -0
  26. package/dist/cjs/utils.js +65 -0
  27. package/dist/cjs/utils.js.map +1 -0
  28. package/dist/esm/EntityMap.d.ts +18 -0
  29. package/dist/esm/EntityMap.d.ts.map +1 -0
  30. package/dist/esm/EntityMap.js +42 -0
  31. package/dist/esm/EntityMap.js.map +1 -0
  32. package/dist/esm/QueryClient.d.ts +123 -0
  33. package/dist/esm/QueryClient.d.ts.map +1 -0
  34. package/dist/esm/QueryClient.js +363 -0
  35. package/dist/esm/QueryClient.js.map +1 -0
  36. package/dist/esm/QueryStore.d.ts +77 -0
  37. package/dist/esm/QueryStore.d.ts.map +1 -0
  38. package/dist/esm/QueryStore.js +212 -0
  39. package/dist/esm/QueryStore.js.map +1 -0
  40. package/dist/esm/errors.d.ts +4 -0
  41. package/dist/esm/errors.d.ts.map +1 -0
  42. package/dist/esm/errors.js +101 -0
  43. package/dist/esm/errors.js.map +1 -0
  44. package/dist/esm/index.d.ts +7 -0
  45. package/dist/esm/index.d.ts.map +1 -0
  46. package/dist/esm/index.js +4 -0
  47. package/dist/esm/index.js.map +1 -0
  48. package/dist/esm/parseEntities.d.ts +8 -0
  49. package/dist/esm/parseEntities.d.ts.map +1 -0
  50. package/dist/esm/parseEntities.js +120 -0
  51. package/dist/esm/parseEntities.js.map +1 -0
  52. package/dist/esm/pathInterpolator.d.ts +29 -0
  53. package/dist/esm/pathInterpolator.d.ts.map +1 -0
  54. package/dist/esm/pathInterpolator.js +66 -0
  55. package/dist/esm/pathInterpolator.js.map +1 -0
  56. package/dist/esm/proxy.d.ts +8 -0
  57. package/dist/esm/proxy.d.ts.map +1 -0
  58. package/dist/esm/proxy.js +180 -0
  59. package/dist/esm/proxy.js.map +1 -0
  60. package/dist/esm/query.d.ts +41 -0
  61. package/dist/esm/query.d.ts.map +1 -0
  62. package/dist/esm/query.js +38 -0
  63. package/dist/esm/query.js.map +1 -0
  64. package/dist/esm/typeDefs.d.ts +25 -0
  65. package/dist/esm/typeDefs.d.ts.map +1 -0
  66. package/dist/esm/typeDefs.js +239 -0
  67. package/dist/esm/typeDefs.js.map +1 -0
  68. package/dist/esm/types.d.ts +96 -0
  69. package/dist/esm/types.d.ts.map +1 -0
  70. package/dist/esm/types.js +12 -0
  71. package/dist/esm/types.js.map +1 -0
  72. package/dist/esm/utils.d.ts +6 -0
  73. package/dist/esm/utils.d.ts.map +1 -0
  74. package/dist/esm/utils.js +60 -0
  75. package/dist/esm/utils.js.map +1 -0
  76. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  77. package/package.json +3 -3
  78. package/src/QueryClient.ts +321 -105
  79. package/src/QueryStore.ts +15 -7
  80. package/src/__tests__/caching-persistence.test.ts +31 -2
  81. package/src/__tests__/entity-system.test.ts +5 -1
  82. package/src/__tests__/gc-time.test.ts +327 -0
  83. package/src/__tests__/mock-fetch.test.ts +8 -4
  84. package/src/__tests__/parse-entities.test.ts +5 -1
  85. package/src/__tests__/reactivity.test.ts +5 -1
  86. package/src/__tests__/refetch-interval.test.ts +262 -0
  87. package/src/__tests__/rest-query-api.test.ts +5 -1
  88. package/src/__tests__/stale-time.test.ts +357 -0
  89. package/src/__tests__/utils.ts +28 -12
  90. package/src/__tests__/validation-edge-cases.test.ts +1 -0
  91. package/src/query.ts +2 -1
  92. package/src/react/__tests__/basic.test.tsx +9 -4
  93. package/src/react/__tests__/component.test.tsx +10 -3
  94. package/src/types.ts +11 -0
  95. package/vitest.config.ts +4 -10
@@ -0,0 +1,180 @@
1
+ import { typeError } from './errors.js';
2
+ import { getFormat } from './typeDefs.js';
3
+ import { ARRAY_KEY, RECORD_KEY, } from './types.js';
4
+ import { extractShape, typeMaskOf } from './utils.js';
5
+ const entries = Object.entries;
6
+ const PROXY_BRAND = new WeakSet();
7
+ function parseUnionValue(valueType, value, unionDef, path) {
8
+ if (valueType === 64 /* Mask.ARRAY */) {
9
+ const shape = unionDef.shape[ARRAY_KEY];
10
+ if (shape === undefined || typeof shape === 'number') {
11
+ return value;
12
+ }
13
+ return parseArrayValue(value, shape, path);
14
+ }
15
+ else {
16
+ // Use the cached typename field from the union definition
17
+ const typenameField = unionDef.typenameField;
18
+ const typename = typenameField ? value[typenameField] : undefined;
19
+ if (typename === undefined || typeof typename !== 'string') {
20
+ const recordShape = unionDef.shape[RECORD_KEY];
21
+ if (recordShape === undefined || typeof recordShape === 'number') {
22
+ return value;
23
+ }
24
+ return parseRecordValue(value, recordShape, path);
25
+ }
26
+ const matchingDef = unionDef.shape[typename];
27
+ if (matchingDef === undefined || typeof matchingDef === 'number') {
28
+ return value;
29
+ }
30
+ return parseObjectValue(value, matchingDef, path);
31
+ }
32
+ }
33
+ export function parseArrayValue(array, arrayShape, path) {
34
+ for (let i = 0; i < array.length; i++) {
35
+ array[i] = parseValue(array[i], arrayShape, `${path}[${i}]`);
36
+ }
37
+ return array;
38
+ }
39
+ export function parseRecordValue(record, recordShape, path) {
40
+ for (const [key, value] of entries(record)) {
41
+ record[key] = parseValue(value, recordShape, `${path}["${key}"]`);
42
+ }
43
+ return record;
44
+ }
45
+ export function parseObjectValue(object, objectShape, path) {
46
+ if (PROXY_BRAND.has(object)) {
47
+ // Is an entity proxy, so return it directly
48
+ return object;
49
+ }
50
+ const shape = extractShape(objectShape);
51
+ for (const [key, propShape] of entries(shape)) {
52
+ // parse and replace the property in place
53
+ object[key] = parseValue(object[key], propShape, `${path}.${key}`);
54
+ }
55
+ return object;
56
+ }
57
+ export function parseValue(value, propDef, path) {
58
+ // Handle Set-based constants/enums
59
+ if (propDef instanceof Set) {
60
+ if (!propDef.has(value)) {
61
+ throw typeError(path, propDef, value);
62
+ }
63
+ return value;
64
+ }
65
+ switch (typeof propDef) {
66
+ case 'string':
67
+ if (value !== propDef) {
68
+ throw typeError(path, propDef, value);
69
+ }
70
+ return value;
71
+ // handle primitives
72
+ case 'number': {
73
+ let valueType = typeMaskOf(value);
74
+ if ((propDef & valueType) === 0) {
75
+ throw typeError(path, propDef, value);
76
+ }
77
+ if ((propDef & 4096 /* Mask.HAS_NUMBER_FORMAT */) !== 0 && valueType === 4 /* Mask.NUMBER */) {
78
+ return getFormat(propDef)(value);
79
+ }
80
+ if ((propDef & 8192 /* Mask.HAS_STRING_FORMAT */) !== 0 && valueType === 8 /* Mask.STRING */) {
81
+ return getFormat(propDef)(value);
82
+ }
83
+ return value;
84
+ }
85
+ // handle complex objects
86
+ default: {
87
+ // Note: Keep in mind that at this point, we're using `valueType`
88
+ // primarily, so some of the logic is "reversed" from the above where
89
+ // we use the `propDef` type primarily
90
+ let valueType = typeMaskOf(value);
91
+ const propMask = propDef.mask;
92
+ // Check if the value type is allowed by the propMask
93
+ // Also check if it's in a values set (for enums/constants stored in ValidatorDef)
94
+ if ((propMask & valueType) === 0 && !propDef.values?.has(value)) {
95
+ throw typeError(path, propMask, value);
96
+ }
97
+ if (valueType < 32 /* Mask.OBJECT */) {
98
+ if ((propMask & 4096 /* Mask.HAS_NUMBER_FORMAT */) !== 0 && valueType === 4 /* Mask.NUMBER */) {
99
+ return getFormat(propMask)(value);
100
+ }
101
+ if ((propMask & 8192 /* Mask.HAS_STRING_FORMAT */) !== 0 && valueType === 8 /* Mask.STRING */) {
102
+ return getFormat(propMask)(value);
103
+ }
104
+ // value is a primitive, it has already passed the mask so return it now
105
+ return value;
106
+ }
107
+ if ((valueType & 512 /* Mask.UNION */) !== 0) {
108
+ return parseUnionValue(valueType, value, propDef, path);
109
+ }
110
+ if (valueType === 64 /* Mask.ARRAY */) {
111
+ return parseArrayValue(value, propDef.shape, path);
112
+ }
113
+ return parseObjectValue(value, propDef, path);
114
+ }
115
+ }
116
+ }
117
+ const CustomNodeInspect = Symbol.for('nodejs.util.inspect.custom');
118
+ export function createEntityProxy(id, entityRecord, def, desc) {
119
+ // Cache for nested proxies - each proxy gets its own cache
120
+ const shape = extractShape(def);
121
+ const toJSON = () => ({
122
+ __entityRef: id,
123
+ });
124
+ const handler = {
125
+ get(target, prop) {
126
+ // Handle toJSON for serialization
127
+ if (prop === 'toJSON') {
128
+ return toJSON;
129
+ }
130
+ const { signal, cache } = entityRecord;
131
+ const obj = signal.value;
132
+ // Check cache first, BEFORE any expensive checks
133
+ if (cache.has(prop)) {
134
+ return cache.get(prop);
135
+ }
136
+ let value = obj[prop];
137
+ let propDef = shape[prop];
138
+ if (!Object.hasOwnProperty.call(shape, prop)) {
139
+ return value;
140
+ }
141
+ const parsed = parseValue(value, propDef, `[[${desc}]].${prop}`);
142
+ cache.set(prop, parsed);
143
+ return parsed;
144
+ },
145
+ has(target, prop) {
146
+ return prop in shape;
147
+ },
148
+ ownKeys(target) {
149
+ const keys = Object.keys(shape);
150
+ // Add typename field if it exists on the definition
151
+ const typenameField = def.typenameField;
152
+ if (typenameField && !keys.includes(typenameField)) {
153
+ keys.push(typenameField);
154
+ }
155
+ return keys;
156
+ },
157
+ getOwnPropertyDescriptor(target, prop) {
158
+ const typenameField = def.typenameField;
159
+ if (prop in shape || prop === typenameField) {
160
+ return {
161
+ enumerable: true,
162
+ configurable: true,
163
+ };
164
+ }
165
+ return undefined;
166
+ },
167
+ };
168
+ const proxy = new Proxy({
169
+ [CustomNodeInspect]: () => {
170
+ return Object.keys(shape).reduce((acc, key) => {
171
+ acc[key] = proxy[key];
172
+ return acc;
173
+ }, {});
174
+ },
175
+ }, handler);
176
+ // Add the proxy to the proxy brand set so we can easily identify it later
177
+ PROXY_BRAND.add(proxy);
178
+ return proxy;
179
+ }
180
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { APITypes, ArrayDef, DiscriminatedQueryResult, EntityDef, Mask, ObjectDef, RecordDef, ObjectFieldTypeDef, UnionDef } from './types.js';
2
+ import { QueryCacheOptions } from './QueryClient.js';
3
+ type ExtractPrimitiveTypeFromMask<T extends number> = T extends Mask.UNDEFINED ? undefined : T extends Mask.NULL ? null : T extends Mask.NUMBER ? number : T extends Mask.STRING ? string : T extends Mask.BOOLEAN ? boolean : T extends Mask.ID ? string : never;
4
+ export type ExtractType<T extends ObjectFieldTypeDef | string> = T extends number ? ExtractPrimitiveTypeFromMask<T> : T extends string ? T : T extends Set<infer TSet> ? TSet : T extends ObjectDef<infer S> ? Prettify<ExtractTypesFromShape<S>> : T extends EntityDef<infer S> ? Prettify<ExtractTypesFromShape<S>> : T extends ArrayDef<infer S> ? ExtractType<S>[] : T extends RecordDef<infer S> ? Record<string, ExtractType<S>> : T extends UnionDef<infer VS> ? ExtractType<VS[number]> : never;
5
+ type ExtractTypesFromShape<S extends Record<string, ObjectFieldTypeDef | string>> = {
6
+ [K in keyof S]: ExtractType<S[K]>;
7
+ };
8
+ type IsParameter<Part> = Part extends `[${infer ParamName}]` ? ParamName : never;
9
+ type FilteredParts<Path> = Path extends `${infer PartA}/${infer PartB}` ? IsParameter<PartA> | FilteredParts<PartB> : IsParameter<Path>;
10
+ type ParamValue<Key> = Key extends `...${infer Anything}` ? (string | number)[] : string | number;
11
+ type RemovePrefixDots<Key> = Key extends `...${infer Name}` ? Name : Key;
12
+ type PathParams<Path> = {
13
+ [Key in FilteredParts<Path> as RemovePrefixDots<Key>]: ParamValue<Key>;
14
+ };
15
+ interface RESTQueryDefinition {
16
+ path: string;
17
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
18
+ searchParams?: Record<string, ObjectFieldTypeDef>;
19
+ response: Record<string, ObjectFieldTypeDef> | ObjectFieldTypeDef;
20
+ cache?: QueryCacheOptions;
21
+ refetchInterval?: number;
22
+ }
23
+ type ExtractTypesFromObjectOrTypeDef<S extends Record<string, ObjectFieldTypeDef> | ObjectFieldTypeDef | undefined> = S extends Record<string, ObjectFieldTypeDef> ? {
24
+ [K in keyof S]: ExtractType<S[K]>;
25
+ } : S extends ObjectFieldTypeDef ? ExtractType<S> : {};
26
+ type QueryParams<QDef extends RESTQueryDefinition> = PathParams<QDef['path']> & ExtractTypesFromObjectOrTypeDef<QDef['searchParams']>;
27
+ type QueryParamsOrUndefined<QDef extends RESTQueryDefinition> = {} extends QueryParams<QDef> ? undefined : QueryParams<QDef>;
28
+ type HasRequiredKeys<T> = {} extends T ? false : {
29
+ [K in keyof T]: undefined;
30
+ } extends T ? false : true;
31
+ type Optionalize<T> = T extends object ? {
32
+ -readonly [K in keyof T as undefined extends T[K] ? never : K]: T[K];
33
+ } & {
34
+ -readonly [K in keyof T as undefined extends T[K] ? K : never]?: T[K];
35
+ } : T;
36
+ type Prettify<T> = T extends object ? {
37
+ -readonly [K in keyof T]: T[K];
38
+ } & {} : T;
39
+ export declare function query<const QDef extends RESTQueryDefinition>(queryDefinitionBuilder: (t: APITypes) => QDef): (...args: HasRequiredKeys<QueryParams<QDef>> extends true ? [params: Prettify<Optionalize<QueryParams<QDef>>>] : [params?: Prettify<Optionalize<QueryParamsOrUndefined<QDef>>>]) => DiscriminatedQueryResult<Readonly<Prettify<ExtractTypesFromObjectOrTypeDef<QDef['response']>>>>;
40
+ export {};
41
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { getContext, reactive } from 'signalium';
2
+ import { QueryClientContext } from './QueryClient.js';
3
+ import { t, ValidatorDef } from './typeDefs.js';
4
+ import { createPathInterpolator } from './pathInterpolator.js';
5
+ export function query(queryDefinitionBuilder) {
6
+ let queryDefinition;
7
+ return reactive((params) => {
8
+ const queryClient = getContext(QueryClientContext);
9
+ if (queryClient === undefined) {
10
+ throw new Error('QueryClient not found');
11
+ }
12
+ if (queryDefinition === undefined) {
13
+ const { path, method = 'GET', response, cache, refetchInterval } = queryDefinitionBuilder(t);
14
+ const id = `${method}:${path}`;
15
+ const shape = typeof response === 'object' && !(response instanceof ValidatorDef)
16
+ ? t.object(response)
17
+ : response;
18
+ // Create optimized path interpolator (parses template once)
19
+ const interpolatePath = createPathInterpolator(path);
20
+ const fetchFn = async (context, params) => {
21
+ // Interpolate path params and append search params automatically
22
+ const url = interpolatePath(params);
23
+ const response = await context.fetch(url, {
24
+ method,
25
+ });
26
+ return response.json();
27
+ };
28
+ queryDefinition = {
29
+ id,
30
+ shape,
31
+ fetchFn,
32
+ cache,
33
+ };
34
+ }
35
+ return queryClient.getQuery(queryDefinition, params);
36
+ });
37
+ }
38
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAYjD,OAAO,EAAqB,kBAAkB,EAAiC,MAAM,kBAAkB,CAAC;AACxG,OAAO,EAAU,CAAC,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AA4F/D,MAAM,UAAU,KAAK,CACnB,sBAA6C;IAM7C,IAAI,eAES,CAAC;IAEd,OAAO,QAAQ,CACb,CAAC,MAA+B,EAA+E,EAAE;QAC/G,MAAM,WAAW,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAEnD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAE7F,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC;YAE/B,MAAM,KAAK,GACT,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,YAAY,YAAY,CAAC;gBACjE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAA8C,CAAC;gBAC1D,CAAC,CAAE,QAA+B,CAAC;YAEvC,4DAA4D;YAC5D,MAAM,eAAe,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAErD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAqB,EAAE,MAA+B,EAAE,EAAE;gBAC/E,iEAAiE;gBACjE,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;gBAEpC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;oBACxC,MAAM;iBACP,CAAC,CAAC;gBAEH,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;YACzB,CAAC,CAAC;YAEF,eAAe,GAAG;gBAChB,EAAE;gBACF,KAAK;gBACL,OAAO;gBACP,KAAK;aACN,CAAC;QACJ,CAAC;QAED,OAAO,WAAW,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC,CAIK,CAAC;AACX,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { APITypes, ArrayDef, EntityDef, Mask, ObjectDef, ObjectShape, RecordDef, TypeDef, ObjectFieldTypeDef, UnionTypeDefs } from './types.js';
2
+ export declare class ValidatorDef<T> {
3
+ mask: Mask;
4
+ shape: ObjectFieldTypeDef | ObjectShape | ((t: APITypes) => ObjectShape) | UnionTypeDefs | undefined;
5
+ subEntityPaths: undefined | string | string[];
6
+ values: Set<string | boolean | number> | undefined;
7
+ typenameField: string | undefined;
8
+ typenameValue: string | undefined;
9
+ idField: string | undefined;
10
+ private _optional;
11
+ private _nullable;
12
+ private _nullish;
13
+ constructor(mask: Mask, shape: ObjectFieldTypeDef | ObjectShape | ((t: APITypes) => ObjectShape) | UnionTypeDefs | undefined, subEntityPaths?: undefined | string | string[], values?: Set<string | boolean | number> | undefined, typenameField?: string | undefined, typenameValue?: string | undefined, idField?: string | undefined);
14
+ get optional(): ValidatorDef<T | undefined>;
15
+ get nullable(): ValidatorDef<T | null>;
16
+ get nullish(): ValidatorDef<T | null | undefined>;
17
+ }
18
+ export declare function defineArray<T extends TypeDef>(shape: T): ArrayDef<T>;
19
+ export declare function defineRecord<T extends TypeDef>(shape: T): RecordDef<T>;
20
+ export declare function defineObject<T extends ObjectShape>(shape: T): ObjectDef<T>;
21
+ export declare function getFormat(mask: number): (value: unknown) => unknown;
22
+ export declare function registerFormat<Input extends string | boolean, T>(name: string, type: Input extends string ? Mask.STRING : Mask.BOOLEAN, parse: (value: Input) => T, serialize: (value: T) => Input): void;
23
+ export declare function entity<T extends ObjectShape>(shape: (t: APITypes) => T): EntityDef<T>;
24
+ export declare const t: APITypes;
25
+ //# sourceMappingURL=typeDefs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeDefs.d.ts","sourceRoot":"","sources":["../../src/typeDefs.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAER,QAAQ,EAER,SAAS,EACT,IAAI,EACJ,SAAS,EACT,WAAW,EAEX,SAAS,EACT,OAAO,EACP,kBAAkB,EAElB,aAAa,EACd,MAAM,YAAY,CAAC;AAGpB,qBAAa,YAAY,CAAC,CAAC;IAMhB,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,kBAAkB,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,WAAW,CAAC,GAAG,aAAa,GAAG,SAAS;IACpG,cAAc,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EAAE;IAC7C,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,GAAG,SAAS;IAClD,aAAa,EAAE,MAAM,GAAG,SAAS;IACjC,aAAa,EAAE,MAAM,GAAG,SAAS;IACjC,OAAO,EAAE,MAAM,GAAG,SAAS;IAXpC,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,QAAQ,CAAiD;gBAGxD,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,kBAAkB,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,WAAW,CAAC,GAAG,aAAa,GAAG,SAAS,EACpG,cAAc,GAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EAAc,EACzD,MAAM,GAAE,GAAG,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,GAAG,SAAqB,EAC9D,aAAa,GAAE,MAAM,GAAG,SAAqB,EAC7C,aAAa,GAAE,MAAM,GAAG,SAAqB,EAC7C,OAAO,GAAE,MAAM,GAAG,SAAqB;IAGhD,IAAI,QAAQ,IAAI,YAAY,CAAC,CAAC,GAAG,SAAS,CAAC,CAa1C;IAED,IAAI,QAAQ,IAAI,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,CAarC;IAED,IAAI,OAAO,IAAI,YAAY,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAahD;CACF;AAMD,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CASpE;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAUtE;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAM1E;AA4LD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAInE;AAED,wBAAgB,cAAc,CAAC,KAAK,SAAS,MAAM,GAAG,OAAO,EAAE,CAAC,EAC9D,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,KAAK,SAAS,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EACvD,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,EAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,KAAK,QAW/B;AAMD,wBAAgB,MAAM,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAMrF;AAED,eAAO,MAAM,CAAC,EAAE,QAef,CAAC"}
@@ -0,0 +1,239 @@
1
+ import { ARRAY_KEY, RECORD_KEY, } from './types.js';
2
+ import { extractShape, extractShapeMetadata } from './utils.js';
3
+ export class ValidatorDef {
4
+ mask;
5
+ shape;
6
+ subEntityPaths;
7
+ values;
8
+ typenameField;
9
+ typenameValue;
10
+ idField;
11
+ _optional;
12
+ _nullable;
13
+ _nullish;
14
+ constructor(mask, shape, subEntityPaths = undefined, values = undefined, typenameField = undefined, typenameValue = undefined, idField = undefined) {
15
+ this.mask = mask;
16
+ this.shape = shape;
17
+ this.subEntityPaths = subEntityPaths;
18
+ this.values = values;
19
+ this.typenameField = typenameField;
20
+ this.typenameValue = typenameValue;
21
+ this.idField = idField;
22
+ }
23
+ get optional() {
24
+ if (this._optional === undefined) {
25
+ this._optional = new ValidatorDef(this.mask | 1 /* Mask.UNDEFINED */, this.shape, this.subEntityPaths, this.values, this.typenameField, this.typenameValue, this.idField);
26
+ }
27
+ return this._optional;
28
+ }
29
+ get nullable() {
30
+ if (this._nullable === undefined) {
31
+ this._nullable = new ValidatorDef(this.mask | 2 /* Mask.NULL */, this.shape, this.subEntityPaths, this.values, this.typenameField, this.typenameValue, this.idField);
32
+ }
33
+ return this._nullable;
34
+ }
35
+ get nullish() {
36
+ if (this._nullish === undefined) {
37
+ this._nullish = new ValidatorDef(this.mask | 1 /* Mask.UNDEFINED */ | 2 /* Mask.NULL */, this.shape, this.subEntityPaths, this.values, this.typenameField, this.typenameValue, this.idField);
38
+ }
39
+ return this._nullish;
40
+ }
41
+ }
42
+ // -----------------------------------------------------------------------------
43
+ // Complex Type Definitions
44
+ // -----------------------------------------------------------------------------
45
+ export function defineArray(shape) {
46
+ let mask = 64 /* Mask.ARRAY */;
47
+ // Propagate HAS_SUB_ENTITY flag if the shape contains entities
48
+ if (shape instanceof ValidatorDef && (shape.mask & (1024 /* Mask.ENTITY */ | 2048 /* Mask.HAS_SUB_ENTITY */)) !== 0) {
49
+ mask |= 2048 /* Mask.HAS_SUB_ENTITY */;
50
+ }
51
+ return new ValidatorDef(mask, shape);
52
+ }
53
+ export function defineRecord(shape) {
54
+ // The mask should be OBJECT | RECORD so that values match when compared
55
+ let mask = 256 /* Mask.RECORD */ | 32 /* Mask.OBJECT */;
56
+ // Propagate HAS_SUB_ENTITY flag if the shape contains entities
57
+ if (shape instanceof ValidatorDef && (shape.mask & (1024 /* Mask.ENTITY */ | 2048 /* Mask.HAS_SUB_ENTITY */)) !== 0) {
58
+ mask |= 2048 /* Mask.HAS_SUB_ENTITY */;
59
+ }
60
+ return new ValidatorDef(mask, shape);
61
+ }
62
+ export function defineObject(shape) {
63
+ const def = new ValidatorDef(32 /* Mask.OBJECT */, shape);
64
+ extractShapeMetadata(def, shape);
65
+ return def;
66
+ }
67
+ const addShapeToUnion = (shape, definition, unionTypenameField) => {
68
+ const mask = definition.mask;
69
+ if ((mask & 512 /* Mask.UNION */) !== 0) {
70
+ // Merge nested union into parent union
71
+ const nestedUnion = definition;
72
+ // Check typename field consistency
73
+ if (nestedUnion.typenameField !== undefined) {
74
+ if (unionTypenameField !== undefined && unionTypenameField !== nestedUnion.typenameField) {
75
+ throw new Error(`Union typename field conflict: Cannot merge unions with different typename fields ('${unionTypenameField}' vs '${nestedUnion.typenameField}')`);
76
+ }
77
+ unionTypenameField = nestedUnion.typenameField;
78
+ }
79
+ // Merge nested union's shape into parent
80
+ if (nestedUnion.shape !== undefined) {
81
+ for (const key of [...Object.keys(nestedUnion.shape), ARRAY_KEY, RECORD_KEY]) {
82
+ // Check for conflicts
83
+ const value = nestedUnion.shape[key];
84
+ if (shape[key] !== undefined && shape[key] !== value) {
85
+ throw new Error(`Union merge conflict: Duplicate typename value '${String(key)}' found when merging nested unions`);
86
+ }
87
+ // coerce type because we know the value is the same type as the key
88
+ shape[key] = value;
89
+ }
90
+ }
91
+ return unionTypenameField;
92
+ }
93
+ else if ((mask & 64 /* Mask.ARRAY */) !== 0) {
94
+ if (shape[ARRAY_KEY] !== undefined) {
95
+ throw new Error('Array shape already defined');
96
+ }
97
+ shape[ARRAY_KEY] = definition.shape;
98
+ return unionTypenameField;
99
+ }
100
+ else if ((mask & 256 /* Mask.RECORD */) !== 0) {
101
+ if (shape[RECORD_KEY] !== undefined) {
102
+ throw new Error('Record shape already defined');
103
+ }
104
+ shape[RECORD_KEY] = definition.shape;
105
+ return unionTypenameField;
106
+ }
107
+ else {
108
+ // Make sure the type is fully extracted, so we can get the typename field and value
109
+ extractShape(definition);
110
+ // definition is ObjectDef | EntityDef
111
+ const typenameField = definition.typenameField;
112
+ const typename = definition.typenameValue;
113
+ if (typename === undefined) {
114
+ throw new Error('Object definitions must have a typename to be in a union with other objects, records, or arrays');
115
+ }
116
+ if (unionTypenameField !== undefined && typenameField !== unionTypenameField) {
117
+ throw new Error('Object definitions must have the same typename field to be in the same union');
118
+ }
119
+ shape[typename] = definition;
120
+ return typenameField;
121
+ }
122
+ };
123
+ function defineUnion(...types) {
124
+ let mask = 0;
125
+ let definition;
126
+ let shape;
127
+ let values;
128
+ let unionTypenameField;
129
+ for (const type of types) {
130
+ if (typeof type === 'number') {
131
+ mask |= type;
132
+ continue;
133
+ }
134
+ const isSet = type instanceof Set;
135
+ const typeValues = isSet ? type : type.values;
136
+ // Handle Set-based constants/enums
137
+ if (typeValues !== undefined) {
138
+ if (values === undefined) {
139
+ values = new Set(typeValues);
140
+ }
141
+ else {
142
+ for (const val of typeValues) {
143
+ values.add(val);
144
+ }
145
+ }
146
+ if (isSet) {
147
+ continue;
148
+ }
149
+ }
150
+ // We know it's a complex type at this point because if it was a Set,
151
+ // we would have already handled it above.
152
+ const typeDef = type;
153
+ mask |= typeDef.mask;
154
+ if (definition === undefined) {
155
+ definition = typeDef;
156
+ continue;
157
+ }
158
+ if (shape === undefined) {
159
+ shape = Object.create(null);
160
+ unionTypenameField = addShapeToUnion(shape, definition, unionTypenameField);
161
+ }
162
+ unionTypenameField = addShapeToUnion(shape, typeDef, unionTypenameField);
163
+ }
164
+ // It was a union of primitives, so return the mask
165
+ if (definition === undefined && values === undefined) {
166
+ // This type coercion is incorrect, but we can't return the mask as a Mask
167
+ // because that loses the type information about the union, which breaks
168
+ // inference.
169
+ //
170
+ // TODO: Figure out how to make this correct type-wise
171
+ return mask;
172
+ }
173
+ return new ValidatorDef(mask | 512 /* Mask.UNION */, shape ?? definition?.shape, undefined, values, unionTypenameField);
174
+ }
175
+ // -----------------------------------------------------------------------------
176
+ // Marker Functions
177
+ // -----------------------------------------------------------------------------
178
+ function defineTypename(value) {
179
+ return value;
180
+ }
181
+ function defineConst(value) {
182
+ return new Set([value]);
183
+ }
184
+ function defineEnum(...values) {
185
+ return new Set(values);
186
+ }
187
+ // -----------------------------------------------------------------------------
188
+ // Formatted Values
189
+ // -----------------------------------------------------------------------------
190
+ const FORMAT_MASK_SHIFT = 16;
191
+ let nextFormatId = 0;
192
+ const FORMAT_PARSERS = [];
193
+ const FORMAT_SERIALIZERS = [];
194
+ const FORMAT_MAP = new Map();
195
+ function defineFormatted(format) {
196
+ const mask = FORMAT_MAP.get(format);
197
+ if (mask === undefined) {
198
+ throw new Error(`Format ${format} not registered`);
199
+ }
200
+ return mask;
201
+ }
202
+ export function getFormat(mask) {
203
+ const formatId = mask >> FORMAT_MASK_SHIFT;
204
+ return FORMAT_PARSERS[formatId];
205
+ }
206
+ export function registerFormat(name, type, parse, serialize) {
207
+ const maskId = nextFormatId++;
208
+ FORMAT_PARSERS[maskId] = parse;
209
+ FORMAT_SERIALIZERS[maskId] = serialize;
210
+ const shiftedId = maskId << FORMAT_MASK_SHIFT;
211
+ const formatMask = type === 8 /* Mask.STRING */ ? 8192 /* Mask.HAS_STRING_FORMAT */ : 4096 /* Mask.HAS_NUMBER_FORMAT */;
212
+ const mask = shiftedId | type | formatMask;
213
+ FORMAT_MAP.set(name, mask);
214
+ }
215
+ // -----------------------------------------------------------------------------
216
+ // Entity Definitions
217
+ // -----------------------------------------------------------------------------
218
+ export function entity(shape) {
219
+ return new ValidatorDef(
220
+ // The mask should be OBJECT | ENTITY so that values match when compared
221
+ 1024 /* Mask.ENTITY */ | 32 /* Mask.OBJECT */, shape);
222
+ }
223
+ export const t = {
224
+ format: defineFormatted,
225
+ typename: defineTypename,
226
+ const: defineConst,
227
+ enum: defineEnum,
228
+ id: 128 /* Mask.ID */ | 8 /* Mask.STRING */ | 4 /* Mask.NUMBER */,
229
+ string: 8 /* Mask.STRING */,
230
+ number: 4 /* Mask.NUMBER */,
231
+ boolean: 16 /* Mask.BOOLEAN */,
232
+ null: 2 /* Mask.NULL */,
233
+ undefined: 1 /* Mask.UNDEFINED */,
234
+ array: defineArray,
235
+ object: defineObject,
236
+ record: defineRecord,
237
+ union: defineUnion,
238
+ };
239
+ //# sourceMappingURL=typeDefs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeDefs.js","sourceRoot":"","sources":["../../src/typeDefs.ts"],"names":[],"mappings":"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"}