jazz-tools 0.19.12 → 0.19.14

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 (119) hide show
  1. package/.turbo/turbo-build.log +44 -44
  2. package/CHANGELOG.md +18 -0
  3. package/dist/browser/createBrowserContext.d.ts +1 -5
  4. package/dist/browser/createBrowserContext.d.ts.map +1 -1
  5. package/dist/browser/index.js +124 -47
  6. package/dist/browser/index.js.map +1 -1
  7. package/dist/browser/provideBrowserLockSession/BrowserSessionProvider.d.ts +12 -0
  8. package/dist/browser/provideBrowserLockSession/BrowserSessionProvider.d.ts.map +1 -0
  9. package/dist/browser/provideBrowserLockSession/BrowserSessionProvider.test.d.ts +2 -0
  10. package/dist/browser/provideBrowserLockSession/BrowserSessionProvider.test.d.ts.map +1 -0
  11. package/dist/browser/provideBrowserLockSession/SessionIDStorage.d.ts +6 -0
  12. package/dist/browser/provideBrowserLockSession/SessionIDStorage.d.ts.map +1 -0
  13. package/dist/browser/provideBrowserLockSession/index.d.ts +4 -0
  14. package/dist/browser/provideBrowserLockSession/index.d.ts.map +1 -0
  15. package/dist/{chunk-AGF4HEDH.js → chunk-GAPMDNJY.js} +437 -82
  16. package/dist/chunk-GAPMDNJY.js.map +1 -0
  17. package/dist/index.js +5 -3
  18. package/dist/index.js.map +1 -1
  19. package/dist/react-native/index.js +41 -12
  20. package/dist/react-native/index.js.map +1 -1
  21. package/dist/react-native-core/ReactNativeSessionProvider.d.ts +11 -0
  22. package/dist/react-native-core/ReactNativeSessionProvider.d.ts.map +1 -0
  23. package/dist/react-native-core/index.js +41 -12
  24. package/dist/react-native-core/index.js.map +1 -1
  25. package/dist/react-native-core/platform.d.ts +2 -8
  26. package/dist/react-native-core/platform.d.ts.map +1 -1
  27. package/dist/react-native-core/tests/ReactNativeSessionProvider.test.d.ts +2 -0
  28. package/dist/react-native-core/tests/ReactNativeSessionProvider.test.d.ts.map +1 -0
  29. package/dist/testing.js +4 -3
  30. package/dist/testing.js.map +1 -1
  31. package/dist/tools/coValues/account.d.ts.map +1 -1
  32. package/dist/tools/coValues/coFeed.d.ts +2 -2
  33. package/dist/tools/coValues/coFeed.d.ts.map +1 -1
  34. package/dist/tools/coValues/coList.d.ts +1 -2
  35. package/dist/tools/coValues/coList.d.ts.map +1 -1
  36. package/dist/tools/coValues/coMap.d.ts.map +1 -1
  37. package/dist/tools/coValues/coVector.d.ts.map +1 -1
  38. package/dist/tools/coValues/group.d.ts +5 -1
  39. package/dist/tools/coValues/group.d.ts.map +1 -1
  40. package/dist/tools/coValues/interfaces.d.ts +2 -1
  41. package/dist/tools/coValues/interfaces.d.ts.map +1 -1
  42. package/dist/tools/exports.d.ts +2 -2
  43. package/dist/tools/exports.d.ts.map +1 -1
  44. package/dist/tools/implementation/createContext.d.ts +21 -11
  45. package/dist/tools/implementation/createContext.d.ts.map +1 -1
  46. package/dist/tools/implementation/schema.d.ts +14 -6
  47. package/dist/tools/implementation/schema.d.ts.map +1 -1
  48. package/dist/tools/implementation/schemaUtils.d.ts +1 -1
  49. package/dist/tools/implementation/schemaUtils.d.ts.map +1 -1
  50. package/dist/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts.map +1 -1
  51. package/dist/tools/implementation/zodSchema/schemaPermissions.d.ts +99 -0
  52. package/dist/tools/implementation/zodSchema/schemaPermissions.d.ts.map +1 -0
  53. package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts +11 -0
  54. package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts.map +1 -1
  55. package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts +11 -0
  56. package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts.map +1 -1
  57. package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts +15 -1
  58. package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts.map +1 -1
  59. package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts +10 -0
  60. package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts.map +1 -1
  61. package/dist/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.d.ts +9 -0
  62. package/dist/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.d.ts.map +1 -1
  63. package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts +13 -1
  64. package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts.map +1 -1
  65. package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts +10 -0
  66. package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts.map +1 -1
  67. package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts +6 -0
  68. package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts.map +1 -1
  69. package/dist/tools/implementation/zodSchema/unionUtils.d.ts +12 -1
  70. package/dist/tools/implementation/zodSchema/unionUtils.d.ts.map +1 -1
  71. package/dist/tools/internal.d.ts +1 -0
  72. package/dist/tools/internal.d.ts.map +1 -1
  73. package/dist/tools/testing.d.ts.map +1 -1
  74. package/dist/tools/tests/schema.withPermissions.test.d.ts +2 -0
  75. package/dist/tools/tests/schema.withPermissions.test.d.ts.map +1 -0
  76. package/dist/worker/index.js +2 -2
  77. package/dist/worker/index.js.map +1 -1
  78. package/package.json +4 -4
  79. package/src/browser/createBrowserContext.ts +3 -62
  80. package/src/browser/provideBrowserLockSession/BrowserSessionProvider.test.ts +406 -0
  81. package/src/browser/provideBrowserLockSession/BrowserSessionProvider.ts +132 -0
  82. package/src/browser/provideBrowserLockSession/SessionIDStorage.ts +33 -0
  83. package/src/browser/provideBrowserLockSession/index.ts +11 -0
  84. package/src/react-native-core/ReactNativeSessionProvider.ts +52 -0
  85. package/src/react-native-core/platform.ts +5 -30
  86. package/src/react-native-core/tests/ReactNativeSessionProvider.test.ts +124 -0
  87. package/src/tools/coValues/account.ts +4 -0
  88. package/src/tools/coValues/coFeed.ts +8 -3
  89. package/src/tools/coValues/coList.ts +6 -3
  90. package/src/tools/coValues/coMap.ts +10 -0
  91. package/src/tools/coValues/coVector.ts +2 -1
  92. package/src/tools/coValues/group.ts +6 -4
  93. package/src/tools/coValues/interfaces.ts +19 -7
  94. package/src/tools/exports.ts +3 -1
  95. package/src/tools/implementation/createContext.ts +43 -15
  96. package/src/tools/implementation/schema.ts +23 -13
  97. package/src/tools/implementation/schemaUtils.ts +1 -1
  98. package/src/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.ts +105 -4
  99. package/src/tools/implementation/zodSchema/schemaPermissions.ts +188 -0
  100. package/src/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.ts +46 -3
  101. package/src/tools/implementation/zodSchema/schemaTypes/CoListSchema.ts +46 -3
  102. package/src/tools/implementation/zodSchema/schemaTypes/CoMapSchema.ts +50 -13
  103. package/src/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.ts +14 -0
  104. package/src/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.ts +24 -1
  105. package/src/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.ts +51 -4
  106. package/src/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.ts +25 -1
  107. package/src/tools/implementation/zodSchema/schemaTypes/RichTextSchema.ts +21 -1
  108. package/src/tools/implementation/zodSchema/unionUtils.ts +72 -20
  109. package/src/tools/internal.ts +1 -0
  110. package/src/tools/testing.ts +3 -1
  111. package/src/tools/tests/ContextManager.test.ts +2 -1
  112. package/src/tools/tests/coPlainText.test.ts +2 -2
  113. package/src/tools/tests/createContext.test.ts +79 -1
  114. package/src/tools/tests/deepLoading.test.ts +25 -2
  115. package/src/tools/tests/schema.resolved.test.ts +10 -0
  116. package/src/tools/tests/schema.withPermissions.test.ts +859 -0
  117. package/src/tools/tests/utils.ts +2 -2
  118. package/src/worker/index.ts +2 -2
  119. package/dist/chunk-AGF4HEDH.js.map +0 -1
