@graphprotocol/hypergraph 0.0.1
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/LICENSE +21 -0
- package/README.md +2 -0
- package/dist/connect/auth-storage.d.ts.map +1 -0
- package/dist/connect/create-app-identity.d.ts.map +1 -0
- package/dist/connect/create-auth-url.d.ts.map +1 -0
- package/dist/connect/create-auth-url.js +35 -0
- package/dist/connect/create-auth-url.js.map +1 -0
- package/dist/connect/create-callback-params.d.ts.map +1 -0
- package/dist/connect/create-callback-params.js +17 -0
- package/dist/connect/create-callback-params.js.map +1 -0
- package/dist/connect/create-identity-keys.d.ts.map +1 -0
- package/dist/connect/identity-encryption.d.ts.map +1 -0
- package/dist/connect/index.d.ts.map +1 -0
- package/dist/connect/login.d.ts.map +1 -0
- package/dist/connect/parse-callback-params.d.ts.map +1 -0
- package/dist/connect/parse-callback-params.js +63 -0
- package/dist/connect/parse-callback-params.js.map +1 -0
- package/dist/connect/prove-ownership.d.ts.map +1 -0
- package/dist/connect/types.d.ts +57 -0
- package/dist/connect/types.d.ts.map +1 -0
- package/dist/connect/types.js +24 -0
- package/dist/connect/types.js.map +1 -0
- package/dist/entity/create.d.ts.map +1 -0
- package/dist/entity/decodedEntitiesCache.d.ts.map +1 -0
- package/dist/entity/delete.d.ts.map +1 -0
- package/dist/entity/entity.d.ts.map +1 -0
- package/dist/entity/entityRelationParentsMap.d.ts.map +1 -0
- package/dist/entity/findMany.d.ts.map +1 -0
- package/dist/entity/findMany.js +436 -0
- package/dist/entity/findMany.js.map +1 -0
- package/dist/entity/findOne.d.ts.map +1 -0
- package/dist/entity/getEntityRelations.d.ts.map +1 -0
- package/dist/entity/index.d.ts.map +1 -0
- package/dist/entity/relationParentsMap.d.ts.map +1 -0
- package/dist/entity/removeRelation.d.ts.map +1 -0
- package/dist/entity/types.d.ts +79 -0
- package/dist/entity/types.d.ts.map +1 -0
- package/dist/entity/types.js +2 -0
- package/dist/entity/types.js.map +1 -0
- package/dist/entity/update.d.ts.map +1 -0
- package/dist/identity/auth-storage.d.ts.map +1 -0
- package/dist/identity/get-verified-identity.d.ts.map +1 -0
- package/dist/identity/identity-encryption.d.ts.map +1 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/logout.d.ts.map +1 -0
- package/dist/identity/prove-ownership.d.ts.map +1 -0
- package/dist/inboxes/create-inbox.d.ts.map +1 -0
- package/dist/inboxes/get-list-inboxes.d.ts.map +1 -0
- package/dist/inboxes/index.d.ts.map +1 -0
- package/dist/inboxes/merge-messages.d.ts.map +1 -0
- package/dist/inboxes/message-encryption.d.ts.map +1 -0
- package/dist/inboxes/message-validation.d.ts.map +1 -0
- package/dist/inboxes/prepare-message.d.ts +31 -0
- package/dist/inboxes/prepare-message.d.ts.map +1 -0
- package/dist/inboxes/recover-inbox-creator.d.ts.map +1 -0
- package/dist/inboxes/recover-inbox-message-signer.d.ts.map +1 -0
- package/dist/inboxes/send-message.d.ts.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/messages/signed-update-message.d.ts.map +1 -0
- package/dist/messages/types.d.ts.map +1 -0
- package/dist/space-events/accept-invitation.d.ts.map +1 -0
- package/dist/space-events/apply-event.d.ts.map +1 -0
- package/dist/space-events/create-inbox.d.ts.map +1 -0
- package/dist/space-events/create-invitation.d.ts.map +1 -0
- package/dist/space-events/create-space.d.ts.map +1 -0
- package/dist/space-events/delete-space.d.ts.map +1 -0
- package/dist/space-events/hash-event.d.ts.map +1 -0
- package/dist/space-events/index.d.ts.map +1 -0
- package/dist/space-info/decrypt-space-info.d.ts.map +1 -0
- package/dist/space-info/encrypt-and-sign-space-info.d.ts.map +1 -0
- package/dist/space-info/index.d.ts.map +1 -0
- package/dist/store-connect.d.ts.map +1 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/type/type.d.ts.map +1 -0
- package/dist/utils/automergeId.d.ts +9 -0
- package/dist/utils/automergeId.d.ts.map +1 -0
- package/dist/utils/automergeId.js +17 -0
- package/dist/utils/automergeId.js.map +1 -0
- package/dist/utils/generateId.d.ts +15 -0
- package/dist/utils/generateId.d.ts.map +1 -0
- package/dist/utils/generateId.js +18 -0
- package/dist/utils/generateId.js.map +1 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/package.json +35 -0
- package/src/connect/auth-storage.ts +67 -0
- package/src/connect/create-app-identity.ts +16 -0
- package/src/connect/create-auth-url.ts +42 -0
- package/src/connect/create-callback-params.ts +30 -0
- package/src/connect/create-identity-keys.ts +20 -0
- package/src/connect/identity-encryption.ts +232 -0
- package/src/connect/index.ts +10 -0
- package/src/connect/login.ts +114 -0
- package/src/connect/parse-auth-params.ts +37 -0
- package/src/connect/parse-callback-params.ts +67 -0
- package/src/connect/prove-ownership.ts +58 -0
- package/src/connect/types.ts +67 -0
- package/src/entity/create.ts +58 -0
- package/src/entity/decodedEntitiesCache.ts +38 -0
- package/src/entity/delete.ts +52 -0
- package/src/entity/entity.ts +26 -0
- package/src/entity/entityRelationParentsMap.ts +6 -0
- package/src/entity/findMany.ts +506 -0
- package/src/entity/findOne.ts +34 -0
- package/src/entity/getEntityRelations.ts +45 -0
- package/src/entity/hasValidTypesProperty.ts +8 -0
- package/src/entity/index.ts +8 -0
- package/src/entity/relationParentsMap.ts +6 -0
- package/src/entity/removeRelation.ts +21 -0
- package/src/entity/test.ts +0 -0
- package/src/entity/types.ts +100 -0
- package/src/entity/update.ts +58 -0
- package/src/entity/variant-schema.ts +677 -0
- package/src/identity/auth-storage.ts +57 -0
- package/src/identity/get-verified-identity.ts +53 -0
- package/src/identity/identity-encryption.ts +140 -0
- package/src/identity/index.ts +6 -0
- package/src/identity/logout.ts +8 -0
- package/src/identity/prove-ownership.ts +58 -0
- package/src/identity/types.ts +44 -0
- package/src/inboxes/create-inbox.ts +102 -0
- package/src/inboxes/get-list-inboxes.ts +52 -0
- package/src/inboxes/index.ts +10 -0
- package/src/inboxes/merge-messages.ts +28 -0
- package/src/inboxes/message-encryption.ts +35 -0
- package/src/inboxes/message-validation.ts +66 -0
- package/src/inboxes/prepare-message.ts +85 -0
- package/src/inboxes/recover-inbox-creator.ts +29 -0
- package/src/inboxes/recover-inbox-message-signer.ts +42 -0
- package/src/inboxes/send-message.ts +75 -0
- package/src/inboxes/types.ts +9 -0
- package/src/index.ts +13 -0
- package/src/key/create-key.ts +27 -0
- package/src/key/decrypt-key.ts +19 -0
- package/src/key/encrypt-key.ts +27 -0
- package/src/key/index.ts +4 -0
- package/src/key/key-box.ts +31 -0
- package/src/messages/decrypt-message.ts +13 -0
- package/src/messages/encrypt-message.ts +14 -0
- package/src/messages/index.ts +5 -0
- package/src/messages/serialize.ts +24 -0
- package/src/messages/signed-update-message.ts +84 -0
- package/src/messages/types.ts +506 -0
- package/src/space-events/accept-invitation.ts +36 -0
- package/src/space-events/apply-event.ts +150 -0
- package/src/space-events/create-inbox.ts +56 -0
- package/src/space-events/create-invitation.ts +41 -0
- package/src/space-events/create-space.ts +35 -0
- package/src/space-events/delete-space.ts +36 -0
- package/src/space-events/hash-event.ts +10 -0
- package/src/space-events/index.ts +8 -0
- package/src/space-events/types.ts +137 -0
- package/src/space-info/decrypt-space-info.ts +22 -0
- package/src/space-info/encrypt-and-sign-space-info.ts +50 -0
- package/src/space-info/index.ts +3 -0
- package/src/space-info/types.ts +7 -0
- package/src/store-connect.ts +504 -0
- package/src/store.ts +493 -0
- package/src/type/type.ts +25 -0
- package/src/types.ts +47 -0
- package/src/utils/assertExhaustive.ts +3 -0
- package/src/utils/automergeId.ts +18 -0
- package/src/utils/base58.ts +74 -0
- package/src/utils/generateId.ts +18 -0
- package/src/utils/hexBytesAddressUtils.ts +25 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/internal/base58Utils.ts +47 -0
- package/src/utils/internal/deep-merge.ts +38 -0
- package/src/utils/isRelationField.ts +9 -0
- package/src/utils/jsc.ts +94 -0
- package/src/utils/stringToUint8Array.ts +9 -0
|
@@ -0,0 +1,677 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type { Brand } from 'effect/Brand';
|
|
5
|
+
import type * as Effect from 'effect/Effect';
|
|
6
|
+
import { constUndefined, dual } from 'effect/Function';
|
|
7
|
+
import * as Option from 'effect/Option';
|
|
8
|
+
import * as ParseResult from 'effect/ParseResult';
|
|
9
|
+
import { type Pipeable, pipeArguments } from 'effect/Pipeable';
|
|
10
|
+
import * as Predicate from 'effect/Predicate';
|
|
11
|
+
import * as Schema from 'effect/Schema';
|
|
12
|
+
import type * as AST from 'effect/SchemaAST';
|
|
13
|
+
import * as Struct_ from 'effect/Struct';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @since 1.0.0
|
|
17
|
+
* @category type ids
|
|
18
|
+
*/
|
|
19
|
+
export const TypeId: unique symbol = Symbol.for('@effect/experimental/VariantSchema');
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @since 1.0.0
|
|
23
|
+
* @category type ids
|
|
24
|
+
*/
|
|
25
|
+
export type TypeId = typeof TypeId;
|
|
26
|
+
|
|
27
|
+
const cacheSymbol = Symbol.for('@effect/experimental/VariantSchema/cache');
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @since 1.0.0
|
|
31
|
+
* @category models
|
|
32
|
+
*/
|
|
33
|
+
export interface Struct<in out A extends Field.Fields> extends Pipeable {
|
|
34
|
+
readonly [TypeId]: A;
|
|
35
|
+
/** @internal */
|
|
36
|
+
[cacheSymbol]?: Record<string, Schema.Schema.All>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @since 1.0.0
|
|
41
|
+
* @category guards
|
|
42
|
+
*/
|
|
43
|
+
export const isStruct = (u: unknown): u is Struct<any> => Predicate.hasProperty(u, TypeId);
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @since 1.0.0
|
|
47
|
+
* @category models
|
|
48
|
+
*/
|
|
49
|
+
export declare namespace Struct {
|
|
50
|
+
/**
|
|
51
|
+
* @since 1.0.0
|
|
52
|
+
* @category models
|
|
53
|
+
*/
|
|
54
|
+
export type Any = { readonly [TypeId]: any };
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @since 1.0.0
|
|
58
|
+
* @category models
|
|
59
|
+
*/
|
|
60
|
+
export type Fields = {
|
|
61
|
+
readonly [key: string]: Schema.Schema.All | Schema.PropertySignature.All | Field<any> | Struct<any> | undefined;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @since 1.0.0
|
|
66
|
+
* @category models
|
|
67
|
+
*/
|
|
68
|
+
export type Validate<A, Variant extends string> = {
|
|
69
|
+
readonly [K in keyof A]: A[K] extends { readonly [TypeId]: infer _ }
|
|
70
|
+
? Validate<A[K], Variant>
|
|
71
|
+
: A[K] extends Field<infer Config>
|
|
72
|
+
? [keyof Config] extends [Variant]
|
|
73
|
+
? {}
|
|
74
|
+
: 'field must have valid variants'
|
|
75
|
+
: {};
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* @since 1.0.0
|
|
81
|
+
* @category type ids
|
|
82
|
+
*/
|
|
83
|
+
export const FieldTypeId: unique symbol = Symbol.for('@effect/experimental/VariantSchema/Field');
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @since 1.0.0
|
|
87
|
+
* @category type ids
|
|
88
|
+
*/
|
|
89
|
+
export type FieldTypeId = typeof FieldTypeId;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @since 1.0.0
|
|
93
|
+
* @category models
|
|
94
|
+
*/
|
|
95
|
+
export interface Field<in out A extends Field.Config> extends Pipeable {
|
|
96
|
+
readonly [FieldTypeId]: FieldTypeId;
|
|
97
|
+
readonly schemas: A;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* @since 1.0.0
|
|
102
|
+
* @category guards
|
|
103
|
+
*/
|
|
104
|
+
export const isField = (u: unknown): u is Field<any> => Predicate.hasProperty(u, FieldTypeId);
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* @since 1.0.0
|
|
108
|
+
* @category models
|
|
109
|
+
*/
|
|
110
|
+
export declare namespace Field {
|
|
111
|
+
/**
|
|
112
|
+
* @since 1.0.0
|
|
113
|
+
* @category models
|
|
114
|
+
*/
|
|
115
|
+
export type Any = { readonly [FieldTypeId]: FieldTypeId };
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @since 1.0.0
|
|
119
|
+
* @category models
|
|
120
|
+
*/
|
|
121
|
+
type ValueAny = Schema.Schema.All | Schema.PropertySignature.All;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @since 1.0.0
|
|
125
|
+
* @category models
|
|
126
|
+
*/
|
|
127
|
+
export type Config = {
|
|
128
|
+
readonly [key: string]: Schema.Schema.All | Schema.PropertySignature.All | undefined;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* @since 1.0.0
|
|
133
|
+
* @category models
|
|
134
|
+
*/
|
|
135
|
+
export type ConfigWithKeys<K extends string> = {
|
|
136
|
+
readonly [P in K]?: Schema.Schema.All | Schema.PropertySignature.All;
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* @since 1.0.0
|
|
141
|
+
* @category models
|
|
142
|
+
*/
|
|
143
|
+
export type Fields = {
|
|
144
|
+
readonly [key: string]: Schema.Schema.All | Schema.PropertySignature.All | Field<any> | Struct<any> | undefined;
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* @since 1.0.0
|
|
150
|
+
* @category extractors
|
|
151
|
+
*/
|
|
152
|
+
export type ExtractFields<V extends string, Fields extends Struct.Fields, IsDefault = false> = {
|
|
153
|
+
readonly [K in keyof Fields as [Fields[K]] extends [Field<infer Config>]
|
|
154
|
+
? V extends keyof Config
|
|
155
|
+
? K
|
|
156
|
+
: never
|
|
157
|
+
: K]: [Fields[K]] extends [Struct<infer _>]
|
|
158
|
+
? Extract<V, Fields[K], IsDefault>
|
|
159
|
+
: [Fields[K]] extends [Field<infer Config>]
|
|
160
|
+
? [Config[V]] extends [Schema.Schema.All | Schema.PropertySignature.All]
|
|
161
|
+
? Config[V]
|
|
162
|
+
: never
|
|
163
|
+
: [Fields[K]] extends [Schema.Schema.All | Schema.PropertySignature.All]
|
|
164
|
+
? Fields[K]
|
|
165
|
+
: never;
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* @since 1.0.0
|
|
170
|
+
* @category extractors
|
|
171
|
+
*/
|
|
172
|
+
export type Extract<V extends string, A extends Struct<any>, IsDefault = false> = [A] extends [Struct<infer Fields>]
|
|
173
|
+
? IsDefault extends true
|
|
174
|
+
? [A] extends [Schema.Schema.Any]
|
|
175
|
+
? A
|
|
176
|
+
: Schema.Struct<Schema.Simplify<ExtractFields<V, Fields>>>
|
|
177
|
+
: Schema.Struct<Schema.Simplify<ExtractFields<V, Fields>>>
|
|
178
|
+
: never;
|
|
179
|
+
|
|
180
|
+
const extract: {
|
|
181
|
+
<V extends string, const IsDefault extends boolean = false>(
|
|
182
|
+
variant: V,
|
|
183
|
+
options?: {
|
|
184
|
+
readonly isDefault?: IsDefault | undefined;
|
|
185
|
+
},
|
|
186
|
+
): <A extends Struct<any>>(self: A) => Extract<V, A, IsDefault>;
|
|
187
|
+
<V extends string, A extends Struct<any>, const IsDefault extends boolean = false>(
|
|
188
|
+
self: A,
|
|
189
|
+
variant: V,
|
|
190
|
+
options?: {
|
|
191
|
+
readonly isDefault?: IsDefault | undefined;
|
|
192
|
+
},
|
|
193
|
+
): Extract<V, A, IsDefault>;
|
|
194
|
+
} = dual(
|
|
195
|
+
(args) => isStruct(args[0]),
|
|
196
|
+
<V extends string, A extends Struct<any>>(
|
|
197
|
+
self: A,
|
|
198
|
+
variant: V,
|
|
199
|
+
options?: {
|
|
200
|
+
readonly isDefault?: boolean | undefined;
|
|
201
|
+
},
|
|
202
|
+
): Extract<V, A> => {
|
|
203
|
+
const cache = self[cacheSymbol] ?? (self[cacheSymbol] = {});
|
|
204
|
+
const cacheKey = options?.isDefault === true ? '__default' : variant;
|
|
205
|
+
if (cache[cacheKey] !== undefined) {
|
|
206
|
+
return cache[cacheKey] as any;
|
|
207
|
+
}
|
|
208
|
+
const fields: Record<string, any> = {};
|
|
209
|
+
for (const key of Object.keys(self[TypeId])) {
|
|
210
|
+
const value = self[TypeId][key];
|
|
211
|
+
if (TypeId in value) {
|
|
212
|
+
if (options?.isDefault === true && Schema.isSchema(value)) {
|
|
213
|
+
fields[key] = value;
|
|
214
|
+
} else {
|
|
215
|
+
fields[key] = extract(value, variant);
|
|
216
|
+
}
|
|
217
|
+
} else if (FieldTypeId in value) {
|
|
218
|
+
if (variant in value.schemas) {
|
|
219
|
+
fields[key] = value.schemas[variant];
|
|
220
|
+
}
|
|
221
|
+
} else {
|
|
222
|
+
fields[key] = value;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return (cache[cacheKey] = Schema.Struct(fields) as any);
|
|
226
|
+
},
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* @category accessors
|
|
231
|
+
* @since 1.0.0
|
|
232
|
+
*/
|
|
233
|
+
export const fields = <A extends Struct<any>>(self: A): A[TypeId] => self[TypeId];
|
|
234
|
+
|
|
235
|
+
type RequiredKeys<T> = {
|
|
236
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? never : K;
|
|
237
|
+
}[keyof T];
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* @since 1.0.0
|
|
241
|
+
* @category models
|
|
242
|
+
*/
|
|
243
|
+
export interface Class<Self, Fields extends Struct.Fields, SchemaFields extends Schema.Struct.Fields, A, I, R, C>
|
|
244
|
+
extends Schema.Schema<Self, Schema.Simplify<I>, R>,
|
|
245
|
+
Struct<Fields> {
|
|
246
|
+
new (
|
|
247
|
+
props: RequiredKeys<C> extends never ? void | Schema.Simplify<C> : Schema.Simplify<C>,
|
|
248
|
+
options?: {
|
|
249
|
+
readonly disableValidation?: boolean;
|
|
250
|
+
},
|
|
251
|
+
): A;
|
|
252
|
+
|
|
253
|
+
readonly ast: AST.Transformation;
|
|
254
|
+
|
|
255
|
+
make<Args extends Array<any>, X>(this: { new (...args: Args): X }, ...args: Args): X;
|
|
256
|
+
|
|
257
|
+
annotations(annotations: Schema.Annotations.Schema<Self>): Schema.SchemaClass<Self, Schema.Simplify<I>, R>;
|
|
258
|
+
|
|
259
|
+
readonly identifier: string;
|
|
260
|
+
readonly fields: SchemaFields;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
type ClassFromFields<Self, Fields extends Struct.Fields, SchemaFields extends Schema.Struct.Fields> = Class<
|
|
264
|
+
Self,
|
|
265
|
+
Fields,
|
|
266
|
+
SchemaFields,
|
|
267
|
+
Schema.Struct.Type<SchemaFields>,
|
|
268
|
+
Schema.Struct.Encoded<SchemaFields>,
|
|
269
|
+
Schema.Struct.Context<SchemaFields>,
|
|
270
|
+
Schema.Struct.Constructor<SchemaFields>
|
|
271
|
+
>;
|
|
272
|
+
|
|
273
|
+
type MissingSelfGeneric<Params extends string = ''> =
|
|
274
|
+
`Missing \`Self\` generic - use \`class Self extends Class<Self>()(${Params}{ ... })\``;
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* @since 1.0.0
|
|
278
|
+
* @category models
|
|
279
|
+
*/
|
|
280
|
+
export interface Union<Members extends ReadonlyArray<Struct<any>>>
|
|
281
|
+
extends Schema.Union<{
|
|
282
|
+
readonly [K in keyof Members]: [Members[K]] extends [Schema.Schema.All] ? Members[K] : never;
|
|
283
|
+
}> {}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* @since 1.0.0
|
|
287
|
+
* @category models
|
|
288
|
+
*/
|
|
289
|
+
export declare namespace Union {
|
|
290
|
+
/**
|
|
291
|
+
* @since 1.0.0
|
|
292
|
+
* @category models
|
|
293
|
+
*/
|
|
294
|
+
export type Variants<Members extends ReadonlyArray<Struct<any>>, Variants extends string> = {
|
|
295
|
+
readonly [Variant in Variants]: Schema.Union<{
|
|
296
|
+
[K in keyof Members]: Extract<Variant, Members[K]>;
|
|
297
|
+
}>;
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* @since 1.0.0
|
|
303
|
+
* @category models
|
|
304
|
+
*/
|
|
305
|
+
export interface fromKey<S extends Schema.Schema.All, Key extends string>
|
|
306
|
+
extends Schema.PropertySignature<
|
|
307
|
+
':',
|
|
308
|
+
Schema.Schema.Type<S>,
|
|
309
|
+
Key,
|
|
310
|
+
':',
|
|
311
|
+
Schema.Schema.Encoded<S>,
|
|
312
|
+
false,
|
|
313
|
+
Schema.Schema.Context<S>
|
|
314
|
+
> {}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* @since 1.0.0
|
|
318
|
+
* @category models
|
|
319
|
+
*/
|
|
320
|
+
export declare namespace fromKey {
|
|
321
|
+
/**
|
|
322
|
+
* @since 1.0.0
|
|
323
|
+
*/
|
|
324
|
+
export type Rename<S, Key extends string> = S extends Schema.PropertySignature<
|
|
325
|
+
infer _TypeToken,
|
|
326
|
+
infer _Type,
|
|
327
|
+
infer _Key,
|
|
328
|
+
infer _EncodedToken,
|
|
329
|
+
infer _Encoded,
|
|
330
|
+
infer _HasDefault,
|
|
331
|
+
infer _R
|
|
332
|
+
>
|
|
333
|
+
? Schema.PropertySignature<_TypeToken, _Type, Key, _EncodedToken, _Encoded, _HasDefault, _R>
|
|
334
|
+
: S extends Schema.Schema.All
|
|
335
|
+
? fromKey<S, Key>
|
|
336
|
+
: never;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* @since 1.0.0
|
|
341
|
+
* @category constructors
|
|
342
|
+
*/
|
|
343
|
+
export const make = <const Variants extends ReadonlyArray<string>, const Default extends Variants[number]>(options: {
|
|
344
|
+
readonly variants: Variants;
|
|
345
|
+
readonly defaultVariant: Default;
|
|
346
|
+
}): {
|
|
347
|
+
readonly Struct: <const A extends Struct.Fields>(fields: A & Struct.Validate<A, Variants[number]>) => Struct<A>;
|
|
348
|
+
readonly Field: <const A extends Field.ConfigWithKeys<Variants[number]>>(
|
|
349
|
+
config: A & { readonly [K in Exclude<keyof A, Variants[number]>]: never },
|
|
350
|
+
) => Field<A>;
|
|
351
|
+
readonly FieldOnly: <const Keys extends ReadonlyArray<Variants[number]>>(
|
|
352
|
+
...keys: Keys
|
|
353
|
+
) => <S extends Schema.Schema.All | Schema.PropertySignature.All>(
|
|
354
|
+
schema: S,
|
|
355
|
+
) => Field<{ readonly [K in Keys[number]]: S }>;
|
|
356
|
+
readonly FieldExcept: <const Keys extends ReadonlyArray<Variants[number]>>(
|
|
357
|
+
...keys: Keys
|
|
358
|
+
) => <S extends Schema.Schema.All | Schema.PropertySignature.All>(
|
|
359
|
+
schema: S,
|
|
360
|
+
) => Field<{ readonly [K in Exclude<Variants[number], Keys[number]>]: S }>;
|
|
361
|
+
readonly fieldEvolve: {
|
|
362
|
+
<
|
|
363
|
+
Self extends Field<any> | Field.ValueAny,
|
|
364
|
+
const Mapping extends Self extends Field<infer S>
|
|
365
|
+
? { readonly [K in keyof S]?: (variant: S[K]) => Field.ValueAny }
|
|
366
|
+
: { readonly [K in Variants[number]]?: (variant: Self) => Field.ValueAny },
|
|
367
|
+
>(
|
|
368
|
+
f: Mapping,
|
|
369
|
+
): (self: Self) => Field<
|
|
370
|
+
Self extends Field<infer S>
|
|
371
|
+
? {
|
|
372
|
+
readonly [K in keyof S]: K extends keyof Mapping
|
|
373
|
+
? Mapping[K] extends (arg: any) => any
|
|
374
|
+
? ReturnType<Mapping[K]>
|
|
375
|
+
: S[K]
|
|
376
|
+
: S[K];
|
|
377
|
+
}
|
|
378
|
+
: {
|
|
379
|
+
readonly [K in Variants[number]]: K extends keyof Mapping
|
|
380
|
+
? Mapping[K] extends (arg: any) => any
|
|
381
|
+
? ReturnType<Mapping[K]>
|
|
382
|
+
: Self
|
|
383
|
+
: Self;
|
|
384
|
+
}
|
|
385
|
+
>;
|
|
386
|
+
<
|
|
387
|
+
Self extends Field<any> | Field.ValueAny,
|
|
388
|
+
const Mapping extends Self extends Field<infer S>
|
|
389
|
+
? {
|
|
390
|
+
readonly [K in keyof S]?: (variant: S[K]) => Field.ValueAny;
|
|
391
|
+
}
|
|
392
|
+
: { readonly [K in Variants[number]]?: (variant: Self) => Field.ValueAny },
|
|
393
|
+
>(
|
|
394
|
+
self: Self,
|
|
395
|
+
f: Mapping,
|
|
396
|
+
): Field<
|
|
397
|
+
Self extends Field<infer S>
|
|
398
|
+
? {
|
|
399
|
+
readonly [K in keyof S]: K extends keyof Mapping
|
|
400
|
+
? Mapping[K] extends (arg: any) => any
|
|
401
|
+
? ReturnType<Mapping[K]>
|
|
402
|
+
: S[K]
|
|
403
|
+
: S[K];
|
|
404
|
+
}
|
|
405
|
+
: {
|
|
406
|
+
readonly [K in Variants[number]]: K extends keyof Mapping
|
|
407
|
+
? Mapping[K] extends (arg: any) => any
|
|
408
|
+
? ReturnType<Mapping[K]>
|
|
409
|
+
: Self
|
|
410
|
+
: Self;
|
|
411
|
+
}
|
|
412
|
+
>;
|
|
413
|
+
};
|
|
414
|
+
readonly fieldFromKey: {
|
|
415
|
+
<
|
|
416
|
+
Self extends Field<any> | Field.ValueAny,
|
|
417
|
+
const Mapping extends Self extends Field<infer S>
|
|
418
|
+
? { readonly [K in keyof S]?: string }
|
|
419
|
+
: { readonly [K in Variants[number]]?: string },
|
|
420
|
+
>(
|
|
421
|
+
mapping: Mapping,
|
|
422
|
+
): (self: Self) => Field<
|
|
423
|
+
Self extends Field<infer S>
|
|
424
|
+
? {
|
|
425
|
+
readonly [K in keyof S]: K extends keyof Mapping
|
|
426
|
+
? Mapping[K] extends string
|
|
427
|
+
? fromKey.Rename<S[K], Mapping[K]>
|
|
428
|
+
: S[K]
|
|
429
|
+
: S[K];
|
|
430
|
+
}
|
|
431
|
+
: {
|
|
432
|
+
readonly [K in Variants[number]]: K extends keyof Mapping
|
|
433
|
+
? Mapping[K] extends string
|
|
434
|
+
? fromKey.Rename<Self, Mapping[K]>
|
|
435
|
+
: Self
|
|
436
|
+
: Self;
|
|
437
|
+
}
|
|
438
|
+
>;
|
|
439
|
+
<
|
|
440
|
+
Self extends Field<any> | Field.ValueAny,
|
|
441
|
+
const Mapping extends Self extends Field<infer S>
|
|
442
|
+
? { readonly [K in keyof S]?: string }
|
|
443
|
+
: { readonly [K in Variants[number]]?: string },
|
|
444
|
+
>(
|
|
445
|
+
self: Self,
|
|
446
|
+
mapping: Mapping,
|
|
447
|
+
): Field<
|
|
448
|
+
Self extends Field<infer S>
|
|
449
|
+
? {
|
|
450
|
+
readonly [K in keyof S]: K extends keyof Mapping
|
|
451
|
+
? Mapping[K] extends string
|
|
452
|
+
? fromKey.Rename<S[K], Mapping[K]>
|
|
453
|
+
: S[K]
|
|
454
|
+
: S[K];
|
|
455
|
+
}
|
|
456
|
+
: {
|
|
457
|
+
readonly [K in Variants[number]]: K extends keyof Mapping
|
|
458
|
+
? Mapping[K] extends string
|
|
459
|
+
? fromKey.Rename<Self, Mapping[K]>
|
|
460
|
+
: Self
|
|
461
|
+
: Self;
|
|
462
|
+
}
|
|
463
|
+
>;
|
|
464
|
+
};
|
|
465
|
+
readonly Class: <Self = never>(
|
|
466
|
+
identifier: string,
|
|
467
|
+
) => <const Fields extends Struct.Fields>(
|
|
468
|
+
fields: Fields & Struct.Validate<Fields, Variants[number]>,
|
|
469
|
+
annotations?: Schema.Annotations.Schema<Self>,
|
|
470
|
+
) => [Self] extends [never]
|
|
471
|
+
? MissingSelfGeneric
|
|
472
|
+
: ClassFromFields<Self, Fields, Schema.Simplify<ExtractFields<Default, Fields, true>>> & {
|
|
473
|
+
readonly [V in Variants[number]]: Extract<V, Struct<Fields>>;
|
|
474
|
+
};
|
|
475
|
+
readonly Union: <const Members extends ReadonlyArray<Struct<any>>>(
|
|
476
|
+
...members: Members
|
|
477
|
+
) => Union<Members> & Union.Variants<Members, Variants[number]>;
|
|
478
|
+
readonly extract: {
|
|
479
|
+
<V extends Variants[number]>(
|
|
480
|
+
variant: V,
|
|
481
|
+
): <A extends Struct<any>>(self: A) => Extract<V, A, V extends Default ? true : false>;
|
|
482
|
+
<V extends Variants[number], A extends Struct<any>>(
|
|
483
|
+
self: A,
|
|
484
|
+
variant: V,
|
|
485
|
+
): Extract<V, A, V extends Default ? true : false>;
|
|
486
|
+
};
|
|
487
|
+
} => {
|
|
488
|
+
function Class<Self>(identifier: string) {
|
|
489
|
+
return (fields: Struct.Fields, annotations?: Schema.Annotations.Schema<Self>) => {
|
|
490
|
+
const idField = Field({
|
|
491
|
+
select: Schema.String,
|
|
492
|
+
});
|
|
493
|
+
const deletedField = Field({
|
|
494
|
+
select: Schema.Boolean,
|
|
495
|
+
});
|
|
496
|
+
const versionField = Field({
|
|
497
|
+
select: Schema.String,
|
|
498
|
+
});
|
|
499
|
+
const relationField = Field({
|
|
500
|
+
select: Schema.optional(
|
|
501
|
+
Schema.Struct({
|
|
502
|
+
id: Schema.String,
|
|
503
|
+
}),
|
|
504
|
+
),
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
const extractFields: Struct.Fields = {
|
|
508
|
+
...fields,
|
|
509
|
+
id: idField,
|
|
510
|
+
__deleted: deletedField,
|
|
511
|
+
__version: versionField,
|
|
512
|
+
_relation: relationField,
|
|
513
|
+
};
|
|
514
|
+
const variantStruct = Struct(extractFields);
|
|
515
|
+
const schema = extract(variantStruct, options.defaultVariant, {
|
|
516
|
+
isDefault: true,
|
|
517
|
+
});
|
|
518
|
+
class Base extends Schema.Class<any>(identifier)(schema.fields, annotations) {
|
|
519
|
+
static [TypeId] = extractFields;
|
|
520
|
+
}
|
|
521
|
+
for (const variant of options.variants) {
|
|
522
|
+
Object.defineProperty(Base, variant, {
|
|
523
|
+
value: extract(variantStruct, variant).annotations({
|
|
524
|
+
identifier: `${identifier}.${variant}`,
|
|
525
|
+
title: `${identifier}.${variant}`,
|
|
526
|
+
}),
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
return Base;
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
function FieldOnly<Keys extends Variants>(...keys: Keys) {
|
|
533
|
+
return <S extends Schema.Schema.All | Schema.PropertySignature.All>(schema: S) => {
|
|
534
|
+
const obj: Record<string, S> = {};
|
|
535
|
+
for (const key of keys) {
|
|
536
|
+
obj[key] = schema;
|
|
537
|
+
}
|
|
538
|
+
return Field(obj);
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
function FieldExcept<Keys extends Variants>(...keys: Keys) {
|
|
542
|
+
return <S extends Schema.Schema.All | Schema.PropertySignature.All>(schema: S) => {
|
|
543
|
+
const obj: Record<string, S> = {};
|
|
544
|
+
for (const variant of options.variants) {
|
|
545
|
+
if (!keys.includes(variant)) {
|
|
546
|
+
obj[variant] = schema;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
return Field(obj);
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
function UnionVariants(...members: ReadonlyArray<Struct<any>>) {
|
|
553
|
+
return Union(members, options.variants);
|
|
554
|
+
}
|
|
555
|
+
const fieldEvolve = dual(
|
|
556
|
+
2,
|
|
557
|
+
(
|
|
558
|
+
self: Field<any> | Schema.Schema.All | Schema.PropertySignature.All,
|
|
559
|
+
f: Record<string, (schema: Field.ValueAny) => Field.ValueAny>,
|
|
560
|
+
): Field<any> => {
|
|
561
|
+
const field = isField(self)
|
|
562
|
+
? self
|
|
563
|
+
: Field(Object.fromEntries(options.variants.map((variant) => [variant, self])));
|
|
564
|
+
return Field(Struct_.evolve(field.schemas, f));
|
|
565
|
+
},
|
|
566
|
+
);
|
|
567
|
+
const fieldFromKey = dual(
|
|
568
|
+
2,
|
|
569
|
+
(
|
|
570
|
+
self:
|
|
571
|
+
| Field<{
|
|
572
|
+
readonly [key: string]: Schema.Schema.All | Schema.PropertySignature.Any | undefined;
|
|
573
|
+
}>
|
|
574
|
+
| Schema.Schema.All
|
|
575
|
+
| Schema.PropertySignature.Any,
|
|
576
|
+
mapping: Record<string, string>,
|
|
577
|
+
): Field<any> => {
|
|
578
|
+
const obj: Record<string, any> = {};
|
|
579
|
+
if (isField(self)) {
|
|
580
|
+
for (const [key, schema] of Object.entries(self.schemas)) {
|
|
581
|
+
obj[key] = mapping[key] !== undefined ? renameFieldValue(schema as any, mapping[key]) : schema;
|
|
582
|
+
}
|
|
583
|
+
} else {
|
|
584
|
+
for (const key of options.variants) {
|
|
585
|
+
obj[key] = mapping[key] !== undefined ? renameFieldValue(self as any, mapping[key]) : self;
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
return Field(obj);
|
|
589
|
+
},
|
|
590
|
+
);
|
|
591
|
+
const extractVariants = dual(2, (self: Struct<any>, variant: string): any =>
|
|
592
|
+
extract(self, variant, {
|
|
593
|
+
isDefault: variant === options.defaultVariant,
|
|
594
|
+
}),
|
|
595
|
+
);
|
|
596
|
+
return {
|
|
597
|
+
Struct,
|
|
598
|
+
Field,
|
|
599
|
+
FieldOnly,
|
|
600
|
+
FieldExcept,
|
|
601
|
+
Class,
|
|
602
|
+
Union: UnionVariants,
|
|
603
|
+
fieldEvolve,
|
|
604
|
+
fieldFromKey,
|
|
605
|
+
extract: extractVariants,
|
|
606
|
+
} as any;
|
|
607
|
+
};
|
|
608
|
+
|
|
609
|
+
/**
|
|
610
|
+
* @since 1.0.0
|
|
611
|
+
* @category overrideable
|
|
612
|
+
*/
|
|
613
|
+
export const Override = <A>(value: A): A & Brand<'Override'> => value as any;
|
|
614
|
+
|
|
615
|
+
/**
|
|
616
|
+
* @since 1.0.0
|
|
617
|
+
* @category overrideable
|
|
618
|
+
*/
|
|
619
|
+
export interface Overrideable<To, From, R = never>
|
|
620
|
+
extends Schema.PropertySignature<':', (To & Brand<'Override'>) | undefined, never, ':', From, true, R> {}
|
|
621
|
+
|
|
622
|
+
/**
|
|
623
|
+
* @since 1.0.0
|
|
624
|
+
* @category overrideable
|
|
625
|
+
*/
|
|
626
|
+
export const Overrideable = <From, IFrom, RFrom, To, ITo, R>(
|
|
627
|
+
from: Schema.Schema<From, IFrom, RFrom>,
|
|
628
|
+
to: Schema.Schema<To, ITo>,
|
|
629
|
+
options: {
|
|
630
|
+
readonly generate: (_: Option.Option<ITo>) => Effect.Effect<From, ParseResult.ParseIssue, R>;
|
|
631
|
+
},
|
|
632
|
+
): Overrideable<To, IFrom, RFrom | R> =>
|
|
633
|
+
Schema.transformOrFail(from, Schema.Union(Schema.Undefined, to.pipe(Schema.brand('Override'))), {
|
|
634
|
+
decode: (_) => ParseResult.succeed(undefined),
|
|
635
|
+
encode: (dt) => options.generate(dt === undefined ? Option.none() : Option.some(dt)),
|
|
636
|
+
}).pipe(Schema.propertySignature, Schema.withConstructorDefault(constUndefined));
|
|
637
|
+
|
|
638
|
+
const StructProto = {
|
|
639
|
+
pipe() {
|
|
640
|
+
return pipeArguments(this, arguments);
|
|
641
|
+
},
|
|
642
|
+
};
|
|
643
|
+
|
|
644
|
+
const Struct = <const A extends Field.Fields>(fields: A): Struct<A> => {
|
|
645
|
+
const self = Object.create(StructProto);
|
|
646
|
+
self[TypeId] = fields;
|
|
647
|
+
return self;
|
|
648
|
+
};
|
|
649
|
+
|
|
650
|
+
const FieldProto = {
|
|
651
|
+
[FieldTypeId]: FieldTypeId,
|
|
652
|
+
pipe() {
|
|
653
|
+
return pipeArguments(this, arguments);
|
|
654
|
+
},
|
|
655
|
+
};
|
|
656
|
+
|
|
657
|
+
const Field = <const A extends Field.Config>(schemas: A): Field<A> => {
|
|
658
|
+
const self = Object.create(FieldProto);
|
|
659
|
+
self.schemas = schemas;
|
|
660
|
+
return self;
|
|
661
|
+
};
|
|
662
|
+
|
|
663
|
+
const Union = <Members extends ReadonlyArray<Struct<any>>, Variants extends ReadonlyArray<string>>(
|
|
664
|
+
members: Members,
|
|
665
|
+
variants: Variants,
|
|
666
|
+
) => {
|
|
667
|
+
class VariantUnion extends (Schema.Union(...members.filter((member) => Schema.isSchema(member))) as any) {}
|
|
668
|
+
for (const variant of variants) {
|
|
669
|
+
Object.defineProperty(VariantUnion, variant, {
|
|
670
|
+
value: Schema.Union(...members.map((member) => extract(member, variant))),
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
return VariantUnion;
|
|
674
|
+
};
|
|
675
|
+
|
|
676
|
+
const renameFieldValue = <F extends Schema.Schema.All | Schema.PropertySignature.Any>(self: F, key: string) =>
|
|
677
|
+
Schema.isPropertySignature(self) ? Schema.fromKey(self, key) : Schema.fromKey(Schema.propertySignature(self), key);
|