jazz-tools 0.18.23 → 0.18.25

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 (116) hide show
  1. package/.svelte-kit/__package__/Provider.svelte +2 -0
  2. package/.svelte-kit/__package__/Provider.svelte.d.ts.map +1 -1
  3. package/.turbo/turbo-build.log +65 -65
  4. package/CHANGELOG.md +25 -0
  5. package/dist/browser/index.js +9 -9
  6. package/dist/browser/index.js.map +1 -1
  7. package/dist/{chunk-D5L6ES2M.js → chunk-DOCEAUVD.js} +72 -35
  8. package/dist/chunk-DOCEAUVD.js.map +1 -0
  9. package/dist/{chunk-BOMSRY5H.js → chunk-M2HGBOXS.js} +2 -2
  10. package/dist/chunk-M2HGBOXS.js.map +1 -0
  11. package/dist/index.js +2 -2
  12. package/dist/inspector/{custom-element-XDJT5T57.js → custom-element-A7UAELEG.js} +3 -1
  13. package/dist/inspector/{custom-element-XDJT5T57.js.map → custom-element-A7UAELEG.js.map} +1 -1
  14. package/dist/inspector/index.js +2 -0
  15. package/dist/inspector/index.js.map +1 -1
  16. package/dist/inspector/register-custom-element.js +1 -1
  17. package/dist/inspector/viewer/use-open-inspector.d.ts.map +1 -1
  18. package/dist/inspector/viewer/use-page-path.d.ts.map +1 -1
  19. package/dist/react/hooks.d.ts +1 -1
  20. package/dist/react/hooks.d.ts.map +1 -1
  21. package/dist/react/index.d.ts +2 -1
  22. package/dist/react/index.d.ts.map +1 -1
  23. package/dist/react/index.js +17 -3
  24. package/dist/react/index.js.map +1 -1
  25. package/dist/react/provider.d.ts +2 -1
  26. package/dist/react/provider.d.ts.map +1 -1
  27. package/dist/react/ssr.js +1 -1
  28. package/dist/react/ssr.js.map +1 -1
  29. package/dist/react-core/hooks.d.ts +13 -0
  30. package/dist/react-core/hooks.d.ts.map +1 -1
  31. package/dist/react-core/index.d.ts +2 -0
  32. package/dist/react-core/index.d.ts.map +1 -1
  33. package/dist/react-core/index.js +104 -0
  34. package/dist/react-core/index.js.map +1 -1
  35. package/dist/react-core/subscription-provider.d.ts +27 -0
  36. package/dist/react-core/subscription-provider.d.ts.map +1 -0
  37. package/dist/react-core/tests/subscription.bench.d.ts +2 -0
  38. package/dist/react-core/tests/subscription.bench.d.ts.map +1 -0
  39. package/dist/react-core/tests/useSubscriptionSelector.test.d.ts +2 -0
  40. package/dist/react-core/tests/useSubscriptionSelector.test.d.ts.map +1 -0
  41. package/dist/react-core/types.d.ts +10 -0
  42. package/dist/react-core/types.d.ts.map +1 -0
  43. package/dist/react-native-core/hooks.d.ts +1 -1
  44. package/dist/react-native-core/hooks.d.ts.map +1 -1
  45. package/dist/react-native-core/index.d.ts +1 -0
  46. package/dist/react-native-core/index.d.ts.map +1 -1
  47. package/dist/react-native-core/index.js +25 -12
  48. package/dist/react-native-core/index.js.map +1 -1
  49. package/dist/react-native-core/provider.d.ts +2 -1
  50. package/dist/react-native-core/provider.d.ts.map +1 -1
  51. package/dist/svelte/Provider.svelte +2 -0
  52. package/dist/svelte/Provider.svelte.d.ts.map +1 -1
  53. package/dist/testing.js +4 -4
  54. package/dist/testing.js.map +1 -1
  55. package/dist/tools/auth/AuthSecretStorage.d.ts +3 -1
  56. package/dist/tools/auth/AuthSecretStorage.d.ts.map +1 -1
  57. package/dist/tools/coValues/account.d.ts +3 -3
  58. package/dist/tools/coValues/account.d.ts.map +1 -1
  59. package/dist/tools/coValues/group.d.ts +20 -1
  60. package/dist/tools/coValues/group.d.ts.map +1 -1
  61. package/dist/tools/coValues/interfaces.d.ts.map +1 -1
  62. package/dist/tools/implementation/ContextManager.d.ts +1 -0
  63. package/dist/tools/implementation/ContextManager.d.ts.map +1 -1
  64. package/dist/tools/implementation/createContext.d.ts +7 -7
  65. package/dist/tools/implementation/createContext.d.ts.map +1 -1
  66. package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts +3 -8
  67. package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
  68. package/dist/tools/implementation/zodSchema/schemaTypes/GroupSchema.d.ts +5 -0
  69. package/dist/tools/implementation/zodSchema/schemaTypes/GroupSchema.d.ts.map +1 -1
  70. package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
  71. package/dist/tools/ssr.js +1 -1
  72. package/dist/tools/testing.d.ts.map +1 -1
  73. package/dist/worker/index.js +3 -3
  74. package/dist/worker/index.js.map +1 -1
  75. package/package.json +5 -4
  76. package/src/better-auth/database-adapter/tests/sync-utils.ts +1 -1
  77. package/src/browser/createBrowserContext.ts +9 -9
  78. package/src/browser/tests/utils.ts +2 -2
  79. package/src/inspector/viewer/use-open-inspector.ts +1 -0
  80. package/src/inspector/viewer/use-page-path.ts +1 -0
  81. package/src/react/hooks.tsx +3 -0
  82. package/src/react/index.ts +9 -0
  83. package/src/react/provider.tsx +3 -0
  84. package/src/react-core/hooks.ts +37 -5
  85. package/src/react-core/index.ts +2 -0
  86. package/src/react-core/subscription-provider.tsx +144 -0
  87. package/src/react-core/tests/subscription.bench.tsx +319 -0
  88. package/src/react-core/tests/useSubscriptionSelector.test.ts +250 -0
  89. package/src/react-core/types.ts +19 -0
  90. package/src/react-native-core/hooks.tsx +3 -0
  91. package/src/react-native-core/index.ts +6 -0
  92. package/src/react-native-core/platform.ts +9 -9
  93. package/src/react-native-core/provider.tsx +3 -1
  94. package/src/svelte/Provider.svelte +2 -0
  95. package/src/tools/auth/AuthSecretStorage.ts +16 -9
  96. package/src/tools/coValues/account.ts +5 -5
  97. package/src/tools/coValues/group.ts +33 -0
  98. package/src/tools/coValues/interfaces.ts +4 -1
  99. package/src/tools/implementation/ContextManager.ts +7 -3
  100. package/src/tools/implementation/createContext.ts +12 -12
  101. package/src/tools/implementation/zodSchema/schemaTypes/AccountSchema.ts +5 -5
  102. package/src/tools/implementation/zodSchema/schemaTypes/GroupSchema.ts +7 -1
  103. package/src/tools/ssr/ssr.ts +1 -1
  104. package/src/tools/testing.ts +3 -3
  105. package/src/tools/tests/AuthSecretStorage.test.ts +59 -1
  106. package/src/tools/tests/ContextManager.test.ts +11 -1
  107. package/src/tools/tests/account.test.ts +16 -0
  108. package/src/tools/tests/coPlainText.test.ts +2 -2
  109. package/src/tools/tests/createContext.test.ts +19 -19
  110. package/src/tools/tests/deepLoading.test.ts +2 -2
  111. package/src/tools/tests/group.test.ts +59 -0
  112. package/src/tools/tests/inbox.test.ts +2 -2
  113. package/src/tools/tests/utils.ts +3 -3
  114. package/src/worker/index.ts +3 -3
  115. package/dist/chunk-BOMSRY5H.js.map +0 -1
  116. package/dist/chunk-D5L6ES2M.js.map +0 -1