@@ -3,6 +3,7 @@ import {
3
3
  BranchDefinition,
4
4
  CoList,
5
5
  Group,
6
+ hydrateCoreCoValueSchema,
6
7
  ID,
7
8
  Settled,
8
9
  RefsToResolve,
@@ -11,6 +12,7 @@ import {
11
12
  SubscribeListenerOptions,
12
13
  coOptionalDefiner,
13
14
  unstable_mergeBranchWithResolve,
15
+ withSchemaPermissions,
14
16
  } from "../../../internal.js";
15
17
  import { CoValueUniqueness } from "cojson";
16
18
  import { AnonymousJazzAgent } from "../../anonymousJazzAgent.js";
@@ -21,6 +23,10 @@ import { AnyZodOrCoValueSchema } from "../zodSchema.js";
21
23
  import { CoOptionalSchema } from "./CoOptionalSchema.js";
22
24
  import { CoreCoValueSchema, CoreResolveQuery } from "./CoValueSchema.js";
23
25
  import { withSchemaResolveQuery } from "../../schemaUtils.js";
26
+ import {
27
+ DEFAULT_SCHEMA_PERMISSIONS,
28
+ SchemaPermissions,
29
+ } from "../schemaPermissions.js";
24
30
 
25
31
  export class CoListSchema<
26
32
  T extends AnyZodOrCoValueSchema,
@@ -37,6 +43,12 @@ export class CoListSchema<
37
43
  */
38
44
  resolveQuery: DefaultResolveQuery = true as DefaultResolveQuery;
39
45
 
46
+ /**
47
+ * Permissions to be used when creating or composing CoValues
48
+ * @internal
49
+ */
50
+ permissions: SchemaPermissions = DEFAULT_SCHEMA_PERMISSIONS;
51
+
40
52
  constructor(
41
53
  public element: T,
42
54
  private coValueClass: typeof CoList,
@@ -63,7 +75,14 @@ export class CoListSchema<
63
75
  | Account
64
76
  | Group,
65
77
  ): CoListInstance<T> {
66
- return this.coValueClass.create(items as any, options) as CoListInstance<T>;
78
+ const optionsWithPermissions = withSchemaPermissions(
79
+ options,
80
+ this.permissions,
81
+ );
82
+ return this.coValueClass.create(
83
+ items as any,
84
+ optionsWithPermissions,
85
+ ) as CoListInstance<T>;
67
86
  }
68
87
 
69
88
  load<
@@ -189,8 +208,32 @@ export class CoListSchema<
189
208
  >(
190
209
  resolveQuery: RefsToResolveStrict<CoListInstanceCoValuesMaybeLoaded<T>, R>,
191
210
  ): CoListSchema<T, R> {
192
- const copy = new CoListSchema<T, R>(this.element, this.coValueClass);
193
- copy.resolveQuery = resolveQuery as R;
211
+ return this.copy({ resolveQuery: resolveQuery as R });
212
+ }
213
+
214
+ /**
215
+ * Configure permissions to be used when creating or composing CoValues
216
+ */
217
+ withPermissions(
218
+ permissions: SchemaPermissions,
219
+ ): CoListSchema<T, DefaultResolveQuery> {
220
+ return this.copy({ permissions });
221
+ }
222
+
223
+ private copy<ResolveQuery extends CoreResolveQuery = DefaultResolveQuery>({
224
+ permissions,
225
+ resolveQuery,
226
+ }: {
227
+ permissions?: SchemaPermissions;
228
+ resolveQuery?: ResolveQuery;
229
+ }): CoListSchema<T, ResolveQuery> {
230
+ const coreSchema = createCoreCoListSchema(this.element);
231
+ // @ts-expect-error
232
+ const copy: CoListSchema<T, ResolveQuery> =
233
+ hydrateCoreCoValueSchema(coreSchema);
234
+ // @ts-expect-error TS cannot infer that the resolveQuery type is valid
235
+ copy.resolveQuery = resolveQuery ?? this.resolveQuery;
236
+ copy.permissions = permissions ?? this.permissions;
194
237
  return copy;
195
238
  }
196
239
  }
