jazz-tools 0.19.19 → 0.19.20

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 (64) hide show
  1. package/.svelte-kit/__package__/client.d.ts.map +1 -1
  2. package/.svelte-kit/__package__/client.js +3 -1
  3. package/.svelte-kit/__package__/tests/client.test.js +48 -0
  4. package/.turbo/turbo-build.log +65 -61
  5. package/dist/better-auth/auth/client.d.ts.map +1 -1
  6. package/dist/better-auth/auth/client.js +1 -1
  7. package/dist/better-auth/auth/client.js.map +1 -1
  8. package/dist/{chunk-PEHQ7TN2.js → chunk-MI24YFCY.js} +31 -4
  9. package/dist/chunk-MI24YFCY.js.map +1 -0
  10. package/dist/index.js +1 -1
  11. package/dist/react-core/hooks.d.ts +2 -2
  12. package/dist/react-core/hooks.d.ts.map +1 -1
  13. package/dist/react-core/index.js +4 -78
  14. package/dist/react-core/index.js.map +1 -1
  15. package/dist/react-native/chunk-DGUM43GV.js +11 -0
  16. package/dist/react-native/chunk-DGUM43GV.js.map +1 -0
  17. package/dist/react-native/crypto.js +2 -0
  18. package/dist/react-native/crypto.js.map +1 -1
  19. package/dist/react-native/index.js +540 -29
  20. package/dist/react-native/index.js.map +1 -1
  21. package/dist/react-native-core/auth/PasskeyAuth.d.ts +123 -0
  22. package/dist/react-native-core/auth/PasskeyAuth.d.ts.map +1 -0
  23. package/dist/react-native-core/auth/PasskeyAuthBasicUI.d.ts +34 -0
  24. package/dist/react-native-core/auth/PasskeyAuthBasicUI.d.ts.map +1 -0
  25. package/dist/react-native-core/auth/auth.d.ts +3 -0
  26. package/dist/react-native-core/auth/auth.d.ts.map +1 -1
  27. package/dist/react-native-core/auth/passkey-utils.d.ts +16 -0
  28. package/dist/react-native-core/auth/passkey-utils.d.ts.map +1 -0
  29. package/dist/react-native-core/auth/usePasskeyAuth.d.ts +48 -0
  30. package/dist/react-native-core/auth/usePasskeyAuth.d.ts.map +1 -0
  31. package/dist/react-native-core/chunk-DGUM43GV.js +11 -0
  32. package/dist/react-native-core/chunk-DGUM43GV.js.map +1 -0
  33. package/dist/react-native-core/crypto.js +2 -0
  34. package/dist/react-native-core/crypto.js.map +1 -1
  35. package/dist/react-native-core/index.js +535 -24
  36. package/dist/react-native-core/index.js.map +1 -1
  37. package/dist/react-native-core/tests/PasskeyAuth.test.d.ts +2 -0
  38. package/dist/react-native-core/tests/PasskeyAuth.test.d.ts.map +1 -0
  39. package/dist/react-native-core/tests/passkey-utils.test.d.ts +2 -0
  40. package/dist/react-native-core/tests/passkey-utils.test.d.ts.map +1 -0
  41. package/dist/testing.js +1 -1
  42. package/dist/tools/coValues/account.d.ts +5 -1
  43. package/dist/tools/coValues/account.d.ts.map +1 -1
  44. package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts +30 -1
  45. package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
  46. package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
  47. package/dist/tools/testing.d.ts.map +1 -1
  48. package/package.json +8 -4
  49. package/src/better-auth/auth/client.ts +3 -1
  50. package/src/better-auth/auth/tests/client.test.ts +66 -2
  51. package/src/react-core/hooks.ts +12 -103
  52. package/src/react-native-core/auth/PasskeyAuth.ts +316 -0
  53. package/src/react-native-core/auth/PasskeyAuthBasicUI.tsx +284 -0
  54. package/src/react-native-core/auth/auth.ts +3 -0
  55. package/src/react-native-core/auth/passkey-utils.ts +47 -0
  56. package/src/react-native-core/auth/usePasskeyAuth.tsx +85 -0
  57. package/src/react-native-core/tests/PasskeyAuth.test.ts +463 -0
  58. package/src/react-native-core/tests/passkey-utils.test.ts +144 -0
  59. package/src/tools/coValues/account.ts +11 -3
  60. package/src/tools/implementation/zodSchema/schemaTypes/AccountSchema.ts +27 -1
  61. package/src/tools/tests/account.test.ts +2 -1
  62. package/testSetup.ts +4 -0
  63. package/vitest.config.ts +1 -0
  64. package/dist/chunk-PEHQ7TN2.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EAEjB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;wBAmBC,UAAU,CAAC,OAAO,UAAU,CAAC;;;sCAIvB,eAAe,CAAC,OAAO,CAAC;4CAGlB,iBAAiB;;;;;;;;;;;CA6H1D,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EAEjB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;wBAmBC,UAAU,CAAC,OAAO,UAAU,CAAC;;;sCAIvB,eAAe,CAAC,OAAO,CAAC;4CAGlB,iBAAiB;;;;;;;;;;;CA+H1D,CAAC"}