@@ -51,7 +51,7 @@ describe("createContext methods", () => {
51
51
 
52
52
  const context = await createJazzContextFromExistingCredentials({
53
53
  credentials,
54
- peersToLoadFrom: [getPeerConnectedToTestSyncServer()],
54
+ peers: [getPeerConnectedToTestSyncServer()],
55
55
  crypto: Crypto,
56
56
  sessionProvider: randomSessionProvider,
57
57
  asActiveAccount: true,
@@ -83,7 +83,7 @@ describe("createContext methods", () => {
83
83
 
84
84
  const context = await createJazzContextFromExistingCredentials({
85
85
  credentials,
86
- peersToLoadFrom: [getPeerConnectedToTestSyncServer()],
86
+ peers: [getPeerConnectedToTestSyncServer()],
87
87
  crypto: Crypto,
88
88
  AccountSchema: CustomAccount,
89
89
  sessionProvider: randomSessionProvider,
@@ -107,7 +107,7 @@ describe("createContext methods", () => {
107
107
  accountID: account.$jazz.id,
108
108
  secret: account.$jazz.localNode.getCurrentAgent().agentSecret,
109
109
  },
110
- peersToLoadFrom: [getPeerConnectedToTestSyncServer()],
110
+ peers: [getPeerConnectedToTestSyncServer()],
111
111
  crypto: Crypto,
112
112
  sessionProvider: randomSessionProvider,
113
113
  onLogOut,
@@ -131,7 +131,7 @@ describe("createContext methods", () => {
131
131
  accountID: account.$jazz.id,
132
132
  secret: account.$jazz.localNode.getCurrentAgent().agentSecret,
133
133
  },
134
- peersToLoadFrom: [getPeerConnectedToTestSyncServer()],
134
+ peers: [getPeerConnectedToTestSyncServer()],
135
135
  crypto: Crypto,
136
136
  sessionProvider: randomSessionProvider,
137
137
  asActiveAccount: true,
@@ -152,7 +152,7 @@ describe("createContext methods", () => {
152
152
  accountID: account.$jazz.id,
153
153
  secret: account.$jazz.localNode.getCurrentAgent().agentSecret,
154
154
  },
155
- peersToLoadFrom: [getPeerConnectedToTestSyncServer()],
155
+ peers: [getPeerConnectedToTestSyncServer()],
156
156
  crypto: Crypto,
157
157
  sessionProvider: randomSessionProvider,
158
158
  asActiveAccount: true,
@@ -171,7 +171,7 @@ describe("createContext methods", () => {
171
171
  accountID: account.$jazz.id,
172
172
  secret: account.$jazz.localNode.getCurrentAgent().agentSecret,
173
173
  },
174
- peersToLoadFrom: [getPeerConnectedToTestSyncServer()],
174
+ peers: [getPeerConnectedToTestSyncServer()],
175
175
  crypto: Crypto,
176
176
  sessionProvider: randomSessionProvider,
177
177
  asActiveAccount: false,
@@ -185,7 +185,7 @@ describe("createContext methods", () => {
185
185
  test("creates new account with provided props", async () => {
186
186
  const context = await createJazzContextForNewAccount({
187
187
  creationProps: { name: "New User" },
188
- peersToLoadFrom: [],
188
+ peers: [],
189
189
  crypto: Crypto,
190
190
  });
191
191
 
@@ -199,7 +199,7 @@ describe("createContext methods", () => {
199
199
  const context = await createJazzContextForNewAccount({
200
200
  creationProps: { name: "New User" },
201
201
  initialAgentSecret: initialSecret,
202
- peersToLoadFrom: [],
202
+ peers: [],
203
203
  crypto: Crypto,
204
204
  });
205
205
 
@@ -216,7 +216,7 @@ describe("createContext methods", () => {
216
216
 
217
217
  const context = await createJazzContextForNewAccount({
218
218
  creationProps: { name: "New User" },
219
- peersToLoadFrom: [],
219
+ peers: [],
220
220
  crypto: Crypto,
221
221
  AccountSchema: CustomAccount,
222
222
  });
@@ -229,7 +229,7 @@ describe("createContext methods", () => {
229
229
  test("sets the active account to the new account", async () => {
230
230
  const context = await createJazzContextForNewAccount({
231
231
  creationProps: { name: "New User" },
232
- peersToLoadFrom: [],
232
+ peers: [],
233
233
  crypto: Crypto,
234
234
  });
235
235
  expect(activeAccountContext.get()).toBe(context.account);
@@ -239,7 +239,7 @@ describe("createContext methods", () => {
239
239
  describe("createAnonymousJazzContext", () => {
240
240
  test("creates anonymous context", async () => {
241
241
  const context = await createAnonymousJazzContext({
242
- peersToLoadFrom: [],
242
+ peers: [],
243
243
  crypto: Crypto,
244
244
  });
245
245
 
@@ -257,7 +257,7 @@ describe("createContext methods", () => {
257
257
  coMap.set("test", "test", "trusting");
258
258
 
259
259
  const context = await createAnonymousJazzContext({
260
- peersToLoadFrom: [getPeerConnectedToTestSyncServer()],
260
+ peers: [getPeerConnectedToTestSyncServer()],
261
261
  crypto: Crypto,
262
262
  });
263
263
 
@@ -268,7 +268,7 @@ describe("createContext methods", () => {
268
268
 
269
269
  test("sets the guest mode", async () => {
270
270
  await createAnonymousJazzContext({
271
- peersToLoadFrom: [],
271
+ peers: [],
272
272
  crypto: Crypto,
273
273
  });
274
274
 
@@ -281,7 +281,7 @@ describe("createContext methods", () => {
281
281
  describe("createJazzContext", () => {
282
282
  test("creates new account when no credentials exist", async () => {
283
283
  const context = await createJazzContext({
284
- peersToLoadFrom: [],
284
+ peers: [],
285
285
  crypto: Crypto,
286
286
  authSecretStorage,
287
287
  sessionProvider: randomSessionProvider,
@@ -294,7 +294,7 @@ describe("createContext methods", () => {
294
294
  test("uses existing credentials when available", async () => {
295
295
  // First create an account and store credentials
296
296
  const initialContext = await createJazzContext({
297
- peersToLoadFrom: [getPeerConnectedToTestSyncServer()],
297
+ peers: [getPeerConnectedToTestSyncServer()],
298
298
  crypto: Crypto,
299
299
  authSecretStorage,
300
300
  sessionProvider: randomSessionProvider,
@@ -302,7 +302,7 @@ describe("createContext methods", () => {
302
302
 
303
303
  // Create new context with same storage
304
304
  const newContext = await createJazzContext({
305
- peersToLoadFrom: [getPeerConnectedToTestSyncServer()],
305
+ peers: [getPeerConnectedToTestSyncServer()],
306
306
  crypto: Crypto,
307
307
  authSecretStorage,
308
308
  sessionProvider: randomSessionProvider,
@@ -316,7 +316,7 @@ describe("createContext methods", () => {
316
316
  newAccountProps: {
317
317
  creationProps: { name: "Custom User" },
318
318
  },
319
- peersToLoadFrom: [],
319
+ peers: [],
320
320
  crypto: Crypto,
321
321
  authSecretStorage,
322
322
  sessionProvider: randomSessionProvider,
@@ -341,7 +341,7 @@ describe("createContext methods", () => {
341
341
  newAccountProps: {
342
342
  secret: initialSecret,
343
343
  },
344
- peersToLoadFrom: [],
344
+ peers: [],
345
345
  crypto: Crypto,
346
346
  authSecretStorage,
347
347
  sessionProvider: randomSessionProvider,
@@ -365,7 +365,7 @@ describe("createContext methods", () => {
365
365
  .withMigration(async () => {});
366
366
 
367
367
  const context = await createJazzContext({
368
- peersToLoadFrom: [],
368
+ peers: [],
369
369
  crypto: Crypto,
370
370
  authSecretStorage,
371
371
  sessionProvider: randomSessionProvider,
@@ -55,7 +55,7 @@ describe("Deep loading with depth arg", async () => {
55
55
  secret: me.$jazz.localNode.getCurrentAgent().agentSecret,
56
56
  },
57
57
  sessionProvider: randomSessionProvider,
58
- peersToLoadFrom: [initialAsPeer],
58
+ peers: [initialAsPeer],
59
59
  crypto: Crypto,
60
60
  asActiveAccount: true,
61
61
  });
@@ -286,7 +286,7 @@ test("Deep loading a record-like coMap", async () => {
286
286
  secret: me.$jazz.localNode.getCurrentAgent().agentSecret,
287
287
  },
288
288
  sessionProvider: randomSessionProvider,
289
- peersToLoadFrom: [initialAsPeer],
289
+ peers: [initialAsPeer],
290
290
  crypto: Crypto,
291
291
  asActiveAccount: true,
292
292
  });
@@ -30,6 +30,65 @@ describe("Group", () => {
30
30
  expect(group.getRoleOf("everyone")).toBe("reader");
31
31
  });
32
32
 
33
+ describe("Invitations", () => {
34
+ it("should create invitations as an instance method", () => {
35
+ const group = co.group().create();
36
+ const invite = group.$jazz.createInvite();
37
+ expect(invite.startsWith("inviteSecret_")).toBeTruthy();
38
+ });
39
+
40
+ it("should create invitations as an static method", async () => {
41
+ const group = co.group().create();
42
+ const groupId = group.$jazz.id;
43
+ const invite = await Group.createInvite(groupId);
44
+ expect(invite.startsWith("inviteSecret_")).toBeTruthy();
45
+ });
46
+
47
+ it("should correctly create invitations for users of different roles", async () => {
48
+ const currentUser = Account.getMe();
49
+ const group = co.group().create();
50
+ const invites = {
51
+ reader: group.$jazz.createInvite("reader"),
52
+ writeOnly: group.$jazz.createInvite("writeOnly"),
53
+ writer: group.$jazz.createInvite("writer"),
54
+ admin: group.$jazz.createInvite("admin"),
55
+ };
56
+
57
+ expect(group.getRoleOf(currentUser.$jazz.id)).toBe("admin");
58
+
59
+ for (const [role, inviteSecret] of Object.entries(invites)) {
60
+ const newUser = await createJazzTestAccount({
61
+ isCurrentActiveAccount: true,
62
+ });
63
+ expect(group.getRoleOf(newUser.$jazz.id)).toBeUndefined();
64
+ await newUser.acceptInvite(group.$jazz.id, inviteSecret);
65
+ expect(group.getRoleOf(newUser.$jazz.id)).toBe(role);
66
+ }
67
+ });
68
+
69
+ it("should create invitations with loadAs option", async () => {
70
+ const group = co.group().create();
71
+ const groupId = group.$jazz.id;
72
+
73
+ const otherAccount = await createJazzTestAccount();
74
+ group.addMember(otherAccount, "admin");
75
+
76
+ const invite = await Group.createInvite(groupId, {
77
+ role: "writer",
78
+ loadAs: otherAccount,
79
+ });
80
+
81
+ expect(invite.startsWith("inviteSecret_")).toBeTruthy();
82
+ });
83
+
84
+ it("should create invitations via co.group() schema wrapper", async () => {
85
+ const group = co.group().create();
86
+ const groupId = group.$jazz.id;
87
+ const invite = await co.group().createInvite(groupId, { role: "writer" });
88
+ expect(invite.startsWith("inviteSecret_")).toBeTruthy();
89
+ });
90
+ });
91
+
33
92
  describe("TypeScript", () => {
34
93
  it("should correctly type the resolve query", async () => {
35
94
  const group = co.group().create();
@@ -424,7 +424,7 @@ describe("Inbox", () => {
424
424
  const node = await LocalNode.withLoadedAccount({
425
425
  accountID: accountId as any,
426
426
  accountSecret: accountSecret,
427
- peersToLoadFrom: [getPeerConnectedToTestSyncServer()],
427
+ peers: [getPeerConnectedToTestSyncServer()],
428
428
  crypto: receiver.$jazz.localNode.crypto,
429
429
  sessionID: sessionID,
430
430
  });
@@ -495,7 +495,7 @@ describe("Inbox", () => {
495
495
  const node = await LocalNode.withLoadedAccount({
496
496
  accountID: accountId as any,
497
497
  accountSecret: accountSecret,
498
- peersToLoadFrom: [getPeerConnectedToTestSyncServer()],
498
+ peers: [getPeerConnectedToTestSyncServer()],
499
499
  crypto: receiver.$jazz.localNode.crypto,
500
500
  sessionID: sessionID,
501
501
  });
@@ -38,7 +38,7 @@ export async function setupAccount() {
38
38
  secret: me.$jazz.localNode.getCurrentAgent().agentSecret,
39
39
  },
40
40
  sessionProvider: randomSessionProvider,
41
- peersToLoadFrom: [initialAsPeer],
41
+ peers: [initialAsPeer],
42
42
  crypto: Crypto,
43
43
  asActiveAccount: true,
44
44
  });
@@ -61,7 +61,7 @@ export async function setupTwoNodes(options?: {
61
61
  );
62
62
 
63
63
  const client = await LocalNode.withNewlyCreatedAccount({
64
- peersToLoadFrom: [serverAsPeer],
64
+ peers: [serverAsPeer],
65
65
  crypto: Crypto,
66
66
  creationProps: { name: "Client" },
67
67
  migration: async (rawAccount, _node, creationProps) => {
@@ -74,7 +74,7 @@ export async function setupTwoNodes(options?: {
74
74
  });
75
75
 
76
76
  const server = await LocalNode.withNewlyCreatedAccount({
77
- peersToLoadFrom: [clientAsPeer],
77
+ peers: [clientAsPeer],
78
78
  crypto: Crypto,
79
79
  creationProps: { name: "Server" },
80
80
  migration: async (rawAccount, _node, creationProps) => {
@@ -54,7 +54,7 @@ export async function startWorker<
54
54
 
55
55
  let node: LocalNode | undefined = undefined;
56
56
 
57
- const peersToLoadFrom: Peer[] = [];
57
+ const peers: Peer[] = [];
58
58
 
59
59
  const wsPeer = new WebSocketPeerWithReconnection({
60
60
  peer: syncServer,
@@ -63,7 +63,7 @@ export async function startWorker<
63
63
  if (node) {
64
64
  node.syncManager.addPeer(peer);
65
65
  } else {
66
- peersToLoadFrom.push(peer);
66
+ peers.push(peer);
67
67
  }
68
68
  },
69
69
  removePeer: () => {},
@@ -92,7 +92,7 @@ export async function startWorker<
92
92
  },
93
93
  AccountSchema,
94
94
  sessionProvider: randomSessionProvider,
95
- peersToLoadFrom,
95
+ peers,
96
96
  crypto: options.crypto ?? (await WasmCrypto.create()),
97
97
  asActiveAccount,
98
98
  });
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/ssr/ssr.ts"],"sourcesContent":["import { WebSocketPeerWithReconnection } from \"cojson-transport-ws\";\nimport { PureJSCrypto } from \"cojson/dist/crypto/PureJSCrypto\";\nimport { createAnonymousJazzContext } from \"jazz-tools\";\n\nexport function createSSRJazzAgent(opts: { peer: string }) {\n const ssrNode = createAnonymousJazzContext({\n crypto: new PureJSCrypto(),\n peersToLoadFrom: [],\n });\n\n const wsPeer = new WebSocketPeerWithReconnection({\n peer: opts.peer,\n reconnectionTimeout: 100,\n addPeer: (peer) => {\n ssrNode.agent.node.syncManager.addPeer(peer);\n },\n removePeer: () => {},\n });\n\n wsPeer.enable();\n\n return ssrNode.agent;\n}\n"],"mappings":";AAAA,SAAS,qCAAqC;AAC9C,SAAS,oBAAoB;AAC7B,SAAS,kCAAkC;AAEpC,SAAS,mBAAmB,MAAwB;AACzD,QAAM,UAAU,2BAA2B;AAAA,IACzC,QAAQ,IAAI,aAAa;AAAA,IACzB,iBAAiB,CAAC;AAAA,EACpB,CAAC;AAED,QAAM,SAAS,IAAI,8BAA8B;AAAA,IAC/C,MAAM,KAAK;AAAA,IACX,qBAAqB;AAAA,IACrB,SAAS,CAAC,SAAS;AACjB,cAAQ,MAAM,KAAK,YAAY,QAAQ,IAAI;AAAA,IAC7C;AAAA,IACA,YAAY,MAAM;AAAA,IAAC;AAAA,EACrB,CAAC;AAED,SAAO,OAAO;AAEd,SAAO,QAAQ;AACjB;","names":[]}