@@ -17,6 +17,7 @@ import {
17
17
  hydrateCoreCoValueSchema,
18
18
  isAnyCoValueSchema,
19
19
  unstable_mergeBranchWithResolve,
20
+ withSchemaPermissions,
20
21
  } from "../../../internal.js";
21
22
  import { AnonymousJazzAgent } from "../../anonymousJazzAgent.js";
22
23
  import { removeGetters, withSchemaResolveQuery } from "../../schemaUtils.js";
@@ -27,6 +28,10 @@ import { z } from "../zodReExport.js";
27
28
  import { AnyZodOrCoValueSchema, AnyZodSchema } from "../zodSchema.js";
28
29
  import { CoOptionalSchema } from "./CoOptionalSchema.js";
29
30
  import { CoreCoValueSchema, CoreResolveQuery } from "./CoValueSchema.js";
31
+ import {
32
+ DEFAULT_SCHEMA_PERMISSIONS,
33
+ SchemaPermissions,
34
+ } from "../schemaPermissions.js";
30
35
 
31
36
  export class CoMapSchema<
32
37
  Shape extends z.core.$ZodLooseShape,
@@ -48,6 +53,12 @@ export class CoMapSchema<
48
53
  */
49
54
  resolveQuery: DefaultResolveQuery = true as DefaultResolveQuery;
50
55
 