@@ -81,7 +81,9 @@ export const jazzPluginClient = () => {
81
81
  }
82
82
  context.headers.set("x-jazz-auth", JSON.stringify({
83
83
  accountID: credentials.accountID,
84
- secretSeed: credentials.secretSeed,
84
+ secretSeed: credentials.secretSeed
85
+ ? Array.from(credentials.secretSeed)
86
+ : undefined,
85
87
  accountSecret: credentials.accountSecret,
86
88
  }));
87
89
  }
@@ -103,6 +103,54 @@ describe("Better-Auth client plugin", () => {
103
103
  provider: "better-auth",
104
104
  });
105
105
  });
106
+ it("should preserve secretSeed over signup", async () => {
107
+ const secretSeed = new Uint8Array([1, 2, 3]);
108
+ await authSecretStorage.set({
109
+ accountID: account.$jazz.id,
110
+ secretSeed: secretSeed,
111
+ accountSecret: account.$jazz.localNode.getCurrentAgent().agentSecret,
112
+ provider: "test",
113
+ });
114
+ const credentials = await authSecretStorage.get();
115
+ assert(credentials, "Jazz credentials are not available");
116
+ expect(credentials.secretSeed).toBeInstanceOf(Uint8Array);
117
+ customFetchImpl.mockResolvedValue(new Response(JSON.stringify({
118
+ token: "6diDScDDcLJLl3sxAEestZz63mrw9Azy",
119
+ user: {
120
+ id: "S6SDKApdnh746gUnP3zujzsEY53tjuTm",
121
+ email: "test@jazz.dev",
122
+ name: "Matteo",
123
+ image: null,
124
+ emailVerified: false,
125
+ createdAt: new Date(),
126
+ updatedAt: new Date(),
127
+ },
128
+ jazzAuth: {
129
+ accountID: credentials.accountID,
130
+ secretSeed: credentials.secretSeed,
131
+ accountSecret: credentials.accountSecret,
132
+ },
133
+ })));
134
+ // Sign up
135
+ await authClient.signUp.email({
136
+ email: "test@jazz.dev",
137
+ password: "12345678",
138
+ name: "Matteo",
139
+ });
140
+ expect(customFetchImpl).toHaveBeenCalledTimes(1);
141
+ expect(customFetchImpl.mock.calls[0][0].toString()).toBe("http://localhost:3000/api/auth/sign-up/email");
142
+ // Verify the credentials have been injected in the request body
143
+ expect(customFetchImpl.mock.calls[0][1].headers.get("x-jazz-auth")).toEqual(JSON.stringify({
144
+ accountID: credentials.accountID,
145
+ secretSeed: Array.from(credentials.secretSeed),
146
+ accountSecret: credentials.accountSecret,
147
+ }));
148
+ expect(authSecretStorage.isAuthenticated).toBe(true);
149
+ // Verify the profile name has been updated
150
+ const context = jazzContextManager.getCurrentValue();
151
+ assert(context && "me" in context);
152
+ expect(context.me.$jazz.id).toBe(credentials.accountID);
153
+ });
106
154
  it("should logout from Jazz after BetterAuth sign-out", async () => {
107
155
  const credentials = await authSecretStorage.get();
108
156
  expect(authSecretStorage.isAuthenticated).toBe(false);
@@ -1,5 +1,5 @@
1
1
 
2
- > jazz-tools@0.19.19 build /home/runner/_work/jazz/jazz/packages/jazz-tools
2
+ > jazz-tools@0.19.20 build /home/runner/_work/jazz/jazz/packages/jazz-tools
3
3
  > tsup && pnpm types && pnpm build:svelte && pnpm build:better-auth-svelte
4
4
 
5
5
  CLI Building entry: {"index":"src/index.ts","testing":"src/testing.ts","tools/ssr":"src/tools/ssr/index.ts"}
@@ -109,118 +109,122 @@
109
109
  ESM Build start
110
110
  ESM dist/tiptap/index.js 564.00 B
111
111
  ESM dist/tiptap/index.js.map 1.21 KB
112
- ESM ⚡️ Build success in 43ms
113
- ESM dist/worker/edge-wasm.js 215.00 B
112
+ ESM ⚡️ Build success in 33ms
114
113
  ESM dist/worker/index.js 3.19 KB
115
114
  ESM dist/worker/napi-crypto.js 110.00 B
116
- ESM dist/worker/edge-wasm.js.map 434.00 B
115
+ ESM dist/worker/edge-wasm.js 215.00 B
117
116
  ESM dist/worker/index.js.map 6.26 KB
118
117
  ESM dist/worker/napi-crypto.js.map 162.00 B
119
- ESM ⚡️ Build success in 42ms
120
- ESM dist/better-auth/auth/client.js 4.50 KB
118
+ ESM dist/worker/edge-wasm.js.map 434.00 B
119
+ ESM ⚡️ Build success in 32ms
120
+ ESM dist/better-auth/auth/client.js 4.54 KB
121
121
  ESM dist/better-auth/auth/server.js 8.36 KB
122
122
  ESM dist/better-auth/auth/react.js 799.00 B
123
- ESM dist/better-auth/auth/client.js.map 8.32 KB
124
- ESM dist/better-auth/auth/react.js.map 2.04 KB
123
+ ESM dist/better-auth/auth/client.js.map 8.44 KB
125
124
  ESM dist/better-auth/auth/server.js.map 15.31 KB
126
- ESM ⚡️ Build success in 31ms
125
+ ESM dist/better-auth/auth/react.js.map 2.04 KB
126
+ ESM ⚡️ Build success in 29ms
127
127
  ESM dist/media/index.js 236.00 B
128
- ESM dist/media/index.server.js 2.95 KB
129
- ESM dist/media/index.native.js 4.01 KB
130
128
  ESM dist/media/index.browser.js 2.79 KB
129
+ ESM dist/media/index.native.js 4.01 KB
130
+ ESM dist/media/index.server.js 2.95 KB
131
131
  ESM dist/media/chunk-3LKBM3G3.js 6.69 KB
132
132
  ESM dist/media/index.js.map 71.00 B
133
- ESM dist/media/index.server.js.map 6.37 KB
134
- ESM dist/media/index.native.js.map 8.10 KB
135
133
  ESM dist/media/index.browser.js.map 6.15 KB
134
+ ESM dist/media/index.native.js.map 8.10 KB
135
+ ESM dist/media/index.server.js.map 6.37 KB
136
136
  ESM dist/media/chunk-3LKBM3G3.js.map 16.99 KB
137
- ESM ⚡️ Build success in 41ms
138
- ESM dist/react-core/chunk-7DYMJ74I.js 279.00 B
139
- ESM dist/react-core/index.js 17.05 KB
137
+ ESM ⚡️ Build success in 37ms
138
+ ESM dist/react-core/index.js 15.29 KB
140
139
  ESM dist/react-core/testing.js 1.22 KB
141
- ESM dist/react-core/chunk-7DYMJ74I.js.map 533.00 B
140
+ ESM dist/react-core/chunk-7DYMJ74I.js 279.00 B
141
+ ESM dist/react-core/index.js.map 46.65 KB
142
142
  ESM dist/react-core/testing.js.map 1.86 KB
143
- ESM dist/react-core/index.js.map 49.77 KB
144
- ESM ⚡️ Build success in 54ms
145
- ESM dist/expo/testing.js 112.00 B
143
+ ESM dist/react-core/chunk-7DYMJ74I.js.map 533.00 B
144
+ ESM ⚡️ Build success in 37ms
146
145
  ESM dist/expo/index.js 4.68 KB
146
+ ESM dist/expo/testing.js 112.00 B
147
147
  ESM dist/expo/crypto.js 153.00 B
148
148
  ESM dist/expo/polyfills.js 858.00 B
149
- ESM dist/expo/testing.js.map 168.00 B
150
149
  ESM dist/expo/index.js.map 10.23 KB
151
- ESM dist/expo/polyfills.js.map 1.61 KB
150
+ ESM dist/expo/testing.js.map 168.00 B
152
151
  ESM dist/expo/crypto.js.map 189.00 B
153
- ESM ⚡️ Build success in 48ms
154
- ESM dist/better-auth/database-adapter/index.js 26.65 KB
155
- ESM dist/better-auth/database-adapter/index.js.map 58.26 KB
156
- ESM ⚡️ Build success in 50ms
152
+ ESM dist/expo/polyfills.js.map 1.61 KB
153
+ ESM ⚡️ Build success in 42ms
157
154
  ESM dist/browser/index.js 16.26 KB
158
155
  ESM dist/browser/index.js.map 34.88 KB
159
- ESM ⚡️ Build success in 84ms
156
+ ESM ⚡️ Build success in 60ms
157
+ ESM dist/better-auth/database-adapter/index.js 26.65 KB
158
+ ESM dist/better-auth/database-adapter/index.js.map 58.26 KB
159
+ ESM ⚡️ Build success in 59ms
160
160
  ESM dist/react/index.js 25.96 KB
161
- ESM dist/react/ssr.js 697.00 B
162
161
  ESM dist/react/testing.js 122.00 B
163
- ESM dist/react/index.js.map 55.44 KB
164
- ESM dist/react/ssr.js.map 1.11 KB
162
+ ESM dist/react/ssr.js 697.00 B
165
163
  ESM dist/react/testing.js.map 165.00 B
166
- ESM ⚡️ Build success in 68ms
164
+ ESM dist/react/ssr.js.map 1.11 KB
165
+ ESM dist/react/index.js.map 55.44 KB
166
+ ESM ⚡️ Build success in 62ms
167
167
  ESM dist/prosemirror/index.js 77.76 KB
168
168
  ESM dist/prosemirror/index.js.map 307.20 KB
169
- ESM ⚡️ Build success in 82ms
170
- ESM dist/react-native-core/index.js 20.75 KB
169
+ ESM ⚡️ Build success in 71ms
170
+ ESM dist/react-native-core/index.js 34.07 KB
171
171
  ESM dist/react-native-core/testing.js 119.00 B
172
+ ESM dist/react-native-core/chunk-DGUM43GV.js 432.00 B
173
+ ESM dist/react-native-core/crypto.js 2.61 KB
172
174
  ESM dist/react-native-core/crypto/RNCrypto.js 120.00 B
173
- ESM dist/react-native-core/crypto.js 2.58 KB
174
- ESM dist/react-native-core/crypto/RNCrypto.js.map 178.00 B
175
- ESM dist/react-native-core/index.js.map 41.79 KB
176
- ESM dist/react-native-core/crypto.js.map 5.25 KB
177
175
  ESM dist/react-native-core/testing.js.map 175.00 B
178
- ESM ⚡️ Build success in 78ms
179
- ESM dist/react-native/index.js 23.29 KB
180
- ESM dist/react-native/testing.js 120.00 B
181
- ESM dist/react-native/crypto.js 161.00 B
182
- ESM dist/react-native/polyfills.js 858.00 B
183
- ESM dist/react-native/testing.js.map 176.00 B
184
- ESM dist/react-native/crypto.js.map 197.00 B
185
- ESM dist/react-native/polyfills.js.map 1.61 KB
186
- ESM dist/react-native/index.js.map 47.34 KB
187
- ESM ⚡️ Build success in 83ms
188
- ESM dist/inspector/index.js 6.29 KB
176
+ ESM dist/react-native-core/crypto/RNCrypto.js.map 178.00 B
177
+ ESM dist/react-native-core/crypto.js.map 5.26 KB
178
+ ESM dist/react-native-core/chunk-DGUM43GV.js.map 71.00 B
179
+ ESM dist/react-native-core/index.js.map 69.18 KB
180
+ ESM ⚡️ Build success in 68ms
181
+ ESM dist/react-native/chunk-DGUM43GV.js 432.00 B
182
+ ESM dist/react-native/testing.js 120.00 B
183
+ ESM dist/react-native/crypto.js 192.00 B
184
+ ESM dist/react-native/index.js 36.61 KB
185
+ ESM dist/react-native/polyfills.js 858.00 B
186
+ ESM dist/react-native/testing.js.map 176.00 B
187
+ ESM dist/react-native/chunk-DGUM43GV.js.map 71.00 B
188
+ ESM dist/react-native/crypto.js.map 199.00 B
189
+ ESM dist/react-native/index.js.map 74.73 KB
190
+ ESM dist/react-native/polyfills.js.map 1.61 KB
191
+ ESM ⚡️ Build success in 71ms
189
192
  ESM dist/inspector/standalone.js 12.61 KB
190
193
  ESM dist/inspector/chunk-YQNK5Y7B.js 127.21 KB
191
- ESM dist/inspector/index.js.map 9.65 KB
194
+ ESM dist/inspector/index.js 6.29 KB
192
195
  ESM dist/inspector/standalone.js.map 20.11 KB
196
+ ESM dist/inspector/index.js.map 9.65 KB
193
197
  ESM dist/inspector/chunk-YQNK5Y7B.js.map 221.30 KB
194
- ESM ⚡️ Build success in 93ms
198
+ ESM ⚡️ Build success in 88ms
195
199
  ESM dist/index.js 30.81 KB
196
200
  ESM dist/testing.js 8.56 KB
201
+ ESM dist/tools/ssr.js 156.00 B
197
202
  ESM dist/chunk-M2HGBOXS.js 694.00 B
198
203
  ESM dist/chunk-PZ5AY32C.js 233.00 B
199
- ESM dist/tools/ssr.js 156.00 B
200
- ESM dist/chunk-PEHQ7TN2.js 227.64 KB
201
- ESM dist/chunk-M2HGBOXS.js.map 1.10 KB
204
+ ESM dist/chunk-MI24YFCY.js 228.88 KB
205
+ ESM dist/index.js.map 62.37 KB
202
206
  ESM dist/testing.js.map 16.21 KB
203
- ESM dist/chunk-PZ5AY32C.js.map 71.00 B
207
+ ESM dist/chunk-M2HGBOXS.js.map 1.10 KB
204
208
  ESM dist/tools/ssr.js.map 71.00 B
205
- ESM dist/index.js.map 62.37 KB
206
- ESM dist/chunk-PEHQ7TN2.js.map 534.93 KB
207
- ESM ⚡️ Build success in 117ms
209
+ ESM dist/chunk-PZ5AY32C.js.map 71.00 B
210
+ ESM dist/chunk-MI24YFCY.js.map 536.60 KB
211
+ ESM ⚡️ Build success in 104ms
208
212
  ESM dist/inspector/register-custom-element.js 218.00 B
209
213
  ESM dist/inspector/register-custom-element.js.map 314.00 B
210
214
  ESM dist/inspector/custom-element-KYV64IOC.js 1.60 MB
211
215
  ESM dist/inspector/custom-element-KYV64IOC.js.map 2.47 MB
212
- ESM ⚡️ Build success in 154ms
216
+ ESM ⚡️ Build success in 138ms
213
217
 
214
- > jazz-tools@0.19.19 types /home/runner/_work/jazz/jazz/packages/jazz-tools
218
+ > jazz-tools@0.19.20 types /home/runner/_work/jazz/jazz/packages/jazz-tools
215
219
  > tsc --outDir dist
216
220
 
217
221
 
218
- > jazz-tools@0.19.19 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
222
+ > jazz-tools@0.19.20 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
219
223
  > rm -rf dist/svelte && svelte-package -i src/svelte -o dist/svelte --tsconfig tsconfig.svelte.json
220
224
 
221
225
  src/svelte -> dist/svelte
222
226
 
223
- > jazz-tools@0.19.19 build:better-auth-svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
227
+ > jazz-tools@0.19.20 build:better-auth-svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
224
228
  > mkdir -p dist/better-auth/auth && svelte-package -i src/better-auth/auth -o dist/better-auth/auth-temp --tsconfig tsconfig.svelte.json && cp dist/better-auth/auth-temp/svelte.svelte dist/better-auth/auth/svelte.svelte && cp dist/better-auth/auth-temp/svelte.svelte.d.ts dist/better-auth/auth/svelte.d.ts && rm -rf dist/better-auth/auth-temp
225
229
 
226
230
  src/better-auth/auth -> dist/better-auth/auth-temp
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EAEjB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;wBAmBC,UAAU,CAAC,OAAO,UAAU,CAAC;;;sCAIvB,eAAe,CAAC,OAAO,CAAC;4CAGlB,iBAAiB;;;;;;;;;;;CA6H1D,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EAEjB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;wBAmBC,UAAU,CAAC,OAAO,UAAU,CAAC;;;sCAIvB,eAAe,CAAC,OAAO,CAAC;4CAGlB,iBAAiB;;;;;;;;;;;CA+H1D,CAAC"}
@@ -66,7 +66,7 @@ var jazzPluginClient = () => {
66
66
  "x-jazz-auth",
67
67
  JSON.stringify({
68
68
  accountID: credentials.accountID,
69
- secretSeed: credentials.secretSeed,
69
+ secretSeed: credentials.secretSeed ? Array.from(credentials.secretSeed) : void 0,
70
70
  accountSecret: credentials.accountSecret
71
71
  })
72
72
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/better-auth/auth/client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from \"better-auth\";\nimport type {\n Account,\n AuthSecretStorage,\n AuthSetPayload,\n JazzContextType,\n} from \"jazz-tools\";\nimport type { jazzPlugin } from \"./server.js\";\n\nconst SIGNUP_URLS = [\n \"/sign-up\",\n \"/sign-in/social\",\n \"/sign-in/oauth2\",\n \"/email-otp/send-verification-otp\",\n];\n\n/**\n * @example\n * ```ts\n * const auth = betterAuth({\n * plugins: [jazzPluginClient()],\n * });\n * ```\n */\nexport const jazzPluginClient = () => {\n let jazzContext: JazzContextType<Account>;\n let authSecretStorage: AuthSecretStorage;\n let signOutUnsubscription: () => void;\n\n const authenticateOnJazz = async (jazzAuth: AuthSetPayload) => {\n const parsedJazzAuth = {\n ...jazzAuth,\n secretSeed: jazzAuth.secretSeed\n ? Uint8Array.from(jazzAuth.secretSeed)\n : undefined,\n };\n\n await jazzContext.authenticate(parsedJazzAuth);\n await authSecretStorage.set(parsedJazzAuth);\n };\n\n return {\n id: \"jazz-plugin\",\n $InferServerPlugin: {} as ReturnType<typeof jazzPlugin>,\n getActions: ($fetch, $store) => {\n return {\n jazz: {\n setJazzContext: (context: JazzContextType<Account>) => {\n jazzContext = context;\n },\n setAuthSecretStorage: (storage: AuthSecretStorage) => {\n authSecretStorage = storage;\n if (signOutUnsubscription) signOutUnsubscription();\n\n // This is a workaround to logout from Better Auth when user logs out directly from Jazz\n signOutUnsubscription = authSecretStorage.onUpdate(\n (isAuthenticated) => {\n if (isAuthenticated === false) {\n const session = $store.atoms.session?.get();\n if (!session) return;\n\n // if the user logs out from Better Auth, the get session is immediately called\n // so we must wait the next fetched session to understand if we need to call sign-out\n if (session.isPending || session.isRefetching) {\n // listen once for next session's data\n const unsub = $store.atoms.session?.listen((session) => {\n unsub?.();\n // if the session is null, user has been already logged out from Better Auth\n if (session.data !== null) {\n $fetch(\"/sign-out\", { method: \"POST\" });\n }\n });\n }\n // if the session is not pending, it means user logged out from Jazz only\n // so we call the sign-out api\n else {\n $fetch(\"/sign-out\", { method: \"POST\" });\n }\n }\n },\n );\n },\n },\n };\n },\n fetchPlugins: [\n {\n id: \"jazz-plugin\",\n name: \"jazz-plugin\",\n hooks: {\n async onRequest(context) {\n if (\n SIGNUP_URLS.some((url) => context.url.toString().includes(url))\n ) {\n const credentials = await authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"Jazz credentials not found\");\n }\n\n context.headers.set(\n \"x-jazz-auth\",\n JSON.stringify({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n }),\n );\n }\n },\n async onSuccess(context) {\n if (context.request.url.toString().includes(\"/sign-up\")) {\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n if (context.request.url.toString().includes(\"/sign-in/email\")) {\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n if (context.request.url.toString().includes(\"/get-session\")) {\n if (context.data === null) {\n if (authSecretStorage.isAuthenticated === true) {\n console.info(\n \"Jazz is authenticated, but the session is null. Logging out\",\n );\n await jazzContext.logOut();\n }\n return;\n }\n\n if (!context.data?.user) {\n return;\n }\n\n if (authSecretStorage.isAuthenticated === false) {\n console.info(\n \"Jazz is not authenticated, using Better Auth stored credentials\",\n );\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n const sessionAccountID = context.data.user.accountID;\n\n const credentials = await authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"Jazz credentials not found\");\n }\n\n if (credentials.accountID !== sessionAccountID) {\n console.info(\n \"Jazz credentials mismatch, using Better Auth stored credentials\",\n );\n await authenticateOnJazz(context.data.jazzAuth);\n }\n return;\n }\n\n if (context.request.url.toString().includes(\"/sign-out\")) {\n await jazzContext.logOut();\n return;\n }\n\n if (context.request.url.toString().includes(\"/delete-user\")) {\n await jazzContext.logOut();\n return;\n }\n },\n },\n },\n ],\n } satisfies BetterAuthClientPlugin;\n};\n"],"mappings":"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","names":["session"]}
1
+ {"version":3,"sources":["../../../src/better-auth/auth/client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from \"better-auth\";\nimport type {\n Account,\n AuthSecretStorage,\n AuthSetPayload,\n JazzContextType,\n} from \"jazz-tools\";\nimport type { jazzPlugin } from \"./server.js\";\n\nconst SIGNUP_URLS = [\n \"/sign-up\",\n \"/sign-in/social\",\n \"/sign-in/oauth2\",\n \"/email-otp/send-verification-otp\",\n];\n\n/**\n * @example\n * ```ts\n * const auth = betterAuth({\n * plugins: [jazzPluginClient()],\n * });\n * ```\n */\nexport const jazzPluginClient = () => {\n let jazzContext: JazzContextType<Account>;\n let authSecretStorage: AuthSecretStorage;\n let signOutUnsubscription: () => void;\n\n const authenticateOnJazz = async (jazzAuth: AuthSetPayload) => {\n const parsedJazzAuth = {\n ...jazzAuth,\n secretSeed: jazzAuth.secretSeed\n ? Uint8Array.from(jazzAuth.secretSeed)\n : undefined,\n };\n\n await jazzContext.authenticate(parsedJazzAuth);\n await authSecretStorage.set(parsedJazzAuth);\n };\n\n return {\n id: \"jazz-plugin\",\n $InferServerPlugin: {} as ReturnType<typeof jazzPlugin>,\n getActions: ($fetch, $store) => {\n return {\n jazz: {\n setJazzContext: (context: JazzContextType<Account>) => {\n jazzContext = context;\n },\n setAuthSecretStorage: (storage: AuthSecretStorage) => {\n authSecretStorage = storage;\n if (signOutUnsubscription) signOutUnsubscription();\n\n // This is a workaround to logout from Better Auth when user logs out directly from Jazz\n signOutUnsubscription = authSecretStorage.onUpdate(\n (isAuthenticated) => {\n if (isAuthenticated === false) {\n const session = $store.atoms.session?.get();\n if (!session) return;\n\n // if the user logs out from Better Auth, the get session is immediately called\n // so we must wait the next fetched session to understand if we need to call sign-out\n if (session.isPending || session.isRefetching) {\n // listen once for next session's data\n const unsub = $store.atoms.session?.listen((session) => {\n unsub?.();\n // if the session is null, user has been already logged out from Better Auth\n if (session.data !== null) {\n $fetch(\"/sign-out\", { method: \"POST\" });\n }\n });\n }\n // if the session is not pending, it means user logged out from Jazz only\n // so we call the sign-out api\n else {\n $fetch(\"/sign-out\", { method: \"POST\" });\n }\n }\n },\n );\n },\n },\n };\n },\n fetchPlugins: [\n {\n id: \"jazz-plugin\",\n name: \"jazz-plugin\",\n hooks: {\n async onRequest(context) {\n if (\n SIGNUP_URLS.some((url) => context.url.toString().includes(url))\n ) {\n const credentials = await authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"Jazz credentials not found\");\n }\n\n context.headers.set(\n \"x-jazz-auth\",\n JSON.stringify({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed\n ? Array.from(credentials.secretSeed)\n : undefined,\n accountSecret: credentials.accountSecret,\n }),\n );\n }\n },\n async onSuccess(context) {\n if (context.request.url.toString().includes(\"/sign-up\")) {\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n if (context.request.url.toString().includes(\"/sign-in/email\")) {\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n if (context.request.url.toString().includes(\"/get-session\")) {\n if (context.data === null) {\n if (authSecretStorage.isAuthenticated === true) {\n console.info(\n \"Jazz is authenticated, but the session is null. Logging out\",\n );\n await jazzContext.logOut();\n }\n return;\n }\n\n if (!context.data?.user) {\n return;\n }\n\n if (authSecretStorage.isAuthenticated === false) {\n console.info(\n \"Jazz is not authenticated, using Better Auth stored credentials\",\n );\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n const sessionAccountID = context.data.user.accountID;\n\n const credentials = await authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"Jazz credentials not found\");\n }\n\n if (credentials.accountID !== sessionAccountID) {\n console.info(\n \"Jazz credentials mismatch, using Better Auth stored credentials\",\n );\n await authenticateOnJazz(context.data.jazzAuth);\n }\n return;\n }\n\n if (context.request.url.toString().includes(\"/sign-out\")) {\n await jazzContext.logOut();\n return;\n }\n\n if (context.request.url.toString().includes(\"/delete-user\")) {\n await jazzContext.logOut();\n return;\n }\n },\n },\n },\n ],\n } satisfies BetterAuthClientPlugin;\n};\n"],"mappings":"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","names":["session"]}
@@ -2355,8 +2355,11 @@ var _Account = class _Account extends CoValueBase {
2355
2355
  });
