@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.
- package/.turbo/turbo-build.log +12 -0
- package/CHANGELOG.md +17 -0
- package/dist/cjs/EntityMap.js +46 -0
- package/dist/cjs/EntityMap.js.map +1 -0
- package/dist/cjs/QueryClient.js +368 -0
- package/dist/cjs/QueryClient.js.map +1 -0
- package/dist/cjs/QueryStore.js +222 -0
- package/dist/cjs/QueryStore.js.map +1 -0
- package/dist/cjs/errors.js +105 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +24 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/parseEntities.js +127 -0
- package/dist/cjs/parseEntities.js.map +1 -0
- package/dist/cjs/pathInterpolator.js +69 -0
- package/dist/cjs/pathInterpolator.js.map +1 -0
- package/dist/cjs/proxy.js +187 -0
- package/dist/cjs/proxy.js.map +1 -0
- package/dist/cjs/query.js +41 -0
- package/dist/cjs/query.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/cjs/typeDefs.js +249 -0
- package/dist/cjs/typeDefs.js.map +1 -0
- package/dist/cjs/types.js +15 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils.js +65 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/EntityMap.d.ts +18 -0
- package/dist/esm/EntityMap.d.ts.map +1 -0
- package/dist/esm/EntityMap.js +42 -0
- package/dist/esm/EntityMap.js.map +1 -0
- package/dist/esm/QueryClient.d.ts +123 -0
- package/dist/esm/QueryClient.d.ts.map +1 -0
- package/dist/esm/QueryClient.js +363 -0
- package/dist/esm/QueryClient.js.map +1 -0
- package/dist/esm/QueryStore.d.ts +77 -0
- package/dist/esm/QueryStore.d.ts.map +1 -0
- package/dist/esm/QueryStore.js +212 -0
- package/dist/esm/QueryStore.js.map +1 -0
- package/dist/esm/errors.d.ts +4 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +101 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/parseEntities.d.ts +8 -0
- package/dist/esm/parseEntities.d.ts.map +1 -0
- package/dist/esm/parseEntities.js +120 -0
- package/dist/esm/parseEntities.js.map +1 -0
- package/dist/esm/pathInterpolator.d.ts +29 -0
- package/dist/esm/pathInterpolator.d.ts.map +1 -0
- package/dist/esm/pathInterpolator.js +66 -0
- package/dist/esm/pathInterpolator.js.map +1 -0
- package/dist/esm/proxy.d.ts +8 -0
- package/dist/esm/proxy.d.ts.map +1 -0
- package/dist/esm/proxy.js +180 -0
- package/dist/esm/proxy.js.map +1 -0
- package/dist/esm/query.d.ts +41 -0
- package/dist/esm/query.d.ts.map +1 -0
- package/dist/esm/query.js +38 -0
- package/dist/esm/query.js.map +1 -0
- package/dist/esm/typeDefs.d.ts +25 -0
- package/dist/esm/typeDefs.d.ts.map +1 -0
- package/dist/esm/typeDefs.js +239 -0
- package/dist/esm/typeDefs.js.map +1 -0
- package/dist/esm/types.d.ts +96 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +12 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils.d.ts +6 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +60 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +3 -3
- package/src/QueryClient.ts +321 -105
- package/src/QueryStore.ts +15 -7
- package/src/__tests__/caching-persistence.test.ts +31 -2
- package/src/__tests__/entity-system.test.ts +5 -1
- package/src/__tests__/gc-time.test.ts +327 -0
- package/src/__tests__/mock-fetch.test.ts +8 -4
- package/src/__tests__/parse-entities.test.ts +5 -1
- package/src/__tests__/reactivity.test.ts +5 -1
- package/src/__tests__/refetch-interval.test.ts +262 -0
- package/src/__tests__/rest-query-api.test.ts +5 -1
- package/src/__tests__/stale-time.test.ts +357 -0
- package/src/__tests__/utils.ts +28 -12
- package/src/__tests__/validation-edge-cases.test.ts +1 -0
- package/src/query.ts +2 -1
- package/src/react/__tests__/basic.test.tsx +9 -4
- package/src/react/__tests__/component.test.tsx +10 -3
- package/src/types.ts +11 -0
- 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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"}
|