56
+ /**
57
+ * Permissions to be used when creating or composing CoValues
58
+ * @internal
59
+ */
60
+ permissions: SchemaPermissions = DEFAULT_SCHEMA_PERMISSIONS;
61
+
51
62
  constructor(
52
63
  coreSchema: CoreCoMapSchema<Shape, CatchAll>,
53
64
  private coValueClass: typeof CoMap,
@@ -76,8 +87,12 @@ export class CoMapSchema<
76
87
  }
77
88
  | Owner,
78
89
  ): CoMapInstanceShape<Shape, CatchAll> & CoMap;
79
- create(...args: [any, ...any[]]) {
80
- return this.coValueClass.create(...args);
90
+ create(init: any, options?: any) {
91
+ const optionsWithPermissions = withSchemaPermissions(
92
+ options,
93
+ this.permissions,
94
+ );
95
+ return this.coValueClass.create(init, optionsWithPermissions);
81
96
  }
82
97
 
83
98
  load<
@@ -254,8 +269,8 @@ export class CoMapSchema<
254
269
  true
255
270
  >,
256
271
  ) => undefined,
257
- ): CoMapSchema<Shape, CatchAll, Owner, DefaultResolveQuery> {
258
- // @ts-expect-error
272
+ ): this {
273
+ // @ts-expect-error avoid exposing 'migrate' at the type level
259
274
  this.coValueClass.prototype.migrate = migration;
260
275
  return this;
261
276
  }
@@ -340,15 +355,37 @@ export class CoMapSchema<
340
355
  R
341
356
  >,
342
357
  ): CoMapSchema<Shape, CatchAll, Owner, R> {
343
- const coreSchema: CoreCoMapSchema<Shape, CatchAll> = createCoreCoMapSchema(
344
- this.shape,
345
- this.catchAll,
346
- );
347
- const copy = new CoMapSchema<Shape, CatchAll, Owner, R>(
348
- coreSchema,
349
- this.coValueClass,
350
- );
351
- copy.resolveQuery = resolveQuery as R;
358
+ return this.copy({ resolveQuery: resolveQuery as R });
359
+ }
360
+
361
+ /**
362
+ * Configure permissions to be used when creating or composing CoValues
363
+ */
364
+ withPermissions(
365
+ permissions: SchemaPermissions,
366
+ ): CoMapSchema<Shape, CatchAll, Owner, DefaultResolveQuery> {
367
+ return this.copy({ permissions });
368
+ }
369
+
370
+ /**
371
+ * Creates a copy of this schema, preserving all previous configuration
372
+ */
373
+ private copy<ResolveQuery extends CoreResolveQuery = DefaultResolveQuery>({
374
+ permissions,
375
+ resolveQuery,
376
+ }: {
377
+ permissions?: SchemaPermissions;
378
+ resolveQuery?: ResolveQuery;
379
+ }): CoMapSchema<Shape, CatchAll, Owner, ResolveQuery> {
380
+ const coreSchema = createCoreCoMapSchema(this.shape, this.catchAll);
381
+ // @ts-expect-error
382
+ const copy: CoMapSchema<Shape, CatchAll, Owner, ResolveQuery> =
383
+ hydrateCoreCoValueSchema(coreSchema);
384
+ // @ts-expect-error avoid exposing 'migrate' at the type level
385
+ copy.coValueClass.prototype.migrate = this.coValueClass.prototype.migrate;
386
+ // @ts-expect-error TS cannot infer that the resolveQuery type is valid
387
+ copy.resolveQuery = resolveQuery ?? this.resolveQuery;
388
+ copy.permissions = permissions ?? this.permissions;
352
389
  return copy;
353
390
  }
354
391
  }
@@ -21,6 +21,7 @@ import { z } from "../zodReExport.js";
21
21
  import { AnyZodOrCoValueSchema } from "../zodSchema.js";
22
22
  import { CoOptionalSchema } from "./CoOptionalSchema.js";
23
23
  import { CoreCoValueSchema, CoreResolveQuery } from "./CoValueSchema.js";
24
+ import { SchemaPermissions } from "../schemaPermissions.js";
24
25
 
25
26
  type CoRecordInit<
26
27
  K extends z.core.$ZodString<string>,
@@ -161,6 +162,19 @@ export interface CoRecordSchema<
161
162
  R
162
163
  >,
163
164
  ): CoRecordSchema<K, V, R>;
165
+
166
+ /**
167
+ * Permissions to be used when creating or composing CoValues
168
+ * @internal
169
+ */
170
+ permissions: SchemaPermissions;
171
+
172
+ /**
173
+ * Configure permissions to be used when creating or composing CoValues
174
+ */
175
+ withPermissions(
176
+ permissions: SchemaPermissions,
177
+ ): CoRecordSchema<K, V, DefaultResolveQuery>;
164
178
  }
