@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.
Files changed (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -0
  3. package/dist/connect/auth-storage.d.ts.map +1 -0
  4. package/dist/connect/create-app-identity.d.ts.map +1 -0
  5. package/dist/connect/create-auth-url.d.ts.map +1 -0
  6. package/dist/connect/create-auth-url.js +35 -0
  7. package/dist/connect/create-auth-url.js.map +1 -0
  8. package/dist/connect/create-callback-params.d.ts.map +1 -0
  9. package/dist/connect/create-callback-params.js +17 -0
  10. package/dist/connect/create-callback-params.js.map +1 -0
  11. package/dist/connect/create-identity-keys.d.ts.map +1 -0
  12. package/dist/connect/identity-encryption.d.ts.map +1 -0
  13. package/dist/connect/index.d.ts.map +1 -0
  14. package/dist/connect/login.d.ts.map +1 -0
  15. package/dist/connect/parse-callback-params.d.ts.map +1 -0
  16. package/dist/connect/parse-callback-params.js +63 -0
  17. package/dist/connect/parse-callback-params.js.map +1 -0
  18. package/dist/connect/prove-ownership.d.ts.map +1 -0
  19. package/dist/connect/types.d.ts +57 -0
  20. package/dist/connect/types.d.ts.map +1 -0
  21. package/dist/connect/types.js +24 -0
  22. package/dist/connect/types.js.map +1 -0
  23. package/dist/entity/create.d.ts.map +1 -0
  24. package/dist/entity/decodedEntitiesCache.d.ts.map +1 -0
  25. package/dist/entity/delete.d.ts.map +1 -0
  26. package/dist/entity/entity.d.ts.map +1 -0
  27. package/dist/entity/entityRelationParentsMap.d.ts.map +1 -0
  28. package/dist/entity/findMany.d.ts.map +1 -0
  29. package/dist/entity/findMany.js +436 -0
  30. package/dist/entity/findMany.js.map +1 -0
  31. package/dist/entity/findOne.d.ts.map +1 -0
  32. package/dist/entity/getEntityRelations.d.ts.map +1 -0
  33. package/dist/entity/index.d.ts.map +1 -0
  34. package/dist/entity/relationParentsMap.d.ts.map +1 -0
  35. package/dist/entity/removeRelation.d.ts.map +1 -0
  36. package/dist/entity/types.d.ts +79 -0
  37. package/dist/entity/types.d.ts.map +1 -0
  38. package/dist/entity/types.js +2 -0
  39. package/dist/entity/types.js.map +1 -0
  40. package/dist/entity/update.d.ts.map +1 -0
  41. package/dist/identity/auth-storage.d.ts.map +1 -0
  42. package/dist/identity/get-verified-identity.d.ts.map +1 -0
  43. package/dist/identity/identity-encryption.d.ts.map +1 -0
  44. package/dist/identity/index.d.ts.map +1 -0
  45. package/dist/identity/logout.d.ts.map +1 -0
  46. package/dist/identity/prove-ownership.d.ts.map +1 -0
  47. package/dist/inboxes/create-inbox.d.ts.map +1 -0
  48. package/dist/inboxes/get-list-inboxes.d.ts.map +1 -0
  49. package/dist/inboxes/index.d.ts.map +1 -0
  50. package/dist/inboxes/merge-messages.d.ts.map +1 -0
  51. package/dist/inboxes/message-encryption.d.ts.map +1 -0
  52. package/dist/inboxes/message-validation.d.ts.map +1 -0
  53. package/dist/inboxes/prepare-message.d.ts +31 -0
  54. package/dist/inboxes/prepare-message.d.ts.map +1 -0
  55. package/dist/inboxes/recover-inbox-creator.d.ts.map +1 -0
  56. package/dist/inboxes/recover-inbox-message-signer.d.ts.map +1 -0
  57. package/dist/inboxes/send-message.d.ts.map +1 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/messages/index.d.ts.map +1 -0
  60. package/dist/messages/signed-update-message.d.ts.map +1 -0
  61. package/dist/messages/types.d.ts.map +1 -0
  62. package/dist/space-events/accept-invitation.d.ts.map +1 -0
  63. package/dist/space-events/apply-event.d.ts.map +1 -0
  64. package/dist/space-events/create-inbox.d.ts.map +1 -0
  65. package/dist/space-events/create-invitation.d.ts.map +1 -0
  66. package/dist/space-events/create-space.d.ts.map +1 -0
  67. package/dist/space-events/delete-space.d.ts.map +1 -0
  68. package/dist/space-events/hash-event.d.ts.map +1 -0
  69. package/dist/space-events/index.d.ts.map +1 -0
  70. package/dist/space-info/decrypt-space-info.d.ts.map +1 -0
  71. package/dist/space-info/encrypt-and-sign-space-info.d.ts.map +1 -0
  72. package/dist/space-info/index.d.ts.map +1 -0
  73. package/dist/store-connect.d.ts.map +1 -0
  74. package/dist/store.d.ts.map +1 -0
  75. package/dist/type/type.d.ts.map +1 -0
  76. package/dist/utils/automergeId.d.ts +9 -0
  77. package/dist/utils/automergeId.d.ts.map +1 -0
  78. package/dist/utils/automergeId.js +17 -0
  79. package/dist/utils/automergeId.js.map +1 -0
  80. package/dist/utils/generateId.d.ts +15 -0
  81. package/dist/utils/generateId.d.ts.map +1 -0
  82. package/dist/utils/generateId.js +18 -0
  83. package/dist/utils/generateId.js.map +1 -0
  84. package/dist/utils/index.d.ts.map +1 -0
  85. package/package.json +35 -0
  86. package/src/connect/auth-storage.ts +67 -0
  87. package/src/connect/create-app-identity.ts +16 -0
  88. package/src/connect/create-auth-url.ts +42 -0
  89. package/src/connect/create-callback-params.ts +30 -0
  90. package/src/connect/create-identity-keys.ts +20 -0
  91. package/src/connect/identity-encryption.ts +232 -0
  92. package/src/connect/index.ts +10 -0
  93. package/src/connect/login.ts +114 -0
  94. package/src/connect/parse-auth-params.ts +37 -0
  95. package/src/connect/parse-callback-params.ts +67 -0
  96. package/src/connect/prove-ownership.ts +58 -0
  97. package/src/connect/types.ts +67 -0
  98. package/src/entity/create.ts +58 -0
  99. package/src/entity/decodedEntitiesCache.ts +38 -0
  100. package/src/entity/delete.ts +52 -0
  101. package/src/entity/entity.ts +26 -0
  102. package/src/entity/entityRelationParentsMap.ts +6 -0
  103. package/src/entity/findMany.ts +506 -0
  104. package/src/entity/findOne.ts +34 -0
  105. package/src/entity/getEntityRelations.ts +45 -0
  106. package/src/entity/hasValidTypesProperty.ts +8 -0
  107. package/src/entity/index.ts +8 -0
  108. package/src/entity/relationParentsMap.ts +6 -0
  109. package/src/entity/removeRelation.ts +21 -0
  110. package/src/entity/test.ts +0 -0
  111. package/src/entity/types.ts +100 -0
  112. package/src/entity/update.ts +58 -0
  113. package/src/entity/variant-schema.ts +677 -0
  114. package/src/identity/auth-storage.ts +57 -0
  115. package/src/identity/get-verified-identity.ts +53 -0
  116. package/src/identity/identity-encryption.ts +140 -0
  117. package/src/identity/index.ts +6 -0
  118. package/src/identity/logout.ts +8 -0
  119. package/src/identity/prove-ownership.ts +58 -0
  120. package/src/identity/types.ts +44 -0
  121. package/src/inboxes/create-inbox.ts +102 -0
  122. package/src/inboxes/get-list-inboxes.ts +52 -0
  123. package/src/inboxes/index.ts +10 -0
  124. package/src/inboxes/merge-messages.ts +28 -0
  125. package/src/inboxes/message-encryption.ts +35 -0
  126. package/src/inboxes/message-validation.ts +66 -0
  127. package/src/inboxes/prepare-message.ts +85 -0
  128. package/src/inboxes/recover-inbox-creator.ts +29 -0
  129. package/src/inboxes/recover-inbox-message-signer.ts +42 -0
  130. package/src/inboxes/send-message.ts +75 -0
  131. package/src/inboxes/types.ts +9 -0
  132. package/src/index.ts +13 -0
  133. package/src/key/create-key.ts +27 -0
  134. package/src/key/decrypt-key.ts +19 -0
  135. package/src/key/encrypt-key.ts +27 -0
  136. package/src/key/index.ts +4 -0
  137. package/src/key/key-box.ts +31 -0
  138. package/src/messages/decrypt-message.ts +13 -0
  139. package/src/messages/encrypt-message.ts +14 -0
  140. package/src/messages/index.ts +5 -0
  141. package/src/messages/serialize.ts +24 -0
  142. package/src/messages/signed-update-message.ts +84 -0
  143. package/src/messages/types.ts +506 -0
  144. package/src/space-events/accept-invitation.ts +36 -0
  145. package/src/space-events/apply-event.ts +150 -0
  146. package/src/space-events/create-inbox.ts +56 -0
  147. package/src/space-events/create-invitation.ts +41 -0
  148. package/src/space-events/create-space.ts +35 -0
  149. package/src/space-events/delete-space.ts +36 -0
  150. package/src/space-events/hash-event.ts +10 -0
  151. package/src/space-events/index.ts +8 -0
  152. package/src/space-events/types.ts +137 -0
  153. package/src/space-info/decrypt-space-info.ts +22 -0
  154. package/src/space-info/encrypt-and-sign-space-info.ts +50 -0
  155. package/src/space-info/index.ts +3 -0
  156. package/src/space-info/types.ts +7 -0
  157. package/src/store-connect.ts +504 -0
  158. package/src/store.ts +493 -0
  159. package/src/type/type.ts +25 -0
  160. package/src/types.ts +47 -0
  161. package/src/utils/assertExhaustive.ts +3 -0
  162. package/src/utils/automergeId.ts +18 -0
  163. package/src/utils/base58.ts +74 -0
  164. package/src/utils/generateId.ts +18 -0
  165. package/src/utils/hexBytesAddressUtils.ts +25 -0
  166. package/src/utils/index.ts +8 -0
  167. package/src/utils/internal/base58Utils.ts +47 -0
  168. package/src/utils/internal/deep-merge.ts +38 -0
  169. package/src/utils/isRelationField.ts +9 -0
  170. package/src/utils/jsc.ts +94 -0
  171. 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);