2356
2356
  if (!loadedWorker.$isLoaded)
2357
2357
  throw new Error("Unable to load the worker account");
2358
- if (options.onCreate) await options.onCreate(account, loadedWorker);
2359
- await account.$jazz.waitForAllCoValuesSync();
2358
+ if (options.onCreate)
2359
+ await options.onCreate(account, loadedWorker, credentials);
2360
+ await account.$jazz.waitForAllCoValuesSync({
2361
+ timeout: options.waitForSyncTimeout
2362
+ });
2360
2363
  const createdAccount = await this.load(account.$jazz.id, {
2361
2364
  loadAs: worker
2362
2365
  });
@@ -6198,7 +6201,31 @@ var AccountSchema = class _AccountSchema {
6198
6201
  withSchemaResolveQuery(options, this.resolveQuery)
6199
6202
  );
6200
6203
  }
6201
- // Create an account via worker, useful to generate controlled accounts from the server
6204
+ /**
6205
+ * Creates a new account as a worker account, useful for generating controlled accounts from a server environment.
6206
+ * This method initializes a new account, applies migrations, invokes the `onCreate` callback, and then shuts down the temporary node to avoid memory leaks.
6207
+ * Returns the created account (loaded on the worker) and its credentials.
6208
+ *
6209
+ * The method internally calls `waitForAllCoValuesSync` on the new account. If many CoValues are created during `onCreate`,
6210
+ * consider adjusting the timeout using the `waitForSyncTimeout` option.
6211
+ *
6212
+ * @param worker - The worker account to create the new account from
6213
+ * @param options.creationProps - The creation properties for the new account
6214
+ * @param options.onCreate - The callback to use to initialize the account after it is created
6215
+ * @param options.waitForSyncTimeout - The timeout for the sync to complete
6216
+ * @returns The credentials and the created account loaded by the worker account
6217
+ *
6218
+ *
6219
+ * @example
6220
+ * ```ts
6221
+ * const { credentials, account } = await AccountSchema.createAs(worker, {
6222
+ * creationProps: { name: "My Account" },
6223
+ * onCreate: async (account, worker, credentials) => {
6224
+ * account.root.$jazz.owner.addMember(worker, "writer");
6225
+ * },
6226
+ * });
6227
+ * ```
6228
+ */
6202
6229
  createAs(worker, options) {
6203
6230
  return this.coValueClass.createAs(worker, options);
6204
6231
  }
@@ -7850,4 +7877,4 @@ export {
7850
7877
  JazzContextManager
7851
7878
  };
7852
7879
  /* istanbul ignore file -- @preserve */
7853
- //# sourceMappingURL=chunk-PEHQ7TN2.js.map
7880
+ //# sourceMappingURL=chunk-MI24YFCY.js.map