165
179
 
166
180
  type CoRecordSchemaDefinition<
@@ -6,9 +6,14 @@ import {
6
6
  InstanceOrPrimitiveOfSchema,
7
7
  InstanceOrPrimitiveOfSchemaCoValuesMaybeLoaded,
8
8
  coOptionalDefiner,
9
+ withSchemaPermissions,
9
10
  } from "../../../internal.js";
10
11
  import { CoOptionalSchema } from "./CoOptionalSchema.js";
11
12
  import { CoreCoValueSchema } from "./CoValueSchema.js";
13
+ import {
14
+ DEFAULT_SCHEMA_PERMISSIONS,
15
+ SchemaPermissions,
16
+ } from "../schemaPermissions.js";
12
17
 
13
18
  export interface CoreCoVectorSchema extends CoreCoValueSchema {
14
19
  builtin: "CoVector";
@@ -31,6 +36,11 @@ export class CoVectorSchema implements CoreCoVectorSchema {
31
36
  readonly builtin = "CoVector" as const;
32
37
  readonly resolveQuery = true as const;
33
38
 
39
+ /**
40
+ * Permissions to be used when creating or composing CoValues
41
+ */
42
+ permissions: SchemaPermissions = DEFAULT_SCHEMA_PERMISSIONS;
43
+
34
44
  constructor(
35
45
  public dimensions: number,
36
46
  private coValueClass: typeof CoVector,
@@ -56,7 +66,11 @@ export class CoVectorSchema implements CoreCoVectorSchema {
56
66
  vector: number[] | Float32Array,
57
67
  options?: { owner: Account | Group } | Account | Group,
58
68
  ): CoVectorInstance {
59
- return this.coValueClass.create(vector, options);
69
+ const optionsWithPermissions = withSchemaPermissions(
70
+ options,
71
+ this.permissions,
72
+ );
73
+ return this.coValueClass.create(vector, optionsWithPermissions);
60
74
  }
61
75
 
62
76
  /**
@@ -99,6 +113,15 @@ export class CoVectorSchema implements CoreCoVectorSchema {
99
113
  optional(): CoOptionalSchema<this> {
100
114
  return coOptionalDefiner(this);
101
115
  }
116
+
117
+ /**
118
+ * Configure permissions to be used when creating or composing CoValues
119
+ */
120
+ withPermissions(permissions: SchemaPermissions): CoVectorSchema {
121
+ const copy = new CoVectorSchema(this.dimensions, this.coValueClass);
122
+ copy.permissions = permissions;
123
+ return copy;
124
+ }
102
125
  }
103
126
 
104
127
  export type CoVectorInstance = InstanceOrPrimitiveOfSchema<CoVectorSchema>;
@@ -6,9 +6,14 @@ import {
6
6
  Settled,
7
7
  coOptionalDefiner,
8
8
  unstable_mergeBranchWithResolve,
9
+ withSchemaPermissions,
9
10
  } from "../../../internal.js";
10
11
  import { CoOptionalSchema } from "./CoOptionalSchema.js";
11
12
  import { CoreCoValueSchema } from "./CoValueSchema.js";
13
+ import {
14
+ DEFAULT_SCHEMA_PERMISSIONS,
15
+ SchemaPermissions,
16
+ } from "../schemaPermissions.js";
12
17
 
13
18
  export interface CoreFileStreamSchema extends CoreCoValueSchema {
14
19
  builtin: "FileStream";
@@ -27,13 +32,22 @@ export class FileStreamSchema implements CoreFileStreamSchema {
27
32
  readonly builtin = "FileStream" as const;
28
33
  readonly resolveQuery = true as const;
29
34
 
35
+ /**
36
+ * Permissions to be used when creating or composing CoValues
37
+ */
38
+ permissions: SchemaPermissions = DEFAULT_SCHEMA_PERMISSIONS;
39
+
30
40
  constructor(private coValueClass: typeof FileStream) {}
31
41
 
32
42
  create(options?: { owner: Group } | Group): FileStream;
33
43
  /** @deprecated Creating CoValues with an Account as owner is deprecated. Use a Group instead. */
34
44
  create(options?: { owner: Account | Group } | Account | Group): FileStream;
35
45
  create(options?: { owner: Account | Group } | Account | Group): FileStream {
36
- return this.coValueClass.create(options);
46
+ const optionsWithPermissions = withSchemaPermissions(
47
+ options,
48
+ this.permissions,
49
+ );
50
+ return this.coValueClass.create(optionsWithPermissions);
37
51
  }
38
52
 
39
53
  createFromBlob(
@@ -60,13 +74,35 @@ export class FileStreamSchema implements CoreFileStreamSchema {
60
74
  | Account
61
75
  | Group,
62
76
  ): Promise<FileStream> {
63
- return this.coValueClass.createFromBlob(blob, options);
77
+ const optionsWithPermissions = withSchemaPermissions(
78
+ options,
79
+ this.permissions,
80
+ );
81
+ return this.coValueClass.createFromBlob(blob, optionsWithPermissions);
64
82
  }
65
83
 
66
84
  createFromArrayBuffer(
67
- ...args: Parameters<typeof FileStream.createFromArrayBuffer>
85
+ arrayBuffer: ArrayBuffer,
86
+ mimeType: string,
87
+ fileName: string | undefined,
88
+ options?:
89
+ | {
90
+ owner?: Account | Group;
91
+ onProgress?: (progress: number) => void;
92
+ }
93
+ | Account
94
+ | Group,
68
95
  ) {
69
- return this.coValueClass.createFromArrayBuffer(...args);
96
+ const optionsWithPermissions = withSchemaPermissions(
97
+ options,
98
+ this.permissions,
99
+ );
100
+ return this.coValueClass.createFromArrayBuffer(
101
+ arrayBuffer,
102
+ mimeType,
103
+ fileName,
104
+ optionsWithPermissions,
105
+ );
70
106
  }
71
107
 
72
108
  loadAsBlob(
@@ -115,4 +151,15 @@ export class FileStreamSchema implements CoreFileStreamSchema {
115
151
  optional(): CoOptionalSchema<this> {
116
152
  return coOptionalDefiner(this);
117
153
  }
154
+
155
+ /**
156
+ * Configure permissions to be used when creating or composing CoValues
157
+ */
158
+ withPermissions(
159
+ permissions: Omit<SchemaPermissions, "onInlineCreate">,
160
+ ): FileStreamSchema {
161
+ const copy = new FileStreamSchema(this.coValueClass);
162
+ copy.permissions = permissions;
163
+ return copy;
164
+ }
118
165
  }
@@ -7,10 +7,15 @@ import {
7
7
  Settled,
8
8
  coOptionalDefiner,
9
9
  unstable_mergeBranchWithResolve,
10
+ withSchemaPermissions,
10
11
  } from "../../../internal.js";
11
12
  import { AnonymousJazzAgent } from "../../anonymousJazzAgent.js";
12
13
  import { CoOptionalSchema } from "./CoOptionalSchema.js";
13
14
  import { CoreCoValueSchema } from "./CoValueSchema.js";
15
+ import {
16
+ DEFAULT_SCHEMA_PERMISSIONS,
17
+ SchemaPermissions,
18
+ } from "../schemaPermissions.js";
14
19
 
15
20
  export interface CorePlainTextSchema extends CoreCoValueSchema {
16
21
  builtin: "CoPlainText";
@@ -29,6 +34,12 @@ export class PlainTextSchema implements CorePlainTextSchema {
29
34
  readonly builtin = "CoPlainText" as const;
30
35
  readonly resolveQuery = true as const;
31
36
 
37
+ /**
38
+ * Permissions to be used when creating or composing CoValues
39
+ * @internal
40
+ */
41
+ permissions: SchemaPermissions = DEFAULT_SCHEMA_PERMISSIONS;
42
+
32
43
  constructor(private coValueClass: typeof CoPlainText) {}
33
44
 
34
45
  create(text: string, options?: { owner: Group } | Group): CoPlainText;
@@ -41,7 +52,11 @@ export class PlainTextSchema implements CorePlainTextSchema {
41
52
  text: string,
42
53
  options?: { owner: Account | Group } | Account | Group,
43
54
  ): CoPlainText {
44
- return this.coValueClass.create(text, options);
55
+ const optionsWithPermissions = withSchemaPermissions(
56
+ options,
57
+ this.permissions,
58
+ );
59
+ return this.coValueClass.create(text, optionsWithPermissions);
45
60
  }
46
61
 
47
62
  load(
@@ -90,4 +105,13 @@ export class PlainTextSchema implements CorePlainTextSchema {
90
105
  optional(): CoOptionalSchema<this> {
91
106
  return coOptionalDefiner(this);
92
107
  }
108
+
109
+ /**
110
+ * Configure permissions to be used when creating or composing CoValues
111
+ */
112
+ withPermissions(permissions: SchemaPermissions): PlainTextSchema {
113
+ const copy = new PlainTextSchema(this.coValueClass);
114
+ copy.permissions = permissions;
115
+ return copy;
116
+ }
93
117
  }
@@ -6,10 +6,15 @@ import {
6
6
  Settled,
7
7
  coOptionalDefiner,
8
8
  unstable_mergeBranchWithResolve,
9
+ withSchemaPermissions,
9
10
  } from "../../../internal.js";
10
11
  import { AnonymousJazzAgent } from "../../anonymousJazzAgent.js";
11
12
  import { CoOptionalSchema } from "./CoOptionalSchema.js";
12
13
  import { CoreCoValueSchema } from "./CoValueSchema.js";
14
+ import {
15
+ DEFAULT_SCHEMA_PERMISSIONS,
16
+ SchemaPermissions,
17
+ } from "../schemaPermissions.js";
13
18
 
14
19
  export interface CoreRichTextSchema extends CoreCoValueSchema {
15
20
  builtin: "CoRichText";
@@ -28,6 +33,8 @@ export class RichTextSchema implements CoreRichTextSchema {
28
33
  readonly builtin = "CoRichText" as const;
29
34
  readonly resolveQuery = true as const;
30
35
 
36
+ permissions: SchemaPermissions = DEFAULT_SCHEMA_PERMISSIONS;
37
+
31
38
  constructor(private coValueClass: typeof CoRichText) {}
32
39
 
33
40
  create(text: string, options?: { owner: Group } | Group): CoRichText;
@@ -40,7 +47,11 @@ export class RichTextSchema implements CoreRichTextSchema {
40
47
  text: string,
41
48
  options?: { owner: Account | Group } | Account | Group,
42
49
  ): CoRichText {
43
- return this.coValueClass.create(text, options);
50
+ const optionsWithPermissions = withSchemaPermissions(
51
+ options,
52
+ this.permissions,
53
+ );
54
+ return this.coValueClass.create(text, optionsWithPermissions);
44
55
  }
45
56
 
46
57
  load(
@@ -85,4 +96,13 @@ export class RichTextSchema implements CoreRichTextSchema {
85
96
  optional(): CoOptionalSchema<this> {
86
97
  return coOptionalDefiner(this);
87
98
  }
99
+
100
+ /**
101
+ * Configure permissions to be used when creating or composing CoValues
102
+ */
103
+ withPermissions(permissions: SchemaPermissions): RichTextSchema {
104
+ const copy = new RichTextSchema(this.coValueClass);
105
+ copy.permissions = permissions;
106
+ return copy;
107
+ }
88
108
  }
@@ -1,3 +1,4 @@
1
+ import { JsonValue, RawCoMap } from "cojson";
1
2
  import {
2
3
  AnyZodOrCoValueSchema,
3
4
  CoDiscriminatedUnionSchema,
@@ -37,25 +38,7 @@ export function schemaUnionDiscriminatorFor(
37
38
  }
38
39
  }
39
40
 
40
- const availableOptions: DiscriminableCoreCoValueSchema[] = [];
41
-
42
- for (const option of options) {
43
- if (option.builtin === "CoMap") {
44
- availableOptions.push(option);
45
- } else if (option.builtin === "CoDiscriminatedUnion") {
46
- for (const subOption of (
47
- option as CoDiscriminatedUnionSchema<any>
48
- ).getDefinition().options) {
49
- if (!options.includes(subOption)) {
50
- options.push(subOption);
51
- }
52
- }
53
- } else {
54
- throw new Error(
55
- "Unsupported zod type in co.discriminatedUnion() of collaborative types",
56
- );
57
- }
58
- }
41
+ const availableOptions = getFlattenedUnionOptions(schema);
59
42
 
60
43
  const determineSchema: SchemaUnionDiscriminator<CoMap> = (
61
44
  discriminable,
@@ -77,7 +60,10 @@ export function schemaUnionDiscriminatorFor(
77
60
 
78
61
  for (const key of Object.keys(discriminatorMap)) {
79
62
  const discriminatorDef = optionDef.shape[key];
80
- const discriminatorValue = discriminable.get(key);
63
+ const discriminatorValue = resolveDiscriminantValue(
64
+ discriminable,
65
+ key,
66
+ );
81
67
 
82
68
  if (discriminatorValue && typeof discriminatorValue === "object") {
83
69
  throw new Error("Discriminator must be a primitive value");
@@ -175,3 +161,69 @@ function isCoDiscriminatedUnion(
175
161
  ): def is CoreCoDiscriminatedUnionSchema<any> {
176
162
  return def.builtin === "CoDiscriminatedUnion";
177
163
  }
164
+
165
+ /**
166
+ * Flattens all options from a discriminated union schema, including nested unions.
167
+ * Returns all options in a flat array.
168
+ */
169
+ export function getFlattenedUnionOptions(
170
+ schema: CoreCoDiscriminatedUnionSchema<DiscriminableCoValueSchemas>,
171
+ ): DiscriminableCoreCoValueSchema[] {
172
+ const definition = schema.getDefinition();
173
+ const options = definition.options;
174
+ const availableOptions: DiscriminableCoreCoValueSchema[] = [];
175
+
176
+ for (const option of options) {
177
+ if (option.builtin === "CoMap") {
178
+ availableOptions.push(option);
179
+ } else if (option.builtin === "CoDiscriminatedUnion") {
180
+ const nestedOptions = getFlattenedUnionOptions(
181
+ option as CoreCoDiscriminatedUnionSchema<DiscriminableCoValueSchemas>,
182
+ );
183
+ for (const subOption of nestedOptions) {
184
+ if (!availableOptions.includes(subOption)) {
185
+ availableOptions.push(subOption);
186
+ }
187
+ }
188
+ } else {
189
+ throw new Error(
190
+ "Unsupported zod type in co.discriminatedUnion() of collaborative types",
191
+ );
192
+ }
193
+ }
194
+
195
+ return availableOptions;
196
+ }
197
+
198
+ /**
199
+ * Gets the discriminator values for a given option and discriminator key
200
+ */
201
+ export function getDiscriminatorValuesForOption(
202
+ option: DiscriminableCoreCoValueSchema,
203
+ discriminatorKey: string,
204
+ ): Set<unknown> | undefined {
205
+ const optionDefinition = option.getDefinition();
206
+ return optionDefinition.discriminatorMap?.[discriminatorKey];
207
+ }
208
+
209
+ export function resolveDiscriminantValue(
210
+ init: unknown,
211
+ discriminatorKey: string,
212
+ ): JsonValue | undefined {
213
+ if (init == null) {
214
+ return undefined;
215
+ }
216
+
217
+ if (init instanceof Map || init instanceof RawCoMap) {
218
+ return init.get(discriminatorKey);
219
+ }
220
+
221
+ if (typeof init === "object") {
222
+ const record = init as Record<string, JsonValue>;
223
+ if (discriminatorKey in record) {
224
+ return record[discriminatorKey];
225
+ }
226
+ }
227
+
228
+ return undefined;
229
+ }
@@ -53,6 +53,7 @@ export * from "./implementation/zodSchema/typeConverters/InstanceOfSchemaCoValue
53
53
  export * from "./implementation/zodSchema/typeConverters/CoFieldSchemaInit.js";
54
54
  export * from "./implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.js";
55
55
  export * from "./implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.js";
56
+ export * from "./implementation/zodSchema/schemaPermissions.js";
56
57
  export * from "./coValues/extensions/imageDef.js";
57
58
 
58
59
  export * from "./implementation/ContextManager.js";
@@ -16,9 +16,11 @@ import {
16
16
  coValueClassFromCoValueClassOrSchema,
17
17
  createAnonymousJazzContext,
18
18
  createJazzContext,
19
- randomSessionProvider,
19
+ MockSessionProvider,
20
20
  } from "./internal.js";
21
21
 
22
+ const randomSessionProvider = new MockSessionProvider();
23
+
22
24
  export { assertLoaded } from "./lib/utils.js";
23
25
 
24
26
  const syncServer: { current: LocalNode | null; asyncPeers: boolean } = {
@@ -19,7 +19,7 @@ import {
19
19
  } from "../implementation/ContextManager";
20
20
  import {
21
21
  createJazzContext,
22
- randomSessionProvider,
22
+ MockSessionProvider,
23
23
  } from "../implementation/createContext";
24
24
  import {
25
25
  CoValueFromRaw,
@@ -37,6 +37,7 @@ import { SubscriptionCache } from "../subscribe/SubscriptionCache";
37
37
  import { createAsyncStorage, getDbPath } from "./testStorage";
38
38
 
39
39
  const Crypto = await WasmCrypto.create();
40
+ const randomSessionProvider = new MockSessionProvider();
40
41
 
41
42
  class TestJazzContextManager<Acc extends Account> extends JazzContextManager<
42
43
  Acc,
@@ -7,10 +7,10 @@ import {
7
7
  createJazzContextFromExistingCredentials,
8
8
  isControlledAccount,
9
9
  } from "../index.js";
10
- import { co, randomSessionProvider } from "../internal.js";
10
+ import { co, MockSessionProvider } from "../internal.js";
11
11
 
12
12
  const Crypto = await WasmCrypto.create();
13
-
13
+ const randomSessionProvider = new MockSessionProvider();
14
14
  const connectedPeers = cojsonInternals.connectedPeers;
15
15
 
16
16
  describe("CoPlainText", () => {