Compare commits

..

1984 Commits

Author SHA1 Message Date
Matteo Manchi
688316f199 Merge pull request #2793 from garden-co/fix/load-as-upsertUnique
Explicit loadAs in CoList.upsertUnique to use it without loaded context
2025-08-21 18:02:00 +02:00
Matteo Manchi
65332631d2 chore: refactor runWithoutActiveAccount to handle promises 2025-08-21 17:51:48 +02:00
Matteo Manchi
bb9d837236 fix(jazz-tools/tools): explicit loadAs in CoList.upsertUnique to use it without loaded context 2025-08-21 16:35:06 +02:00
Matteo Manchi
fd186f769e test(jazz-tools/tools): add tests for CoMap.upsertUnique without an active account 2025-08-21 16:29:10 +02:00
Guido D'Orsi
97bf06fb9f Merge pull request #2792 from garden-co/feat/remove-wee-alloc
Remove wee_alloc from the code, update benchmarks to target 0.17.9 (last one before SessionLog)
2025-08-21 10:10:33 +02:00
Guido D'Orsi
85740f01ff Merge pull request #2788 from garden-co/feat/skip-signerID
feat: skip the agent resolve
2025-08-21 09:51:52 +02:00
Guido D'Orsi
842b7fa05a chore: update the bench to target 0.17.9 2025-08-21 09:50:59 +02:00
Guido D'Orsi
9decbb4d5b chore: remove wee_alloc 2025-08-21 09:49:25 +02:00
Guido D'Orsi
e301ad63ae chore: changeset 2025-08-20 23:36:15 +02:00
Guido D'Orsi
f1d0c4244b chore: remove useless check 2025-08-20 23:35:19 +02:00
Guido D'Orsi
4afe200553 fix: type error and console log 2025-08-20 21:18:32 +02:00
Guido D'Orsi
a06bc8f868 fix: skipVerify on WASMCrypto 2025-08-20 21:16:47 +02:00
Justin Rosenthal
c805d132fd Correct error message 2025-08-20 12:15:22 -07:00
Justin Rosenthal
33936b8fe3 Add test for missing signerID in PureJSCrypto 2025-08-20 12:13:08 -07:00
Guido D'Orsi
23e7d07ab9 Merge pull request #2786 from garden-co/fix/self-downgrade-writeonly
fix: make it possible for an admin to self-downgrade to writeOnly
2025-08-20 21:05:43 +02:00
Guido D'Orsi
22944b5025 feat: skip the agent resolve 2025-08-20 21:03:23 +02:00
NicoR
257ded37a7 chore: add changeset 2025-08-20 15:45:22 -03:00
NicoR
a6f7b0c64e docs: add TS docs to user-facing roles 2025-08-20 15:43:13 -03:00
NicoR
bbf9b1b1ca test: downgrading self & other accounts to reader & writeOnly 2025-08-20 15:43:13 -03:00
NicoR
0ec9906357 fix: prevent admin from downgrade other admins to writeOnly 2025-08-20 15:43:12 -03:00
Guido D'Orsi
91aec2536c fix: make it possible for an admin to self-downgrade to writeOnly 2025-08-20 15:43:12 -03:00
Guido D'Orsi
d0ae8ef8cd Merge pull request #2787 from garden-co/chore/simplfy-tryadd-params
chore: remove unused params from tryAddTransactions
2025-08-20 20:06:21 +02:00
Guido D'Orsi
6dab1e01c1 chore: remove unused params from tryAddTransactions 2025-08-20 19:12:48 +02:00
Guido D'Orsi
6adc931b7f chore: update bench titles 2025-08-20 17:12:12 +02:00
Guido D'Orsi
b2165f3758 chore: version Cargo.lock 2025-08-20 17:12:12 +02:00
Guido D'Orsi
14f0d557e8 Merge pull request #2784 from garden-co/changeset-release/main
Version Packages
2025-08-20 17:08:56 +02:00
github-actions[bot]
42ac056b99 Version Packages 2025-08-20 15:06:58 +00:00
Guido D'Orsi
0aef1705a2 chore: changeset 2025-08-20 17:03:10 +02:00
Guido D'Orsi
15f09aefeb Merge pull request #2783 from garden-co/changeset-release/main
Version Packages
2025-08-20 17:01:12 +02:00
github-actions[bot]
472142e926 Version Packages 2025-08-20 14:58:27 +00:00
Guido D'Orsi
3fca60bc23 Merge pull request #2617 from garden-co/anselm-gco-634-implement-current-session-logic-in-rust-and-use-as-wasm
Implement current session logic in Rust and use as WASM
2025-08-20 16:54:55 +02:00
Guido D'Orsi
c87e5abba6 Merge pull request #2755 from garden-co/fix/catalog-cja
fix: catalog replacement for `create-jazz-app`
2025-08-20 16:54:16 +02:00
Guido D'Orsi
c55297cdc5 chore: changeset 2025-08-20 16:39:48 +02:00
Brad Anderson
07db808253 fix: don't bump/control create-jazz-app version 2025-08-20 08:54:40 -04:00
Guido D'Orsi
657ac7344a Update .changeset/config.json 2025-08-20 14:51:53 +02:00
Guido D'Orsi
6061cad555 remove filter on pre-release label 2025-08-20 14:51:06 +02:00
Guido D'Orsi
4c2e60ab51 Merge pull request #2776 from garden-co/changeset-release/main
Version Packages
2025-08-20 13:25:30 +02:00
github-actions[bot]
1830171930 Version Packages 2025-08-20 10:59:08 +00:00
Guido D'Orsi
6574090402 Merge pull request #2777 from garden-co/fix/load-as-upsertUnique
Explicit loadAs in upsertUnique to use it without loaded context
2025-08-20 12:55:18 +02:00
Guido D'Orsi
a6f65472a7 Merge pull request #2779 from ccssmnn/add-fallback-components
Add Fallback properties to JazzProvider and ClerkProvider
2025-08-20 12:54:16 +02:00
Guido D'Orsi
109952aa6a Merge pull request #2781 from garden-co/gio/setup-codeowners
chore: setup codeowners
2025-08-20 12:50:38 +02:00
Giordano Ricci
556bdf977b more tweaking 2025-08-20 11:41:31 +01:00
Giordano Ricci
0213b4e5b9 add ui 2025-08-20 11:31:54 +01:00
Giordano Ricci
01c195756c add docs 2025-08-20 11:27:17 +01:00
Giordano Ricci
9c69917d24 add @garden-co/framework as owner of all packages 2025-08-20 11:03:18 +01:00
Giordano Ricci
b4d68f0a32 wip: setup codeowners 2025-08-20 10:59:36 +01:00
Guido D'Orsi
fbc3839777 chore: simplify the fallback on the react provider 2025-08-20 11:55:45 +02:00
Guido D'Orsi
296464b282 Merge pull request #2753 from garden-co/GCO-642-clarify-docs-adding-group-members-by-id
Closes #GCO-642 - Clarify docs for adding group members by id
2025-08-20 11:50:03 +02:00
Guido D'Orsi
2e73d09ab9 perf: optimize hashing computation 2025-08-20 10:52:37 +02:00
Carl Assmann
c463654970 no need to add fallback to clerk, bc it extends and forwards jazzproviderprops 2025-08-19 23:23:19 +02:00
Carl Assmann
debc052bdc add fallback to clerk example 2025-08-19 23:12:12 +02:00
Carl Assmann
3c7846153d add fallback properties to JazzProvider and ClerkProvider 2025-08-19 23:00:06 +02:00
Meg Culotta
e410fedda7 Merge pull request #2736 from garden-co/#GCO-691-Adds-node-20-troubleshooting-docs
Closes GCO-691, GCO-731 - Add setup troubleshooting page
2025-08-19 14:40:47 -05:00
Brad Anderson
94172c9972 chore: PR feedback, move to own workflow 2025-08-19 13:11:41 -04:00
Matteo Manchi
52ea0c7a9b fix(jazz-tools/tools): explicit loadAs in upsertUnique to use it without loaded context 2025-08-19 18:21:31 +02:00
Guido D'Orsi
4d3d99504b Merge remote-tracking branch 'origin/main' into anselm-gco-634-implement-current-session-logic-in-rust-and-use-as-wasm 2025-08-19 18:03:32 +02:00
Guido D'Orsi
b91c93caed Merge pull request #2769 from garden-co/justin-gco-741-skip-session-transaction-verification-in-core-node
Ref GCO-741: Add option for disabling transaction verification to SyncManager
2025-08-19 18:03:02 +02:00
Guido D'Orsi
ae8e77d216 chore: add build:dev command 2025-08-19 18:01:15 +02:00
Guido D'Orsi
d36291e9e2 test: add crypto high level tests 2025-08-19 18:00:59 +02:00
Justin Rosenthal
7586c3bac5 Add changeset 2025-08-19 08:52:44 -07:00
Justin Rosenthal
9b96cd4a65 Craft an invalid transaction in unit test 2025-08-19 08:50:43 -07:00
Justin Rosenthal
2e66ea8e56 Revert signatures to positional args 2025-08-19 08:32:38 -07:00
Guido D'Orsi
336cc1f0fe Merge pull request #2773 from garden-co/changeset-release/main
Version Packages
2025-08-19 16:27:36 +02:00
github-actions[bot]
cc2ca5c23c Version Packages 2025-08-19 14:26:38 +00:00
Guido D'Orsi
3664385113 Merge pull request #2775 from garden-co/fix/comap-coprofile-validate-input
fix: prevent passing CoValue schemas to `co.map` and `co.profile`
2025-08-19 16:22:45 +02:00
Guido D'Orsi
2b2ecdaf3d Merge pull request #2771 from garden-co/feat/rich-text-prosemirror-fix
fix(prosemirror): fix RangeError triggered when creating invalid HTML
2025-08-19 16:21:39 +02:00
Guido D'Orsi
506491aebe Merge pull request #2774 from garden-co/feat/unified-crypto
feat: unify the wasm modules
2025-08-19 16:20:42 +02:00
Guido D'Orsi
6dbb05320a fix(prosemirror): fix RangeError triggered when creating invalid HTML 2025-08-19 16:15:12 +02:00
Margaret Culotta
0160a188fa Remove strict casting from example 2025-08-19 09:06:58 -05:00
NicoR
ac3e694f4e fix: prevent passing CoValue schemas to co.map and co.profile 2025-08-19 11:05:54 -03:00
Guido D'Orsi
d70e4a9773 feat: unify the wasm modules 2025-08-19 16:04:38 +02:00
Margaret Culotta
a7dca75955 Clean up unnecessary content per PR feedback 2025-08-19 08:29:24 -05:00
Guido D'Orsi
143156cd6a Merge pull request #2772 from garden-co/gio/add-missing-export
fix: add missing export
2025-08-19 14:31:57 +02:00
Giordano Ricci
1a182f07de add changeset 2025-08-19 13:30:30 +01:00
Giordano Ricci
7e7e7ebb51 fix: add missing export 2025-08-19 13:28:45 +01:00
Guido D'Orsi
0966a90f3d Merge pull request #2768 from garden-co/changeset-release/main
Version Packages
2025-08-19 08:44:03 +02:00
Justin Rosenthal
76f142b70d Add ability to disable verification in SyncManager 2025-08-18 14:52:58 -07:00
github-actions[bot]
cd2f0846db Version Packages 2025-08-18 20:33:16 +00:00
Guido D'Orsi
c2e411d056 Merge pull request #2759 from 0x100101/feat/sync-server-host-opt
Add host option to the jazz-run sync command
2025-08-18 22:31:01 +02:00
Guido D'Orsi
70cdb1100e Merge pull request #2762 from garden-co/feat/optimize-crypto
perf: switch to decryptNextTransactionChangesJson
2025-08-18 22:26:28 +02:00
Justin Rosenthal
0167153da2 Use named parameters in tryAddTransactions() signatures 2025-08-18 13:19:26 -07:00
Guido D'Orsi
e4a4d0decc chore: update the bench 2025-08-18 20:17:43 +02:00
Guido D'Orsi
be5211d088 Merge pull request #2765 from garden-co/changeset-release/main
Version Packages
2025-08-18 20:00:59 +02:00
Guido D'Orsi
dd7b30b5d8 chore: fix broken tests, remove expectedNewHashAfter 2025-08-18 19:58:38 +02:00
github-actions[bot]
747f73d168 Version Packages 2025-08-18 17:48:48 +00:00
Guido D'Orsi
7501702f7b Merge pull request #2761 from garden-co/fix/GCO-726
fix(jazz-tools/media): get resized file's id without triggering shallow load
2025-08-18 19:44:23 +02:00
Guido D'Orsi
16fb9fab5f Merge pull request #2764 from garden-co/fix/create-from-json-without-active-account
fix: create CoValues from JSON without an active account
2025-08-18 19:43:39 +02:00
NicoR
82de51c93d chore: add changeset 2025-08-18 13:49:25 -03:00
NicoR
5d96991981 fix: create CoValues from JSON without an active account 2025-08-18 13:42:28 -03:00
Matteo Manchi
694b168fb4 fix(jazz-tools/media): get resized file's id without triggering shallow load 2025-08-18 17:54:48 +02:00
0x100101
feaa69ebdd Add patch file 2025-08-18 10:04:04 -05:00
Guido D'Orsi
384ebf7f92 perf: switch to decryptNextTransactionChangesJson 2025-08-18 16:37:23 +02:00
Guido D'Orsi
f5acd5c8a3 Merge pull request #2760 from garden-co/feat/optimize-crypto
perf: optimize PureJSCrypto SessionLog
2025-08-18 16:07:40 +02:00
Guido D'Orsi
d7df996fdc perf: cache agentId 2025-08-18 15:07:30 +02:00
Guido D'Orsi
820718ebb2 perf: optimize SessionLog for PureJSCrypto 2025-08-18 14:41:51 +02:00
Guido D'Orsi
344206a7a6 fix: fix content import benchmark 2025-08-18 14:16:40 +02:00
Guido D'Orsi
ca51fe2296 fix: use WASMCrypto in the bench 2025-08-18 12:25:09 +02:00
Guido D'Orsi
e40a4f2f76 feat: add a bench to compare perf with the latest published version of jazz 2025-08-18 11:42:39 +02:00
0x100101
d5fa172b17 Update docs 2025-08-17 20:46:12 -05:00
0x100101
96de15593b Add and update tests. Tweak sync server return. 2025-08-17 20:32:22 -05:00
0x100101
5ba03ebc70 Add host option to startSyncServerCommand command 2025-08-17 16:10:04 -05:00
Guido D'Orsi
4609cebed6 Merge pull request #2757 from garden-co/feat/music-player-welcome
fix: avatar permissions
2025-08-16 18:12:54 +02:00
Guido D'Orsi
06d21b9529 fix: avatar permissions 2025-08-16 18:09:24 +02:00
Guido D'Orsi
f3426beaf5 Merge pull request #2756 from garden-co/feat/music-player-welcome
feat(music): show the welcome screen, add playlist members list
2025-08-16 17:47:53 +02:00
Guido D'Orsi
8b3e038a98 feat(music): show the welcome screen, add playlist members list 2025-08-16 17:36:15 +02:00
Brad Anderson
e794ddbd3d fix: include workspace file for catalog replacement, add CI tests 2025-08-16 10:18:13 -04:00
Brad Anderson
436f9393b3 Revert "fix: remove catalog: deps"
This reverts commit 7dd128962d.
2025-08-16 09:32:20 -04:00
Guido D'Orsi
4002d6afb9 Merge pull request #2754 from garden-co/fix/replace-catalog
fix: remove catalog: deps
2025-08-16 11:59:49 +02:00
Guido D'Orsi
7dd128962d fix: remove catalog: deps 2025-08-16 11:53:44 +02:00
Margaret Culotta
d8ae47c4d1 Clarify docs for adding group members by id 2025-08-15 15:01:38 -05:00
Guido D'Orsi
8fb1748433 Merge pull request #2750 from garden-co/changeset-release/main
Version Packages
2025-08-15 20:36:35 +02:00
github-actions[bot]
c8644bf678 Version Packages 2025-08-15 16:30:37 +00:00
Guido D'Orsi
269ee94338 test: skip flaky e2e test 2025-08-15 18:26:41 +02:00
Guido D'Orsi
dae80eeba8 Merge pull request #2751 from garden-co/feat/unmount
fix: remove unnecessary content sent as dependency
2025-08-15 18:25:51 +02:00
Guido D'Orsi
ce54667b4d Merge pull request #2752 from garden-co/more-unique-static-methods
Implement/expose loadUnique and upsertUnique on co.list and co.record
2025-08-15 18:25:33 +02:00
Anselm
5963658e28 Implement/expose loadUnique and upsertUnique on co.list and co.record 2025-08-15 17:20:48 +01:00
Guido D'Orsi
71c1411bbd fix: remove unnecessary content sent as dependency 2025-08-15 18:05:42 +02:00
Guido D'Orsi
71b221dc79 Merge pull request #2749 from garden-co/feat/unmount
feat: make the unmount function detach the CoValue from the localNode
2025-08-15 17:48:01 +02:00
Guido D'Orsi
2d11d448dc feat: make the unmount function detach the CoValue from the localNode 2025-08-15 17:41:18 +02:00
Guido D'Orsi
2d42fc9b34 Merge pull request #2748 from garden-co/changeset-release/main
Version Packages
2025-08-15 17:27:17 +02:00
github-actions[bot]
c9bda7e1e3 Version Packages 2025-08-15 15:26:39 +00:00
Guido D'Orsi
476f2d7eee Merge pull request #2747 from garden-co/export-ref-from-jazz-tools
Export Ref class from jazz-tools package
2025-08-15 17:23:08 +02:00
Guido D'Orsi
1ba3a2ca34 test: add waitForSync to fix flaky test on mesh 2025-08-15 17:22:31 +02:00
Anselm
7dd3d005a3 Export Ref class from jazz-tools package 2025-08-15 16:19:51 +01:00
Guido D'Orsi
2c2dfb52d4 Merge pull request #2746 from garden-co/changeset-release/main
Version Packages
2025-08-15 17:00:22 +02:00
github-actions[bot]
d33917fbaa Version Packages 2025-08-15 14:59:08 +00:00
Guido D'Orsi
f0c73d9cc6 chore: changeset 2025-08-15 16:56:43 +02:00
Guido D'Orsi
d9324a9809 Merge pull request #2742 from garden-co/fix/sync-server-test
test: fix flaky syncserver test
2025-08-15 16:45:11 +02:00
Guido D'Orsi
f7b5454cc6 fix: store empty content messages with header 2025-08-15 16:43:03 +02:00
Sammii
5de338bdaf Merge pull request #2730 from garden-co/feat/quint-export-updates
quint export update
2025-08-15 15:05:04 +01:00
Sammii
e67d44d47a updating imports on input page 2025-08-15 14:47:55 +01:00
Guido D'Orsi
a310293346 Merge pull request #2741 from garden-co/changeset-release/main
Version Packages
2025-08-15 15:29:06 +02:00
github-actions[bot]
716d770258 Version Packages 2025-08-15 13:27:48 +00:00
Guido D'Orsi
4e85b50e1b chore: update catalog entries in package.json to reflect current values 2025-08-15 15:25:10 +02:00
Guido D'Orsi
643297b42e test: skip flaky test 2025-08-15 15:23:15 +02:00
Guido D'Orsi
261efd99be Merge pull request #2735 from garden-co/feat/catalogs
feat: use multiple catalogs for easier version bumps
2025-08-15 15:20:43 +02:00
Brad Anderson
f75f4f9b2d fix: squirrely export recognition from twoslash 2025-08-15 09:14:05 -04:00
Brad Anderson
a0021f060c fix: homepage lockfile and catalog 2025-08-15 09:14:05 -04:00
Brad Anderson
86bd87e6d0 chore: add changeset 2025-08-15 09:14:05 -04:00
Brad Anderson
ae55e80801 chore: remove check-catalog-deps 2025-08-15 09:14:05 -04:00
Brad Anderson
e830caf966 fix: create-jazz-app handles catalog: dependencies 2025-08-15 09:14:04 -04:00
Brad Anderson
2f7240121d feat: use multiple catalogs for easier version bumps 2025-08-15 09:14:04 -04:00
Guido D'Orsi
97699a6d5b Merge pull request #2739 from garden-co/changeset-release/main
Version Packages
2025-08-15 14:33:35 +02:00
github-actions[bot]
5f8a2ba8df Version Packages 2025-08-15 12:31:47 +00:00
Guido D'Orsi
fe06e12b85 Merge pull request #2737 from garden-co/justin-gco-730-bug-correction-callback-returned-undefined
Closes GCO-730: Don't attempt to store sessions with invalid assumptions
2025-08-15 14:29:33 +02:00
Guido D'Orsi
5b2b16a5c6 chore: changeset 2025-08-15 14:27:30 +02:00
Guido D'Orsi
a966912c8a test: cover InvalidSignature storage 2025-08-15 14:26:30 +02:00
Guido D'Orsi
b63b70fb80 fix: move the msg new filtering in handleNewContent 2025-08-15 13:21:28 +02:00
Guido D'Orsi
6b3e02920a chore: changeset 2025-08-15 12:58:27 +02:00
Guido D'Orsi
f566961390 Merge pull request #2738 from garden-co/fix/media-rn-fixes
Fixes in image management for React Native
2025-08-15 12:54:14 +02:00
Guido D'Orsi
265b265365 Merge pull request #2646 from nicolasembleton/community-vue-packages
Add community-maintained VueJS bindings packages and examples
2025-08-15 12:53:28 +02:00
Matteo Manchi
83fc22f39a fix(jazz-tools/media): import react-native-image-resizer only when needed 2025-08-15 11:22:49 +02:00
Matteo Manchi
794681a8bb fix(react/media): EmptyPixelBlob initialization when needed 2025-08-15 11:22:49 +02:00
Justin Rosenthal
899bb0d2a1 Don't attempt to store content with invalid assumptions 2025-08-14 16:26:27 -07:00
Margaret Culotta
92c0048984 add setup troubleshooting page 2025-08-14 10:32:22 -05:00
Guido D'Orsi
33cfc4cc25 chore: format 2025-08-14 17:27:44 +02:00
Guido D'Orsi
42c60c99fe chore: remove the vue biome config 2025-08-14 17:25:42 +02:00
Guido D'Orsi
e42518ed29 feat: upgrade to jazz 0.16 2025-08-14 17:22:07 +02:00
Guido D'Orsi
5b7ef3cd89 Merge remote-tracking branch 'origin/main' into community-vue-packages 2025-08-14 16:03:11 +02:00
Guido D'Orsi
8e3bb4b4d9 Merge remote-tracking branch 'origin/main' into anselm-gco-634-implement-current-session-logic-in-rust-and-use-as-wasm 2025-08-14 12:14:27 +02:00
Guido D'Orsi
fc02fc0608 chore: simplify InvalidSignature test with less whiteboxing 2025-08-14 12:12:30 +02:00
Guido D'Orsi
37d1bbf00a chore: clean deps 2025-08-14 12:03:38 +02:00
Guido D'Orsi
ceaa555e83 Merge pull request #2727 from garden-co/changeset-release/main
Version Packages
2025-08-14 11:49:33 +02:00
Guido D'Orsi
3cd472f47a Merge pull request #2734 from garden-co/feat/merge-main
Feat/merge main
2025-08-14 11:30:51 +02:00
Guido D'Orsi
d453709d94 chore(biome): ignore crates 2025-08-14 11:29:43 +02:00
github-actions[bot]
03229b2ea9 Version Packages 2025-08-14 08:51:24 +00:00
Guido D'Orsi
e2737d44b6 fix: add jazz-run as workspace dependency 2025-08-14 10:48:02 +02:00
Guido D'Orsi
4b73834883 chore: changeset 2025-08-14 10:47:44 +02:00
Guido D'Orsi
1b3d43d5f4 Merge pull request #2728 from legowhales/main
fix(jazz-tools/svelte): Make Image reactive to imageId change
2025-08-14 10:46:52 +02:00
Guido D'Orsi
2ba972f444 Merge remote-tracking branch 'origin/main' into feat/merge-main 2025-08-13 20:28:57 +02:00
Guido D'Orsi
7865455cb1 chore: extract the sessions management into a SessionMap class 2025-08-13 18:33:18 +02:00
Guido D'Orsi
4d909ea4cc chore: revert type changes 2025-08-13 18:32:43 +02:00
Guido D'Orsi
9c9a689879 Merge pull request #2729 from garden-co/feat/debug-correction
feat: add debug info to correction errors
2025-08-13 17:43:53 +02:00
Guido D'Orsi
62f79df20a fix: fix the export path from the wasm .d.ts 2025-08-13 17:03:10 +02:00
Guido D'Orsi
8fd3c4c96c feat: get the cojson-core-wasm build working 2025-08-13 16:52:48 +02:00
Sammii
60b5288042 quint export update 2025-08-13 11:58:14 +01:00
Guido D'Orsi
2fd88b938c feat: add debug info to correction errors 2025-08-13 12:33:05 +02:00
Sammii
d1f955006f Merge pull request #2702 from garden-co/feat/add-input-label
Feat/add input label
2025-08-13 10:33:51 +01:00
Jérémy Le Mardelé
bb3d5f1f87 fix(jazz-tools/svelte): Make Image reactive to imageId change 2025-08-13 00:42:33 +02:00
Sammii
26ce61ab78 input PR amends 2025-08-12 15:59:30 +01:00
Sammii
1f300114d5 label PR amends 2025-08-12 15:58:42 +01:00
Guido D'Orsi
da69f812f8 Merge pull request #2726 from garden-co/fix/GCO-726
fix(jazz-tools/media): ensure file downloaded in loadImageBySize
2025-08-12 14:30:28 +02:00
Guido D'Orsi
0bcbf551ca fix: export the HttpRoute type 2025-08-12 14:26:31 +02:00
Matteo Manchi
6b3d5b5560 fixup! fix(jazz-tools/media): ensure file downloaded in loadImageBySize 2025-08-12 11:44:54 +02:00
Matteo Manchi
d1bdbf5d49 fix(jazz-tools/media): ensure file downloaded in loadImageBySize 2025-08-12 10:37:34 +02:00
Matteo Manchi
621e809fad Merge pull request #2722 from garden-co/changeset-release/main
Version Packages 0.17
2025-08-11 15:45:03 +02:00
github-actions[bot]
d6600d9322 Version Packages 2025-08-11 13:26:38 +00:00
Matteo Manchi
2b08bd77c1 Merge pull request #2624 from garden-co/feat/new-image-apis
New Image management API
2025-08-11 15:24:33 +02:00
Guido D'Orsi
c1c6e31711 Merge pull request #2719 from garden-co/changeset-release/main
Version Packages
2025-08-11 14:15:38 +02:00
github-actions[bot]
0b16085f3c Version Packages 2025-08-11 12:07:42 +00:00
Guido D'Orsi
e53db2e96a chore: format 2025-08-11 14:04:22 +02:00
Guido D'Orsi
384f0e23c0 Merge pull request #2701 from garden-co/feat/better-async-storage
feat: support multiple instances of storage
2025-08-11 14:03:39 +02:00
Guido D'Orsi
daaf1789d9 Merge pull request #2721 from garden-co/fix/char-chunking-coplaintext
Fix local transactions streaming and implement chunking for CoPlainText
2025-08-11 14:02:49 +02:00
Guido D'Orsi
1f9e20e753 Merge pull request #2705 from garden-co/chore/biome-2
chore: bump biome version to 2.1.3
2025-08-11 14:01:16 +02:00
Guido D'Orsi
ce9ca54f5c feat: content chunking on CoPlainText 2025-08-11 14:00:20 +02:00
Guido D'Orsi
67e0968809 fix: fix content streaming chunking, now chunks should be splitted always respecting the MAX_RECOMMENDED_TX_SIZE 2025-08-11 14:00:17 +02:00
Giordano Ricci
96a922cceb Merge pull request #2711 from garden-co/gio/usage-metering 2025-08-11 12:22:00 +01:00
Sammii
9b22fc74cd ignore biome on label cn import 2025-08-11 11:19:49 +01:00
Sammii
1bebe3c6c8 Merge branch 'main' into feat/add-input-label 2025-08-11 11:00:05 +01:00
Sammii
0a98b826f1 Merge pull request #2675 from garden-co/feat/quint-add-full-button-suite
Feat/quint add full button suite
2025-08-11 10:59:10 +01:00
Sammii
e1bd16d08b amend cn import on label 2025-08-11 10:58:47 +01:00
Sammii
0967c2ee5a pr amends 2025-08-11 10:49:34 +01:00
Sammii
62a3854c41 Update packages/quint-ui/src/components/button.tsx
Co-authored-by: Giordano Ricci <me@giordanoricci.com>
2025-08-11 10:45:57 +01:00
Matteo Manchi
f22ef4e646 chore: fix import ordering 2025-08-11 11:40:10 +02:00
Matteo Manchi
6c35d0031d chore(jazz-tools/svelte): refactor image component + svelte testing 2025-08-11 11:39:06 +02:00
Guido D'Orsi
7bdb6f4279 chore: simplify drawWaveform 2025-08-11 11:33:49 +02:00
Matteo Manchi
93f3fb231b fix(jazz-tools/media): fix resize calcs 2025-08-11 11:24:45 +02:00
Matteo Manchi
01d13d5df2 feat(jazz-tools/react): generate Image blobs on lazy loading 2025-08-11 11:24:45 +02:00
Matteo Manchi
944e725b95 fix(jazz-tools/react): disable revokeObjectURL on Image unmounts in development env 2025-08-11 11:24:45 +02:00
Matteo Manchi
16024fec8e chore(jazz-tools/react): show always the img element 2025-08-11 11:24:45 +02:00
Matteo Manchi
f90414ab95 chore(jazz-tools/react-native): move Image component from react-native to react-native-core 2025-08-11 11:24:45 +02:00
Guido D'Orsi
492eecb46a docs: add jsDoc comment to Image and createImage 2025-08-11 11:24:45 +02:00
Matteo Manchi
51144ec832 docs: add 0.17 upgrade guide 2025-08-11 11:24:44 +02:00
Matteo Manchi
fcaf4b9c30 chore: add changeset 2025-08-11 11:24:44 +02:00
Matteo Manchi
afae2649f5 docs: new docs for Image Management 2025-08-11 11:24:44 +02:00
Matteo Manchi
b5b0284c61 feat(jazz-tools/svelte): new Image component based on new image management API 2025-08-11 11:24:44 +02:00
Matteo Manchi
bf1475a143 feat(jazz-tools/react-native): new Image component based on new image management API 2025-08-11 11:24:44 +02:00
Matteo Manchi
e82cb80ca4 chore(example/image-upload): refactor using the new image management API 2025-08-11 11:24:44 +02:00
Matteo Manchi
32c2a617d6 feat(jazz-tools/react): new Image component based on new image management API 2025-08-11 11:24:42 +02:00
Matteo Manchi
d3c2a41c81 feat(jazz-tools/media): new media API for image management 2025-08-11 11:23:55 +02:00
Guido D'Orsi
4b99ff1fe3 feat: support multiple storage instances 2025-08-11 11:21:22 +02:00
Guido D'Orsi
3ebf8258a0 Merge pull request #2692 from garden-co/feat/garbage-collector
feat: added a TTL-based garbage collection
2025-08-11 10:54:58 +02:00
Guido D'Orsi
4809d14f6d chore: restore CI quality check 2025-08-11 10:45:04 +02:00
Guido D'Orsi
5ae1f33127 chore: disable importOrder and format the codebase 2025-08-11 10:44:03 +02:00
Guido D'Orsi
ca5d84f6a9 Merge pull request #2720 from garden-co/fix/vitest-nested-projects
chore: removed nested projects in vitest.config
2025-08-11 10:33:59 +02:00
Guido D'Orsi
6e6acc3404 chore: revert the homepage formatting 2025-08-11 10:26:24 +02:00
Guido D'Orsi
b17b7b6481 Merge remote-tracking branch 'origin/main' into chore/biome-2 2025-08-11 10:22:41 +02:00
Guido D'Orsi
5341646301 chore: revert formatting, remove the code-quality CI check 2025-08-11 10:21:33 +02:00
Guido D'Orsi
5416165d28 Merge remote-tracking branch 'origin/main' into feat/garbage-collector 2025-08-11 10:18:37 +02:00
Guido D'Orsi
b5a9f681c5 Merge pull request #2696 from garden-co/feat/chat-pagination
feat(chat): implement lazy-loading
2025-08-11 10:17:32 +02:00
Matteo Manchi
7dffc006eb chore: removed nested projects in vitest.config 2025-08-11 00:09:19 +02:00
Guido D'Orsi
cd3cc5b0ab Merge pull request #2716 from garden-co/fix/co-record-key-deep-loading
Fix return type on deep loaded co.record() when using single keys
2025-08-10 22:54:54 +02:00
Guido D'Orsi
ceab75eb4d Merge pull request #2718 from garden-co/feat/nice-music-player
fix: fix UnknownError: Unknown transaction on IndexedDB
2025-08-10 22:40:50 +02:00
Guido D'Orsi
103d1b41f7 fix: fix unknown transaction error on IndexedDB 2025-08-10 22:32:23 +02:00
Guido D'Orsi
b87cc6973e Merge pull request #2717 from garden-co/feat/nice-music-player
feat: improve music player UI
2025-08-10 22:23:41 +02:00
Guido D'Orsi
3d541ca241 feat: improve music player controls bar 2025-08-10 22:21:03 +02:00
Matteo Manchi
e72bfec884 fixup! fix(jazz-tools/coValues): fix return type on deep loaded co.record() when using string keys 2025-08-10 20:37:37 +02:00
Matteo Manchi
19c7ad27d9 fix(jazz-tools/coValues): fix return type on deep loaded co.record() when using string keys 2025-08-10 15:22:24 +02:00
Guido D'Orsi
0bc7bfc5cc test: cover string loading and unavailable props 2025-08-09 17:31:49 +02:00
Matteo Manchi
2c8120d46f fix(jazz-tools/coValues): fix return type on deep loaded co.record() when using single keys 2025-08-09 16:58:49 +02:00
Guido D'Orsi
c936c8c611 Merge pull request #2708 from garden-co/changeset-release/main
Version Packages
2025-08-08 19:29:12 +02:00
github-actions[bot]
58c6013770 Version Packages 2025-08-08 16:28:02 +00:00
Guido D'Orsi
3eb3291a97 Merge pull request #2714 from garden-co/revert-2712-fix/invalid-signature-allowlist
Revert "feat: add markAsStorageSignatureToFix to make it possible to fix bad signatures caused by the storage bug fixed in 0.15.9"
2025-08-08 18:25:32 +02:00
Guido D'Orsi
6b659f2df3 Revert "feat: add markAsStorageSignatureToFix to make it possible to fix bad signatures caused by the storage bug fixed in 0.15.9" 2025-08-08 18:25:22 +02:00
Guido D'Orsi
dcc9c9a5ec Merge pull request #2712 from garden-co/fix/invalid-signature-allowlist
feat: add markAsStorageSignatureToFix to make it possible to fix bad signatures caused by the storage bug fixed in 0.15.9
2025-08-08 18:14:58 +02:00
Guido D'Orsi
fe9a244363 Merge pull request #2710 from garden-co/fix/missing-child-rotation
fix: handle missing child groups when rotating key
2025-08-08 18:12:11 +02:00
Guido D'Orsi
9440bbc058 Merge pull request #2713 from garden-co/fix/nested-discriminated-union
fix: fix nested discriminated unions
2025-08-08 18:08:34 +02:00
Guido D'Orsi
1c92cc2997 chore: improve the key fallback 2025-08-08 18:07:15 +02:00
Guido D'Orsi
33ebbf0bdd fix: fix nested discriminated unions 2025-08-08 17:58:50 +02:00
Guido D'Orsi
d630b5bde5 Merge pull request #2704 from garden-co/fix/everyone-readkey-rotation
fix: skip rotateKey when everyone has read access
2025-08-08 17:31:14 +02:00
Nicolas Embleton
8c56445882 chore(packages/community-jazz-vue): merge main into branch + address type issues that prevent the build
fix(packages/community-jazz-vue): address an issue where the transition right after login was not triggering a reactive cascade, making the example apps stuck in "Anonymous" until manual refresh
chore(packages/community-jazz-vue): minor clean-up removing an un-necessary use of nextTick that can disrupt some reactive behaviors
chore(examples/community-todo-vue): fix a warning / remove un-needed CSS file, remnant of the VueJS inspector
chore(examples/community-chat-vue,examples/community-clerk-vue): fix a warning about the inspector component imported from VanillaJS not being detected by VueJS as a component
2025-08-08 20:11:34 +07:00
Guido D'Orsi
1c6ae12cd9 feat: add markAsStorageSignatureToFix to make it possible to fix bad signatures caused by the storage bug fixed in 0.15.9 2025-08-08 14:53:58 +02:00
Giordano Ricci
ac5d20d159 Revert "Merge pull request #2709 from garden-co/revert-2682-gio/usage-metering"
This reverts commit b3d1ad7201, reversing
changes made to fbc29f2f17.
2025-08-08 12:35:16 +01:00
Guido D'Orsi
21bcaabd5a chore: update failing snapshot 2025-08-08 13:13:45 +02:00
Guido D'Orsi
17b4d5b668 chore: update failing snapshot 2025-08-08 13:12:51 +02:00
Guido D'Orsi
3cd15862d5 fix: handle missing child groups when rotating key 2025-08-08 13:11:40 +02:00
Guido D'Orsi
b3d1ad7201 Merge pull request #2709 from garden-co/revert-2682-gio/usage-metering
Revert "feat: add ingress/egress metering on cojosn-transport-ws"
2025-08-08 12:32:58 +02:00
Guido D'Orsi
d87df11795 fix: fallback to the latest available readkey when key_for_everyone was not being revealed when everyone has access 2025-08-08 12:16:55 +02:00
Giordano Ricci
82c2a62b2a Revert "feat: add ingress/egress metering on cojosn-transport-ws" 2025-08-08 11:03:48 +01:00
Guido D'Orsi
0a9112506e fix: fixes cilrcular import issue on group.test.ts 2025-08-08 11:40:24 +02:00
Nicolas Embleton
d9c9b5f099 Merge branch 'main' into community-vue-packages 2025-08-08 16:34:02 +07:00
Giordano Ricci
fbc29f2f17 Merge pull request #2682 from garden-co/gio/usage-metering 2025-08-08 11:16:59 +02:00
Brad Anderson
3915bbbf3c fix: update tests due to sync protocol improvements 2025-08-06 17:08:00 -04:00
Brad Anderson
0b471c4e89 fix: undo organizeImports that broke tests - jazz-tools 2025-08-06 12:34:29 -04:00
Brad Anderson
09077d37ef chore: code-quality version bump, biome to catalog for examples 2025-08-06 10:40:42 -04:00
Brad Anderson
afe06b4fa6 chore: format-and-lint:fix 2025-08-06 10:29:38 -04:00
Brad Anderson
d89b6e488a chore: bump biome version to 2.1.3 2025-08-06 10:26:33 -04:00
Guido D'Orsi
f6361ee43b Merge pull request #2703 from didier/patch-2
Update Svelte setup doc to be more accurate for Svelte 5
2025-08-06 15:41:16 +02:00
Guido D'Orsi
726dbfb6df fix: heal groups with missing key for everyone 2025-08-06 13:44:10 +02:00
Guido D'Orsi
267f689f10 fix: skip rotateKey when everyone has read access 2025-08-06 12:26:36 +02:00
Giordano Ricci
893ad3ae23 comment out flaky assertion 2025-08-06 12:25:06 +02:00
Giordano Ricci
f5590b1be8 remove duplicated import 2025-08-06 12:14:10 +02:00
Giordano Ricci
17a01f57e8 move utils 2025-08-06 12:12:08 +02:00
Giordano Ricci
7318d86f52 Merge branch 'main' into gio/usage-metering 2025-08-06 12:05:05 +02:00
Didier Catz
1c8403e87a Update to new schema syntax instead of classes 2025-08-06 10:23:35 +02:00
Didier Catz
dd747c068a Use consistent quotes / semis 2025-08-06 00:30:00 +02:00
Didier Catz
1f0f230fe2 Newline 2025-08-06 00:28:37 +02:00
Didier Catz
da655cbff5 Typo 2025-08-06 00:24:45 +02:00
Didier Catz
02f6c6220e Update svelte.mdx 2025-08-06 00:10:31 +02:00
Didier Catz
0755cd198e Update svelte.mdx 2025-08-06 00:02:30 +02:00
Didier Catz
c4a8227b66 Update Svelte setup doc to be more accurate for Svelte 5 2025-08-06 00:00:55 +02:00
Giordano Ricci
86f0302233 add meta 2025-08-05 13:13:06 +01:00
Sammii
72b5542130 Merge branch 'main' into feat/add-input-label 2025-08-05 12:41:06 +01:00
Sammii
5fd9225a54 adding intent styles to input + u0pdating docs 2025-08-05 12:32:52 +01:00
Sammii
9138d30208 create input and label components, with docs 2025-08-05 12:18:49 +01:00
Sammii
a5ece15797 adding defaults to button 2025-08-05 12:04:41 +01:00
Sammii
9f8877202e creating color-highlight var in quint 2025-08-05 10:56:08 +01:00
Sammii
d190097ed9 creating tempory nav 2025-08-05 10:55:16 +01:00
Sammii
9841617c66 adding colours to homepage 2025-08-05 10:54:56 +01:00
Guido D'Orsi
165a6170cd Merge pull request #2700 from garden-co/changeset-release/main
Version Packages
2025-08-04 21:13:54 +02:00
github-actions[bot]
5148419df9 Version Packages 2025-08-04 19:11:13 +00:00
Guido D'Orsi
fc0ecb0968 chore: changeset 2025-08-04 21:07:48 +02:00
Guido D'Orsi
802b5a3060 chore: changeset 2025-08-04 21:06:23 +02:00
Guido D'Orsi
e47af262b3 Merge pull request #2673 from garden-co/feat/storage-wal
fix: ensure that transactions are synced in the correct order
2025-08-04 20:54:53 +02:00
Sammii
688a4850a4 add svg sizes to button and amend icons docs page 2025-08-04 16:09:39 +01:00
Sammii
e87fef751e remove old icon pages 2025-08-04 16:08:01 +01:00
Sammii
8f714440f8 create icons page 2025-08-04 16:07:28 +01:00
Sammii
70cd09170e updating button docs page 2025-08-04 16:02:28 +01:00
Guido D'Orsi
e98b610fd0 Merge pull request #2698 from garden-co/feat/comap-pick-and-partial
feat: Add `.pick()` and `.partial()` methods to CoMapSchema
2025-08-04 14:53:38 +02:00
Guido D'Orsi
b554983558 Merge pull request #2699 from garden-co/fix/extend-circular-check
fix: fixes error when extending a group without having child groups loaded
2025-08-04 14:53:15 +02:00
Guido D'Orsi
4c63334299 chore: add comments 2025-08-04 14:48:17 +02:00
Guido D'Orsi
4aef7cdac5 Update .changeset/ten-cobras-fetch.md
Co-authored-by: Joe Innes <joe@joeinn.es>
2025-08-04 14:39:26 +02:00
Guido D'Orsi
76adeb0d53 chore: clean up implementation 2025-08-04 14:03:51 +02:00
Guido D'Orsi
d95dcbe7db fix: align pick to the Zod API 2025-08-04 13:24:44 +02:00
Guido D'Orsi
f9d538f049 fix: fixes error when extending a group without having child groups loaded 2025-08-04 12:37:53 +02:00
Guido D'Orsi
40c7336c09 chore: update lucide-react 2025-08-04 11:21:18 +02:00
Guido D'Orsi
e0d2723615 fix: router update when calling navitate 2025-08-04 11:17:49 +02:00
Guido D'Orsi
93e68c62f5 docs: fix a missing type alias 2025-08-04 10:52:06 +02:00
Guido D'Orsi
dadee9dcc5 test: fix flaky test 2025-08-04 10:40:03 +02:00
Guido D'Orsi
6724c4bd83 feat: add docs, remove lodash-es dependency and add tests for recursive types with pick and partial 2025-08-04 10:34:43 +02:00
NicoR
1942bd5de4 Replace lodash with lodash-es 2025-08-04 01:44:27 -03:00
NicoR
16764f6365 Add changeset 2025-08-04 01:23:00 -03:00
NicoR
b56cfc2e1f Add TS docs 2025-08-04 01:21:32 -03:00
NicoR
7091bcf9c0 Add CoMapSchema.partial 2025-08-04 01:17:25 -03:00
NicoR
436cbfa095 Add CoMapSchema.pick 2025-08-04 01:00:57 -03:00
Guido D'Orsi
c19a25f928 feat(chat): implement lazy-loading 2025-08-03 17:20:46 +02:00
Guido D'Orsi
104e664bbb fix: fix build errors on music player 2025-08-03 17:20:15 +02:00
Guido D'Orsi
f199b451eb chore: use inline JSON when creating covalues 2025-08-03 17:09:02 +02:00
Guido D'Orsi
70bc48458e Merge pull request #2695 from garden-co/feat/music-player-refresh
docs: exclude upgrade guides from llm.txt
2025-08-02 14:37:56 +02:00
Guido D'Orsi
f28b2a6135 docs: exclude upgrade guides 2025-08-02 14:36:55 +02:00
Guido D'Orsi
55b770b7c9 Merge pull request #2694 from garden-co/feat/music-player-refresh
feat: improve the music player UI
2025-08-02 14:29:35 +02:00
Guido D'Orsi
e6838dfb98 feat: make the music-player a PWA 2025-08-02 14:22:36 +02:00
Guido D'Orsi
5e34061fdc feat: improve the music player UI 2025-08-02 14:19:24 +02:00
Guido D'Orsi
6d9b77195a chore: clean up code 2025-08-02 12:36:56 +02:00
Guido D'Orsi
9bf7946ee6 feat: added a TTL-based garbage collection 2025-08-01 19:58:11 +02:00
Guido D'Orsi
acecffaeb2 test: fix flaky tests on the created and update time 2025-08-01 19:57:33 +02:00
Nico Rainhart
0a98d6aaf2 Merge pull request #2691 from garden-co/changeset-release/main
Version Packages
2025-08-01 12:57:33 -03:00
github-actions[bot]
4ea1a63a0a Version Packages 2025-08-01 15:47:51 +00:00
Nico Rainhart
41a4c3bc95 Merge pull request #2683 from garden-co/feat/json-create-and-set
feat: create CoValues using plain JSON objects
2025-08-01 12:45:30 -03:00
Guido D'Orsi
60d0027f9d Merge pull request #2690 from garden-co/docs/useCoState-jsDoc
docs: adds jsDocs to useCoState and useAccount react hooks
2025-08-01 16:12:39 +02:00
Guido D'Orsi
748c2ff751 Merge pull request #2688 from garden-co/changeset-release/main
Version Packages
2025-08-01 15:46:41 +02:00
Guido D'Orsi
cc291b590a Merge remote-tracking branch 'origin/main' into community-vue-packages 2025-08-01 15:46:12 +02:00
Guido D'Orsi
1f144e89bf chore: update lockfile 2025-08-01 15:43:09 +02:00
github-actions[bot]
70938b0ab3 Version Packages 2025-08-01 13:42:25 +00:00
Guido D'Orsi
f2f5b55dbf Update packages/jazz-tools/src/react-core/hooks.ts
Co-authored-by: Nico Rainhart <nmrainhart@gmail.com>
2025-08-01 15:42:24 +02:00
Guido D'Orsi
3c3acae803 Merge pull request #2689 from joeinnes/2687-fix-broken-link
Fix HTTP API link in inbox.mdx. Fixes #2687
2025-08-01 15:40:07 +02:00
Guido D'Orsi
896ee3460f docs: adds jsDocs to useCoState and useAccount react hooks 2025-08-01 15:37:02 +02:00
Joe Innes
9b9bf44e2b Fix HTTP API link in inbox.mdx. Fixes #2687 2025-08-01 15:13:33 +02:00
Guido D'Orsi
8e9acb37f8 chore(ci): add community-clerk-vue to e2e tests 2025-08-01 15:06:21 +02:00
Guido D'Orsi
392aa88d95 Merge pull request #2655 from joeinnes/docs/optional-references
Docs/optional references
2025-08-01 13:15:20 +02:00
Joe Innes
7ce82cd934 Merge branch 'main' into docs/optional-references 2025-08-01 13:13:26 +02:00
Guido D'Orsi
0c8158b91c Merge pull request #2676 from Gabrola/fix/jazz-run-exports
fix: jazz-run package.json exports
2025-08-01 13:07:30 +02:00
Guido D'Orsi
5a48c9c44c chore: improve tests titles and add comments 2025-08-01 10:14:24 +02:00
Guido D'Orsi
25c56146f5 Merge pull request #2686 from garden-co/test/logout-state
test: logout integration tests on browser
2025-08-01 09:57:18 +02:00
nembleton
8115e194d3 chore(packages/community-jazz-vue): remove DemoAuth UI
chore(packages/community-jazz-vue): remove VueJS Inspector since every package uses the VanillaJS one now
chore(packages/community-jazz-vue): update models to be Zod-based rather than CoValue-based in the tests
chore(examples/community-clerk-vue): add + fix Playwright tests
2025-08-01 09:24:49 +07:00
NicoR
c564fbb02e test: add permission tests for creating nested CoValues from JSON 2025-07-31 15:03:25 -03:00
Guido D'Orsi
12481e14c2 test: logout integration tests on browser 2025-07-31 18:56:37 +02:00
NicoR
fd2d247ff5 docs: improve examples 2025-07-31 13:08:50 -03:00
NicoR
9e9ea029b2 fix: move alert out of CodeGroup 2025-07-30 17:32:56 -03:00
NicoR
a0da272dcd fix: add missing import in docs 2025-07-30 16:51:23 -03:00
NicoR
72fbcc3262 chore: remove unnecessary import from form example 2025-07-30 15:52:07 -03:00
NicoR
f4c8cc858b docs: add sections for creating CoValues from JSON and permissions 2025-07-30 15:48:55 -03:00
Anselm
0ab4d7a20d Update meta description 2025-07-30 11:34:54 -07:00
Giordano Ricci
5c98ff4e4f use object.values 2025-07-30 19:24:45 +01:00
NicoR
4cbda689c4 refactor: update form example to use new API 2025-07-30 14:54:08 -03:00
NicoR
771b0ed914 fix: cannot create empty plain text when nested 2025-07-30 14:53:38 -03:00
NicoR
79913c3136 fix: simplify CoMapInit schema 2025-07-30 13:37:10 -03:00
NicoR
43d3511d15 Add changeset 2025-07-30 12:40:25 -03:00
NicoR
928ef14086 feat: support deeply nested optional primitive fields 2025-07-30 12:33:28 -03:00
NicoR
048dd7def0 feat: support deeply nested optional CoValue fields 2025-07-30 12:33:09 -03:00
Guido D'Orsi
51fcb8a44b test: improve the client subscription test 2025-07-30 17:29:01 +02:00
Guido D'Orsi
c5888c39f5 perf: update parent before updating children to favor batching 2025-07-30 17:14:45 +02:00
Guido D'Orsi
2defcfae67 test: mark retry unavailable states as flaky 2025-07-30 17:10:50 +02:00
NicoR
873b146d15 feat: create a child group for each created CoValue 2025-07-30 11:03:38 -03:00
Guido D'Orsi
213de11c3b feat: preserve transaction order on sync 2025-07-30 15:37:58 +02:00
Sammii
2f24d35471 amending comments for button tv 2025-07-30 12:49:49 +01:00
Sammii
42667c81bb imrprove icon docs 2025-07-30 12:42:36 +01:00
Giordano Ricci
1b881cc89f cleanup tests 2025-07-30 12:00:54 +01:00
Guido D'Orsi
af295d816a chore: add comments and rename CoValueSyncQueue in LocalTransactionsSyncQueue 2025-07-30 12:54:46 +02:00
Guido D'Orsi
fe8d3497c0 chore: fix the peer attribution on storage corrections tests 2025-07-30 12:37:19 +02:00
Giordano Ricci
c2899e94ca add changeset 2025-07-30 11:36:17 +01:00
Giordano Ricci
f4be67e9b6 Merge branch 'main' into gio/usage-metering 2025-07-30 11:34:37 +01:00
Guido D'Orsi
ba9ad295b6 fix: don't consider -1 as a valid signature checkpoint 2025-07-30 12:32:07 +02:00
Giordano Ricci
9ed5a96ef8 lockfile update 2025-07-30 11:28:44 +01:00
Giordano Ricci
4272ea9019 refactor: use getTransactionSize util 2025-07-30 11:28:17 +01:00
Giordano Ricci
9509307ed1 cleanup and add egress tests 2025-07-30 11:27:24 +01:00
Giordano Ricci
be08921bc5 cleanup and add ingress tests 2025-07-30 11:01:10 +01:00
Sammii
77e3c21cbd format globals css 2025-07-30 10:58:18 +01:00
NicoR
ab1798c7bd feat: make CoValue creation from JSON type safe 2025-07-29 16:41:48 -03:00
NicoR
26ae69a242 refactor: reuse TypeOfZodSchema 2025-07-29 12:44:42 -03:00
Giordano Ricci
25be055a51 wip: basica ingress/egress metering 2025-07-29 16:39:34 +01:00
NicoR
21ad3767b9 refactor: avoid InstanceOrPrimitiveOfSchemaCoValuesNullable duplication 2025-07-29 11:48:46 -03:00
NicoR
a9383516c1 refactor: avoid InstanceOrPrimitiveOfSchema duplication 2025-07-29 11:38:09 -03:00
NicoR
bffc516c68 refactor: extract TypeOfZodSchema util 2025-07-29 11:16:14 -03:00
NicoR
9e7c0d9887 chore: clean up instantiateRefEncodedWithInit's implementation 2025-07-29 10:56:32 -03:00
NicoR
99b44d5780 feat: create CoMap with JSON discriminated union fields 2025-07-29 10:36:33 -03:00
NicoR
02db5f3b1d feat: create CoMap with JSON CoFeed fields 2025-07-29 09:13:01 -03:00
Anselm
626775caa8 Implement session logic for PureJSCrypto 2025-07-28 13:19:26 -07:00
NicoR
1949a5fcd9 feat: create CoMap with JSON CoList fields 2025-07-28 17:15:43 -03:00
NicoR
dcd3b022cc feat: create CoMap with JSON plain and rich text fields 2025-07-28 16:56:43 -03:00
NicoR
a7b837c7e1 feat: create CoMap with JSON CoMap fields 2025-07-28 16:47:51 -03:00
Anselm Eickhoff
88ebcf58ab Merge pull request #2680 from garden-co/jazz-as-a-db
Jazz as a DB narrative MVP
2025-07-28 11:34:01 -07:00
Guido D'Orsi
b173e0884a feat: improve local transactions streaming calculation 2025-07-28 19:45:31 +02:00
Anselm
f379a168be Update garden co slogan 2025-07-28 10:30:18 -07:00
Anselm
bde6ac7d45 Jazz as a DB narrative MVP 2025-07-28 10:08:56 -07:00
Guido D'Orsi
231947c97a fix(sync): start a new content message when the size exceeds the recommended value 2025-07-28 18:44:13 +02:00
Guido D'Orsi
d1609cdd55 Merge pull request #2679 from garden-co/changeset-release/main
Version Packages
2025-07-28 18:12:46 +02:00
Guido D'Orsi
d5b57ad1fc fix: fix priority for content 2025-07-28 17:53:33 +02:00
github-actions[bot]
b71ab3168a Version Packages 2025-07-28 15:15:40 +00:00
Nico Rainhart
0c8f6e5039 Merge pull request #2677 from garden-co/feat/add-nullable-support
feat: Add support for nullable non-collaborative fields
2025-07-28 12:12:12 -03:00
Guido D'Orsi
0bf5c53bec fix: disable code coverage check on CI 2025-07-28 16:59:02 +02:00
Guido D'Orsi
e7b1550003 feat: perserve insert order when storing transactions on multiple covalues 2025-07-28 16:59:02 +02:00
NicoR
6a93a1b8a3 chore: add comment on why nullable date cofields are not supported 2025-07-28 11:52:44 -03:00
NicoR
9f654a2603 test: loading a map with a nullable field 2025-07-28 11:46:50 -03:00
NicoR
dbf735d9e1 Fix rebase error 2025-07-28 10:27:44 -03:00
NicoR
c62abefb66 Add changeset 2025-07-28 10:19:55 -03:00
NicoR
1453869a46 Add support for nullable non-collaborative fields 2025-07-28 10:18:39 -03:00
Sammii
f5039cefc1 addig icon button to docs page and icons pagr tidy 2025-07-28 14:09:46 +01:00
Youssef Gaber
239da90c9f chore: changeset 2025-07-28 17:06:01 +04:00
Youssef Gaber
972791e7a8 fix: correct jazz-run package.json exports 2025-07-28 17:05:45 +04:00
Sammii
6540893caf adding default, strong and muted to css 2025-07-28 13:51:23 +01:00
Sammii
bfc85c4573 refactoring icon and icon page 2025-07-28 13:50:57 +01:00
Sammii
e9076313ab amending Button page, adding title 2025-07-28 13:50:44 +01:00
Sammii
c6afd8ae36 adding placeholder favicon 2025-07-28 13:40:52 +01:00
Sammii
370f20d13d refactoring css and button component 2025-07-28 13:40:31 +01:00
NicoR
0c0178764e chore: fix rebase errors 2025-07-28 09:34:24 -03:00
NicoR
928350b821 refactor: rename OptionalizeUndefinedKeys to PartialOnUndefined 2025-07-28 09:34:23 -03:00
NicoR
be3fd9c696 test: create CoMap with shallowly resolved CoValue 2025-07-28 09:34:23 -03:00
NicoR
269c028df0 test: add test for CoMapSchema + catchall 2025-07-28 09:34:23 -03:00
NicoR
e4df837138 refactor: rename CoMapInitZod to CoMapSchemaInit 2025-07-28 09:34:23 -03:00
NicoR
54fe6d93ba refactor: extract CoMapSchema.create's return type 2025-07-28 09:34:23 -03:00
NicoR
979689c6d8 refactor: improve CatchAll type handling in CoMapSchemas 2025-07-28 09:34:23 -03:00
NicoR
859a37868f refactor: simplify CoMapSchema.create's return type 2025-07-28 09:34:23 -03:00
NicoR
57bd32d77e refactor: simplify the type of CoMapSchema.create's init parameter 2025-07-28 09:34:23 -03:00
Sammii
f9b3116deb adding custom color steps to all tailwind css colours in design system 2025-07-28 13:10:42 +01:00
Anselm
e51c4d4b5b Make SessionLogImpl part of CryptoProvider 2025-07-25 11:28:23 -07:00
Sammii
352d34979f create icon component 2025-07-25 17:34:29 +01:00
Sammii
7ff736ace4 improving gradient on muted, default and strong intent buttons 2025-07-25 16:23:23 +01:00
Sammii
5bab466fd0 adding default/hover/active states for all intents 2025-07-25 16:20:55 +01:00
Sammii
329b8c3d6a switching muted and default styles 2025-07-25 15:29:01 +01:00
Nico Rainhart
e21cbccd4b Merge pull request #2674 from garden-co/changeset-release/main
Version Packages
2025-07-25 11:07:46 -03:00
github-actions[bot]
a66ab7d174 Version Packages 2025-07-25 13:34:52 +00:00
Nico Rainhart
78e91f4030 Merge pull request #2667 from garden-co/0-16
Jazz 0.16 upgrade
2025-07-25 10:32:40 -03:00
Guido D'Orsi
7a915c198e Merge pull request #2657 from garden-co/fix/root-trusting
feat: store the root id unencrypted in account
2025-07-25 14:39:59 +02:00
Guido D'Orsi
c9b0420746 Merge pull request #2672 from garden-co/chore/fix-conflicts-between-http-api-and-schema-refactoring
chore: Fix conflicts between HTTP requests and CoValue schema refactor
2025-07-25 14:39:16 +02:00
NicoR
2303f3e70a fix: schema definition error in server-http-worker example 2025-07-25 09:31:47 -03:00
NicoR
a7bc9569a3 chore: Fix conflicts between HTTP requests and CoValue schema refactor 2025-07-25 09:19:15 -03:00
NicoR
f351ba0fcd Merge remote-tracking branch 'origin/main' into chore/fix-conflicts-between-http-api-and-schema-refactoring 2025-07-25 09:12:05 -03:00
Guido D'Orsi
d3e554f491 Merge pull request #2671 from garden-co/chore/queues
chore: move cojson queues in a dedicated directory
2025-07-25 13:03:33 +02:00
Guido D'Orsi
b5e31456ad chore: trigger deploy 2025-07-25 12:25:05 +02:00
Sammii
c0aeb7baf9 porting over variant/intent styles 2025-07-25 11:21:17 +01:00
Sammii
8a14de10d7 fix(quint-ui): correct hover and active states for button variants 2025-07-25 11:13:39 +01:00
Sammii
b585b39a86 porting over glass styles with specular borders 2025-07-25 10:15:57 +01:00
Guido D'Orsi
42d07ba7b4 docs: upgrade docs for account root id 2025-07-25 11:13:40 +02:00
Guido D'Orsi
b81b6ba69b Merge remote-tracking branch 'origin/0-16' into fix/root-trusting 2025-07-25 10:54:21 +02:00
Guido D'Orsi
1bc1759bb4 Merge remote-tracking branch 'origin/main' into chore/queues 2025-07-25 10:51:43 +02:00
Guido D'Orsi
225bc1f63f Merge pull request #2670 from garden-co/changeset-release/main
Version Packages
2025-07-25 10:37:04 +02:00
github-actions[bot]
5d94564f99 Version Packages 2025-07-25 08:30:50 +00:00
Guido D'Orsi
9633d0187f chore: changeset 2025-07-25 10:28:31 +02:00
Guido D'Orsi
b82ecaa3ca docs: add server worker http example card 2025-07-25 10:23:16 +02:00
Guido D'Orsi
111ec8d351 Merge pull request #2626 from garden-co/feat/http-requests
RPC style HTTP requests with CoValues
2025-07-25 10:18:10 +02:00
Nico Rainhart
512aacdbc2 Merge pull request #2669 from garden-co/fix/simplify-circular-constraint
fix: circular constraint type check error with `Simplify`
2025-07-24 17:07:53 -03:00
NicoR
7ad843aa3e fix: circular constraint type check error with Simplify 2025-07-24 16:18:21 -03:00
Guido D'Orsi
071128339b docs: fix typo 2025-07-24 21:03:55 +02:00
Guido D'Orsi
688ced499d feat: ux improvments on http example 2025-07-24 18:59:33 +02:00
Guido D'Orsi
ac91c8e7c2 Merge remote-tracking branch 'origin/main' into feat/http-requests 2025-07-24 18:23:00 +02:00
Guido D'Orsi
c3b303c310 feat: track handled messages in the request envelope 2025-07-24 18:21:23 +02:00
Guido D'Orsi
fc027a56db Merge pull request #2650 from garden-co/refactor/covalue-zod-schema-boundary
refactor: CoValue schemas are no longer Zod schemas
2025-07-24 17:41:09 +02:00
Guido D'Orsi
959a7a3927 Merge branch '0-16' into refactor/covalue-zod-schema-boundary 2025-07-24 17:40:51 +02:00
NicoR
2548085b59 Update upgrade guide and docs with improved support for recursive refs 2025-07-24 12:24:33 -03:00
Guido D'Orsi
b27bb3e65b test: remove .only 2025-07-24 17:21:04 +02:00
Guido D'Orsi
937284f7e9 Merge pull request #2666 from garden-co/changeset-release/main
Version Packages
2025-07-24 17:16:01 +02:00
github-actions[bot]
e999727c70 Version Packages 2025-07-24 14:58:34 +00:00
Guido D'Orsi
2197766624 Merge pull request #2665 from garden-co/fix/optional-ref-assign
fix: property update when assigning an optional reference on CoMap
2025-07-24 16:56:05 +02:00
Guido D'Orsi
d1efde468f Merge remote-tracking branch 'origin/main' into fix/root-trusting 2025-07-24 16:55:31 +02:00
Guido D'Orsi
4d4fd0beaa chore: use import content instead of copy on acceptInvite 2025-07-24 16:55:19 +02:00
Guido D'Orsi
2b61e853a7 test: cover recursive references without explicit return type 2025-07-24 16:43:35 +02:00
Guido D'Orsi
6f79b45544 chore: move cojson queues in a dedicated directory 2025-07-24 16:23:58 +02:00
Guido D'Orsi
2e1ff99579 chore: use import content instead of copy on acceptInvite 2025-07-24 16:04:43 +02:00
Guido D'Orsi
7361854ee4 chore: add isCoValueId check 2025-07-24 16:03:41 +02:00
Guido D'Orsi
4a775fada3 chore: remove unused import 2025-07-24 15:57:20 +02:00
Guido D'Orsi
3fe53a3a4a fix: property update when assigning an optional reference on CoMap 2025-07-24 12:19:48 +02:00
Guido D'Orsi
fe37516786 chore: remove TODO from play route 2025-07-24 12:18:43 +02:00
Guido D'Orsi
4beafb7cf3 fix: property update when assigning an optional reference on CoMap 2025-07-24 12:16:35 +02:00
Guido D'Orsi
82a592e08a feat(ci): add server-worker-http to ci tests 2025-07-24 11:45:15 +02:00
Guido D'Orsi
4c6926153a chore: simplify groups in createPlayer 2025-07-24 11:45:15 +02:00
Guido D'Orsi
c51b088243 Update examples/server-worker-http/src/apiKey.ts
Co-authored-by: Nico Rainhart <nmrainhart@gmail.com>
2025-07-24 11:36:55 +02:00
Brad Anderson
3eff28a896 Merge branch 'main' into anselm-gco-634-implement-current-session-logic-in-rust-and-use-as-wasm 2025-07-23 13:18:17 -04:00
Guido D'Orsi
867cb6b7a5 Merge pull request #2659 from garden-co/changeset-release/main
Version Packages
2025-07-23 18:30:51 +02:00
Guido D'Orsi
3a1fdd7600 docs: remove per-user limits exception 2025-07-23 18:28:30 +02:00
Guido D'Orsi
3fdbb43b54 docs: added the security safeguards provided by Jazz 2025-07-23 18:20:04 +02:00
Guido D'Orsi
02969ee89b docs: pr feedback 2025-07-23 17:49:39 +02:00
Sammii
e9b2860e74 button tv refactor 2025-07-23 16:32:07 +01:00
Guido D'Orsi
9b4988a514 docs: improve deploy requirements docs 2025-07-23 17:27:15 +02:00
Sammii
6327d74f68 mapping over button suite from old design system to quint 2025-07-23 16:24:19 +01:00
Guido D'Orsi
8aa4b59d49 chore: fix typo
Co-authored-by: Nico Rainhart <nmrainhart@gmail.com>
2025-07-23 16:39:27 +02:00
NicoR
ac782674de One more Upgrade guide tweak 2025-07-23 11:24:14 -03:00
Sammii
bedbabdcb4 styling the layout of quint docs 2025-07-23 15:18:48 +01:00
NicoR
5eb406d54d Upgrade guide adjustments 2025-07-23 11:03:47 -03:00
NicoR
a3be832414 Remove WithHelpers export 2025-07-23 10:55:35 -03:00
NicoR
7ca8dd960e Merge branch 'main' into refactor/covalue-zod-schema-boundary 2025-07-23 10:50:08 -03:00
NicoR
62c8aff73f Fix Upgrade guide navigation 2025-07-23 10:24:53 -03:00
NicoR
7731109a28 Address Upgrade guide comments 2025-07-23 10:08:14 -03:00
github-actions[bot]
0401fcf2a8 Version Packages 2025-07-23 12:43:56 +00:00
Nico Rainhart
139a649279 Merge pull request #2663 from garden-co/fix/export-WithHelpers-type
fix: Export `WithHelpers` type
2025-07-23 09:41:20 -03:00
NicoR
9acccb5df2 Add changeset 2025-07-23 09:23:12 -03:00
NicoR
fd90cdb49a fix: Export WithHelpers type 2025-07-23 09:15:09 -03:00
Anselm
7d7a810bba Fix content updates after makeTransaction 2025-07-23 13:10:44 +01:00
Guido D'Orsi
4a29999c6a feat: support worker groups 2025-07-23 14:07:09 +02:00
Giordano Ricci
df487d5335 Merge pull request #2658 from garden-co/gio/quint 2025-07-23 12:35:06 +01:00
Giordano Ricci
1efe84c691 Merge branch 'main' into gio/quint 2025-07-23 12:17:02 +01:00
Guido D'Orsi
73b99c6c1a docs: http request jsDoc 2025-07-23 13:07:51 +02:00
Guido D'Orsi
039b92c839 feat: export API and jsdocs 2025-07-23 13:03:58 +02:00
Guido D'Orsi
618af5f1e3 feat: e2e tests and improve UX on server-worker-http 2025-07-23 12:50:48 +02:00
NicoR
dfc4286694 Return resolved resized images on createImage 2025-07-22 15:15:02 -03:00
NicoR
970ff0d813 Fix docs 2025-07-22 14:57:57 -03:00
Guido D'Orsi
65eee0ef01 docs: update the server-worker-http readme 2025-07-22 18:39:11 +02:00
NicoR
eee221f563 Merge branch 'main' into refactor/covalue-zod-schema-boundary 2025-07-22 13:38:47 -03:00
Guido D'Orsi
063553090e docs: fix type errors on co.profile 2025-07-22 18:29:18 +02:00
Guido D'Orsi
97f6bcedbd test: remove failing test 2025-07-22 18:24:07 +02:00
Guido D'Orsi
7c63e6bb0f docs: mention jazz-run account create defaults 2025-07-22 18:07:06 +02:00
Guido D'Orsi
08aedcf517 docs: fix typos 2025-07-22 17:53:08 +02:00
Guido D'Orsi
3e12ee127f docs: cover the inbox API 2025-07-22 17:52:06 +02:00
NicoR
2283d375ef Update docs 2025-07-22 12:17:49 -03:00
NicoR
202e763380 Merge branch 'main' into refactor/covalue-zod-schema-boundary 2025-07-22 12:07:57 -03:00
NicoR
52bbdb37a9 Add .optional() to all CoValue schemas 2025-07-22 12:06:21 -03:00
Nicolas Embleton
c2c223f22a Merge branch 'garden-co:main' into community-vue-packages 2025-07-22 21:41:47 +07:00
Guido D'Orsi
96f743b2f4 Merge remote-tracking branch 'origin/main' into feat/http-requests 2025-07-22 16:38:26 +02:00
NicoR
f5c47feeb6 Upgrade Zod to 3.25.76 instead 2025-07-22 11:33:01 -03:00
Guido D'Orsi
6dffe73bd2 chore: rename jazz-paper-scissors in server-worker-inbox 2025-07-22 16:32:08 +02:00
Guido D'Orsi
6f9ee31179 feat: rename serve-worker examples 2025-07-22 16:23:05 +02:00
Guido D'Orsi
52f324ffc4 chore: update lockfile 2025-07-22 16:21:34 +02:00
Guido D'Orsi
2d86f53575 Merge remote-tracking branch 'origin/main' into feat/http-requests 2025-07-22 16:20:49 +02:00
Guido D'Orsi
68cb357a94 Merge pull request #2660 from garden-co/feat/persistent-peers
feat: introduce persistent peers
2025-07-22 16:18:56 +02:00
Guido D'Orsi
56ccf9ab9d feat: make it possible to define API with empty responses 2025-07-22 15:57:57 +02:00
NicoR
b8b0851433 Add upgrade guide 2025-07-22 10:42:46 -03:00
NicoR
2bbb07b0bf Add changeset 2025-07-22 10:01:00 -03:00
Guido D'Orsi
4f7bc91502 chore: apply suggestions from code review
Co-authored-by: Nico Rainhart <nmrainhart@gmail.com>
2025-07-22 14:40:45 +02:00
NicoR
d3053955d8 Update docs 2025-07-22 09:34:40 -03:00
Giordano Ricci
f61a120560 changeset 2025-07-22 12:22:22 +01:00
Giordano Ricci
2f1307a0ba rename package 2025-07-22 12:21:19 +01:00
Giordano Ricci
fa15ea56d1 build & dev workflows 2025-07-22 12:03:21 +01:00
Guido D'Orsi
1e58ecb3ac test: integration tests for browser and workers on offline loading & sync 2025-07-22 12:42:49 +02:00
Giordano Ricci
ceeabfaf89 strip down PR 2025-07-22 11:07:52 +01:00
Guido D'Orsi
70ce7c5736 feat: introduce persistent peers 2025-07-22 11:12:48 +02:00
NicoR
f40484eca9 Migrate plain text, rich text, file stream and optional schemas to classes 2025-07-21 17:00:57 -03:00
NicoR
d581a59aa1 Convert CoDiscriminatedUnionSchema into a class 2025-07-21 16:39:43 -03:00
NicoR
0ca09f75c1 Convert CoFeedSchema into a class 2025-07-21 16:30:04 -03:00
NicoR
e8fcd101f2 Convert CoListSchema into a class 2025-07-21 16:24:35 -03:00
NicoR
cf43fa7529 Remove usage of withHelpers 2025-07-21 15:23:36 -03:00
NicoR
df1cdda4e8 Update zod version in all examples 2025-07-21 15:15:51 -03:00
Guido D'Orsi
be46042cdc chore: fix typos and errors 2025-07-21 20:12:39 +02:00
Nico Rainhart
6afdb16739 Merge pull request #2656 from garden-co/feat/prevent-resolving-discriminated-union-fields
feat: Prevent resolving discriminated union fields
2025-07-21 14:45:51 -03:00
NicoR
7a60d7bb76 Avoid NotNull duplication 2025-07-21 14:33:22 -03:00
NicoR
f8263a8358 Stop extending Zod schemas when creating core CoValue schemas 2025-07-21 14:25:23 -03:00
NicoR
f6da966922 Explain "core" CoValue schema / actual CoValue schema distinction 2025-07-21 14:21:44 -03:00
Giordano Ricci
b0b2b85a6f fix lint issues 2025-07-21 18:13:18 +01:00
NicoR
8a2ab51543 Expose internal schemas for co.map, co.list, co.optional and co.account 2025-07-21 14:09:48 -03:00
Giordano Ricci
28c19c134f Merge branch 'main' into gio/quint 2025-07-21 18:09:42 +01:00
Giordano Ricci
0924c9baaa revert changes to example app 2025-07-21 18:04:17 +01:00
Guido D'Orsi
8bfaa0a18b docs: document deployments 2025-07-21 19:00:19 +02:00
Giordano Ricci
b2712e18a2 fix imports 2025-07-21 17:46:15 +01:00
Giordano Ricci
66894b63d7 more cleanup 2025-07-21 17:43:11 +01:00
Guido D'Orsi
147be76399 test: cover deep response sharing 2025-07-21 16:51:24 +02:00
Guido D'Orsi
36770bed52 fix: limit the content pieces sent to server to the envelope 2025-07-21 16:45:40 +02:00
NicoR
466e6c44ee Remove unused imports 2025-07-21 11:43:11 -03:00
NicoR
5bd8277161 Remove withHelpers schema method 2025-07-21 11:41:28 -03:00
Giordano Ricci
b1a05143e3 cleanup 2025-07-21 15:26:49 +01:00
Giordano Ricci
fb761ce66d cleanup 2025-07-21 15:25:09 +01:00
Giordano Ricci
07a6c340dc some cleanup 2025-07-21 15:23:02 +01:00
Guido D'Orsi
8b4261f7d8 docs: pr feedback 2025-07-21 16:13:59 +02:00
NicoR
0ec917e453 Remove non-namespaced CoValue schema exports 2025-07-21 10:42:23 -03:00
NicoR
6326d0fc45 Export co.Image type 2025-07-21 10:30:55 -03:00
NicoR
d746b1279a Remove deprecated createCoValueObservable function 2025-07-21 10:18:54 -03:00
Giordano Ricci
0fea904dd0 tailwind class source 2025-07-21 14:04:39 +01:00
Giordano Ricci
373aef313f wip: quint 2025-07-21 13:55:21 +01:00
Guido D'Orsi
c09dcdfc76 feat: make the root trusting 2025-07-21 12:06:28 +02:00
NicoR
a584590ed8 Add changeset 2025-07-18 18:00:50 -03:00
NicoR
0a830e29a9 Prevent resolving discriminated union fields 2025-07-18 17:57:07 -03:00
NicoR
4402c553b6 Fix z.object bug with cyclic references 2025-07-18 15:44:54 -03:00
NicoR
e76fe343da Fix co.discriminatedUnion with cyclic references 2025-07-18 15:10:53 -03:00
Guido D'Orsi
dc183a19b2 feat: show that the opponent has made their move 2025-07-18 19:51:10 +02:00
Guido D'Orsi
fef55a4cd6 fix: remove bad export on route 2025-07-18 19:34:47 +02:00
Guido D'Orsi
ddef54048f docs: fix type error 2025-07-18 19:26:40 +02:00
NicoR
a2626a0f38 Avoid rehydrating CoValue schemas 2025-07-18 14:21:27 -03:00
NicoR
ec579bcaf7 Go back to using tuple for discriminatedUnion's options type 2025-07-18 14:19:53 -03:00
Guido D'Orsi
8aa2d2a789 docs: fix type errors on organization pattern 2025-07-18 19:12:24 +02:00
Guido D'Orsi
a39d009b87 docs: http requests & server workers 2025-07-18 19:00:36 +02:00
Anselm
13e7e80482 Merge branch 'main' into anselm-gco-634-implement-current-session-logic-in-rust-and-use-as-wasm 2025-07-18 17:24:49 +01:00
Anselm
d491b66abd Fix remaining tests 2025-07-18 16:45:46 +01:00
Joe Innes
6b662b0efe Type fixes for twoslash 2025-07-18 15:06:03 +02:00
Guido D'Orsi
efff4d0f4f Merge pull request #2654 from garden-co/fix/vitest-type-tests
fix: restore type tests on Vitest and upgrade Vitest to v3.2.4
2025-07-18 14:13:01 +02:00
Guido D'Orsi
ea2b01d8a2 fix: restore type tests on Vitest and upgrade Vitest to v3.2.4 2025-07-18 12:51:02 +02:00
NicoR
e9af90c841 Fix Zod type messing up Zod's type inference 2025-07-17 17:06:37 -03:00
NicoR
2b7c6f5aa7 Rename anySchemaToCoSchema to coValueClassFromCoValueClassOrSchema 2025-07-17 16:55:43 -03:00
NicoR
d73a3d9d46 Rename files 2025-07-17 16:52:56 -03:00
NicoR
8af39077a3 Remove CoValueSchema.getZodSchema 2025-07-17 16:44:48 -03:00
NicoR
54bd487818 PlainText, RichText and FileStream schemas are no longer Zod schemas 2025-07-17 16:30:09 -03:00
Guido D'Orsi
f01dab5c8f test: cover requests error management 2025-07-17 20:29:02 +02:00
Joe Innes
a8b3ec7bb0 Add more detail regarding optional references
As the boundary becomes more defined between CoValue schemas and Zod schemas, we need to ensure folks pick the right `.optional()` between `co.optional()` for CoValues and `z.optional()` for primitives.
2025-07-17 20:24:03 +02:00
Guido D'Orsi
a7f6870048 chore: update package json 2025-07-17 19:43:37 +02:00
Guido D'Orsi
3b294f6994 Merge remote-tracking branch 'origin/main' into feat/http-requests 2025-07-17 19:42:56 +02:00
NicoR
a420b43029 Add CoDiscriminatedUnionSchema.optional() 2025-07-17 14:29:52 -03:00
NicoR
a57268de32 Add runtime check to prevent using z.object with coValues as values 2025-07-17 14:12:41 -03:00
NicoR
6b2c4ed280 Remove no longer necessary Zod re-export wrappers 2025-07-17 14:12:41 -03:00
NicoR
8d4e0027be Upgrade Zod to 4.0.5 2025-07-17 14:12:41 -03:00
NicoR
a4141da1b7 Drop support for z.optional CoValue schemas 2025-07-17 14:12:41 -03:00
NicoR
c9ca5202f9 Fix browser integration tests 2025-07-17 14:12:41 -03:00
NicoR
7b50a2e06d Avoid using core.$ZodTypeDiscriminable for CoDiscriminatedUnions 2025-07-17 14:12:40 -03:00
NicoR
43dabccb57 [WIP] Discriminable CoValue schemas no longer extend $ZodDiscriminatedUnion 2025-07-17 14:12:40 -03:00
NicoR
b6d04f56ef Preserve catchall type info in CoMapSchema 2025-07-17 14:12:40 -03:00
NicoR
628195b678 Remove unused types from test 2025-07-17 14:12:40 -03:00
NicoR
9a5d769717 Use CoValue schema types (instead of Zod's) in circular references 2025-07-17 14:12:40 -03:00
NicoR
e30a3f66bf CoValue schemas are no longer Zod schemas 2025-07-17 14:12:40 -03:00
NicoR
6327fce933 Refactor CoValue instances & Zod primitives type inference 2025-07-17 14:12:40 -03:00
NicoR
a650da4184 Fix bug with deeply nested discriminated unions 2025-07-17 14:12:40 -03:00
NicoR
6e4a94f6ce Avoid accessing CoDiscriminatedUnion Zod internals directly 2025-07-17 14:12:40 -03:00
NicoR
b73bec64bc Rename AnyCoSchemas to CoreCoValueSchemas 2025-07-17 14:12:40 -03:00
NicoR
50ae2f47c2 Remove CoValue schema cache 2025-07-17 14:12:40 -03:00
NicoR
724d8e7f30 Drop support for z.discriminatedUnion of CoValue schemas 2025-07-17 14:12:40 -03:00
NicoR
7b285ab110 Modify CoMap schema to no longer extend ZodObject 2025-07-17 14:12:40 -03:00
NicoR
01ac9b8c4c Rewrite tests that access Zod internals 2025-07-17 14:12:40 -03:00
NicoR
4e2e1ac73e Convert CoValue schemas into interfaces 2025-07-17 14:12:40 -03:00
NicoR
94960c1f65 Convert CoValue schemas into a discriminated union 2025-07-17 14:12:40 -03:00
NicoR
b5af58347b Add getZodSchema method to CoValue schemas 2025-07-17 14:12:40 -03:00
NicoR
46a84558c5 Clean up InstanceOfSchema types 2025-07-17 14:12:40 -03:00
NicoR
f93566c045 Replace references to z.core.$ZodType with AnyZodSchema 2025-07-17 14:12:39 -03:00
NicoR
d97ed603a3 Tighten CoOptionalSchema inner type 2025-07-17 14:12:39 -03:00
NicoR
8d33103182 Rename zodSchemaToCoSchema to coreSchemaToCoSchema 2025-07-17 14:12:39 -03:00
NicoR
aaa1ff978b Organize Schema Union types 2025-07-17 14:12:39 -03:00
NicoR
82655ea7a7 Stop exporting zodSchemaToCoSchema 2025-07-17 14:12:39 -03:00
NicoR
8afe3a2e02 Remove unnecessary usages of zodSchemaToCoSchema 2025-07-17 14:12:39 -03:00
NicoR
ae2adcbd15 Extract functions to create CoreCoSchemas 2025-07-17 14:12:39 -03:00
NicoR
eb0460d330 Revert https://github.com/garden-co/jazz/pull/2651 2025-07-17 14:12:30 -03:00
Guido D'Orsi
55cb83e6e0 Merge pull request #2652 from garden-co/changeset-release/main
Version Packages
2025-07-17 15:26:20 +02:00
github-actions[bot]
6290088fec Version Packages 2025-07-17 13:06:49 +00:00
Guido D'Orsi
b9c17b37db Merge pull request #2651 from garden-co/fix/optional-load
fix: load failures when loading a missing ref declared with z.optional and Schema.optional
2025-07-17 15:04:36 +02:00
Guido D'Orsi
6c76ff8fbf fix: load of missing z.optional and Schema.optional doesn't fail 2025-07-17 14:54:33 +02:00
Guido D'Orsi
3c6a2a6092 Merge pull request #2649 from garden-co/changeset-release/main
Version Packages
2025-07-16 13:16:14 +02:00
github-actions[bot]
e8a950e61a Version Packages 2025-07-16 10:15:20 +00:00
Guido D'Orsi
e2cbf035de Merge pull request #2648 from garden-co/fix/onAnonymous-stuck
fix: fix stuck authentication when using onAnonymousAccountDiscarded with a storage
2025-07-16 12:13:11 +02:00
Matteo Manchi
47599b6307 chore(cojson): new removeStorage method exposed on LocalNode 2025-07-16 11:19:35 +02:00
Guido D'Orsi
901d0762ee Merge pull request #2647 from garden-co/fix/GCO-646-uncaught-from-load-promise
fix: catch errors from CoValue loading and treat it as "unavailable"
2025-07-16 09:18:43 +02:00
Guido D'Orsi
d1c1b0c5cc fix: fix stuck authentication when using onAnonymousAccountDiscarded with a storage 2025-07-15 22:17:51 +02:00
Matteo Manchi
cf4ad7285d fix(jazz-tools/tools): catch errors from CoValue loading and treat it as "unavailable" 2025-07-15 21:12:21 +02:00
Guido D'Orsi
255a947ea6 feat: add error management 2025-07-15 20:22:04 +02:00
Guido D'Orsi
530a263d35 chore: add vercel.json 2025-07-15 18:42:05 +02:00
Guido D'Orsi
2983c7bd58 fix: ignore builds for server-side-validation 2025-07-15 18:41:12 +02:00
Anselm
9f9c235e4b Fix remaining tests with expectedNewHash 2025-07-15 17:25:50 +01:00
nembleton
d60e345b4d fix(packages/community-jazz-vue): small typescript inconsistency 2025-07-15 23:23:34 +07:00
Anselm
a3e6ff1ae7 Use proper ephemeral signer ID 2025-07-15 17:12:39 +01:00
Guido D'Orsi
745020b7a8 chore: refactor code 2025-07-15 18:06:37 +02:00
Nicolas Embleton
be47d866bc Merge branch 'garden-co:main' into community-vue-packages 2025-07-15 22:38:52 +07:00
Anselm
d01e2080d1 Save inbetween signatures again 2025-07-15 16:35:38 +01:00
Nico Rainhart
ab6328f767 Merge pull request #2645 from garden-co/changeset-release/main
Version Packages
2025-07-15 12:23:00 -03:00
github-actions[bot]
e0555debde Version Packages 2025-07-15 15:12:46 +00:00
Guido D'Orsi
247f4556e7 change the changeset to a patch 2025-07-15 17:10:44 +02:00
Nico Rainhart
7903c737f4 Merge pull request #2627 from garden-co/feat/co-optional-and-discriminatedUnion
feat: add `co.optional` and `co.discriminatedUnion`
2025-07-15 12:01:47 -03:00
NicoR
6145da5525 Update changeset 2025-07-15 11:50:55 -03:00
Nico Rainhart
fc0a2e77a3 Merge pull request #2629 from garden-co/feat/improve-zod-functions-type-safety
feat: prevent using Zod functions with CoValue schemas
2025-07-15 09:21:38 -03:00
NicoR
334fbbbb7f Comment back z.record and z.intersection until we support them 2025-07-15 09:12:18 -03:00
Anselm
da86337d13 Remove stored hash and debug logs 2025-07-15 11:39:52 +01:00
NicoR
eaac1e6580 Keep z.optional and z.discriminatedUnion compatible with covalues 2025-07-14 22:44:02 -03:00
Guido D'Orsi
114898d8a9 Merge pull request #2643 from garden-co/changeset-release/main
Version Packages
2025-07-14 21:25:21 +02:00
Guido D'Orsi
991aebf7a7 feat: only accept init payload and improve auth checks 2025-07-14 21:00:08 +02:00
NicoR
cbc3f0cc65 Improve changeset message 2025-07-14 15:25:04 -03:00
NicoR
29c487e288 Remove new usages of zodSchemaToCoSchema 2025-07-14 15:13:51 -03:00
NicoR
0b0590a364 Merge remote-tracking branch 'origin/main' into feat/co-optional-and-discriminatedUnion 2025-07-14 15:11:31 -03:00
NicoR
1eb01997d8 Remove unused imports 2025-07-14 14:57:42 -03:00
Nico Rainhart
0dc8d511a1 Merge pull request #2636 from garden-co/feat/zod-jazz-schema-boundary
refactor: consolidate boundary between Zod schemas, CoValue schemas & CoValue classes
2025-07-14 14:43:36 -03:00
Guido D'Orsi
9b75880b10 feat: bestEffortResolution on export 2025-07-14 18:53:44 +02:00
github-actions[bot]
962213c712 Version Packages 2025-07-14 15:04:25 +00:00
Guido D'Orsi
427df8fcbb Merge pull request #2644 from garden-co/chore/lefthook-autoinstall
chore: auto-install lefthook using `postinstall` script
2025-07-14 17:02:16 +02:00
Guido D'Orsi
98fe72ed42 fix: push players data on joinGameRequest 2025-07-14 15:00:47 +02:00
Guido D'Orsi
1f5c81c2ea feat: nicer example UI 2025-07-14 14:45:16 +02:00
Matteo Manchi
c40aad55dc chore: auto-install lefthook using postinstall script 2025-07-14 14:38:48 +02:00
Guido D'Orsi
fc41aa165b feat: support CoMapInit as payload for send/response 2025-07-14 14:29:20 +02:00
Guido D'Orsi
dfca5926de Merge pull request #2640 from garden-co/GCO-621-Adds-documentation-for-descriminatedUnion-workaround
Closes GCO-621 - Add documentation for discriminated union workaround
2025-07-14 12:50:16 +02:00
Guido D'Orsi
9815ec61f0 feat: export the z.ZodDiscriminatedUnion type and improve the recursive types docs 2025-07-14 11:14:59 +02:00
Guido D'Orsi
fca60d213e Merge pull request #2641 from garden-co/GCO-655-user-id-on-unauthorized
Expose current Account id in unauthorized error message
2025-07-14 11:12:49 +02:00
Matteo Manchi
b4fdab475b chore: add changeset 2025-07-14 11:03:59 +02:00
Guido D'Orsi
2b043abffa Merge pull request #2637 from garden-co/feat/discriminated-union-load-subscribe
feat: add load & subscribe to Discriminated union schemas
2025-07-14 10:53:33 +02:00
Anselm
c4df2a2189 Most tests pass except intermediate known states 2025-07-13 15:01:34 +01:00
Matteo Manchi
958c122c36 chore(jazz-tools/tools): expose current user id in unauthorized error message 2025-07-12 21:01:44 +02:00
Margaret Culotta
5842838371 Add examples but remove twoslash because of limitations in how Twoslash parses advanced TypeScript types 2025-07-11 14:36:07 -05:00
NicoR
e136e1b696 Remove unnecessary comment 2025-07-11 16:01:38 -03:00
NicoR
2475a46578 Remove resolve type for when loading/subscribing to discriminated unions 2025-07-11 15:45:23 -03:00
Guido D'Orsi
41466ea399 feat: simplify the API 2025-07-11 20:01:30 +02:00
NicoR
44f653a64b Format and reorder imports 2025-07-11 14:00:55 -03:00
NicoR
f8437042a6 Add CoDiscriminatedUnionSchema.subscribe 2025-07-11 13:38:08 -03:00
Guido D'Orsi
3b91594d10 feat: migrate the jazz-paper-scissors to request & nextjs and rename it to server-side-validation 2025-07-11 18:11:47 +02:00
Nicolas Embleton
ac88bdcb98 Merge branch 'garden-co:main' into community-vue-packages 2025-07-11 22:44:03 +07:00
nembleton
30704bcaf7 feat(@community-jazz-vue): port Jazz Vue bindings to 0.15 and match React signatures 1-to-1 for easier forward maintenance and to make it easier to infer Vue Bindings usage from React documentation
feat(@community-jazz-vue): port React Inspector to Vue to make it easier to use within Vue projects
chore(@community-jazz-vue): add tests to prevent regressions with Vue Proxy / Reactivity, which works quite differently from React's
feat(@community-chat-vue): add up-to-date, reworked Chat Vue example
feat(@community-clerk-vue): add Clerk Auth example with Vue
feat(@community-todo-vue): add up-to-date, reworked Todo Vue example
2025-07-11 22:42:22 +07:00
Margaret Culotta
acd908fbc2 add docs for recursive connection 2025-07-11 10:41:50 -05:00
Margaret Culotta
4e61d1d191 add docs for recursive connections 2025-07-11 10:37:31 -05:00
NicoR
db23582b4c Fix "Expression produces a union type that is too complex to represent" error 2025-07-11 12:27:31 -03:00
NicoR
4b0b6d8a69 Use Add CoDiscriminatedUnionSchema.load in existing tests 2025-07-11 12:21:31 -03:00
NicoR
d450b394fa Tighten CoDiscriminatedUnionSchema type 2025-07-11 12:12:56 -03:00
NicoR
0abc96e400 Add CoDiscriminatedUnionSchema.load 2025-07-11 11:17:44 -03:00
NicoR
7562354b29 Fix e2e test error 2025-07-10 21:44:54 -03:00
NicoR
6c085a3919 Fix imports 2025-07-10 17:29:33 -03:00
NicoR
6afff848bc Clean up CoValue schema definitions 2025-07-10 16:49:19 -03:00
NicoR
47059845cc Make co.discriminatedUnion tests type-tests 2025-07-10 16:09:41 -03:00
NicoR
a1735a8232 Update tests that expected CoValue class instead of schema 2025-07-10 16:00:56 -03:00
NicoR
1f5750d8c4 Support nesting CoValue classes inside CoValue schemas 2025-07-10 15:24:57 -03:00
NicoR
f756ce26b5 Fix CoListSchema 2025-07-10 14:46:22 -03:00
NicoR
84f5bdda74 Rename AnyCoSchema.getCoSchema to getCoValueClass 2025-07-10 14:41:54 -03:00
NicoR
ee7aefa97c Tighten Account schema type when inferring from Zod schema 2025-07-10 14:32:27 -03:00
NicoR
b0895981ba Add CoDiscriminatedUnionSchema 2025-07-10 14:31:58 -03:00
NicoR
94f636b2ee Fix CoOptionalSchema 2025-07-10 14:05:30 -03:00
NicoR
331ab070f6 Fix CoMapSchema.catchall 2025-07-10 13:38:42 -03:00
NicoR
13e73adfb9 Refactor zodSchemaToCoSchema to return CoValue schema instead of class 2025-07-10 12:38:23 -03:00
Guido D'Orsi
265a6405af feat: implement the payload/response schema spec 2025-07-10 16:56:30 +02:00
Guido D'Orsi
9f6079b6c6 Merge pull request #2634 from garden-co/changeset-release/main
Version Packages
2025-07-10 16:14:58 +02:00
Anselm
cf606c7c2f Make tests pass 2025-07-10 15:08:18 +01:00
github-actions[bot]
4033d78fa6 Version Packages 2025-07-10 14:02:44 +00:00
Guido D'Orsi
83af94c850 Merge pull request #2575 from garden-co/feat/storage-api
feat: storage as load/store API
2025-07-10 16:00:33 +02:00
Guido D'Orsi
70fe856713 fix: don't wait for File streaming on SubscriptionScope 2025-07-10 14:54:00 +02:00
Guido D'Orsi
42e4afc42b test: add tests for markErrored 2025-07-10 14:35:51 +02:00
Guido D'Orsi
0e6797b222 chore: update lockfile 2025-07-10 14:28:10 +02:00
Guido D'Orsi
3634eaf8e9 chore: remove error logged on verify failures 2025-07-10 14:27:56 +02:00
Guido D'Orsi
58dfda3d0f Merge remote-tracking branch 'origin/main' into feat/storage-api 2025-07-10 14:16:16 +02:00
Guido D'Orsi
d304b0bcb5 Merge pull request #2622 from garden-co/feat/wait-for-streaming
feat: wait for the full streaming before return values in load and subscribe
2025-07-10 14:10:01 +02:00
Guido D'Orsi
44f5a3f5a2 test: add tests for loading/subscribing to large coValues 2025-07-10 14:06:20 +02:00
Sammii
ebb3ce1c25 Merge pull request #2623 from garden-co/feat/design-system-shadcn-integration
Feat/design system shadcn integration
2025-07-10 11:18:28 +01:00
Sammii
a67bba0dcf ensuring height consistency between buttons, inputs and dropdowns 2025-07-10 11:12:23 +01:00
Guido D'Orsi
4a72c26e42 chore: simplify toAddTransactions and tracking content from storage 2025-07-10 11:24:21 +02:00
Guido D'Orsi
084cb5936d perf: increase the ws messages batching to 5ms 2025-07-10 10:49:48 +02:00
NicoR
f1552b8262 [WIP] FieldSchema refactor 2025-07-09 17:20:51 -03:00
NicoR
6826ad8e45 Add CoOptionalSchema 2025-07-09 17:09:26 -03:00
NicoR
7c1b757b62 Reuse DefaultProfileShape wherever possible 2025-07-09 17:09:26 -03:00
NicoR
326e1734a4 Fix import order 2025-07-09 17:09:10 -03:00
NicoR
0cf027c91b Revert changes on z.object and z.strictObject 2025-07-09 17:09:10 -03:00
NicoR
e358881b76 Prevent using z.record with CoValue schemas 2025-07-09 17:09:10 -03:00
NicoR
cee8010918 Prevent using z.intersection with CoValue schemas 2025-07-09 17:09:10 -03:00
NicoR
cc877139ef Prevent using z.strictObject with CoValue schemas 2025-07-09 17:09:10 -03:00
NicoR
56a9b89538 Prevent using z.tuple with CoValue schemas 2025-07-09 17:09:10 -03:00
NicoR
199c463e28 Prevent using z.array with CoValue schemas 2025-07-09 17:09:10 -03:00
NicoR
50e523d19c Prevent using z.union with CoValue schemas 2025-07-09 17:09:10 -03:00
NicoR
796ea24288 Prevent using z.discriminatedUnion with CoValue schemas 2025-07-09 17:09:10 -03:00
NicoR
c8be86e823 Add tests 2025-07-09 17:09:10 -03:00
NicoR
41b7054aab Prevent using z.optional and z.object with CoValue schemas 2025-07-09 17:09:10 -03:00
NicoR
101adcd024 More updates to docs and examples 2025-07-09 17:08:59 -03:00
Anselm
63a03b4139 State: all inputs byte-identical, but signature verification fails 2025-07-09 20:26:00 +01:00
NicoR
a2854aeec9 Fix import order 2025-07-09 16:24:45 -03:00
NicoR
bdc9aee689 Add changeset 2025-07-09 16:11:55 -03:00
NicoR
2f53ae0ab8 Update docs 2025-07-09 16:09:03 -03:00
NicoR
f76c05448c Update examples 2025-07-09 16:08:54 -03:00
NicoR
585e7e8177 Add tests for co.optional and co.discriminatedUnion 2025-07-09 15:30:05 -03:00
NicoR
82d8d1d873 Add co.discriminatedUnion 2025-07-09 15:30:05 -03:00
NicoR
2c523c86ff Replace usages of z.optional with CoSchemas with a new co.optional 2025-07-09 15:30:05 -03:00
NicoR
6616668d4a Add pnpm check command to jazz-tools 2025-07-09 15:30:05 -03:00
Anselm
e47e18b84d Introduce thiserror 2025-07-09 18:52:28 +01:00
Anselm
8f5a7a091a Setup cojson-core-wasm wrapper and start writing tests 2025-07-09 17:44:46 +01:00
Guido D'Orsi
a4d23d527b feat: add content import/export to the experimental_request and move into tools 2025-07-09 18:43:53 +02:00
Anselm
e04cec6092 Fix unrelated build errors 2025-07-09 17:23:27 +01:00
Nico Rainhart
8a3be85e97 Merge pull request #2601 from garden-co/fix/chat-rn-example-not-running
Update pinned react version to 19.1.0
2025-07-09 09:44:49 -03:00
Brad Anderson
1a7f2b7379 fix: chat-rn build issues for android 2025-07-08 17:32:31 -04:00
Guido D'Orsi
caac82dffd chore: enable lazy load on ProjectScreen 2025-07-08 20:33:49 +02:00
Guido D'Orsi
27b48378e5 feat: wait for the full streaming before return values in load and subscribe 2025-07-08 20:19:24 +02:00
Guido D'Orsi
cfd3c3ca5c Merge remote-tracking branch 'origin/main' into feat/storage-api 2025-07-08 19:36:25 +02:00
Guido D'Orsi
41f26b7a4f chore: streamingTarget -> expectContentUntil 2025-07-08 19:18:37 +02:00
Guido D'Orsi
c57ebb1cea feat: add the streamingTarget information only on the first content message 2025-07-08 19:10:17 +02:00
Guido D'Orsi
259aded5cc chore: changeset 2025-07-08 19:10:12 +02:00
Guido D'Orsi
1f5e091dd7 Merge pull request #2602 from garden-co/fix/remove-storage-peers
feat: refactor Peer communication and schedule incoming messages on sync
2025-07-08 18:52:25 +02:00
Guido D'Orsi
bbb1c44977 fix: reduce delay on batch to 0 and add a config for incoming messages scheduling budget 2025-07-08 18:38:08 +02:00
Guido D'Orsi
4327ecbfdf Merge pull request #2619 from garden-co/changeset-release/main
Version Packages
2025-07-08 17:34:26 +02:00
Guido D'Orsi
114c10bc77 Merge pull request #2621 from garden-co/fix/invalid-signature
fix: fixes InvalidSignature errors that could happen during streaming
2025-07-08 17:33:18 +02:00
Guido D'Orsi
cecdf29721 test: add tests for invalid signatures coming from stale data updates 2025-07-08 17:32:23 +02:00
Sammii
bd717fc0d7 updating buttons for default default 2025-07-08 16:04:50 +01:00
Guido D'Orsi
739fff68b3 fix: fixes InvalidSignature errors that could happen during streaming 2025-07-08 16:50:30 +02:00
Sammii
d49cab0afa improving design systems integration with shadcn vars 2025-07-08 13:56:49 +01:00
Guido D'Orsi
ffebb4fdaf chore: remove console.log 2025-07-08 14:40:46 +02:00
github-actions[bot]
32565f0e53 Version Packages 2025-07-08 12:20:12 +00:00
Sammii
61a5889bea Merge pull request #2615 from garden-co/fix/team-update 2025-07-08 13:18:08 +01:00
Sammii
82bd3e1ea6 adding nico 2025-07-08 12:00:09 +01:00
Sammii
b800a6fba2 Merge pull request #2401 from garden-co/feat/snippet-improvements
Feat/snippet improvements
2025-07-08 11:54:03 +01:00
Sammii
1b6dbfdfff adjusting side nav item design 2025-07-08 11:45:29 +01:00
Sammii
061a70f1b3 responsive design for dropdown select 2025-07-08 11:45:18 +01:00
Sammii
f1c1e0dafd adding div's profile link 2025-07-08 10:43:54 +01:00
Guido D'Orsi
c3912fdb37 Merge pull request #2618 from garden-co/fix/inspector-element
fix: simplify definition of the AccountSchema type
2025-07-07 22:19:49 +02:00
Guido D'Orsi
356bfa4860 docs: add jsDoc for coAccountDefiner 2025-07-07 19:50:41 +02:00
Guido D'Orsi
38446668c4 fix: simplify definition of the AccountSchema type 2025-07-07 19:44:21 +02:00
Brad Anderson
e2bb3b8015 fix: chat-rn-expo works, canary bump 2025-07-07 12:33:12 -04:00
Anselm
8868032376 Add initial Rust crates for lzy and cojson-core 2025-07-07 17:31:12 +01:00
Guido D'Orsi
11dcfd703d Merge pull request #2616 from garden-co/changeset-release/main
Version Packages
2025-07-07 18:16:58 +02:00
Brad Anderson
0b09d23bd1 fix: chat-rn works w properly-hoisted RN dep 2025-07-07 12:09:16 -04:00
github-actions[bot]
879b726537 Version Packages 2025-07-07 16:06:32 +00:00
Guido D'Orsi
66bbd03262 Merge pull request #2614 from garden-co/fix/inspector-element
fix: react bundling in jazz-tools/inspector/register-custom-element
2025-07-07 18:04:30 +02:00
Guido D'Orsi
c09b63698f fix: react bundling in jazz-tools/inspector/register-custom-element 2025-07-07 18:03:18 +02:00
Sammii
bed7db0a33 team page updates 2025-07-07 16:51:22 +01:00
NicoR
8ff3e234c1 Upgrade examples' expo version to 54.0.0-canary 2025-07-07 12:44:21 -03:00
Sammii
296da5a5c4 design amends 2025-07-07 16:40:30 +01:00
Guido D'Orsi
700a4f1ba1 fix: restore sync url in todo main 2025-07-07 16:46:18 +02:00
Guido D'Orsi
6f6663d825 test: cover ws.terminate 2025-07-07 16:28:46 +02:00
Guido D'Orsi
844cdc907f Merge pull request #2612 from garden-co/chore/playwright-tests
perf(ci): batch the e2e tests execution in 2 workflow runs
2025-07-07 16:02:45 +02:00
Guido D'Orsi
9e32d4cb92 perf(ci): batch the e2e tests execution in 2 workflow runs 2025-07-07 16:01:12 +02:00
Guido D'Orsi
85dc6ba148 feat: add metrics on incoming messages and storage streaming operations 2025-07-07 15:41:33 +02:00
Sammii
16c4d27e00 code tidy 2025-07-07 14:21:24 +01:00
Sammii
69170fe0e0 style amendments 2025-07-07 14:14:28 +01:00
Sammii
a646ba54b3 component refactor 2025-07-07 14:14:16 +01:00
Sammii
45d60fc3c8 get started snippet select improvements 2025-07-07 14:02:22 +01:00
Sammii
6f0c399ccd Merge branch 'main' into feat/snippet-improvements 2025-07-07 13:50:59 +01:00
Guido D'Orsi
40e1ca7cb1 Merge pull request #2606 from garden-co/changeset-release/main
Version Packages
2025-07-07 11:30:02 +02:00
github-actions[bot]
80cf21e453 Version Packages 2025-07-07 09:27:27 +00:00
Guido D'Orsi
48c8a3d219 Merge pull request #2603 from garden-co/PR-template-v2-simplify
simplify PR template for ease of use
2025-07-07 11:25:24 +02:00
Guido D'Orsi
31bb1201fc Merge pull request #2611 from garden-co/gio/update-lockfile
chore: update lockfile
2025-07-07 11:15:25 +02:00
Giordano Ricci
08d1b05607 chore: update lockfile 2025-07-07 09:47:51 +01:00
Guido D'Orsi
d64a14210d Merge pull request #2608 from jeffgca/main
Error: Loading PostCSS Plugin failed: Cannot find module '@tailwindcss/postcss'
2025-07-07 10:35:06 +02:00
Guido D'Orsi
7e53d33e9b Merge pull request #2609 from jeffgca/user_age_calc_fix
User age calc fix
2025-07-07 10:34:31 +02:00
Jeff Griffiths
ea2b39cc30 fixed off-by-one error 2025-07-04 21:27:54 -07:00
Jeff Griffiths
6b835f95cf enhanced getUserAge to calculate the user's age in a more precise way. 2025-07-04 21:14:32 -07:00
Jeff Griffiths
a229ae5f70 changed postcss dependency to the tailwind plugin instead. 2025-07-04 20:49:46 -07:00
Giordano Ricci
84fdc1d8fd Merge pull request #2605 from garden-co/gio/cancel-pending-workflows-on-push 2025-07-04 17:19:27 +01:00
Guido D'Orsi
9b1d52d183 chore: document IncomingMessagesQueue 2025-07-04 18:15:08 +02:00
Giordano Ricci
14a8b32522 differentiate workflows 2025-07-04 17:10:44 +01:00
Guido D'Orsi
ddc09a0d6b Merge pull request #2604 from garden-co/gio/get-only-direct-members
feat: allow to get only the direct members of a group
2025-07-04 18:09:55 +02:00
Giordano Ricci
3b45a3f2fd chore: cancel pending workflows on push 2025-07-04 17:05:45 +01:00
Giordano Ricci
9034a45da0 forgot the role 2025-07-04 16:51:07 +01:00
Guido D'Orsi
6247fac6c5 Merge remote-tracking branch 'origin/feat/storage-api' into fix/remove-storage-peers 2025-07-04 17:49:17 +02:00
Giordano Ricci
a5ceaffb0c changeset, usemethod instead of getter, reuse logic 2025-07-04 16:47:19 +01:00
Giordano Ricci
dcee2f9b4e better test 2025-07-04 16:18:53 +01:00
Guido D'Orsi
f27a2c541e chore: cleanup code and add tests 2025-07-04 17:18:17 +02:00
Giordano Ricci
83fdc504ff feat: add directMembers get to get only the direct members of a given group 2025-07-04 16:07:30 +01:00
Guido D'Orsi
2317a23fd4 chore: refactor createWebSocketPeer 2025-07-04 16:26:08 +02:00
Guido D'Orsi
a34c0675cd Merge pull request #2599 from garden-co/changeset-release/main
Version Packages
2025-07-04 14:36:26 +02:00
Margaret Culotta
5a8a62b4a3 simplify PR template for ease of use 2025-07-02 13:23:56 -05:00
github-actions[bot]
325a554bd1 Version Packages 2025-07-02 17:07:22 +00:00
Guido D'Orsi
7422943e83 Merge pull request #2600 from garden-co/fix/react-native-peer-dependencies
Make all React Native deps in `jazz-tools` optional peer dependencies
2025-07-02 19:05:22 +02:00
NicoR
23bfea5861 Add changeset 2025-07-02 13:50:45 -03:00
NicoR
605a54eb11 Make react-native-fast-encoder an optional peer dependency 2025-07-02 13:49:04 -03:00
Brad Anderson
a7aaee51e6 Merge pull request #2587 from garden-co/feat/rn-betterauth
feat: add RN BetterAuth
2025-07-02 12:24:38 -04:00
Brad Anderson
4b8983858a chore: changeset 2025-07-02 12:07:25 -04:00
Brad Anderson
8a8c4d11e1 fix: small cleanup 2025-07-02 11:56:40 -04:00
Guido D'Orsi
26994684d7 feat: refactor Peer communication and schedule incoming messages on sync 2025-07-02 17:45:28 +02:00
NicoR
14a5e036a4 Update homepage to react 19.1.0 2025-07-02 11:03:40 -03:00
NicoR
5b1c1ca522 Update all examples to react 19.1.0 2025-07-02 10:44:31 -03:00
NicoR
a9c8458c51 Update chat-rn's Podfile.lock 2025-07-02 09:38:56 -03:00
NicoR
5f31d6cbe1 Update pinned react version 2025-07-02 09:38:38 -03:00
Guido D'Orsi
b774bb345d chore: changeset 2025-07-02 10:52:44 +02:00
Guido D'Orsi
7fd891d7b9 chore: fix formatting 2025-07-02 10:52:10 +02:00
Guido D'Orsi
27cac4a6d7 Merge pull request #2596 from satendra03/main
fix #1914
2025-07-02 10:51:23 +02:00
Brad Anderson
2b71ef1181 fix: PR feedback 2025-07-01 21:46:25 -04:00
NicoR
ae169c7b3a Revert change for react-native-fast-encoder 2025-07-01 13:57:17 -03:00
NicoR
d888c99d9a Add expo-sqlite dependency to Expo Project setup docs 2025-07-01 13:53:01 -03:00
NicoR
0b54917f19 Make all React Native deps in jazz-tools optional peer dependencies 2025-07-01 12:21:38 -03:00
Guido D'Orsi
c87b215b75 Merge pull request #2594 from garden-co/fix-RNQuickCrypto-type-error
fix: `RNQuickCrypto` type error
2025-07-01 17:15:01 +02:00
NicoR
e4ba23cbef Add changeset 2025-07-01 12:13:40 -03:00
Brad Anderson
98c005a6e0 feat: more RN BetterAuth 2025-07-01 08:49:13 -04:00
Guido D'Orsi
477fd8a62d feat: simple backpressure for sync storage 2025-07-01 12:55:56 +02:00
Guido D'Orsi
90999ee709 Merge pull request #2593 from garden-co/fix/remove-storage-peers
chore: remove storage peer
2025-07-01 12:48:34 +02:00
Guido D'Orsi
38065f0cdf Merge pull request #2590 from garden-co/fix/storage-streaming
fix: server subscription when streaming from storage
2025-07-01 12:47:52 +02:00
Guido D'Orsi
c77d16cdb3 chore: cleanup code 2025-07-01 12:31:24 +02:00
Guido D'Orsi
9410084e6a chore: cleanup code
Co-authored-by: Nico Rainhart <nmrainhart@gmail.com>
2025-07-01 12:30:08 +02:00
Guido D'Orsi
8528db4de4 Merge pull request #2595 from garden-co/fix/make-jazz-tools-rn-deps-peer-dependencies
fix: make `react-native-nitro-modules` and `react-native-quick-crypto` optional peer dependencies
2025-07-01 11:30:14 +02:00
satendra03
e0fe5a20b7 fix #1914 2025-07-01 04:21:26 +05:30
NicoR
e16e4d53d1 Keep file extension in relative import 2025-06-30 16:52:09 -03:00
NicoR
d904fae506 fix: make react-native-quick-crypto an optional peer dependency 2025-06-30 15:44:04 -03:00
NicoR
f67c0b3db3 fix: make react-native-nitro-modules an optional peer dependency 2025-06-30 15:43:30 -03:00
NicoR
283d7c6bf0 fix: RNQuickCrypto type error 2025-06-30 15:13:10 -03:00
Guido D'Orsi
e67c5838a9 chore: remove storage peer 2025-06-30 18:15:11 +02:00
Guido D'Orsi
0e7a7dbbc0 Merge pull request #2591 from garden-co/fix/ci-e2e-exit-code
fix(ci): listen to e2e-rn-test's exit code
2025-06-30 17:53:34 +02:00
Matteo Manchi
63c69b6b95 fix(ci): listen to e2e-rn-test's exit code 2025-06-30 17:41:57 +02:00
Guido D'Orsi
a141cbc7f7 chore: rename back to AvailableCoValueCore to facilitate review 2025-06-30 16:40:37 +02:00
Guido D'Orsi
6a5352cf3a test: remove TODO on browser integration tests 2025-06-30 15:31:38 +02:00
Guido D'Orsi
27762637ee fix: streaming from storage now correctly send the target known state in the load requests 2025-06-30 15:28:08 +02:00
nembleton
03108871e9 chore: restore vue examples and bindings under community prefix
chore: update dependencies to new single package structure
2025-06-30 11:58:08 +07:00
Guido D'Orsi
dcebe34891 chore: remove unused id param from storage.store 2025-06-27 19:59:56 +02:00
Guido D'Orsi
99d510815f Merge remote-tracking branch 'origin/main' into feat/storage-api 2025-06-27 19:40:12 +02:00
Guido D'Orsi
928962c08b chore: add comments and improve tests 2025-06-27 19:37:43 +02:00
Guido D'Orsi
cdadd6db1d chore: revert CoJsonIDBTransaction 2025-06-27 18:58:36 +02:00
Guido D'Orsi
d45b8ae70b feat: improve the loading and add content streaming tests 2025-06-27 18:57:45 +02:00
Guido D'Orsi
445a58c864 chore: centralize loadFromStorage logic 2025-06-27 18:29:05 +02:00
Guido D'Orsi
1895b474ea Merge remote-tracking branch 'origin/main' into feat/storage-api 2025-06-27 18:15:49 +02:00
Guido D'Orsi
fd02627069 Merge pull request #2583 from garden-co/changeset-release/main
Version Packages
2025-06-27 18:14:31 +02:00
github-actions[bot]
827adc991d Version Packages 2025-06-27 16:01:01 +00:00
Guido D'Orsi
651b69e5af Merge pull request #2582 from garden-co/fix/circular-deps-sync
fix: fix sync with circular deps
2025-06-27 17:57:32 +02:00
Guido D'Orsi
277e4d49e8 fix: fix sync with circular deps 2025-06-27 17:52:02 +02:00
Guido D'Orsi
8990ff39a5 fix: initialize async sqlite db 2025-06-27 17:26:52 +02:00
Guido D'Orsi
71e4c97255 chore: update lockfile 2025-06-27 17:21:56 +02:00
Guido D'Orsi
577e960e28 Merge remote-tracking branch 'origin/main' into feat/storage-api 2025-06-27 17:19:07 +02:00
Guido D'Orsi
f232f75d40 feat: performance testing app 2025-06-27 17:18:57 +02:00
Guido D'Orsi
cfa44f32eb Merge pull request #2578 from garden-co/changeset-release/main
Version Packages
2025-06-27 12:53:43 +02:00
github-actions[bot]
ef920435e9 Version Packages 2025-06-27 10:07:38 +00:00
Guido D'Orsi
87d05404dd Merge pull request #2581 from garden-co/fix/idbtransaction
fix: refresh the IndexedDB transaction when finished but not flagged as done
2025-06-27 12:03:19 +02:00
Guido D'Orsi
535c460f5a fix: refresh the IndexedDB transaction when finished but not flagged as done 2025-06-27 11:49:49 +02:00
Guido D'Orsi
e1a7f829b4 feat: move storage inside cojson and add more tests 2025-06-26 18:18:30 +02:00
Guido D'Orsi
fa1b302474 Merge pull request #2577 from garden-co/fix/GCO-600-image-original-size
Fix GCO-600: image original size
2025-06-26 14:35:27 +02:00
Matteo Manchi
45f73a774c chore: update changeset 2025-06-26 12:08:55 +02:00
Matteo Manchi
2a9e271dc3 chore(create-jazz-app/browser-media-images): small refactoring of function 2025-06-26 12:04:51 +02:00
Anselm Eickhoff
3d96d9c829 Merge pull request #2416 from garden-co/feat/design-system-improvements
Feat/design system improvements
2025-06-26 10:16:24 +01:00
Anselm
844051405d Smaller nav CTA & move CTA to menu on mobile 2025-06-26 10:07:24 +01:00
Anselm
625eff2333 Fix pricing page button 2025-06-26 09:54:07 +01:00
Anselm
59e2871065 Rename styleType to intent 2025-06-26 09:49:26 +01:00
Anselm
acdc88fb91 Tweak md icon size 2025-06-26 09:47:53 +01:00
Matteo Manchi
05eab4e2a9 fix(jazz-tools/browser-media-images): use coherent values for resized images - Fixes GCO-600 2025-06-25 23:43:13 +02:00
Guido D'Orsi
efcd65ae38 docs: improve the contributing 2025-06-25 15:42:39 +02:00
Guido D'Orsi
f82177b9da feat: indexed db 2025-06-25 15:26:08 +02:00
Meg Culotta
ad60fa942a Merge pull request #2571 from garden-co/closes-gco-581-add-pr-template-to-gh
Closes GCO-581 - Create pull_request_template.md
2025-06-25 08:05:52 -05:00
Guido D'Orsi
c1c553bad0 feat: storage as load/store API 2025-06-25 11:53:14 +02:00
Sammii
5272d3cd2a update nav button on gcmp homepage 2025-06-24 16:10:04 +01:00
Sammii
588ea02f63 refactoring Framework Select 2025-06-24 16:09:01 +01:00
Sammii
d837811813 variant updates on fake get started buttons and example link components 2025-06-24 15:54:18 +01:00
Guido D'Orsi
2b4aba2d1b fix: fix todo schema migration 2025-06-24 16:53:13 +02:00
Sammii
50b4da18d9 refactoring everything to be more compatible with shadcn nomenclature, styleVariants now variants, variants now styleTyles, shad cn button variants mapped to design system, all buttons/icons etc required are updated monorepo wide 2025-06-24 15:41:41 +01:00
Guido D'Orsi
d18d09e002 Merge pull request #2574 from garden-co/changeset-release/main
Version Packages
2025-06-24 15:33:26 +02:00
github-actions[bot]
d983f27bbe Version Packages 2025-06-24 13:32:21 +00:00
Guido D'Orsi
fcf83b0da4 Merge pull request #2570 from joeinnes/post-0.15-docs-fixes
Post 0.15 docs fixes
2025-06-24 15:26:22 +02:00
Guido D'Orsi
9231e2c22f Merge pull request #2568 from garden-co/feat/cotext-display
feat(inspector): improve CoPlainText view
2025-06-24 15:24:54 +02:00
Guido D'Orsi
33157ee0ad Merge pull request #2573 from garden-co/fix/debug-transactions
fix: add debug code on parseJSON errors during the transactions parsing
2025-06-24 15:24:18 +02:00
Guido D'Orsi
4b964edcaf fix: add debug code on parseJSON errors during the transactions parsing 2025-06-24 15:16:10 +02:00
Sammii
df22f2617e amend secondary button style to default 2025-06-24 12:01:33 +01:00
Sammii
ddc69f2268 apply track on copy click to new snippet select component 2025-06-24 11:56:39 +01:00
Sammii
7c62689319 Merge branch 'main' into feat/snippet-improvements 2025-06-24 11:52:03 +01:00
Sammii
280495c533 updating styles on HelpLinks and NewsLetterForm 2025-06-24 11:40:46 +01:00
Sammii
d5c6fbdc3c removing secondary styles 2025-06-24 11:40:32 +01:00
Sammii
57776a1400 amending default button with icon styling 2025-06-24 11:40:24 +01:00
Sammii
156c45aa0e update button styles on design system side nav 2025-06-24 11:28:34 +01:00
Sammii
2d0dba6bbc amend button style on early adopter section 2025-06-24 11:23:44 +01:00
Sammii
7241d2ad95 refactor button highlight to strong 2025-06-24 11:22:46 +01:00
Sammii
4a9eeace00 refactor highlight to strong colours inputs and icons 2025-06-24 11:21:32 +01:00
Meg Culotta
4f9c91f6ff Closes GCO-581 - Create pull_request_template.md 2025-06-23 14:39:52 -05:00
Guido D'Orsi
a8e1726797 Merge pull request #2569 from garden-co/docs/type-aliases
docs: add type aliases to the docs examples
2025-06-23 21:25:43 +02:00
Joe Innes
a6eeada331 docs: ⚠️ update Node.js requirement to v20.0.0 or later
* Updated the minimum Node.js version requirement in the documentation to ensure compatibility with the latest features and improvements.
2025-06-23 20:56:59 +02:00
Joe Innes
3b38a8241c docs: ✏️ add Node.js v20 requirement alerts in documentation
* Added `<Alert>` components to inform users about the requirement of Node.js v20 across various setup documentation files.
* Updated installation instructions for clarity and improved user guidance.
2025-06-23 20:56:40 +02:00
Joe Innes
c49330c308 docs: ⚠️ add warning about custom AccountSchema requirement
* Added an `<Alert>` component to inform users that they need to pass their custom `AccountSchema` to the provider.
* This change aims to reduce confusion for new adopters regarding schema registration.
2025-06-23 20:20:12 +02:00
Guido D'Orsi
0c4e27c18d docs: add type aliases to the docs examples 2025-06-23 19:54:42 +02:00
Joe Innes
d8d273821e docs: ✏️ remove 'note' on docs inaccuracies
* Removed outdated note about Jazz 0.14.0 release.
* We've got links on the right now so docs issues can be reported, no need for an extra chore to bump the version number in this note every release.
2025-06-23 18:04:04 +02:00
Guido D'Orsi
def0ca81b4 Merge pull request #2567 from garden-co/fix/clerk-starter
fix: fix clerk-expo starter and make it more minimal
2025-06-23 18:00:08 +02:00
Sammii
7ff13a8f55 erfactor out secondary variant 2025-06-23 16:52:51 +01:00
Guido D'Orsi
53fff71f25 Merge pull request #2563 from garden-co/changeset-release/main
Version Packages
2025-06-23 16:54:10 +02:00
Trisha Lim
0e7e53238b feat(inspector): improve CoPlainText view 2025-06-23 15:17:47 +01:00
Guido D'Orsi
fcc18e5212 fix: fix clerk-expo starter and make it more minimal 2025-06-23 15:45:43 +02:00
Sammii
5741d7f09c update input props table 2025-06-23 14:34:36 +01:00
Sammii
766d2c8846 update inputs view 2025-06-23 14:33:02 +01:00
Sammii
70a43d0c39 Icon refactor and style adjust 2025-06-23 14:26:39 +01:00
github-actions[bot]
c28a04d09e Version Packages 2025-06-23 12:51:44 +00:00
Guido D'Orsi
56fe0aa614 Merge pull request #2493 from garden-co/emil/findunique-slow
feat: add `upsertUnique` and `loadUnique` APIs to CoMap
2025-06-23 14:48:32 +02:00
Guido D'Orsi
745e3132ca Update serious-weeks-double.md 2025-06-23 14:47:59 +02:00
Guido D'Orsi
ace1c796b5 docs: improve uniqueness docs
Co-authored-by: Anselm Eickhoff <anselm.eickhoff@gmail.com>
2025-06-23 14:47:44 +02:00
Guido D'Orsi
1556e41895 chore: fix changeset configuration to exclude exampled from the bump 2025-06-23 13:08:36 +02:00
Guido D'Orsi
2badb7e706 Merge pull request #2557 from garden-co/fix/create-app-rn-plain
create-jazz-app: Fix initial configuration based on react-native type
2025-06-23 13:03:21 +02:00
Matteo Manchi
6f5731b86e chore(create-jazz-app): prepare changeset 2025-06-23 13:02:49 +02:00
Matteo Manchi
b9214a8ef4 chore(examples/chat-rn): upgrade react-native to 0.80.0 and updated all dependencies to make it runnable 2025-06-23 13:02:49 +02:00
Guido D'Orsi
c65940fa94 chore: revert non-related changes for easier review 2025-06-23 12:59:26 +02:00
Matteo Manchi
74e3c0864a chore(examples/chat-rn): add @babel/plugin-transform-export-namespace-from to use new zod4 import 2025-06-23 12:54:43 +02:00
Matteo Manchi
1d3a0e8d6c fix(create-jazz-app): add .npmrc file in RN projects to make pnpm work 2025-06-23 12:54:43 +02:00
Matteo Manchi
e1f2c1936a fix(examples/chat-rn): upgrade dependencies compatible with react-native version 2025-06-23 12:54:43 +02:00
Matteo Manchi
10c139ae97 fix(create-jazz-app): fix initial configuration based on react-native project type (expo/rn) 2025-06-23 12:54:43 +02:00
Guido D'Orsi
e0cd3a5637 test: upserting with partially loaded references 2025-06-23 12:53:07 +02:00
Sammii
cf44258848 variant fix 2025-06-23 11:41:30 +01:00
Sammii
4db5ec2dd8 variant update ViewsSideMenu 2025-06-23 11:39:12 +01:00
Guido D'Orsi
c3610d3b98 Merge pull request #2549 from garden-co/feat/load-fileStream-base64
feat: add FileStream.loadAsBase64 API
2025-06-23 12:36:21 +02:00
Sammii
4983e57e62 more styling updates 2025-06-23 11:21:22 +01:00
Sammii
5b2fc70ca1 refactorign buttons view page 2025-06-23 11:16:02 +01:00
Guido D'Orsi
0e3a4d2c46 feat: add FileStream.loadAsBase64 API 2025-06-23 12:00:14 +02:00
Sammii
53af54570c refactoring button variants 2025-06-23 10:57:22 +01:00
Trisha Lim
c1be360e3b Merge pull request #2545 from garden-co/feat/inspector-save-state
persist embedded inspector's state on reload through local storage
2025-06-23 10:30:07 +01:00
Giordano Ricci
3b4c83088e Merge pull request #2561 from garden-co/gio/avoid-running-quality-twice 2025-06-23 10:28:46 +01:00
Giordano Ricci
25fd7f39ae Merge pull request #2566 from garden-co/gio/chore/update-gh-runners 2025-06-23 10:27:59 +01:00
Anselm
591d6f1ed8 Update team page 2025-06-23 10:14:05 +01:00
Sammii
e0b4626c22 reactor outline button to have hover text map class 2025-06-23 10:04:07 +01:00
Trisha Lim
fbf9dd29db persist embedded inspector's state on reload through local storage 2025-06-23 09:59:29 +01:00
Trisha Lim
ae09b47c33 Merge pull request #2544 from garden-co/benjamin-gco-569-twoslash-takes-a-long-time
Adds caching to the highlighter
2025-06-23 09:57:35 +01:00
Sammii
a273a0db58 quick search style update 2025-06-23 09:39:20 +01:00
Sammii
277104ebba Input style refactor 2025-06-23 09:37:56 +01:00
Giordano Ricci
7eac549606 revert rn 2025-06-23 09:36:32 +01:00
Giordano Ricci
042d03f002 chore: update runners from 22.04 to 24.04 2025-06-23 09:18:41 +01:00
Sammii
434e59d5c4 refactoring Inputs, improving styling and InputsView page & table props 2025-06-23 08:38:23 +01:00
Sammii
bb20907774 update button props on view table 2025-06-23 08:07:42 +01:00
Sammii
282425575f amend quick search design to ahere to design system 2025-06-23 08:05:52 +01:00
Guido D'Orsi
8e4cfd08b2 docs: make the SSR update visible on expo and react native docs 2025-06-20 20:04:29 +02:00
Guido D'Orsi
66b5f8d4c8 Merge pull request #2562 from garden-co/changeset-release/main
Version Packages
2025-06-20 18:14:32 +02:00
Guido D'Orsi
9c6ca9e864 docs: remove use client from the enableSSR snippet 2025-06-20 18:14:06 +02:00
github-actions[bot]
858386b5b1 Version Packages 2025-06-20 16:01:07 +00:00
Guido D'Orsi
238e9ab7a0 Merge remote-tracking branch 'origin/main' into emil/findunique-slow 2025-06-20 17:58:25 +02:00
Guido D'Orsi
f45af0a5cf Merge pull request #2552 from garden-co/feat/jazz-tools-single-package
Jazz 0.15: move all the adapters in the jazz-tools package
2025-06-20 17:57:40 +02:00
Guido D'Orsi
22af329930 docs: remove vue from tests and remove prosermirror link 2025-06-20 17:55:04 +02:00
Guido D'Orsi
c27ac18135 docs: improve uniqueness docs 2025-06-20 17:21:29 +02:00
Giordano Ricci
8f86d44174 chore: avoid running the quality GHA twice on PRs 2025-06-20 17:02:54 +02:00
Guido D'Orsi
4d7555a4ee chore: cleanup 2025-06-20 16:59:49 +02:00
Sammii
75501a9051 amending styling for gcmp homepage 2025-06-20 15:36:55 +01:00
Guido D'Orsi
fc342306e2 feat: add use client banner to react packages for a better compat with Server Components 2025-06-20 16:33:37 +02:00
Guido D'Orsi
8e4a9c7211 Merge pull request #2537 from garden-co/tests/inspector
inspector: add tests
2025-06-20 16:26:12 +02:00
Guido D'Orsi
362284f6b7 chore: remove Vue mentions 2025-06-20 16:25:22 +02:00
Guido D'Orsi
975c7bc785 docs: remove Vue examples 2025-06-20 16:22:14 +02:00
Guido D'Orsi
9a1295d4f6 docs: upgrade guide 2025-06-20 16:04:58 +02:00
Guido D'Orsi
256fdfd0db fix(ImageDefinition): share the owner between ImageDefinition and FileStream when options.owner is undefined 2025-06-20 14:48:40 +02:00
Guido D'Orsi
4cf2bf5fef chore: remove outdated comment 2025-06-20 13:24:46 +02:00
Guido D'Orsi
cae74bd051 Merge remote-tracking branch 'origin/main' into feat/jazz-tools-single-package 2025-06-20 13:21:43 +02:00
Guido D'Orsi
05a3786e23 docs: update imagedef docs for RN and Expo 2025-06-20 13:20:29 +02:00
Guido D'Orsi
0fa051a59d feat: remove experimental prefix from enableSSR and update SSR docs 2025-06-20 13:14:05 +02:00
Guido D'Orsi
1378a1ff68 chore: changeset 2025-06-20 12:15:16 +02:00
Guido D'Orsi
5ad093cb6a chore: optimize the homepage tests action 2025-06-20 12:11:36 +02:00
Sammii
c114cf4029 fresh pnpm lock 2025-06-20 11:08:14 +01:00
Guido D'Orsi
98407c2314 Merge pull request #2558 from garden-co/fix/e2e-rn-test
fix(ci): prevent Android emulator from hanging during e2e-tests gh workflow
2025-06-20 12:06:47 +02:00
Sammii
03da7dc994 Merge branch 'main' into feat/design-system-improvements 2025-06-20 11:06:17 +01:00
Guido D'Orsi
65e14c6176 Merge pull request #2559 from garden-co/fix/o-14-0-remove-=account
docs(0-14): add a code snippet to make it clear that only the type declaration disappears
2025-06-20 11:49:52 +02:00
Guido D'Orsi
9fa79b3a5f docs(0-14): add a code snippet to make it clear that only the type declaration disappears 2025-06-20 11:19:25 +02:00
Matteo Manchi
c90222d32e fix(ci): prevent android emulator from hanging during e2e-tests gh workflow 2025-06-20 00:47:53 +02:00
Guido D'Orsi
d084b41929 chore: small fixes 2025-06-19 18:39:03 +02:00
Guido D'Orsi
65e78014fa feat: export logger from jazz-tools 2025-06-19 18:38:48 +02:00
Guido D'Orsi
d693800eb3 feat: rename the frameworks APIs to avoid collisions 2025-06-19 17:40:03 +02:00
Sammii
12d5c68f98 update colors view 2025-06-19 14:44:46 +01:00
Guido D'Orsi
4ab0b1f4b2 fix: fix jazz-tools/svelte build 2025-06-19 15:00:38 +02:00
Sammii
ec1e359621 help links responsive button styling amends 2025-06-19 13:49:15 +01:00
Sammii
44fb13ddd7 refactoring variants with default with black/white baked in on system mode, refactoring Buttons and Icons 2025-06-19 13:48:57 +01:00
Sammii
4fd4c5bbed amending styling on home page 2025-06-19 11:36:01 +01:00
Guido D'Orsi
9157effdb3 Merge pull request #2556 from garden-co/docs/fix-starters-links
docs(examples): fix the links to passkey examples
2025-06-19 12:35:03 +02:00
Sammii
a1d31566ed adding views layout to landing page to look like views routes 2025-06-19 11:34:50 +01:00
Sammii
dcde3aa811 amending bg highlight on dark 2025-06-19 11:34:29 +01:00
Guido D'Orsi
30b2820a8c chore: remove the svelte-package commanf 2025-06-19 12:24:52 +02:00
Guido D'Orsi
bb561e2650 docs: fixes 404 links 2025-06-19 12:19:36 +02:00
Trisha Lim
7cdf397a01 fix command for starters 2025-06-19 11:13:38 +01:00
Guido D'Orsi
44116b805b docs(examples): fix the links to passkey examples 2025-06-19 12:02:08 +02:00
Guido D'Orsi
e93c27910d chore: remove the build examples workflow 2025-06-19 11:47:23 +02:00
Guido D'Orsi
16428cace4 docs: remove twoslash from the outdated upgrade guides 2025-06-19 11:43:06 +02:00
Guido D'Orsi
f48dabaa1a docs: remove the BetterAuth links from auth/overview 2025-06-19 11:31:50 +02:00
Trisha Lim
7ff90cb81e Merge pull request #2555 from garden-co/gio/docs/helper-methods
docs: update helper methods docs
2025-06-19 10:01:01 +01:00
Giordano Ricci
3a53cc4c00 docs: update helper methods docs 2025-06-19 10:08:31 +02:00
Guido D'Orsi
ea6c50b2b8 fix: remove unused react-test-rendered depencency from examples 2025-06-19 09:59:54 +02:00
Divya
6d93f7b388 Merge pull request #2553 from garden-co/fix/cojson-queue-metric
Typo that could be causing some b0rked metrics
2025-06-18 16:39:55 -04:00
shortdiv
ebc0139559 fix: typo that could be causing some b0rked metrics 2025-06-18 15:53:16 -04:00
Guido D'Orsi
01c07e34e4 test: set jsdom as env for prosemirror 2025-06-18 19:48:53 +02:00
Guido D'Orsi
c89b94aa3b feat: update lockfile 2025-06-18 19:33:41 +02:00
Guido D'Orsi
01e2977a13 fix: build tiptap and export Plugin type from prosemirror 2025-06-18 19:29:17 +02:00
Guido D'Orsi
41354cb2c1 fix: update actions 2025-06-18 19:03:00 +02:00
Guido D'Orsi
530f9d3e11 feat: remove Vue 2025-06-18 19:02:02 +02:00
Guido D'Orsi
c965c904bc feat: move svelte and vue in jazz-tools 2025-06-18 18:42:55 +02:00
Sammii
a621141d76 adding colour classes to all colour class maps and improving types 2025-06-18 17:19:07 +01:00
Sammii
0e1fbd7dfc type update 2025-06-18 16:37:31 +01:00
Guido D'Orsi
d527ae2db0 feat: move all the adapters in the jazz-tools package 2025-06-18 16:31:35 +02:00
Guido D'Orsi
b9261aa4c1 Merge pull request #2551 from garden-co/feat/cleanup-examples
chore: reduce the number of example apps
2025-06-18 12:55:43 +02:00
Guido D'Orsi
41dd1fa80b chore: reduce the number of example apps 2025-06-18 12:06:03 +02:00
Sammii
27efdf9b8e button instance refactor to new variant colors, code tidy and Layout/view update 2025-06-18 10:59:14 +01:00
Sammii
83068b33e9 refactoring colors into variants 2025-06-18 10:58:23 +01:00
Sammii
769d9b0517 amending HelpLinks, deleting custom styling and refactoring to use button component 2025-06-18 10:36:22 +01:00
Sammii
b0ffe5ed7e creatnig buttong gradient styles with pure tailwind button MVP 2025-06-18 10:35:55 +01:00
Trisha Lim
53dabbd955 Merge pull request #2550 from garden-co/move-to-local-font 2025-06-18 09:35:52 +01:00
Emil Sayahi
a036a1c58c feat: CoMap.upsertUnique can return null 2025-06-17 13:09:30 -07:00
Emil Sayahi
f4f47258eb Merge branch 'main' into emil/findunique-slow 2025-06-17 12:32:47 -07:00
Trisha Lim
7e605bb1f3 save fonts locally 2025-06-17 18:31:22 +01:00
Guido D'Orsi
469ac44ff5 Merge pull request #2548 from garden-co/changeset-release/main
Version Packages
2025-06-17 18:46:02 +02:00
github-actions[bot]
ea0045580c Version Packages 2025-06-17 16:45:11 +00:00
Guido D'Orsi
b84bf1826b Merge pull request #2547 from garden-co/feat/load-fileStream
fix: resolve FileStream.load only when the file is fully loaded
2025-06-17 18:41:31 +02:00
Guido D'Orsi
a4fb2edfc2 fix: pin biome version to 1.9.4 2025-06-17 18:35:40 +02:00
Guido D'Orsi
06c5a1c2ba fix: resolve FileStream.load only when the file is fully loaded 2025-06-17 18:30:30 +02:00
Sammii
c67a0cd3ce create and add ThemeProvider component to design system 2025-06-17 17:24:21 +01:00
Sammii
48e11a243f Icon refactor 2025-06-17 17:24:05 +01:00
Guido D'Orsi
b85423b39f Merge pull request #2546 from garden-co/changeset-release/main
Version Packages
2025-06-17 18:15:58 +02:00
github-actions[bot]
b698ffbf45 Version Packages 2025-06-17 16:03:38 +00:00
Sammii
de904698d8 amending Variant import in Icon 2025-06-17 17:01:14 +01:00
Guido D'Orsi
a026073c41 fix: export CoRecordSchema & CoProfileSchema types 2025-06-17 18:00:03 +02:00
Guido D'Orsi
5763c684c5 Merge pull request #2539 from garden-co/changeset-release/main
Version Packages
2025-06-17 17:37:06 +02:00
Sammii
7c8180dcb4 refactor pages for Layout view with dynamic header based on path 2025-06-17 16:35:01 +01:00
github-actions[bot]
a82b216901 Version Packages 2025-06-17 15:23:51 +00:00
Guido D'Orsi
f20182b1cc Merge pull request #2514 from garden-co/perf/async-storage
feat: improve missing deps recovery & parallelize storage reads
2025-06-17 17:20:46 +02:00
Sammii
da3e101c50 Button StyleVariant Type 2025-06-17 16:17:10 +01:00
Sammii
7605d228f2 page update inputs 2025-06-17 16:10:36 +01:00
Sammii
3063d74ab9 refactoring views, ading new input and icon views to page routes/pages 2025-06-17 16:09:59 +01:00
Sammii
2a4e3fc0cd refactoring components view and icons 2025-06-17 16:04:12 +01:00
Sammii
7cc6d63d40 Icons, styling an code tidy 2025-06-17 15:43:56 +01:00
Sammii
d574bbc521 Icon refactor, has background and refactor icon components on homepage 2025-06-17 15:40:44 +01:00
Sammii
6388a7272b add InputProps table and update ButtonsProps table 2025-06-17 15:23:07 +01:00
Sammii
cd358888d8 Table refactor 2025-06-17 15:22:42 +01:00
Sammii
f427f2324b incorporate icons into design system, with logic to colour button dependant on button variant and style 2025-06-17 15:21:55 +01:00
Brad Anderson
ef4fdff4fc Merge pull request #2543 from garden-co/fix/remove-rn-buffer-polyfill
fix: remove RN Buffer polyfill for ProgressiveImg
2025-06-17 09:48:53 -04:00
Trisha Lim
0f5e22f522 Merge pull request #2540 from garden-co/inspector/reduce-height
inspector: UI improvements
2025-06-17 14:12:10 +01:00
Brad Anderson
fc71d4548c fix: remove RN Buffer polyfill for ProgressiveImg 2025-06-17 09:04:30 -04:00
Guido D'Orsi
f5c90d875f chore: add comments on the account loading 2025-06-17 14:34:31 +02:00
Benjamin S. Leveritt
65963fffc8 Merge pull request #2273 from garden-co/feat/1514-coValue-types-data-access-docs
#1514 - Connecting CoValue docs
2025-06-17 12:44:12 +01:00
Benjamin S. Leveritt
d62285ba22 Moves cache out of ignored dir 2025-06-17 09:57:47 +01:00
Benjamin S. Leveritt
04575ff237 Adds caching to the highlights 2025-06-17 09:40:41 +01:00
Emil Sayahi
34a5e17cab merge 2025-06-16 15:13:24 -07:00
Emil Sayahi
759a800874 Merge branch 'main' into emil/findunique-slow 2025-06-16 15:07:11 -07:00
Emil Sayahi
c5ca74e2a9 feat: dedup CoMap creation code 2025-06-16 15:00:03 -07:00
Benjamin S. Leveritt
7f09bc9475 Merge pull request #2542 from garden-co/fix-highlighter
Fix highlighter
2025-06-16 21:36:35 +01:00
Emil Sayahi
0e4a523757 test: upsert with resolve != value 2025-06-16 13:33:10 -07:00
Benjamin S. Leveritt
d97956e5db Reverts highlighter 2025-06-16 21:06:50 +01:00
Benjamin S. Leveritt
38e0e3f29b Bumps rehype toc dep 2025-06-16 21:06:13 +01:00
Emil Sayahi
733b48ab2d test: upsert with resolve
- add comment in `CoValueCoreSubscription`
- add upsert with resolve tests

todo:
- upsert new comap with `value` not equaling `resolve` form
- upsert existing comap with `value` not equaling `resolve` form
2025-06-16 12:38:08 -07:00
Emil Sayahi
4bf6ecce9d feat: findUnique test -> loadUnique 2025-06-16 11:40:07 -07:00
Benjamin S. Leveritt
2526e88cd1 Merge pull request #2284 from garden-co/feat/1604-Add-docs-for-soft-delete 2025-06-16 19:05:42 +01:00
Emil Sayahi
f7742a0ba1 test: LocalNode.load with skipRetry 2025-06-16 10:21:00 -07:00
Trisha Lim
5360000f61 show copy button on raw data 2025-06-16 17:37:01 +01:00
Trisha Lim
ca638e4d92 inspector: show raw data for account type 2025-06-16 17:29:15 +01:00
Guido D'Orsi
594d68e9ee fix: delay session parsing to when the account becomes available 2025-06-16 18:28:23 +02:00
Trisha Lim
de1ea09ec5 reduce height of embedded inspector 2025-06-16 17:14:00 +01:00
Guido D'Orsi
cf30fbd575 chore: update lockfile 2025-06-16 18:04:18 +02:00
Guido D'Orsi
598e669705 fix: remove redundant initialAdmin check on getDependedOnCoValuesFromRawData 2025-06-16 18:03:19 +02:00
Guido D'Orsi
e4ed11cd9d fix: load missing accounts when required by new transactions 2025-06-16 18:03:19 +02:00
Guido D'Orsi
e74a077823 feat: improve missing dependencies recovery & management 2025-06-16 18:03:18 +02:00
Guido D'Orsi
680a2e2b99 perf(async-storage): parralelize reads 2025-06-16 18:03:18 +02:00
Guido D'Orsi
861d7b88f8 Merge pull request #2538 from garden-co/legowhales_main
fix: Svelte CoState reactivity issue v3
2025-06-16 18:02:26 +02:00
Guido D'Orsi
e35a380d16 chore: changeset 2025-06-16 17:55:20 +02:00
Guido D'Orsi
08b1601dd1 test(jazz-svelte): add test based on Virtua 2025-06-16 17:55:20 +02:00
Benjamin S. Leveritt
d413df4864 Adds optional to deleted 2025-06-16 16:51:12 +01:00
Trisha Lim
b897e950bb clean up 2025-06-16 16:46:07 +01:00
Trisha Lim
69c92ab908 fix test 2025-06-16 16:44:46 +01:00
Benjamin S. Leveritt
b177b09724 Removes a return 2025-06-16 16:24:49 +01:00
Benjamin S. Leveritt
3110459530 Fixes examples 2025-06-16 16:18:37 +01:00
Jérémy Le Mardelé
f66ed45460 fix: CoState reactivity issue v3 2025-06-16 17:17:12 +02:00
Trisha Lim
10e1612fd4 Revert "changeset"
This reverts commit 31b89adb03.
2025-06-16 16:07:30 +01:00
Trisha Lim
282a2798c7 undo inspector changes 2025-06-16 16:07:19 +01:00
Trisha Lim
31b89adb03 changeset 2025-06-16 15:58:15 +01:00
Trisha Lim
793787bc66 move files, create utils 2025-06-16 15:57:14 +01:00
Trisha Lim
9cbbd55eef Examples and github actions cleanup (#2529) 2025-06-16 15:45:52 +01:00
Trisha Lim
17710122af test: grid view and table view 2025-06-16 15:41:38 +01:00
Benjamin S. Leveritt
e4e3e173da Merge pull request #2536 from garden-co/benjamin-gco-564-docs-internal-links-showing-undefined-instead-of-proper
Refactor out remark/rehype plugins
2025-06-16 15:19:10 +01:00
Benjamin S. Leveritt
9a438a05ae Fixes typing 2025-06-16 15:06:35 +01:00
Benjamin S. Leveritt
fb126b8194 Refactors out highlight plugin 2025-06-16 13:56:27 +01:00
Benjamin S. Leveritt
a58ca736ec Moves html-to-jsx out 2025-06-16 13:49:00 +01:00
Benjamin S. Leveritt
39d916aeff Removes unused deps 2025-06-16 13:39:22 +01:00
Benjamin S. Leveritt
554dd8e6e6 Moves with-toc into plugin file 2025-06-16 13:39:22 +01:00
Benjamin S. Leveritt
8d8cb77316 Adds typechecks 2025-06-16 13:39:22 +01:00
Benjamin S. Leveritt
4c615ba5c2 Moves rehype-plugins into folder 2025-06-16 13:39:22 +01:00
Benjamin S. Leveritt
30dc4a8caa Moves with-slug fn out 2025-06-16 13:39:22 +01:00
Benjamin S. Leveritt
ffdad97a32 Fixes theme types 2025-06-16 13:39:21 +01:00
Benjamin S. Leveritt
f548199027 Typechecks next config 2025-06-16 13:39:16 +01:00
Benjamin S. Leveritt
9fecaee697 Adds test for header id 2025-06-16 13:37:27 +01:00
Benjamin S. Leveritt
f3409d8575 Moves generating header code out 2025-06-16 13:35:57 +01:00
Trisha Lim
1173884769 test: group members table 2025-06-16 13:24:26 +01:00
Trisha Lim
1c40b3fd6d test: show correct icon and label for each covalue type 2025-06-16 12:43:16 +01:00
Trisha Lim
8b66c92c46 Merge pull request #2531 from garden-co/feat/examples-analytics
track event: template command copied from examples page
2025-06-16 11:11:31 +01:00
Guido D'Orsi
dd60538ea2 Merge pull request #2511 from Wizzel1/Add-docs-for-accept-invite
Add docs for accept invite
2025-06-16 12:05:36 +02:00
Trisha Lim
8a7aab8520 Merge pull request #2530 from garden-co/chore/update-examples-tailwind-v4-shadcn
chore: update examples with shadcn to tailwind v4
2025-06-16 10:16:59 +01:00
Trisha Lim
d3fc467514 fix lock file conflicts 2025-06-16 09:56:50 +01:00
Emil Sayahi
2506ac799b feat(examples): update todo:
- update tests  - add test for  changes (see )  - add upserting test using resolve with new value  - add upserting test using resolve with existing value  - update  tests to be less timing-dependent  - add  tests  - re-evaluate if disconnections should be in  tests  - should update changeset too- try to deduplicate CoMap creation code
2025-06-13 15:25:17 -07:00
Emil Sayahi
905ba921b1 feat: update documentation
todo:
- update tests
  - add test for  changes (see )
  - add upserting test using resolve with new value
  - add upserting test using resolve with existing value
  - update  tests to be less timing-dependent
  - add  tests
  - re-evaluate if disconnections should be in  tests
- update  in  example
  - should update changeset too
- try to deduplicate CoMap creation code
2025-06-13 15:11:46 -07:00
Emil Sayahi
336b51eac7 fix: update some documentation
todo:
- update tests
  - add test for `localNode` changes (see `sync.load.test.ts`)
  - add upserting test using resolve with new value
  - add upserting test using resolve with existing value
  - update `skipRetry` tests to be less timing-dependent
  - add `loadUnique` tests
  - re-evaluate if disconnections should be in `upsertUnique` tests
- update documentation
  - change upserting pattern section to be about uniquely identifying comaps with human-readable strings
- try to deduplicate CoMap creation code
2025-06-13 14:25:20 -07:00
Emil Sayahi
b71a8dec3d feat: begin loadUnique
todo:
- update tests
  - add test for `localNode` changes (see `sync.load.test.ts`)
  - add upserting test using resolve with new value
  - add upserting test using resolve with existing value
  - update `skipRetry` tests to be less timing-dependent
  - add `loadUnique` tests
  - re-evaluate if disconnections should be in `upsertUnique` tests
- update changeset
- update documentation
  - add documentation to `loadUnique` method
  - mark `findUnique` method as deprecated
  - remove section on retrying loads
  - change upserting pattern section to be about uniquely identifying comaps with human-readable strings
- try to deduplicate CoMap creation code
2025-06-13 14:12:02 -07:00
Emil Sayahi
1058156953 test: add one more expect 2025-06-13 12:07:49 -07:00
Emil Sayahi
edbc10c892 fix: remove more logging 2025-06-13 12:03:35 -07:00
Emil Sayahi
4470d52326 fix: remove console.log 2025-06-13 12:02:08 -07:00
Emil Sayahi
b110f00561 chore: changeset 2025-06-13 11:41:43 -07:00
Emil Sayahi
f3f8baebba Merge branch 'main' into emil/findunique-slow 2025-06-13 11:18:30 -07:00
Emil Sayahi
d330e0e7e6 fix: formatting in homepage 2025-06-13 11:18:12 -07:00
Giordano Ricci
6d1bd2b70a Merge pull request #2532 from garden-co/fix/lock
fix: lock file
2025-06-13 19:12:01 +01:00
Emil Sayahi
5cf888930f Merge branch 'main' into emil/findunique-slow 2025-06-13 11:07:48 -07:00
Emil Sayahi
9d75d38bbd feat: docs for upsertUnique & skipRetry 2025-06-13 11:05:21 -07:00
Trisha Lim
6e79c8679e fix: lock file 2025-06-13 18:09:26 +01:00
Trisha Lim
222a8c2976 lint fix 2025-06-13 18:02:03 +01:00
Trisha Lim
5b7f02024e undo wordlist change 2025-06-13 18:02:03 +01:00
Trisha Lim
4b94b25a11 fix button variant 2025-06-13 18:02:03 +01:00
Trisha Lim
a99df9cb13 pets app: upgrade to tailwind v4 2025-06-13 18:02:02 +01:00
Trisha Lim
d359a4f491 music player app: upgrade to tailwind v4 2025-06-13 18:01:53 +01:00
Trisha Lim
588d7f41a2 todo app: upgrade radix 2025-06-13 18:01:53 +01:00
Trisha Lim
1951d0f5b1 todo app: upgrade to tailwind v4 2025-06-13 18:01:53 +01:00
Trisha Lim
3ffb74d170 Merge pull request #2520 from garden-co/chore/update-examples-tw-v4
chore: upgrade examples to tailwind v4
2025-06-13 18:01:04 +01:00
Emil Sayahi
8a45dae3f7 cleanup
todo:
- update docs
- changeset
2025-06-13 09:31:11 -07:00
Emil Sayahi
6110c82106 fix: skipRetry handling update 2025-06-13 09:18:53 -07:00
Guido D'Orsi
597545741b Merge pull request #2515 from garden-co/changeset-release/main
Version Packages
2025-06-13 17:58:33 +02:00
github-actions[bot]
5e42e2a8d8 Version Packages 2025-06-13 15:52:42 +00:00
Guido D'Orsi
19e2a61398 fix: changeset 2025-06-13 17:48:32 +02:00
Trisha Lim
cb5fe3380e track event: template command copied from examples page 2025-06-13 16:48:00 +01:00
Sammii
d0e2041b10 styling adjustments 2025-06-13 16:44:16 +01:00
Sammii
edce59d238 making everything fully responsive 2025-06-13 16:35:12 +01:00
Sammii
7f75d852c1 tailwind config amends 2025-06-13 16:21:30 +01:00
Sammii
2683af7d28 ameding tailwind config 2025-06-13 16:14:31 +01:00
Sammii
4223720010 formatting 2025-06-13 16:09:43 +01:00
Sammii
1b4508fea7 making layout with side nav fully responsive 2025-06-13 16:06:21 +01:00
Trisha Lim
5b06a9d0a7 Merge pull request #2528 from garden-co/chat-svelte
Create Svelte version of chat example
2025-06-13 15:29:58 +01:00
Trisha Lim
41c4fbb8f9 update lock file 2025-06-13 15:14:20 +01:00
Trisha Lim
95febc7777 Revert "update lock file"
This reverts commit 7d80839396a88bfa85d71a79a0fe899b0b6c9fc1.
2025-06-13 15:13:35 +01:00
Trisha Lim
7ddff0a550 update lock file 2025-06-13 15:13:35 +01:00
Joe Innes
cebc58cd3a fix(layout): 🔄 revert to random username generation
* Removed derived username assignment from URL parameters.

https://github.com/garden-co/jazz/pull/2339#discussion_r2139972049
2025-06-13 15:13:22 +01:00
Joe Innes
044626fbc8 test(chat): add test to ensure user is not assigned 'Anonymous user' name
* Implemented a new test case to verify that users do not receive the username 'Anonymous user' upon joining the chat.
* Added a method `expectUserNameNotToBeAnonymousUser` in `ChatPage` to facilitate this check.
2025-06-13 15:13:22 +01:00
Joe Innes
28fdc43c89 fix(chat): 🔄 reload on logout to update profile name
* Ensure the application reloads after logging out to reflect the default profile name.
* Also trim the `user` URL param (in case a user passes an empty param, generate a random username)
2025-06-13 15:13:22 +01:00
Joe Innes
2602a49f12 fix(app.html): 🖼️ add type attribute to icon link
* Ensures the correct MIME type is specified for the icon.
2025-06-13 15:13:22 +01:00
Joe Innes
8505b0a0b6 Minor tweaks:
- Update API Key
- Remove Prettier comment
- Fix README (#2424)
2025-06-13 15:13:22 +01:00
Joe Innes
f2418ff364 Create Svelte version of chat example 2025-06-13 15:13:22 +01:00
Joe Innes
c81a49ebc3 Create Svelte version of chat example 2025-06-13 15:13:20 +01:00
Sammii
776fa09279 refactoring entire design system view for routes base views, created layout and side menu 2025-06-13 15:10:43 +01:00
Sammii
5c200aa60d updating globals.css 2025-06-13 14:13:51 +01:00
Sammii
9fc6c5f6c8 updating Input imports 2025-06-13 14:12:40 +01:00
Sammii
7e06cd4a77 refactor Colors view 2025-06-13 14:12:30 +01:00
Sammii
c43191d97b amending taiwlind config 2025-06-13 14:08:05 +01:00
Sammii
5706b5eb81 Buttons prop table refactor 2025-06-13 14:06:46 +01:00
Guido D'Orsi
3cd07dca31 Merge pull request #2518 from garden-co/fix/passkey-login
fix(passkey): increase the challenge to 20 bytes and disable the attestation
2025-06-13 15:05:15 +02:00
Trisha Lim
f69707f1af fix lock file 2025-06-13 13:40:46 +01:00
Trisha Lim
57e748d2ba undo upgrading pets and music app 2025-06-13 13:37:47 +01:00
Trisha Lim
c0cfdc0d32 update examples to tailwind v4 2025-06-13 13:37:47 +01:00
Guido D'Orsi
3763a99e14 test: fix passskey tests 2025-06-13 14:01:30 +02:00
Sammii
5eed930997 button refactor for outline style variants 2025-06-13 12:35:48 +01:00
Sammii
35e5e50508 table refactor 2025-06-13 12:24:08 +01:00
Guido D'Orsi
201e2fd015 Merge pull request #2299 from garden-co/emil/group-inheritance-evolution
feat: deprecate extend methods
2025-06-13 13:18:21 +02:00
Sammii
e88a3d0712 adding more variety to Component displays 2025-06-13 10:50:38 +01:00
Sammii
13b64af5b2 adding colour defaulty for dark mode 2025-06-13 10:41:15 +01:00
Sammii
9804c6a729 refactoring Inputs and resolving + showcasing all combinations of labels, positions, icons and buttons available 2025-06-13 10:40:26 +01:00
Guido D'Orsi
3e743d56d3 fix: improve the error UI in PasskeyAuthBasicUI 2025-06-13 11:37:43 +02:00
Guido D'Orsi
b3ff726794 chore: changeset 2025-06-13 11:25:08 +02:00
Guido D'Orsi
f98f88d89b fix: restore the attestation to direct 2025-06-13 11:24:46 +02:00
Emil Sayahi
ea3a69cf53 fix: reduce timeout for flaky test
todo:
- remove `console.log`s
- update docs
2025-06-12 19:34:41 -07:00
Emil Sayahi
24987fa9ec tests: skipRetry 2025-06-12 19:23:20 -07:00
Trisha Lim
56974412df Merge pull request #2513 from joeinnes/2371-gitignore-dotenv-files
chore: ✏️ update README and .gitignore files
2025-06-12 20:23:11 +01:00
Joe Innes
adaedd2da2 chore: ✏️ update .env.example and fix demo URL
* Added .env.example file with necessary environment variables.
* Corrected demo URL in README.
2025-06-12 21:13:56 +02:00
Guido D'Orsi
a11472a497 chore: show the error cause on the PasskeyAuthBasicUI 2025-06-12 20:02:29 +02:00
Guido D'Orsi
3f269c7483 chore: log the error cause on the music player auth modal 2025-06-12 20:00:55 +02:00
Guido D'Orsi
81b6b8fd04 fix: increase the challenge to 20 bytes and disable the attestation 2025-06-12 19:47:55 +02:00
Trisha Lim
2939790335 Merge pull request #2306 from garden-co/feat/svelte-starter
svelte starter app
2025-06-12 16:18:41 +01:00
Guido D'Orsi
7e4ba07c4c fix type error on sharing.mdx 2025-06-12 17:14:13 +02:00
Trisha Lim
48c29435bc replace Loaded with co.loaded 2025-06-12 15:53:54 +01:00
Trisha Lim
8668906376 refactor helper methods in starters 2025-06-12 15:53:54 +01:00
Trisha Lim
6d84e9e83f remove changelog 2025-06-12 15:53:54 +01:00
Trisha Lim
1fea0ef69c match prettier with monorepo biome as much as possible 2025-06-12 15:53:54 +01:00
Trisha Lim
e4314accb6 upgrade vite 2025-06-12 15:53:54 +01:00
Trisha Lim
ee3a4048ef missing test command 2025-06-12 15:53:54 +01:00
Trisha Lim
9ee1edef3b update lock file 2025-06-12 15:53:53 +01:00
Trisha Lim
8ab5a09a86 fix vite and tailwind config 2025-06-12 15:53:53 +01:00
Trisha Lim
2624442903 add playwright tests 2025-06-12 15:53:52 +01:00
Trisha Lim
2d199089d5 svelte starter 2025-06-12 15:53:14 +01:00
Trisha Lim
683c170b9d svelte starter 2025-06-12 15:53:14 +01:00
Sammii
937d415cc2 add home page pnpm lock 2025-06-12 14:59:41 +01:00
Joe Innes
ce0e9f0102 chore: ✏️ update README and .gitignore files
* Added instructions for renaming `.env.example` to `.env` in multiple README files.
* Updated `.gitignore` files to include `.env` and `.env.*` while excluding `.env.example` and `.env.test`.
* Removed `.env` file from `examples/multi-cursors`.
* Improved consistency across example projects.
2025-06-12 13:40:19 +02:00
Benjamin S. Leveritt
518406e23d Merge pull request #2497 from garden-co/benjamin-gco-546-throw-on-typecheck-failures-with-twoslash
Throw on typecheck failures with twoslash
2025-06-12 12:39:53 +01:00
Sammii
9196154207 adding states for all button colors 2025-06-12 12:23:48 +01:00
Sammii
c907b2aac2 adding states for all button variants, styleVariants 2025-06-12 12:20:32 +01:00
Nikos Papadopoulos
4dcbafa058 Merge pull request #2508 from garden-co/2503-create-invitation-onclick-rather-than-pre-emptively-in-org-example
organization example app: Invitation creation moved to button click event
2025-06-12 13:06:09 +02:00
Benjamin S. Leveritt
7ae9e01848 Fix. 2025-06-12 11:27:13 +01:00
Benjamin S. Leveritt
dd9ecf660d Fix? 2025-06-12 11:24:22 +01:00
Benjamin S. Leveritt
4f849050dc Fix? 2025-06-12 11:17:33 +01:00
Wizzel1
7591ac1f7e Update homepage/homepage/content/docs/groups/sharing.mdx
Co-authored-by: Guido D'Orsi <gu.dorsi@gmail.com>
2025-06-12 11:48:08 +02:00
Benjamin S. Leveritt
681600220f Excludes homepage from catalog deps 2025-06-12 10:36:26 +01:00
Benjamin S. Leveritt
384e239ad5 Bumps next to 15 in design system 2025-06-12 10:25:34 +01:00
Benjamin S. Leveritt
54e1a09a46 Bumps next to 15 2025-06-12 10:24:07 +01:00
Benjamin S. Leveritt
392a9c5aac Moves react deps to catalogs 2025-06-12 10:22:28 +01:00
Wizzel1
7f9b82a975 Add cut to hide type errors
Co-authored-by: Guido D'Orsi <gu.dorsi@gmail.com>
2025-06-12 11:16:53 +02:00
Sammii
b5a9dfa7ec adding active and focus states to base variant button types 2025-06-12 10:15:23 +01:00
Sammii
113c77b416 removing padding from text buttons 2025-06-12 10:14:37 +01:00
Sammii
cad5444400 more color tweaks 2025-06-12 10:14:04 +01:00
Sammii
b2b350e4d0 adding light dark variables to all semeantic color vars 2025-06-12 10:13:47 +01:00
Wizzel1
5f65ca0874 Rephrase context 2025-06-12 10:58:59 +02:00
Wizzel1
5a88024420 Clean up section 2025-06-12 10:54:20 +02:00
Wizzel1
bf025724aa Add section 2025-06-12 10:52:58 +02:00
Sammii
80d5d62852 code tidy 2025-06-12 09:36:08 +01:00
Benjamin S. Leveritt
478334eabf Merge pull request #2482 from garden-co/2480-add-more-context-to-introduction-from-the-homepage
Adds context to the introduction page
2025-06-12 08:49:10 +01:00
Benjamin S. Leveritt
479f9b0113 Adds extends to turbo configs
As they're in a workspace
2025-06-12 08:33:16 +01:00
Benjamin S. Leveritt
812622b161 Adds package manager to package.json 2025-06-12 08:25:59 +01:00
Benjamin S. Leveritt
8b35fae4b6 Adds an error suppression for old code 2025-06-12 08:20:53 +01:00
Benjamin S. Leveritt
9e2ecb0378 Bumps React to 19 2025-06-12 08:11:54 +01:00
Emil Sayahi
527082b108 start working on skipRetry
tests still need work
ideas:
- test for local loading with skipRetry=false (should load)
- test for local loading with skipRetry=true (should load)
- test for remote loading with skipRetry=false (should load)
- test for remote loading with skipRetry=true (should not load)
2025-06-11 17:24:03 -07:00
Guido D'Orsi
fe908b5300 Merge pull request #2502 from garden-co/changeset-release/main
Version Packages
2025-06-11 19:03:46 +02:00
github-actions[bot]
1f99807971 Version Packages 2025-06-11 16:52:35 +00:00
Guido D'Orsi
47f54c4d81 Merge pull request #2490 from garden-co/fix/svelte-auth-state
feat(svelte): add isAuthenticated state to AccountCoState & fix id reactivity edge cases
2025-06-11 18:44:31 +02:00
Guido D'Orsi
814f65acaf Merge pull request #2509 from garden-co/fix/rn-db-connection-reuse
fix(rn): reuse the same db connection when doing login/logout
2025-06-11 18:44:08 +02:00
Guido D'Orsi
78fd4c86a1 Merge pull request #2506 from garden-co/fix/clerk-test
fix(clerk example): missing api key in e2e test
2025-06-11 18:37:25 +02:00
Guido D'Orsi
678f326bc1 fix(rn): reuse the same db connection when doing login/logout 2025-06-11 18:25:07 +02:00
Guido D'Orsi
ea33ad4864 fix(svelte): fix some edge cases in the id reactivity on CoState 2025-06-11 18:18:28 +02:00
Guido D'Orsi
57b6d5efb4 test: skip failing tests on PasskeyAuthBasicUI/svelte 2025-06-11 18:18:09 +02:00
Guido D'Orsi
15929b121d feat(svelte): add isAuthenticated state to AccountCoState 2025-06-11 18:18:09 +02:00
Nikos Papadopoulos
6edd061202 removes invite link state 2025-06-11 17:07:07 +01:00
Trisha Lim
eb4cef196c inspector: add tests with playwright (#2500)
* test account dropdown

* remove unused packages

* test account

* attempt test covalues

* test: add createAccount utility

* move things around

* improve locator text

* add inspector to playwright.yml

---------

Co-authored-by: Guido D'Orsi <gu.dorsi@gmail.com>
2025-06-11 17:05:14 +01:00
Emil Sayahi
85703f9241 fix: remove .env from betterauth example (#2507)
* fix: remove `.env` from `betterauth` example

* fix: match convention
2025-06-11 08:59:39 -07:00
Nikos Papadopoulos
865d5385e9 moves invitation creation to button click event in organization example app 2025-06-11 16:55:18 +01:00
Trisha Lim
5bb12523ee create-jazz-app: delete .env.test file 2025-06-11 16:37:26 +01:00
Trisha Lim
190cb1efb2 copy .env.test to .env in test 2025-06-11 16:15:52 +01:00
Trisha Lim
46ab1f6db2 try .env.test 2025-06-11 15:55:29 +01:00
Trisha Lim
a44fc6fc6d move env to build step 2025-06-11 15:36:29 +01:00
Trisha Lim
2376a8d3b2 add .env.example to clerk examples 2025-06-11 15:34:05 +01:00
Trisha Lim
2c3ec2fea6 fix(clerk example): missing api key in e2e test 2025-06-11 15:26:35 +01:00
Nikos Papadopoulos
da6f6ec4d5 Merge pull request #2496 from garden-co/2462-add-jazz-inspector-to-all-example-apps
integrates inspector to all example apps
2025-06-11 16:21:38 +02:00
Guido D'Orsi
8c78b37bfb Merge pull request #2492 from garden-co/feat/add-error-boundary-for-inspector
Add error boundary for inspector
2025-06-11 16:18:03 +02:00
Sammii
75f8833c1a add toaster to design system 2025-06-11 15:14:07 +01:00
Sammii
99d1f3f28b add toast refacvtor table with new isCopyable prop + functionality 2025-06-11 15:13:22 +01:00
Nikos Papadopoulos
5f382309de updates pnpm-lock.yaml 2025-06-11 15:04:31 +01:00
Divya
aa7eb3cf2c fix: ts error with error type 2025-06-11 09:36:23 -04:00
Divya
9b41762e96 fix: styling 2025-06-11 09:23:07 -04:00
Nikos Papadopoulos
28be460286 Merge pull request #2504 from garden-co/nikos/clerk_rn_env_ignore
fix for clerk rn example app .env
2025-06-11 15:22:27 +02:00
Divya
df8af06814 fix: pr feedback 2025-06-11 09:14:04 -04:00
Divya
2ef460fccf fix: build errors and style tweaks 2025-06-11 09:14:04 -04:00
Divya
9660e2c03c feat: Add error boundary to inspector so we can tell if a coId is invalid 2025-06-11 09:14:04 -04:00
Nikos Papadopoulos
908645e4b7 removes clerk rn example app .env and updates .gitignore rules 2025-06-11 14:11:29 +01:00
Nikos Papadopoulos
f3ca37ed5e Merge pull request #2501 from garden-co/nikos/clerk_env_ignore
fix for clerk example app .env
2025-06-11 14:57:03 +02:00
Nikos Papadopoulos
a9d0fd14c4 removes unused inspector dependency from passkey-svelte package.json 2025-06-11 13:51:14 +01:00
Guido D'Orsi
c496f49bb0 Merge pull request #2499 from garden-co/2498-fix-progressiveimg-cannot-be-used-as-a-jsx-component
Fix `ProgressiveImg` cannot be used as a jsx component
2025-06-11 14:42:09 +02:00
Nikos Papadopoulos
b26666ab4c removes clerk example app .env and updates .gitignore rules 2025-06-11 13:26:20 +01:00
Sammii
4066cfe011 adding rest of button props 2025-06-11 13:00:43 +01:00
Sammii
e5f8b06af1 resolve favicon 2025-06-11 13:00:26 +01:00
Benjamin S. Leveritt
9088a349a0 Adds changeset 2025-06-11 12:49:35 +01:00
Benjamin S. Leveritt
54b12dcb7a Returns explicit type for ProgressiveImg 2025-06-11 12:47:34 +01:00
Benjamin S. Leveritt
a998f94789 Includes the recommendation in the error 2025-06-11 12:46:53 +01:00
Sammii
485b5a238d styling Table component 2025-06-11 12:29:40 +01:00
Sammii
c42ee6d6e2 putting the favicon in the public folder 2025-06-11 12:29:23 +01:00
Benjamin S. Leveritt
d17eecfe16 Removes z.null from docs 2025-06-11 12:19:29 +01:00
Sammii
1fb2fd0f50 creating button prop table 2025-06-11 12:14:50 +01:00
Sammii
0fce4adfc5 creating Table component 2025-06-11 12:14:37 +01:00
Nikos Papadopoulos
71b9a5ce25 updates clerk example .gitignore to add .env exclusion 2025-06-11 11:55:17 +01:00
Sammii
b59086c808 doc amend 2025-06-11 11:51:35 +01:00
Sammii
fe91463652 adjusting examples 2025-06-11 11:50:34 +01:00
Sammii
b9065db109 adjusting button styling 2025-06-11 11:45:48 +01:00
Sammii
d13da295ed updating Components 2025-06-11 11:44:26 +01:00
Sammii
0291389c3b update buttons 2025-06-11 11:43:53 +01:00
Sammii
f417f518cb refactor NewsletterForm with new InputWithButton component 2025-06-11 11:43:35 +01:00
Sammii
f69f99a209 create InputWithButton 2025-06-11 11:42:17 +01:00
Sammii
31c4fd7c07 refactor Input 2025-06-11 11:41:35 +01:00
Sammii
613aadd775 create Label 2025-06-11 11:41:10 +01:00
Sammii
0f969b4be4 add search icon to Icon 2025-06-11 11:40:53 +01:00
Sammii
f7ac1015b2 refactor Button to use Icon and remove own ButtonIcon component, introduce icon position 2025-06-11 11:40:02 +01:00
Benjamin S. Leveritt
8ebfbc86db Rethrows in production 2025-06-11 11:36:56 +01:00
Benjamin S. Leveritt
abad8e762f Changes config to throw on typecheck error 2025-06-11 11:21:49 +01:00
Benjamin S. Leveritt
037e16392e Removes list of frameworks 2025-06-11 10:55:19 +01:00
Benjamin S. Leveritt
49ac65c123 Reorders list 2025-06-11 10:55:19 +01:00
Benjamin S. Leveritt
3510fb1273 Update homepage/homepage/content/docs/index.mdx
Co-authored-by: Anselm Eickhoff <anselm.eickhoff@gmail.com>
2025-06-11 10:55:19 +01:00
Benjamin S. Leveritt
bc3efe7ca0 Tweaks 2025-06-11 10:55:19 +01:00
Benjamin S. Leveritt
3b06a7809e Adds why and how sections 2025-06-11 10:55:18 +01:00
Benjamin S. Leveritt
58aa04bb10 Adds introduction paragraph 2025-06-11 10:55:18 +01:00
Trisha Lim
afb94ef043 Merge pull request #2487 from garden-co/feat/link-to-frameworks
link to framework docs from homepage
2025-06-11 10:34:29 +01:00
Nikos Papadopoulos
7554dd9f88 integrates inspector to all example apps 2025-06-11 10:13:21 +01:00
Benjamin S. Leveritt
7a3cfabb4c Merge pull request #2481 from garden-co/changeset-release/main
Version Packages
2025-06-11 09:49:08 +01:00
github-actions[bot]
df7101a8ee Version Packages 2025-06-11 08:47:01 +00:00
Benjamin S. Leveritt
f74b46ee2f Merge pull request #2495 from garden-co/2494-applydiff-out-of-bounds-for-strings-with-emoji
Fix: `applyDiff` out of bounds for strings with emoji
2025-06-11 09:43:30 +01:00
Benjamin S. Leveritt
9177579f53 Fixs coText applyDiff out of bounds insertion with emoji 2025-06-11 09:35:56 +01:00
Benjamin S. Leveritt
f1c00903f9 Removes unused navigator code 2025-06-11 09:34:06 +01:00
Benjamin S. Leveritt
1ca9299590 Adds grapheme split helpers for coText 2025-06-11 09:33:45 +01:00
Emil Sayahi
63500e17f2 feat: upsertUnique 2025-06-10 18:20:28 -07:00
Trisha Lim
4f0fb6c27f link to framework docs from homepage 2025-06-10 22:59:51 +01:00
Benjamin S. Leveritt
34082ccaf5 Merge pull request #2486 from garden-co/add-context-to-twoslash-errors
Adds more details to twoslash errors
2025-06-10 17:40:55 +01:00
Benjamin S. Leveritt
a09c417d81 Formats title and code to make is easier to spot 2025-06-10 17:36:41 +01:00
Emil Sayahi
034bd20b39 Merge branch 'main' into emil/group-inheritance-evolution 2025-06-10 09:10:10 -07:00
Benjamin S. Leveritt
00a188c22f Merge pull request #2484 from garden-co/2483-encryption-in-jazz-docs
2483 encryption in jazz docs
2025-06-10 16:39:31 +01:00
Benjamin S. Leveritt
dc630b0807 Update homepage/homepage/content/docs/resources/encryption.mdx
Co-authored-by: Anselm Eickhoff <anselm.eickhoff@gmail.com>
2025-06-10 16:39:20 +01:00
Benjamin S. Leveritt
484baabe22 Updates introduction sentence as per feedback 2025-06-10 16:38:16 +01:00
Benjamin S. Leveritt
f529bede7b Adds more details to twoslash errors
To make it easier to track down
2025-06-10 16:37:01 +01:00
Emil Sayahi
87f82ac7cd fix(changeset): minor to patch 2025-06-10 08:07:48 -07:00
Trisha Lim
6f637d21ab Merge pull request #2446 from garden-co/feat/analytics
feat: track create-jazz-app copy action in hero
2025-06-10 15:54:23 +01:00
Benjamin S. Leveritt
aeb96510da Adds a section to the FAQ 2025-06-10 15:31:20 +01:00
Benjamin S. Leveritt
d53cc3676d Adds Encryption reference doc 2025-06-10 15:23:13 +01:00
Guido D'Orsi
81dedb6395 Merge pull request #2448 from garden-co/fix/react-native-db-connection
fix(react-native): close db connections and keep the same instance of storage over JazzProvider renders
2025-06-10 12:24:19 +02:00
Nikos Papadopoulos
17cb04bfb1 Merge pull request #2478 from garden-co/2477-fix-mime-types-for-favicon-in-all-example-apps
fixes favicon mime type for example apps
2025-06-10 12:22:39 +02:00
Nikos Papadopoulos
a98b4e5d81 updates links to public directory 2025-06-09 23:13:47 +01:00
Nikos Papadopoulos
7eb7e2f656 reorders metadata tags for consistency across example apps 2025-06-09 20:22:36 +01:00
Nikos Papadopoulos
80703ea1cc tidy up for metadata tags 2025-06-09 20:15:49 +01:00
Nikos Papadopoulos
d46e0b9d0c fixes favicon mime type, replaces png with ico files where applicable, moves favicon to ./public for consistency 2025-06-09 20:00:45 +01:00
Nikos Papadopoulos
430a9e252a Merge pull request #2475 from garden-co/2474-fix-favicon-for-richtext-prosekit-and-organization-examples
fixes missing favicon for richtext-prosekit and organization examples
2025-06-09 16:26:19 +02:00
Nikos Papadopoulos
6f519462df fixes missing favicon for richtext-prosekit and organization examples 2025-06-09 15:13:41 +01:00
Guido D'Orsi
a0ae2811ce test: wait for Join chat to be visible 2025-06-09 15:51:01 +02:00
Guido D'Orsi
73e5a3548a fix: make chat-rn example private 2025-06-09 13:03:04 +02:00
Guido D'Orsi
c5da3a42a1 fix: remove version field from examples to exclude them from the changelog 2025-06-09 12:49:07 +02:00
Guido D'Orsi
74fa115709 Merge pull request #2455 from garden-co/changeset-release/main
Version Packages
2025-06-09 12:41:11 +02:00
github-actions[bot]
baa5278cf3 Version Packages 2025-06-09 10:33:53 +00:00
Guido D'Orsi
6852b60e72 Merge pull request #2471 from garden-co/fix/account-migration-loaded-types
Ensure the types on withMigration expect a shallowly loaded Account
2025-06-09 12:30:04 +02:00
Anselm
fc2b054fc2 Fix formatting 2025-06-09 11:13:02 +01:00
Anselm
048ac1d54f Add changeset 2025-06-09 11:10:47 +01:00
Anselm
4ed7d61ea4 Ensure the types on withMigration expect a shallowly loaded Account 2025-06-09 11:10:18 +01:00
Trisha Lim
ced325da06 Merge pull request #2470 from garden-co/docs/inspector-full-json 2025-06-09 10:23:53 +01:00
Trisha Lim
5563799a2a lint fix 2025-06-09 09:19:35 +01:00
Trisha Lim
5a783f8eac Merge pull request #2467 from joeinnes/fix-small-screen-x-overflow
Add w-full to the pagefind container div
2025-06-09 09:17:13 +01:00
Trisha Lim
0ea1530ee9 update inspector docs instruction for passing credentials 2025-06-09 09:12:56 +01:00
Trisha Lim
164579ee9c Merge pull request #2469 from timolins/paste-json-inspector
[Inspector] Allow pasting of full account JSON
2025-06-09 09:00:59 +01:00
Timo Lins
fc453e68c1 Allow pasting of full json into inspector account 2025-06-08 21:22:46 +02:00
Joe Innes
48544ca4d1 Add w-full to the pagefind container div. 2025-06-07 14:55:10 +02:00
Sammii
d7c5d4a03d styling homepage with design system 2025-06-06 17:49:03 +01:00
Sammii
8384c55cce amending muted tailwind config 2025-06-06 17:48:20 +01:00
Nikos Papadopoulos
b2e2b91dd7 Merge pull request #2461 from garden-co/nikos/ex-app-prosemirror-layout
updates richtext-prosemirror example app layout
2025-06-06 18:16:00 +02:00
Nikos Papadopoulos
36d7791326 updates richtext-prosemirror example app class names 2025-06-06 16:45:53 +01:00
Nikos Papadopoulos
707d84dea0 updates richtext-prosemirror example app layout 2025-06-06 16:22:27 +01:00
Sammii
be947d1086 fixing more paths 2025-06-06 16:19:32 +01:00
Sammii
3924bb2ede making paths fixed 2025-06-06 16:03:15 +01:00
Sammii
2e3003c2fc styling and tweaking Switch and Components 2025-06-06 15:47:32 +01:00
Sammii
5ec15ba0a2 refactoring Forms to Components and adding Switch 2025-06-06 15:44:15 +01:00
Emil Sayahi
6da8e3948c feat(docs): search (#2378)
* feat: documentation search results

Signed-off-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
Co-authored-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
Co-authored-by: Trisha Lim <hello@trishalim.com>
2025-06-06 15:27:55 +01:00
Sammii
c7ccf5c5d7 switch refactor 2025-06-06 15:18:33 +01:00
Sammii
9e8c81a1a6 button refactor 2025-06-06 15:18:23 +01:00
Sammii
c563e2547f button refactor 2025-06-06 15:14:54 +01:00
Sammii
00cb697bc7 moving the component views to /src/views 2025-06-06 14:37:06 +01:00
Sammii
a6a0560059 Merge branch 'main' into feat/design-system-improvements 2025-06-06 14:34:38 +01:00
Sammii
225da5ca42 Merge pull request #2458 from garden-co/feat/covalues-visualisation 2025-06-06 15:14:28 +02:00
Anselm Eickhoff
3943f7fc41 Merge pull request #2460 from garden-co/fix/vercel-ingore-build-project-id
Use vercel project ID for ignore build step
2025-06-06 14:03:59 +01:00
Anselm
d982bb50db Use vercel project ID for ignore build step 2025-06-06 14:02:51 +01:00
Sammii
55fa5977c2 formatting 2025-06-06 13:48:15 +01:00
Sammii
8b4bc1bc97 updating design system favicon 2025-06-06 13:46:27 +01:00
Sammii
92de0a6683 covalues page update 2025-06-06 13:36:33 +01:00
Sammii
e10d00b444 switch refactor 2025-06-06 13:36:24 +01:00
Sammii
89b6c1cbb9 creating Switch component from radix 2025-06-06 13:34:47 +01:00
Sammii
6ec1933d65 updating schema to zod 2025-06-06 13:34:18 +01:00
Nikos Papadopoulos
854c6761a4 Merge pull request #2459 from garden-co/nikos/docs-url-updates
updates example app URLs in documentation
2025-06-06 14:19:10 +02:00
Nikos Papadopoulos
fc8acb0688 updates example app URLs in documentation 2025-06-06 13:10:50 +01:00
Trisha Lim
7a65b35ac5 Merge pull request #2437 from garden-co/chore/tailwind-v4
chore: update react starter to tailwind v4
2025-06-06 12:45:22 +01:00
Trisha Lim
2ef3938d71 update lock file 2025-06-06 12:09:16 +01:00
Trisha Lim
1e71b23779 fix(starter): wording 2025-06-06 12:08:37 +01:00
Trisha Lim
31071a4b21 chore: update react starter to tailwind v4 2025-06-06 12:08:35 +01:00
Sammii
8f53a52110 moving covalues folder into app to see components on /covalues 2025-06-06 10:04:25 +01:00
Anselm Eickhoff
08b105508f Merge pull request #2440 from garden-co/optimize-vercel-deployments
Optimize Vercel deployments
2025-06-06 09:22:00 +01:00
Benjamin S. Leveritt
f567b3d24b Restore homepage build script 2025-06-06 08:52:52 +01:00
Benjamin S. Leveritt
dd750fc6e8 Remove ignore scripts
Signed-off-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
2025-06-06 08:52:01 +01:00
Benjamin S. Leveritt
814d99e0bc Remove app name from examples 2025-06-06 08:02:38 +01:00
Benjamin S. Leveritt
0eb70c2171 Investigating what turbo-ignore defaults to on Vercel 2025-06-06 07:52:42 +01:00
Benjamin S. Leveritt
64e787a57f Remove app name 2025-06-06 07:25:11 +01:00
Benjamin S. Leveritt
1e8c3df83e Remove app name, as we no longer use it 2025-06-06 07:24:50 +01:00
Benjamin S. Leveritt
5013b1d97d Add prosekit 2025-06-06 07:24:27 +01:00
Benjamin S. Leveritt
c4837b9b92 Add ignore to organization 2025-06-06 07:10:41 +01:00
Benjamin S. Leveritt
e527cb676b Fix clerk vercel config 2025-06-06 07:02:55 +01:00
Benjamin S. Leveritt
2c75c46029 Adds turbo-ignore to examples 2025-06-06 07:00:38 +01:00
Benjamin S. Leveritt
f92f65cc28 Trying turbo-ignore 2025-06-06 06:51:17 +01:00
Benjamin S. Leveritt
d88a94bc68 Lets see what refs we have 2025-06-05 21:26:09 +01:00
Guido D'Orsi
e9bf27467f Merge pull request #2445 from garden-co/docs/rnqc-provider
docs: RNQuickCrypto provider docs
2025-06-05 21:57:49 +02:00
Sammii
c9bd778c03 Merge pull request #2456 from garden-co/feat/create-team-profile-pages
Feat/create team profile pages
2025-06-05 21:30:39 +02:00
Sammii
c3832ad794 fix formatting qualms 2025-06-05 19:26:58 +01:00
Sammii
9b807cbba9 updating gios name 2025-06-05 19:15:21 +01:00
Sammii
32fd3cab19 creating individual team member profiles 2025-06-05 19:12:39 +01:00
Sammii
7502dba11b add Brad to team page 2025-06-05 18:43:33 +01:00
Sammii
df403ccbc6 styling button new tab icon 2025-06-05 18:41:24 +01:00
Guido D'Orsi
e9baf69126 Merge pull request #2439 from garden-co/emil/addMember-error-message
fix: clarify `Group.addMember` error message
2025-06-05 19:28:52 +02:00
Trisha Lim
f597d64423 homepage alignment fix (#2453) 2025-06-05 18:22:47 +01:00
Trisha Lim
5c8ce99ab5 Merge pull request #2449 from garden-co/feat/updated-created-dates
docs and example for _createdAt and _lastUpdatedAt
2025-06-05 18:10:38 +01:00
Joe Innes
679ca6c36b docs: ✏️ Update README files to reflect changes in local sync server setup (#2444)
* docs: ✏️ Update README files to reflect changes in local sync server setup

- Changed instructions for running a local sync server to use `sync` parameter format: `{ peer: "ws://localhost:4200" }`.
- Updated multiple example README files for consistency across projects.

* Restore the example in the music player for reference
2025-06-05 18:09:34 +01:00
Emil Sayahi
e6130219fe fix: explicitly check if other account is admin 2025-06-05 10:03:45 -07:00
Trisha Lim
046075288b docs: _createdAt and _lastUpdatedAt 2025-06-05 17:38:54 +01:00
Trisha Lim
57fa927640 use history utility functions in version history app 2025-06-05 17:28:14 +01:00
Guido D'Orsi
8ef14d4850 fix: do not create a storage adapter on each JazzProvider render 2025-06-05 18:22:00 +02:00
Guido D'Orsi
1a7b7942ad test(expo): restore the chat loading test 2025-06-05 18:22:00 +02:00
Guido D'Orsi
5f42c97184 fix: close the DB connection when the node/context is closed 2025-06-05 18:22:00 +02:00
Trisha Lim
2a2b474aa4 feat: track create-jazz-app copy action in hero 2025-06-05 16:16:06 +01:00
Brad Anderson
b45bf9248e docs: RNQuickCrypto provider docs 2025-06-05 11:05:03 -04:00
Emil Sayahi
6c2b8a8f8f fix(addMember): clarify admins demoting admins 2025-06-05 07:54:41 -07:00
Sammii
1f490d2aae reordering style + variant buttons to match style order 2025-06-05 13:38:14 +01:00
Benjamin S. Leveritt
7be49602dd Remove ignoreCommand from clerk 2025-06-05 13:11:19 +01:00
Benjamin S. Leveritt
cb73d474a6 Check previous SHA is accessible for turbo, with fallback 2025-06-05 13:11:19 +01:00
Benjamin S. Leveritt
cd03cb77f5 Add checks to other examples
Signed-off-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
2025-06-05 13:11:19 +01:00
Benjamin S. Leveritt
d9d5662b7a Add more inputs for turbo 2025-06-05 13:11:19 +01:00
Benjamin S. Leveritt
39cd197494 Fallback to main checks 2025-06-05 13:11:19 +01:00
Benjamin S. Leveritt
5397fb27bc Clean up imports 2025-06-05 13:11:18 +01:00
Benjamin S. Leveritt
f0bfdc3f5f Dependency checking with Turbo 2025-06-05 13:11:18 +01:00
Benjamin S. Leveritt
5f45036e2a Add ignore to form
Signed-off-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
2025-06-05 13:11:18 +01:00
Benjamin S. Leveritt
20eab19676 Compare to last successful deployment
Hopefully this works better against derivative branches

Signed-off-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
2025-06-05 13:11:18 +01:00
Benjamin S. Leveritt
6af2feb2e7 Check current project path 2025-06-05 13:11:18 +01:00
Benjamin S. Leveritt
60df32ba05 Try with chat first 2025-06-05 13:11:18 +01:00
Benjamin S. Leveritt
90f36e61d6 Optimize turbo.json for better caching and build performance 2025-06-05 13:11:17 +01:00
Benjamin S. Leveritt
2d27cd5356 Add enhanced Vercel build ignore script with intelligent change detection 2025-06-05 13:11:17 +01:00
Nikos Papadopoulos
0262b9d501 Merge pull request #2438 from garden-co/nikos-example_apps_updates
- Integrates prosekit example app in monorepo
- Updates URLs in all applicable apps in https://jazz.tools/examples to follow the format: app-name.demo.jazz.tools
- Updates URLs in all applicable example apps README files
- Renames richtext example app to richtext-prosemirror
- Moves Svelte example apps above Vue example apps
- Adds jazz.tools entries for richtext prosekit, richtext tiptap
2025-06-05 13:32:40 +02:00
Nikos Papadopoulos
115e22c89d updates pnpm-lock.yaml after merge from main 2025-06-05 12:24:56 +01:00
Nikos Papadopoulos
687d9bbbff Merge branch 'main' into nikos-example_apps_updates 2025-06-05 12:22:50 +01:00
Benjamin S. Leveritt
56ad6379d9 Merge pull request #2443 from garden-co/fix-design-system-build
Fix build for design system
2025-06-05 12:17:27 +01:00
Benjamin S. Leveritt
481ffa1d96 Add package manager 2025-06-05 12:12:08 +01:00
Guido D'Orsi
a383c7e984 Merge pull request #2432 from garden-co/changeset-release/main
Version Packages
2025-06-05 13:11:13 +02:00
github-actions[bot]
8ca283147d Version Packages 2025-06-05 11:04:14 +00:00
Guido D'Orsi
c3d87796ed chore: update changeset 2025-06-05 13:00:37 +02:00
Guido D'Orsi
cb88caced9 fix(comap): return a valid value on _createdAt even when setting a custom uniqueness value 2025-06-05 12:58:26 +02:00
Sammii
1b766b6369 UI view reorder 2025-06-05 11:45:33 +01:00
Sammii
3f54da98f8 fix outline button jump 2025-06-05 11:43:47 +01:00
Guido D'Orsi
6313ead62d Revert "fix: use creation time from CoValue header"
This reverts commit cc0479afe0.
2025-06-05 12:38:23 +02:00
Sammii
05b98c0f8b info update 2025-06-05 11:37:57 +01:00
Sammii
928e63620b renaming styleVariant back 2025-06-05 11:24:16 +01:00
Guido D'Orsi
f674910aa9 Merge pull request #2426 from garden-co/emil/comap-time-getters
feat: `_createdAt` and `_lastUpdatedAt`
2025-06-05 12:23:23 +02:00
Guido D'Orsi
37fc25f5a6 Merge pull request #2434 from garden-co/fix/svelte-costate
Fix id reactivity on CoState for Svelte 5.33 (second try)
2025-06-05 12:22:19 +02:00
Guido D'Orsi
5e9c338c27 Merge pull request #2436 from garden-co/feat/react-19-updates
fix(react-19): optimize re-renders when the values are already in memory
2025-06-05 12:21:55 +02:00
Guido D'Orsi
4b61f7c7a5 chore: format 2025-06-05 12:20:58 +02:00
Guido D'Orsi
1c8472ffbd Merge pull request #2441 from garden-co/fix/union-schema-conversion
Fix union schemas in anySchemaToCoSchema
2025-06-05 12:19:33 +02:00
Benjamin S. Leveritt
9dba68ac36 Remove migration script
Signed-off-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
2025-06-05 11:18:29 +01:00
Anselm
13b57aa576 Add changeset 2025-06-05 11:10:05 +01:00
Anselm
aedf0f3ac5 Fix union schemas in anySchemaToCoSchema 2025-06-05 11:09:06 +01:00
Sammii
ea9b1eb88e renaming symbol styleVariant to style 2025-06-05 10:59:07 +01:00
Sammii
83a88252e2 fighting with tailwind, buttons MVP LGTM 2025-06-05 10:58:40 +01:00
Benjamin S. Leveritt
7fa61644b0 Revert turbo.json to original state 2025-06-05 10:19:22 +01:00
Nikos Papadopoulos
dbc6342222 renames api-key.ts to apiKey.ts 2025-06-05 10:16:53 +01:00
Benjamin S. Leveritt
12389c82f9 Add migration script to update all projects to enhanced ignore script 2025-06-05 10:05:16 +01:00
Benjamin S. Leveritt
4c03a17d3a Optimize turbo.json for better caching and build performance 2025-06-05 10:04:51 +01:00
Benjamin S. Leveritt
5d1ea45a9c Add enhanced Vercel build ignore script with change detection 2025-06-05 10:04:34 +01:00
Emil Sayahi
780961d46f fix: show role of current account 2025-06-04 16:01:45 -07:00
Emil Sayahi
cc0479afe0 fix: use creation time from CoValue header 2025-06-04 15:45:59 -07:00
Emil Sayahi
c102f18b62 Update mean-turkeys-turn.md 2025-06-04 15:15:13 -07:00
Emil Sayahi
57fb69fa6f chore: changeset 2025-06-04 15:14:41 -07:00
Emil Sayahi
8985e2d4ff fix: clarify addMember error message 2025-06-04 15:12:55 -07:00
Emil Sayahi
cfb6786468 feat(jazz-expo): API for clearing local DB (#2427)
* feat(jazz-expo): API for clearing local DB

todo:
- tests
- changeset

* Revert "feat(jazz-expo): API for clearing local DB"

This reverts commit 459e1d04ea.

* feat(jazz-expo): API for clearing local DB

* chore: changeset

* Update .changeset/plenty-ways-smash.md

Co-authored-by: Guido D'Orsi <guido@garden.co>

---------

Co-authored-by: Guido D'Orsi <guido@garden.co>
2025-06-04 12:35:04 -07:00
Emil Sayahi
5662faa9c0 chore: changeset 2025-06-04 12:10:15 -07:00
Emil Sayahi
3e7d9cb585 feat: tests 2025-06-04 12:08:56 -07:00
Nikos Papadopoulos
ec65ba74a8 reorders example apps 2025-06-04 18:52:23 +01:00
Nikos Papadopoulos
f679e6b392 updates richtext-prosemirror vercel configuration 2025-06-04 18:49:11 +01:00
Nikos Papadopoulos
3bcaa81c17 updates pnpm-lock.yaml 2025-06-04 18:34:27 +01:00
Guido D'Orsi
2116a598ae fix(react-19): optimize re-renders when the values are already in memory 2025-06-04 19:34:12 +02:00
Nikos Papadopoulos
8a00392894 adds attribution in prosekit example app README 2025-06-04 18:28:03 +01:00
Nikos Papadopoulos
f3f2e85c53 removes obsolete files 2025-06-04 18:27:17 +01:00
Nikos Papadopoulos
0ff08e9893 moves richtext example to richtext-prosemirror 2025-06-04 18:26:28 +01:00
Nikos Papadopoulos
ca517517f9 updates pnpm-lock.yaml 2025-06-04 18:07:33 +01:00
Nikos Papadopoulos
55bdbbf12e Merge branch 'main' into nikos-example_apps_updates 2025-06-04 17:55:49 +01:00
Nikos Papadopoulos
5c7a7d0f7c updates the homepage example apps URLs 2025-06-04 17:54:55 +01:00
Sammii
7a61c19135 buttons refactor 2025-06-04 17:43:14 +01:00
Nikos Papadopoulos
af388c11d5 updates example apps README files, adds new apps to example page 2025-06-04 17:43:05 +01:00
Sammii
a2f87f304c base structure for component library buttons 2025-06-04 17:00:06 +01:00
Nikos Papadopoulos
df255f850f adds prosekit example app 2025-06-04 16:43:58 +01:00
Guido D'Orsi
d14a069a12 Fix id reactivity on CoState for Svelte 5.33 (second try) 2025-06-04 16:11:14 +02:00
Anselm Eickhoff
aacef80994 Merge pull request #2433 from garden-co/fix/team-page
update team page, adding me and making all socials the same order
2025-06-04 14:46:10 +01:00
Sammii
2a237e5d32 amending file .ext 2025-06-04 14:39:27 +01:00
Sammii
0fe30eca0b update team page, adding me and making all socials the same order 2025-06-04 14:23:40 +01:00
Guido D'Orsi
dea7a8dfd9 Merge pull request #2282 from Wizzel1/Add-missing-discriminator
Add missing discriminator
2025-06-04 15:21:29 +02:00
Guido D'Orsi
ab7191bed0 Merge remote-tracking branch 'origin/main' into Add-missing-discriminator 2025-06-04 15:12:14 +02:00
Guido D'Orsi
901b7c0a51 Merge pull request #2377 from garden-co/2376-groupmakepublic-as-an-alias
Add makePublic to group
2025-06-04 15:02:05 +02:00
Benjamin S. Leveritt
17bea5975c Merge pull request #2430 from garden-co/test-create-jazz-app
Test `create-jazz-app`
2025-06-04 12:54:56 +01:00
Benjamin S. Leveritt
e005ecd0a1 Add changeset 2025-06-04 12:08:27 +01:00
Benjamin S. Leveritt
e7e505e5f3 Add changeset 2025-06-04 12:03:58 +01:00
Benjamin S. Leveritt
d6ffe03d3c Add makePublic to docs 2025-06-04 12:02:18 +01:00
Benjamin S. Leveritt
1120747a24 Add makePublic alias to some example apps 2025-06-04 11:50:24 +01:00
Benjamin S. Leveritt
1e2d7d1c4e Add makePublic to group 2025-06-04 11:44:06 +01:00
Benjamin S. Leveritt
e26f110acd Merge pull request #2428 from garden-co/feature/co-map-migrations
Tweak CoMap migration copy and examples
2025-06-04 11:37:21 +01:00
Benjamin S. Leveritt
28f84a4ee6 Update lock 2025-06-04 11:31:36 +01:00
Benjamin S. Leveritt
cffe4abb84 Handle SIGINT gracefully 2025-06-04 11:21:00 +01:00
Benjamin S. Leveritt
2e0b7cee8c Refactor package manager detection into utils 2025-06-04 11:21:00 +01:00
Benjamin S. Leveritt
d3b47f59e8 Add automatic tests 2025-06-04 11:21:00 +01:00
Benjamin S. Leveritt
aea3287965 Merge pull request #2373 from lukahartwig/main
Set default package manager based on command runner
2025-06-04 11:17:25 +01:00
Benjamin S. Leveritt
6525f8a12e Merge pull request #2325 from garden-co/2324-turbo-dev-doesnt-need-to-build-the-local-package
Turbo just builds deps now
2025-06-04 09:11:16 +01:00
Benjamin S. Leveritt
fe4c934a4b Tweak copy and examples in the docs 2025-06-04 08:26:05 +01:00
Emil Sayahi
60261c8dba feat: _createdAt and _lastUpdatedAt 2025-06-03 13:34:55 -07:00
Guido D'Orsi
7411049faa Merge pull request #2423 from garden-co/changeset-release/main
Version Packages
2025-06-03 19:48:03 +02:00
github-actions[bot]
356b06559b Version Packages 2025-06-03 17:45:08 +00:00
Guido D'Orsi
193738cfe2 Merge pull request #2405 from garden-co/feature/co-map-migrations
feat: add support for coMap migrations
2025-06-03 19:40:53 +02:00
Guido D'Orsi
ddb74fa167 docs: remove unused import 2025-06-03 19:35:31 +02:00
Guido D'Orsi
aca5642671 Merge pull request #2422 from garden-co/changeset-release/main
Version Packages
2025-06-03 19:27:45 +02:00
github-actions[bot]
a5bed20c4a Version Packages 2025-06-03 17:25:46 +00:00
Guido D'Orsi
09bf53a8d3 Merge pull request #2421 from garden-co/fix/react-native-account-schema
fix: fix the AccountSchema prop type to accept co.account schemas
2025-06-03 19:22:11 +02:00
Guido D'Orsi
061ec996b1 fix: F=fix the AccountSchema prop type to accept co.account schemas 2025-06-03 19:17:19 +02:00
Guido D'Orsi
a7ee0465b5 docs: small fix 2025-06-03 18:35:04 +02:00
Guido D'Orsi
e995d8a1fe chore: fix type issue in todo example 2025-06-03 17:50:17 +02:00
Sammii
f9f24d2ad2 styling 2025-06-03 16:48:16 +01:00
Sammii
ed3197a7fd updating schema 2025-06-03 16:47:59 +01:00
Guido D'Orsi
5ccb48446e docs: cover CoMap migrations 2025-06-03 17:46:12 +02:00
Sammii
772a88e98f finessing styling 2025-06-03 16:27:49 +01:00
Guido D'Orsi
04b20c2e42 fix: fix castAs for Zod schemas and make the CoMap migrations stable 2025-06-03 17:14:59 +02:00
Sammii
e22a7f46ad stylingg 2025-06-03 15:31:15 +01:00
Sammii
f890f2f460 refactor design system page.tsx to display new components from refactor 2025-06-03 15:16:58 +01:00
Sammii
e9c17e12dc create new Colors view component 2025-06-03 15:15:27 +01:00
Sammii
4b908e3024 refactor Forms view into own component 2025-06-03 15:15:03 +01:00
Sammii
90fd2b5da0 refactor Typography view into own component 2025-06-03 15:14:55 +01:00
Sammii
d7b4360f11 adding error color 2025-06-03 15:13:55 +01:00
Benjamin S. Leveritt
7aae2441a1 Merge pull request #2231 from garden-co/2223-history-and-time-travel-doc
2223-history-and-time-travel-doc
2025-06-03 14:35:30 +01:00
Benjamin S. Leveritt
650e95a528 Merge pull request #2414 from garden-co/2412-fix-jazz-vue-builds-following-014
Add typecheck to jazz-vue before build
2025-06-03 14:34:53 +01:00
Benjamin S. Leveritt
3d80ab11d9 Minor tweak for efficiency 2025-06-03 14:32:59 +01:00
Benjamin S. Leveritt
85e6489a3e Add note about finding from field.all and chronological order 2025-06-03 14:30:03 +01:00
Benjamin S. Leveritt
45b6c87ade Fix chronological order notes 2025-06-03 14:16:39 +01:00
Guido D'Orsi
edadc4b986 Merge pull request #2411 from garden-co/fix/id-reactivity
fix: fix id reactivity in CoState for svelte > 5.33
2025-06-03 15:06:56 +02:00
Benjamin S. Leveritt
455b722357 Add typecheck before build 2025-06-03 13:25:53 +01:00
Benjamin S. Leveritt
ad2e1d1e98 Suppress the supressions
Signed-off-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
2025-06-03 13:17:37 +01:00
Benjamin S. Leveritt
7c94b70c31 Add biome linting 2025-06-03 12:53:00 +01:00
Benjamin S. Leveritt
74bcf1752e Update Provider types 2025-06-03 12:16:42 +01:00
Guido D'Orsi
97a54b3911 fix: revert changes on src/lib/jazz.class.svelte.ts 2025-06-03 13:07:23 +02:00
Benjamin S. Leveritt
c393c8880f Fix import 2025-06-03 11:41:20 +01:00
Guido D'Orsi
359157fa70 chore: add comment 2025-06-03 12:40:02 +02:00
Guido D'Orsi
62d9680449 chore: update vite to the latest version 2025-06-03 12:38:45 +02:00
Trisha Lim
db6067439d fix missing date 2025-06-03 11:26:51 +01:00
Guido D'Orsi
5051d6a410 fix: fix id reactivity in CoState for svelte > 5.33 2025-06-03 12:23:18 +02:00
Trisha Lim
25efaf30f5 add docs for storing createdAt manually 2025-06-03 11:18:37 +01:00
Trisha Lim
98aadd9842 Show date created on version history example 2025-06-03 11:17:54 +01:00
Trisha Lim
d555b18c11 test homepage routes (#2399)
* test homepage routes

* add playwright.yml to homepage dir

* Revert "add playwright.yml to homepage dir"

This reverts commit f0507ee4f7dd29d25db56d3227937c901f9225a0.

* Add turbo dep to homepage

* Split homepage playwright script out

* remove playwright from test command

* install homepage deps

* update lock file

---------

Co-authored-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
2025-06-03 09:25:28 +01:00
Benjamin S. Leveritt
550111f8a1 Merge pull request #2408 from garden-co/2407-remove-api-reference-from-build
Remove api references from build
2025-06-02 21:05:16 +01:00
Trisha Lim
3d4a00a19d Merge pull request #2409 from garden-co/fix/expo-dark-logo
fix: expo logo color on dark mode
2025-06-02 21:03:41 +01:00
Benjamin S. Leveritt
d06c6677dc Purge typedoc dep 2025-06-02 20:45:31 +01:00
Trisha Lim
ce30f3c4ff fix: expo logo color on dark mode 2025-06-02 20:32:23 +01:00
Benjamin S. Leveritt
1072b9c2fe Remove api ref docs from llms.txt 2025-06-02 20:28:24 +01:00
Benjamin S. Leveritt
5ea41c69ef Remove all the references to API refs 2025-06-02 20:18:11 +01:00
Guido D'Orsi
2d8eed3b69 chore: remove unused var 2025-06-02 21:13:59 +02:00
Benjamin S. Leveritt
45c9c8558f Remove build script 2025-06-02 20:08:19 +01:00
Guido D'Orsi
dccb80edf0 fix: quick fix layout overflows and restore automatic next song 2025-06-02 21:07:58 +02:00
Guido D'Orsi
6f72419b6e feat: add support for coMap migrations 2025-06-02 20:23:52 +02:00
Guido D'Orsi
fc55e5c8e8 Merge pull request #2384 from garden-co/changeset-release/main
Version Packages
2025-06-02 18:29:42 +02:00
github-actions[bot]
4a74ccf399 Version Packages 2025-06-02 16:23:15 +00:00
Guido D'Orsi
a442315995 Merge pull request #2266 from garden-co/feat/encrypt-decrypt-rnqc
feat: enable RNQC for encrypt/decrypt
2025-06-02 18:18:41 +02:00
Brad Anderson
0d5ee3ed07 feat: enable RNQC for encrypt/decrypt 2025-06-02 12:16:31 -04:00
Sammii
df7011167c making active dropdown item text primary 2025-06-02 17:14:45 +01:00
Sammii
28a785acb0 letting dropdown items be editable 2025-06-02 17:10:57 +01:00
Sammii
3ee557bfbe adding routerPush prop to framework select 2025-06-02 17:10:30 +01:00
Sammii
af94255166 updating HeroSection 2025-06-02 16:50:12 +01:00
Sammii
4a0dea3f75 create NpxCreateJazzApp.mdx 2025-06-02 16:49:46 +01:00
Sammii
6a42bc9655 creating GetStartedSnippetSelect component 2025-06-02 16:49:17 +01:00
Sammii
c6c8a7f6b7 amending Framework select 2025-06-02 16:48:41 +01:00
Sammii
133dd0e26d make dropdown classes last so you can edit them 2025-06-02 16:43:07 +01:00
Guido D'Orsi
4e32cae8a7 feat: make the packages versions fixed 2025-06-02 16:19:28 +02:00
Guido D'Orsi
49d721a29b fix: add prosemirror and tiptap to the linked changeset 2025-06-02 16:18:44 +02:00
Guido D'Orsi
2c6d27598d Merge pull request #2397 from garden-co/fix/recursive-profile-discriminated-union
fix: make checks on the discriminator field on z.discriminatedUnion more specific and less strict
2025-06-02 16:16:25 +02:00
Sammii
815339272f alter Feature Card styling 2025-06-02 14:47:30 +01:00
Sammii
9c1f340029 add new size to code group and amend copy button to be icon only on small 2025-06-02 13:54:29 +01:00
Sammii
b72ea9608d add new icon for clipboard success 2025-06-02 13:54:09 +01:00
Guido D'Orsi
e637cb0700 fix: restore implicit discriminators support 2025-06-02 14:37:55 +02:00
Trisha Lim
c42848ece9 Merge pull request #2275 from garden-co/improvement/supported-env
homepage: supported env section, take svelte out of experimental
2025-06-02 13:36:23 +01:00
Benjamin S. Leveritt
841a818dff Merge pull request #2330 from garden-co/2323-update-docs-with-coloaded
Replace `Account` and `Loaded` with `co.account` and `co.loaded` (respectively)
2025-06-02 12:07:26 +01:00
Benjamin S. Leveritt
f74881a3fe Remove me 2025-06-02 12:05:35 +01:00
Guido D'Orsi
c559054378 fix: add support for optional dates 2025-06-02 12:55:33 +02:00
Guido D'Orsi
d6d9c0adcb fix: make checks on the discriminator field on z.discriminatedUnion more specific and less strict 2025-06-02 12:31:05 +02:00
Guido D'Orsi
cdf9b5a71c Merge pull request #2391 from garden-co/fix/recursive-profile-discriminated-union
fix: support for recursive props on co.profile and for co.image inside z.discriminatedUnion
2025-06-02 12:00:37 +02:00
Guido D'Orsi
4b950bce14 fix: support for recursive props on co.profile and for co.image inside z.discriminatedUnion 2025-06-02 11:48:54 +02:00
Benjamin S. Leveritt
8343d8f0fe Formats co.texts with backticks 2025-06-02 10:45:40 +01:00
Benjamin S. Leveritt
eeb280f17b Replace Account with co.account 2025-06-02 10:45:39 +01:00
Benjamin S. Leveritt
a927334b40 Replaces Loaded with co.loaded 2025-06-02 10:45:39 +01:00
Benjamin S. Leveritt
be0c1bcda5 Merge pull request #2367 from joeinnes/patch-2
Remove unnecessary console.log
2025-06-02 10:30:58 +01:00
Trisha Lim
b861daca60 Merge pull request #2386 from garden-co/tobiaslins-patch-1
[website] Use `/next` import for analytics
2025-06-01 18:45:18 +01:00
Benjamin S. Leveritt
b4cd307eba Merge pull request #2383 from garden-co/update-team
update team page
2025-05-31 16:44:50 +01:00
Tobias Lins
1d0e83d3fa Update layout.tsx 2025-05-31 17:05:18 +02:00
Guido D'Orsi
be7c4c29a1 chore: changeset 2025-05-30 14:42:32 +02:00
Trisha Lim
ffa4db0b61 update team page 2025-05-29 21:09:15 +02:00
Trisha Lim
7daf992c51 Merge pull request #2382 from garden-co/fix/sync-link
fix link to self-host docs
2025-05-29 20:57:19 +02:00
Trisha Lim
333c583265 fix link to self-host docs 2025-05-29 20:43:32 +02:00
Luka Hartwig
fa2227716f Remove return type 2025-05-27 23:08:56 +02:00
Guido D'Orsi
bfa5e14112 Merge pull request #1992 from boorad/feat/rn-sqlite-sync
refactor: RN sqlite adapters
2025-05-27 20:44:55 +02:00
Luka Hartwig
38dabd4602 Set default package manager based on command runner 2025-05-27 16:34:40 +02:00
Brad Anderson
dcdf89bba7 fix: re-enable android build in e2e run script 2025-05-26 11:50:36 -04:00
Brad Anderson
a6e6939015 chore: sync app namespace & e2e tests 2025-05-26 11:50:36 -04:00
Brad Anderson
71aa24054d chore: lock file after rebase 2025-05-26 11:50:36 -04:00
Guido D'Orsi
4c88421440 chore: await for WAL 2025-05-26 11:50:36 -04:00
Guido D'Orsi
64bad01d9a fix: fix expo-sqlite run 2025-05-26 11:50:36 -04:00
Brad Anderson
4dfa809a77 fix: update chat-rn landing page, invite clipboard values 2025-05-26 11:50:36 -04:00
Guido D'Orsi
726df167f8 chore: add get function 2025-05-26 11:50:36 -04:00
Guido D'Orsi
2f62cbde13 test: cover the sqlite async with tests 2025-05-26 11:50:36 -04:00
Guido D'Orsi
93ef74219d feat: add sqlite async managers 2025-05-26 11:50:36 -04:00
Guido D'Orsi
495aa81335 feat: configure the max blocking time on RN storage to 30ms 2025-05-26 11:50:36 -04:00
Guido D'Orsi
99caaba328 chore: remove unused import 2025-05-26 11:50:36 -04:00
Guido D'Orsi
4bfcc787a1 chore(sqlite): move the migration logic in SQLiteNodeBase 2025-05-26 11:50:36 -04:00
Guido D'Orsi
7e96eb12dd feat: unify sqlite storage clients 2025-05-26 11:50:35 -04:00
Brad Anderson
a71eba2eb5 chore: bump RN version for ios sim 18.4 bug 2025-05-26 11:50:35 -04:00
Brad Anderson
b129cf9328 fix: rebase main, sync only 2025-05-26 11:50:35 -04:00
Brad Anderson
a6e31c41b7 feat: expo sqlite uses WAL, all sqlite defaults to sync 2025-05-26 11:50:35 -04:00
Brad Anderson
47746ff9ba fix: sourceExts belongs in resolver 2025-05-26 11:50:35 -04:00
Brad Anderson
4e4319a546 fix: rawDBExecute (expo) needs return rows 2025-05-26 11:50:35 -04:00
Brad Anderson
d1de8baf1d fix: initialize must use raw db calls 2025-05-26 11:50:35 -04:00
Brad Anderson
d427a2a13c feat: add sync mode to sqlite client 2025-05-26 11:50:35 -04:00
Brad Anderson
1fa6c3987a refactor: RN sqlite adapters 2025-05-26 11:50:35 -04:00
Joe Innes
ddf49e532f Remove unnecessary console.log 2025-05-26 17:38:14 +02:00
Guido D'Orsi
a0c4ef72ef Merge pull request #2366 from garden-co/changeset-release/main
Version Packages
2025-05-26 14:46:53 +02:00
github-actions[bot]
99009a9054 Version Packages 2025-05-26 12:44:40 +00:00
Guido D'Orsi
e512df4eff fix: move to the latest stable version of Zod 2025-05-26 14:42:08 +02:00
pax-k
da3ede8b54 fix(cursor-docs): improved jazz general help rule 2025-05-26 13:29:01 +02:00
pax-k
56ed6d3271 fix(cursor-docs): improved jazz schema generation rule 2025-05-26 13:22:14 +02:00
pax-k
78112bb19a fix(cursor-docs): added jazz schema template 2025-05-26 13:04:39 +02:00
pax-k
ac6b0c6561 Merge branch 'main' of https://github.com/gardencmp/jazz 2025-05-26 12:51:20 +02:00
pax-k
632365a4fb fix(cursor-docs): added llms-full docs and updated the jazz schema generation rule 2025-05-26 12:51:12 +02:00
Guido D'Orsi
14f52dbc4e Merge pull request #2365 from garden-co/changeset-release/main
Version Packages
2025-05-26 12:48:04 +02:00
github-actions[bot]
82e4256e26 Version Packages 2025-05-26 10:07:42 +00:00
Guido D'Orsi
5e253cc717 chore: version bump 2025-05-26 11:12:59 +02:00
Guido D'Orsi
0c1663505c Merge pull request #2363 from garden-co/changeset-release/main
Version Packages
2025-05-26 11:07:20 +02:00
github-actions[bot]
ad85703373 Version Packages 2025-05-25 15:01:21 +00:00
Guido D'Orsi
3a6ec3791c Merge pull request #2364 from garden-co/fix/storage-group-deps
feat(react): API for SSR and Server Components
2025-05-25 16:58:34 +02:00
Guido D'Orsi
f9590f9120 feat(react): API for SSR and Server Components 2025-05-25 16:54:29 +02:00
Guido D'Orsi
706ebf87da Merge pull request #2357 from balazshevesi/main
Fix docs
2025-05-25 16:24:47 +02:00
Guido D'Orsi
00dd317a5d Merge pull request #2362 from garden-co/fix/storage-group-deps
fix(storage): align groups dependencies calculation to LocalNode
2025-05-25 16:24:04 +02:00
Guido D'Orsi
5ced45fb90 test: cover the group dependency loading with a test (temporary) 2025-05-25 15:35:00 +02:00
Guido D'Orsi
23daa7cdde fix(storage): align groups dependencies calculation to LocalNode 2025-05-25 14:34:50 +02:00
Margaret Culotta
bf9312ad15 Update for deprecated withHelpers 2025-05-24 18:27:41 -05:00
Margaret Culotta
b54eac6484 Merge branch 'main' into feat/1604-Add-docs-for-soft-delete 2025-05-24 17:46:22 -05:00
Guido D'Orsi
c018752c0c Merge pull request #2361 from garden-co/changeset-release/main
Version Packages
2025-05-24 22:54:04 +02:00
github-actions[bot]
ba3bdcc268 Version Packages 2025-05-24 20:31:26 +00:00
Guido D'Orsi
4177f6f92c Merge pull request #2360 from garden-co/feat/ssr
feat(react): add experimental_enableSSR
2025-05-24 22:28:20 +02:00
Guido D'Orsi
e32a1f7392 feat(react): add experimental_enableSSR 2025-05-24 19:11:23 +02:00
Guido D'Orsi
7c43fd37ae Merge pull request #2358 from garden-co/feat/improve-music-player-mobile
feat(music-player): make the ui usable on mobile
2025-05-24 18:37:59 +02:00
Guido D'Orsi
48168d619b feat(music-player): make the ui usable on mobile 2025-05-24 18:37:15 +02:00
Balazs Hevesi
1b9b9273e5 Update 0-14-0.mdx 2025-05-23 22:18:05 +02:00
Guido D'Orsi
2f4eada56c Merge pull request #2356 from garden-co/changeset-release/main
Version Packages
2025-05-23 21:37:52 +02:00
github-actions[bot]
709b3432d7 Version Packages 2025-05-23 19:33:52 +00:00
Guido D'Orsi
78a7672401 fix: update lockfile 2025-05-23 21:31:34 +02:00
Guido D'Orsi
bb214f0e8b fix: remove react-dom from the peerDependencies 2025-05-23 21:22:22 +02:00
Guido D'Orsi
8706398f74 Merge pull request #2355 from garden-co/changeset-release/main
Version Packages
2025-05-23 20:31:09 +02:00
github-actions[bot]
1502a6b421 Version Packages 2025-05-23 18:15:41 +00:00
Guido D'Orsi
f167112d99 fix: remove react and react-dom dev dependencies due to npm install issues 2025-05-23 20:12:58 +02:00
Guido D'Orsi
d4d6cb3307 Merge pull request #2354 from garden-co/changeset-release/main
Version Packages
2025-05-23 20:01:42 +02:00
github-actions[bot]
9565cdf323 Version Packages 2025-05-23 18:01:27 +00:00
Guido D'Orsi
dfb21ff0f2 fix: add missing deps for sqlite and secure storage 2025-05-23 19:59:08 +02:00
Guido D'Orsi
98d697fafb fix: remove react and react-native dev dependencies 2025-05-23 19:50:54 +02:00
Guido D'Orsi
9150d53f90 Merge pull request #2353 from garden-co/changeset-release/main
Version Packages
2025-05-23 19:46:39 +02:00
github-actions[bot]
ac7ecc278c Version Packages 2025-05-23 17:46:11 +00:00
Guido D'Orsi
99595bc7e3 fix: remove React Native specific steps only for chat-rn-expo 2025-05-23 19:42:45 +02:00
Guido D'Orsi
f5bae09679 fix: remove React Native specific steps as not required anymore 2025-05-23 19:40:51 +02:00
Guido D'Orsi
a7b9ae0b76 Merge pull request #2350 from garden-co/changeset-release/main
Version Packages
2025-05-23 19:24:34 +02:00
github-actions[bot]
196efcf48e Version Packages 2025-05-23 17:23:15 +00:00
Guido D'Orsi
153aa972b3 Merge pull request #2351 from garden-co/fix/chat-rn-expo
fix: fix chat-rn-expo example app
2025-05-23 19:20:25 +02:00
Guido D'Orsi
4508524f77 feat: rename demo to minimal, change React Native template to minimal auth 2025-05-23 19:20:05 +02:00
Guido D'Orsi
e7e9062dff test: disable the chat navigation step on RN expo 2025-05-23 18:44:03 +02:00
Guido D'Orsi
65e8d135c1 fix: React 19 upgrade type fixes 2025-05-23 18:36:54 +02:00
Meg Culotta
0b8e84e22d Merge pull request #2352 from garden-co/feat/2345-add-example-links-to-readmes
Add URL's to live demos in all readme files in examples
2025-05-23 11:15:46 -05:00
Margaret Culotta
7b51e38cf6 Add all other examples 2025-05-23 11:11:57 -05:00
Margaret Culotta
fcc2cbdc93 Add URL's to live demos in all readme files in examples 2025-05-23 11:09:00 -05:00
Guido D'Orsi
5aa13b5afc feat: upgrade to React 19 2025-05-23 17:53:49 +02:00
Guido D'Orsi
dc746a2fc9 chore: changeset 2025-05-23 17:36:38 +02:00
Guido D'Orsi
ca39bae001 fix: fix chat-rn-expo when used as template 2025-05-23 17:35:49 +02:00
Guido D'Orsi
020b12fa32 fix: correct definition of react in peerDependencies 2025-05-23 17:33:26 +02:00
Guido D'Orsi
bfea02c229 Merge pull request #2348 from garden-co/feat/deprecate-with-helpers
fix: deprecate withHelpers
2025-05-23 14:45:01 +02:00
Guido D'Orsi
74e6495beb Merge pull request #2349 from garden-co/feat/default-catch
feat: add shallow support for default/catch
2025-05-23 14:40:01 +02:00
Guido D'Orsi
3fe683206a feat: add shallow support for default/catch 2025-05-23 14:37:15 +02:00
Guido D'Orsi
f869d9a4dd fix: deprecate withHelpers 2025-05-23 14:30:52 +02:00
Guido D'Orsi
0724cfb95e Merge pull request #2344 from garden-co/changeset-release/main
Version Packages
2025-05-23 09:54:27 +02:00
github-actions[bot]
3b7fd14976 Version Packages 2025-05-23 07:54:03 +00:00
Guido D'Orsi
55fbe8a0a8 Merge pull request #2343 from garden-co/feat/back-to-zod
fix: move back to zod and clean up zod re-export
2025-05-23 09:50:45 +02:00
Guido D'Orsi
22c2600ef1 fix: move back to zod and clean up zod re-export 2025-05-23 09:46:36 +02:00
Benjamin S. Leveritt
156167e6d7 Update nav items
Signed-off-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
2025-05-23 07:56:06 +01:00
Guido D'Orsi
d41feafebe Merge pull request #2342 from garden-co/changeset-release/main
Version Packages
2025-05-22 23:33:33 +02:00
github-actions[bot]
05e3e30451 Version Packages 2025-05-22 21:29:40 +00:00
Guido D'Orsi
637ae13131 chore: changeset 2025-05-22 23:26:46 +02:00
Guido D'Orsi
4a601a6441 Merge pull request #2340 from garden-co/fix/zod-fork
fix: switch to our zod fork with RN fixes
2025-05-22 23:24:29 +02:00
Benjamin S. Leveritt
aef84cf2ef Tweak History title
Signed-off-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
2025-05-22 21:15:50 +01:00
Benjamin S. Leveritt
275a26e2c1 Splits history patterns out of history doc
Signed-off-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
2025-05-22 21:12:14 +01:00
Guido D'Orsi
15b422f711 fix: switch to our zod fork with RN fixes 2025-05-22 19:48:58 +02:00
Benjamin S. Leveritt
946ae63070 Fix codeblocks for 0.14
Signed-off-by: Benjamin S. Leveritt <benjamin@leveritt.co.uk>
2025-05-22 16:38:05 +01:00
Trisha Lim
2e42825971 Merge pull request #2332 from garden-co/fix/passkey-svelte
fix(passkey-svelte): use AccountCoState instead of useAccount
2025-05-22 14:07:22 +01:00
Trisha Lim
089cdb2031 fix(passkey-svelte): use AccountCoState instead of useAccount 2025-05-22 13:55:06 +01:00
Benjamin S. Leveritt
5cfe47ebbe Add history to nav 2025-05-22 13:33:52 +01:00
Benjamin S. Leveritt
6ee0ec755e Minor tweaks 2025-05-22 13:33:52 +01:00
Benjamin S. Leveritt
8ffca202bd Adds type checking plus tweaks 2025-05-22 13:33:51 +01:00
Benjamin S. Leveritt
6d2bcc7490 Rename history doc 2025-05-22 13:30:54 +01:00
Guido D'Orsi
fa3cf6d0c1 Merge pull request #2331 from garden-co/changeset-release/main
Version Packages
2025-05-22 14:26:58 +02:00
github-actions[bot]
d823700a7c Version Packages 2025-05-22 12:23:10 +00:00
Guido D'Orsi
ed472e834a Merge pull request #2329 from garden-co/fix-z-create
fix: reduce the z exported APIs to the ones we support and fix compatible types
2025-05-22 14:18:56 +02:00
Guido D'Orsi
365b0ea3a9 fix: reduce the z exported APIs to the ones we support and fix compatible types 2025-05-22 14:14:39 +02:00
Benjamin S. Leveritt
43c831167f Merge pull request #2328 from garden-co/2327-remove-auto-generated-api-reference-content
Hides the API Ref links
2025-05-22 12:48:00 +01:00
Benjamin S. Leveritt
cac0f1ad2b Hides the API Ref links 2025-05-22 11:10:46 +01:00
Guido D'Orsi
f66b7c1a5a Merge pull request #2326 from garden-co/changeset-release/main
Version Packages
2025-05-22 11:49:26 +02:00
github-actions[bot]
1b57cfc3f6 Version Packages 2025-05-22 09:45:36 +00:00
Guido D'Orsi
a805e27b0a Merge pull request #2322 from garden-co/fix-z-create
fix: fixes create types for CoList, CoRecord, CoFeed and CoFileStream
2025-05-22 11:42:24 +02:00
Guido D'Orsi
9d6d9fe7a5 fix: fixes create types for CoList, CoRecord, CoFeed and CoFileStream 2025-05-22 11:33:03 +02:00
Benjamin S. Leveritt
69709c2cf2 Turbo just builds deps now
What a smol change?
2025-05-22 10:29:42 +01:00
Benjamin S. Leveritt
409758afd0 Adds tests for co.fileStream()'s this 2025-05-22 10:53:46 +02:00
Guido D'Orsi
e0bc532345 Merge pull request #2321 from garden-co/changeset-release/main
Version Packages
2025-05-22 10:14:43 +02:00
github-actions[bot]
87e02c0516 Version Packages 2025-05-22 08:14:27 +00:00
Guido D'Orsi
405f9be7b9 Merge pull request #2320 from garden-co/fix-z-create
fix: fix coMap.create with optional references
2025-05-22 10:10:01 +02:00
Guido D'Orsi
c82bf737bf Merge pull request #2319 from garden-co/fix-z-enum
feat: export the co.loaded alias
2025-05-22 10:08:49 +02:00
Guido D'Orsi
91cbb2f9d4 fix: fix coMap.create with optional types 2025-05-22 09:58:44 +02:00
Guido D'Orsi
cfbba59c6d test: reproduce the create type errors 2025-05-21 20:44:04 +02:00
Guido D'Orsi
b1209e2e09 docs: bring co.loaded in the upgrade guide 2025-05-21 19:38:06 +02:00
Guido D'Orsi
20b3d88135 feat: export the co.loaded alias 2025-05-21 19:25:47 +02:00
Guido D'Orsi
d9ad1f4de5 Merge pull request #2317 from garden-co/changeset-release/main
Version Packages
2025-05-21 18:16:49 +02:00
github-actions[bot]
c90153e0c9 Version Packages 2025-05-21 15:57:01 +00:00
Guido D'Orsi
a4241c0f4b Merge pull request #2315 from garden-co/fix-z-enum
fix: support z.enum
2025-05-21 17:53:00 +02:00
Benjamin S. Leveritt
e1ff7a65a8 Merge pull request #2316 from garden-co/fix-file-share-svelte
fix-file-share-svelte
2025-05-21 16:51:08 +01:00
Guido D'Orsi
011af55446 fix: support z.enum 2025-05-21 17:48:38 +02:00
Benjamin S. Leveritt
e9dbcf53c8 Fix formatting 2025-05-21 16:30:59 +01:00
Benjamin S. Leveritt
3da21b95ec Fix type issues 2025-05-21 16:30:49 +01:00
Benjamin S. Leveritt
a6d0dd07a1 Add type checking to build process
Can’t fathom why it’s not in there by default.
2025-05-21 15:51:25 +01:00
Trisha Lim
e7733a5428 take svelte out of experimental 2025-05-21 14:45:12 +01:00
Margaret Culotta
286b17431a update per pr feedback, update language, revert change to DocsNav 2025-05-21 08:25:27 -05:00
Emil Sayahi
e8c1a3535a fix(docs): remove parent/child terminology 2025-05-21 09:09:05 -04:00
Emil Sayahi
b05878962b Merge branch 'main' into emil/group-inheritance-evolution 2025-05-21 08:54:41 -04:00
Benjamin S. Leveritt
ac474c4afb Merge pull request #2313 from garden-co/1888-type-check-every-react-example
Final mop-up for React docs type checks
2025-05-21 13:54:36 +01:00
Benjamin S. Leveritt
afe8e1f3b2 Merge pull request #2312 from garden-co/2311-fix-type-check-on-organization-pattern
Fixes org pattern doc
2025-05-21 13:45:40 +01:00
Benjamin S. Leveritt
b12b3808fa Merge pull request #2310 from garden-co/2212-remove-skiperrorchecking-workaround-in-jazz-react-typedoc-options
Remove typedoc check skip
2025-05-21 13:37:14 +01:00
Benjamin S. Leveritt
08ec8fe709 Fixes org pattern doc 2025-05-21 13:27:52 +01:00
Benjamin S. Leveritt
f70cae6bf6 Final mop-up for React docs type checks
Closes #1888
2025-05-21 13:27:12 +01:00
Benjamin S. Leveritt
59fe373863 Remove typedoc check skip 2025-05-21 13:23:35 +01:00
Guido D'Orsi
be58b4c1d8 Merge pull request #2308 from garden-co/changeset-release/main
Version Packages
2025-05-21 13:47:28 +02:00
github-actions[bot]
96c520ae4d Version Packages 2025-05-21 11:46:24 +00:00
Benjamin S. Leveritt
a9553b4945 Merge pull request #2307 from garden-co/2220-type-check-ImageDefinition
2220-type-check-ImageDefinition
2025-05-21 12:43:43 +01:00
Guido D'Orsi
fa516522e3 Merge pull request #2301 from garden-co/fix/svelte-zod
feat: make jazz-svelte compatible with the 0.14 changes
2025-05-21 13:16:18 +02:00
Benjamin S. Leveritt
59e4b5da54 Add typechecked vanillaJS docs 2025-05-21 11:51:24 +01:00
Benjamin S. Leveritt
2fa3f94b4a Add typechecked React docs 2025-05-21 11:51:07 +01:00
Guido D'Orsi
a2f8461e26 docs: add vanilla and expo 2025-05-21 12:47:50 +02:00
Guido D'Orsi
cabaf079be docs(0-14): svelte upgrade guide, fill todo sections 2025-05-21 12:40:08 +02:00
Trisha Lim
d8de4a7ada Merge pull request #2294 from garden-co/docs/groups-type-check
docs: type check Groups
2025-05-21 10:37:53 +01:00
Benjamin S. Leveritt
e510a544b7 Merge pull request #2300 from garden-co/2220-type-check-filestreams
Fix typechecking for FileStreams
2025-05-21 10:35:38 +01:00
Guido D'Orsi
b2ee30630d feat: make jazz-svelte compatible with the 0.14 changes 2025-05-21 11:11:35 +02:00
Benjamin S. Leveritt
ab0d4f364a Fix typechecking for FileStreams 2025-05-21 09:45:42 +01:00
Emil Sayahi
54b4595f23 feat(docs): reduce 'parent', 'child' groups 2025-05-20 18:37:23 -04:00
Emil Sayahi
99a2d9be00 chore: changeset 2025-05-20 17:07:37 -04:00
Emil Sayahi
bf1fbdc8c4 feat(docs): 'Groups as members' 2025-05-20 17:01:33 -04:00
Margaret Culotta
7c88b2c55d Update examples and content to reflect zod changes 2025-05-20 15:28:12 -05:00
Emil Sayahi
14b3aa29c7 feat(docs): type-checking for inheritance docs 2025-05-20 16:00:26 -04:00
Emil Sayahi
bfaadb9d67 feat(tests): unextend test in jazz-tools 2025-05-20 15:38:25 -04:00
Emil Sayahi
cb770e565d feat: group extend should error with writeOnly
todo:
- add unextend tests in `packages/jazz-tools/src/tests/groupsAndAccounts.test.ts`
- test affected example apps by hand
- rewrite group inheritance documentation in terms of adding & removing groups as members
- changeset
2025-05-20 14:52:32 -04:00
Margaret Culotta
15190250e5 handle pr feedback 2025-05-20 13:47:48 -05:00
Emil Sayahi
a50a9e6c9b feat: deprecate extend methods
todo:
- add unextend tests in `packages/jazz-tools/src/tests/groupsAndAccounts.test.ts`
  - also add more `addMember` tests
    - `member` is not `Group` but `role` is `undefined` (type error)
    - `member` is not `Group` but `role` is `inherit` (type error)
- changeset
2025-05-20 13:35:43 -04:00
Margaret Culotta
b8f91dcb9d Merge branch 'main' into feat/1514-coValue-types-data-access-docs 2025-05-20 12:14:35 -05:00
Margaret Culotta
23f5879b54 clean up linting 2025-05-20 11:49:53 -05:00
Margaret Culotta
f882b68490 Break up soft deletion section into coMap and coList to better describe pattern 2025-05-20 11:46:40 -05:00
Trisha Lim
6d9c6ae698 docs: add twoslash type checks to Group Inheritance 2025-05-20 16:01:41 +01:00
Trisha Lim
914af3deae docs: add twoslash type checks to Public Sharing 2025-05-20 15:52:56 +01:00
Trisha Lim
4ad8e9ae78 docs: add twoslash type checks to Groups 2025-05-20 15:29:08 +01:00
Trisha Lim
1e0b496555 docs: add twoslash type check to CoLists, CoFeeds (#2281)
* docs: add twoslash type check to CoLists

* revert to not using a list type

* twoslash type check for CoFeed
2025-05-20 15:04:24 +01:00
Guido D'Orsi
0088aa8b25 Merge pull request #2292 from garden-co/changeset-release/main
Version Packages
2025-05-20 15:48:40 +02:00
github-actions[bot]
35a66df1e4 Version Packages 2025-05-20 12:52:45 +00:00
Guido D'Orsi
3b2fa64a82 Merge pull request #2291 from garden-co/fix/test
fix: restore custom AccountSchema support in testing utils
2025-05-20 14:46:22 +02:00
Guido D'Orsi
3d1027f278 chore: changeset 2025-05-20 14:46:04 +02:00
Guido D'Orsi
cc78386163 Merge pull request #2290 from garden-co/feat/extand-parent
feat: make possible to extend a group without having access to it
2025-05-20 14:17:56 +02:00
Guido D'Orsi
c240eed6a4 fix: Fix custom AccountSchema support in testing utils 2025-05-20 13:19:59 +02:00
Guido D'Orsi
2a9b7f5d52 test: more tests on group extend 2025-05-20 12:44:31 +02:00
Guido D'Orsi
f2fbd29de5 feat: make possible to extend a group without having access to it 2025-05-20 11:54:11 +02:00
Benjamin S. Leveritt
c960176a2a Merge pull request #2285 from garden-co/update-subscriptions-and-loading-for-zod
Update subscriptions and loading docs for 0.14
2025-05-20 06:43:46 +01:00
Benjamin S. Leveritt
fd4bae4cc1 Replace Resolved with Loaded 2025-05-19 22:16:41 +01:00
Benjamin S. Leveritt
ae32b7c19b Updates code expamples 2025-05-19 22:07:55 +01:00
Margaret Culotta
ce149eba76 clean up code snippet 2025-05-19 15:13:14 -05:00
Guido D'Orsi
83986c6699 Merge pull request #2270 from garden-co/changeset-release/main
Version Packages
2025-05-19 21:39:10 +02:00
github-actions[bot]
59a4e2cee3 Version Packages 2025-05-19 19:32:13 +00:00
Trisha Lim
d2a971c86c fix: update plaintext init to zod (#2283) 2025-05-19 20:29:15 +01:00
Margaret Culotta
41d3a5c755 Merge branch 'main' into feat/1604-Add-docs-for-soft-delete 2025-05-19 13:43:52 -05:00
Trisha Lim
aae9ef49da improvement: org design pattern docs (#2253) 2025-05-19 19:38:05 +01:00
Trisha Lim
58c5ee5c73 form design pattern docs: emphasize not having a save button (#2241)
* form design pattern docs: emphasize not having a save button

* rewording to follow diataxis

* fix: instructions field shows undefined
2025-05-19 19:37:40 +01:00
Wizzel1
e88252bee4 Fix formatting 2025-05-19 20:20:52 +02:00
Wizzel1
a6b7857f6f Fix markdown formatting 2025-05-19 20:06:28 +02:00
Wizzel1
265c30158e Fix markdown formatting 2025-05-19 19:59:56 +02:00
Wizzel1
505e132f1e Run format script 2025-05-19 19:53:12 +02:00
Wizzel1
c6d5195cb5 Update tests 2025-05-19 19:48:22 +02:00
Wizzel1
8af543e7d6 Update docs 2025-05-19 19:48:17 +02:00
Wizzel1
016b2098a7 Update example 2025-05-19 19:48:11 +02:00
Margaret Culotta
bb67d6c5fd Add docs for soft delete 2025-05-19 12:40:30 -05:00
Trisha Lim
f1d6097ee6 fix: twoslash breaks page scroll (#2267) 2025-05-19 17:37:35 +01:00
Margaret Culotta
60bf6f0a7a Add section for soft delete pattern 2025-05-19 11:29:52 -05:00
Anselm
3172a61543 Explain Loaded 2025-05-19 16:47:40 +01:00
Trisha Lim
4683cc7ada homepage: redesign supported env section 2025-05-19 16:29:43 +01:00
Anselm
25324c28d9 Mention RN issue 2025-05-19 16:26:28 +01:00
Anselm
f74cb4885a Upgrade guide progress 2025-05-19 15:59:53 +01:00
Margaret Culotta
83765a8509 Add documentation and sidebar link for Connecting CoValues 2025-05-19 08:54:32 -05:00
Guido D'Orsi
4130213d82 Merge pull request #2271 from garden-co/fix/account-profile
fix: force sync of the group after acceptInvite
2025-05-19 15:35:04 +02:00
Guido D'Orsi
c36a26e669 test: update sync snapshots 2025-05-19 15:22:45 +02:00
Guido D'Orsi
c8b33ad7f1 fix: force sync of the group after acceptInvite 2025-05-19 15:14:41 +02:00
Benjamin S. Leveritt
a79489683e Merge pull request #2246 from joeinnes/2245-svelte-provider
add Svelte provider documentation and metadata
2025-05-19 14:09:08 +01:00
Guido D'Orsi
1251fb89b1 Merge pull request #2269 from garden-co/fix/account-profile
fix: make the profile access on Group members trigger updates correctly
2025-05-19 15:07:13 +02:00
Guido D'Orsi
cdfc10557a fix: make the profile access on Group members trigger updates correctly 2025-05-19 15:01:30 +02:00
Anselm
6e0481114c Fix homepage type errors 2025-05-19 13:50:40 +01:00
Anselm
f7e157d2f5 Make docNavigationItems js again 2025-05-19 13:35:10 +01:00
Anselm
ce83f101c7 More skeleton for the upgrade guide 2025-05-19 13:01:24 +01:00
Anselm Eickhoff
c3c723776e Merge pull request #2268 from garden-co/changeset-release/main
Version Packages
2025-05-19 12:57:06 +01:00
github-actions[bot]
33d7789530 Version Packages 2025-05-19 11:53:38 +00:00
Anselm Eickhoff
dcd7398b06 Merge pull request #2150 from garden-co/feature/zod-horribly
Zod support (using a schema translation layer)
2025-05-19 12:51:00 +01:00
Anselm
c3dd8d0271 Upgrade guide skeleton 2025-05-19 12:50:15 +01:00
Anselm
afe0accad5 Merge branch 'main' into feature/zod-horribly 2025-05-19 12:37:47 +01:00
Anselm
5835ed1274 Add changeset 2025-05-19 12:37:15 +01:00
Anselm
c5a6b87885 Fix betterauth example 2025-05-19 12:35:11 +01:00
Trisha Lim
294678e18e update thumbnail and desc for hend app (#2259) 2025-05-19 12:34:46 +01:00
Trisha Lim
9bb90489f8 feat(docs): link to Previous and Next pages (#2258) 2025-05-19 12:34:34 +01:00
Anselm
67efefde3f Merge branch 'main' into feature/zod-horribly 2025-05-19 12:32:37 +01:00
Anselm
5b28545714 More docs and allow broken homepage samples 2025-05-19 12:26:57 +01:00
Guido D'Orsi
b4352e38aa test: add await on group.removeMember 2025-05-19 13:16:21 +02:00
Guido D'Orsi
8015b8099b test: disable RetryUnavailable flaky test 2025-05-19 13:12:55 +02:00
Anselm
ee451ebd67 Port FileStreams docs (some schema methods missing) 2025-05-19 12:02:00 +01:00
Anselm
9dcd70c896 Port CoFeed docs 2025-05-19 11:56:07 +01:00
Anselm
bcacd04773 Post CoList docs 2025-05-19 11:53:32 +01:00
Anselm
65f20184e5 Port CoMap docs 2025-05-19 11:50:51 +01:00
Anselm
0c1817e5a4 Port accounts-and-migrations 2025-05-19 11:38:23 +01:00
Guido D'Orsi
addd31d43d test: disable RetryUnavailable flaky test 2025-05-19 12:25:54 +02:00
Giordano Ricci
53a02511e1 Merge pull request #2254 from garden-co/gio/betterauth-shadcn
Rework betterauth example
2025-05-19 11:24:18 +01:00
Anselm
c66aa631b3 Remove references to guide for now 2025-05-19 11:14:03 +01:00
Anselm
49a84bd8c5 Make .by and .members props again 2025-05-19 10:56:39 +01:00
Giordano Ricci
218ec7eb8d Merge branch 'main' into gio/betterauth-shadcn 2025-05-19 10:53:33 +01:00
Giordano Ricci
54f313e41e chore: readme & .env 2025-05-19 09:46:03 +01:00
Anselm
f14d971a75 Fix useAcceptInvite in jazz-react-native-core 2025-05-19 09:15:31 +01:00
Anselm
5290452e52 Fix CoList schema bug 2025-05-19 08:48:47 +01:00
Anselm
f49c24807a Upgrade to latest zod 2025-05-18 20:50:06 +01:00
Anselm Eickhoff
938f6767e4 add zod sponsor message 2025-05-18 20:30:23 +01:00
Anselm
b053369589 Make primitive objects & arrays actually work 2025-05-18 20:11:32 +01:00
Anselm
42c7f48c52 Fix CoFeed Proxy stuff and typecheck org example 2025-05-18 18:07:02 +01:00
Anselm
cd3c2cbe81 Move CoFeed entries into perAccount subobject 2025-05-18 17:39:21 +01:00
Anselm
e55bcafedb Make remaining tests pass 2025-05-18 17:03:41 +01:00
Anselm
dd3f7b5685 Make remaining examples build 2025-05-18 16:57:42 +01:00
Anselm
bde9d7637d Fix more examples 2025-05-18 16:36:49 +01:00
Anselm
b3f1bba17f Port all example apps except richtext and vue 2025-05-18 16:22:36 +01:00
Anselm
eb33fe6cf0 Handle non-collaborative objects & arrays 2025-05-18 15:25:04 +01:00
Anselm
54cf1b5906 Fix file name typo 2025-05-18 15:15:10 +01:00
Anselm
c7f48a0750 Split zod schema stuff into files 2025-05-18 15:13:01 +01:00
Anselm
f0419c5cde Port a bunch more apps, fix more stuff 2025-05-18 14:19:00 +01:00
Anselm
500ceb593c Add FileStreamSchema.createFromBlob, start working through examples 2025-05-18 11:09:04 +01:00
Anselm
51251fd87c Fix react package types 2025-05-18 10:28:26 +01:00
Anselm
ce27b1d6f9 Properly implement co.profile and inbox (all jazz-tools tests pass) 2025-05-18 10:25:53 +01:00
Anselm
dc46e36281 Merge branch 'emil/comap-doc-typecheck' into feature/zod-horribly 2025-05-17 22:58:10 +01:00
Anselm
b2bef6ffc2 Update intro & schema docs 2025-05-17 22:54:23 +01:00
Anselm
2766009ce6 Get rid of registered accounts 2025-05-17 22:04:22 +01:00
Anselm
8f88b212c1 Attempt to make form example work 2025-05-17 21:25:20 +01:00
Anselm
32e0133468 Extra changes after merge 2025-05-17 19:32:24 +01:00
Anselm
bf88604943 Merge branch 'main' into feature/zod-horribly 2025-05-17 19:32:11 +01:00
Anselm
9b66fde52d Add co.richText() 2025-05-17 17:43:00 +01:00
Anselm
1caa2761a4 Port a bunch of higher level packages 2025-05-17 17:28:47 +01:00
Anselm
4d54f1ec50 Port jazz-react-core 2025-05-17 16:28:25 +01:00
Anselm
135ca17438 Fix overly strict type assertions 2025-05-17 16:21:19 +01:00
Anselm
a5f9223215 Port requestToJoin (types only) 2025-05-17 16:12:06 +01:00
Anselm
b14a045cdb Port inbox tests (only types) 2025-05-17 15:44:52 +01:00
Anselm
0dfbda0487 Mostly make deep loading work 2025-05-17 15:26:20 +01:00
Anselm
19cb9c3ad3 port ContextManager test 2025-05-17 14:38:54 +01:00
Anselm
646c12f093 Make arbitrarily nested schema unions work 2025-05-17 14:22:57 +01:00
Anselm
fbbaad3e80 Port testing test 2025-05-17 11:59:50 +01:00
Anselm
425aa476c8 Port subscribe tests 2025-05-17 11:54:24 +01:00
Anselm
6922431197 Prefer accepting/returning undefined for optional refs in CoLists 2025-05-17 11:43:54 +01:00
Guido D'Orsi
31614c0a4f Merge pull request #2263 from garden-co/changeset-release/main
Version Packages
2025-05-17 08:58:51 +02:00
Emil Sayahi
07222cd6b0 fix: remove extra line 2025-05-16 15:58:18 -04:00
Emil Sayahi
4a88732f89 feat(docs): typechecking for CoMap docs 2025-05-16 15:57:55 -04:00
github-actions[bot]
57b69eb8da Version Packages 2025-05-16 19:49:36 +00:00
Guido D'Orsi
066676c243 Merge pull request #2264 from garden-co/feat/storage-streaming
feat(storage): implement content streaming
2025-05-16 21:46:46 +02:00
Giordano Ricci
2aac54b91d remove callback param from sso button 2025-05-16 20:29:55 +01:00
Giordano Ricci
4e4b53c420 remove leftover routes handlers 2025-05-16 20:24:33 +01:00
Guido D'Orsi
e141024656 feat(storage): implement content streaming 2025-05-16 20:36:09 +02:00
Guido D'Orsi
2c48ae0434 Merge pull request #2262 from garden-co/feat/storage-streaming
feat(storage): implement chunking for large content files
2025-05-16 19:46:36 +02:00
Guido D'Orsi
2bf974390d feat(storage): implement chunking for large content files 2025-05-16 18:41:14 +02:00
Anselm
a5116b9d63 Most CoList tests passing 2025-05-16 17:24:36 +01:00
Anselm
91ffdcc82f Fix _refs types 2025-05-16 17:19:15 +01:00
Anselm
810a7e6db2 Add getMe() 2025-05-16 16:58:23 +01:00
Joe Innes
e123715819 Fix missing $ in template literal (#2261)
Svelte interpolates curly braces in normal strings, but not template literals.
2025-05-16 16:47:11 +01:00
Anselm
1b1c0a98af Add co.account().createAs 2025-05-16 16:42:53 +01:00
Anselm
9fdf5b4831 Make first custom account test pass 2025-05-16 16:40:02 +01:00
Trisha Lim
0d087f3d4c docs: all roles can remove themselves from a Group (#2255) 2025-05-16 13:44:27 +01:00
Giordano Ricci
e2c222c8a6 password recovery flow 2025-05-16 12:08:12 +01:00
Guido D'Orsi
e410823087 Merge pull request #2251 from garden-co/changeset-release/main
Version Packages
2025-05-16 12:26:58 +02:00
Giordano Ricci
5262580222 cleanup layout 2025-05-16 11:26:25 +01:00
github-actions[bot]
dcc11e5b60 Version Packages 2025-05-16 10:22:41 +00:00
Guido D'Orsi
1b05fe5b55 Merge pull request #2252 from garden-co/fix/remove-members-no-parent-access
fix(group): removing members when the admin doesn't have access to the parent group read keys
2025-05-16 12:18:14 +02:00
Guido D'Orsi
de8f896bf9 Merge pull request #2247 from garden-co/feat/skipInvalid
feat: add $onError to catch errors on resolve
2025-05-16 12:17:10 +02:00
Guido D'Orsi
d63716a827 fix(group): removing members when the admin doesn't have access to the parent group read keys 2025-05-16 12:11:03 +02:00
Guido D'Orsi
a1e7fce3b9 Merge pull request #2250 from garden-co/fix/invites-upgrades
fix(invite): restore role upgrades an inviting revoked members
2025-05-16 12:02:50 +02:00
Guido D'Orsi
d5edad7ba5 fix(invite): restore role upgrades an inviting revoked members 2025-05-16 12:02:32 +02:00
Guido D'Orsi
559a4a223b test: cover more logic for $onError 2025-05-16 11:18:27 +02:00
Guido D'Orsi
16d5553ccd docs: replace expect in the example with comments 2025-05-16 09:52:01 +02:00
Guido D'Orsi
ef76c586cc docs: improve the Requesting Invites section 2025-05-15 23:25:54 +02:00
Guido D'Orsi
8ea4b9761c docs: improve the Requesting Invites section 2025-05-15 23:24:38 +02:00
Guido D'Orsi
a81f281079 feat: move to 2025-05-15 23:11:18 +02:00
Guido D'Orsi
3ecb602459 fix: remove Jazz paper scissors from the examples list because the worker isn't deployed 2025-05-15 23:09:16 +02:00
Meg Culotta
ea69ea1f67 Merge pull request #2004 from garden-co/feat/1936-add-request-invites-to-docs
Add request invites to docs
2025-05-15 15:25:28 -05:00
Margaret Culotta
e430bd061e remove unnecessary break 2025-05-15 15:18:35 -05:00
Margaret Culotta
be8ac6fc70 Add new section 2025-05-15 15:08:35 -05:00
Guido D'Orsi
a957485172 chore: docs improvements and more tests 2025-05-15 19:52:00 +02:00
Margaret Culotta
9060975dfb Merge main and handle conflicts 2025-05-15 12:41:32 -05:00
Margaret Culotta
753ec83fdd remove unnecessary comments, clean up 2025-05-15 12:34:05 -05:00
Margaret Culotta
44a9785e93 clean up, clarify and simplfy examples 2025-05-15 12:28:55 -05:00
Trisha Lim
d9b390e538 remove support for demos in examples page (#2230) 2025-05-15 17:57:12 +01:00
Guido D'Orsi
b194f7831b fix: fix return type of $skipInvalid when used on nested lists 2025-05-15 18:17:53 +02:00
Giordano Ricci
9892dd708f improvements, restore SSO button 2025-05-15 17:07:14 +01:00
Guido D'Orsi
b60be9405d docs: add $skipInvalid usage 2025-05-15 17:48:32 +02:00
Guido D'Orsi
84588e0798 feat(organization): add remove member flow and add tests 2025-05-15 17:11:56 +02:00
Guido D'Orsi
e5b170f25e feat: add $skipInvalid resolve keyword 2025-05-15 17:11:09 +02:00
Joe Innes
6efdfef386 Merge remote-tracking branch 'upstream/main' into 2245-svelte-provider 2025-05-15 17:03:55 +02:00
Joe Innes
6528d350ec add Svelte provider documentation and metadata 2025-05-15 17:02:40 +02:00
Giordano Ricci
b6244582c7 wrap up 2025-05-15 15:34:19 +01:00
Guido D'Orsi
cfbf3aa51e Merge pull request #2243 from garden-co/changeset-release/main
Version Packages
2025-05-15 14:38:46 +02:00
github-actions[bot]
b1e00d2b18 Version Packages 2025-05-15 12:35:33 +00:00
Guido D'Orsi
ec330eaa14 chore: include betterauth packages in the linked changeset packages 2025-05-15 14:32:37 +02:00
Guido D'Orsi
07dd2c5e69 fix: restore the longer timeout for the storage loading 2025-05-15 14:26:18 +02:00
Giordano Ricci
37ab25ff62 wip: replace home components 2025-05-15 11:39:53 +01:00
Giordano Ricci
4750e23800 wip: login & signup forms 2025-05-15 11:18:00 +01:00
Trisha Lim
862386c19b add og:description to docs pages (#2153) 2025-05-15 09:29:55 +01:00
Benjamin S. Leveritt
30df1098e1 Merge pull request #2238 from garden-co/update-flake-lock
Updates nix flake lock
2025-05-15 09:12:46 +01:00
Benjamin S. Leveritt
dad4394eed Updates nix flake lock 2025-05-15 09:12:19 +01:00
Benjamin S. Leveritt
9b70336a38 Merge pull request #2187 from garden-co/2186-split-graphemes-with-unicode-segmenter
2186-split-graphemes-with-unicode-segmenter
2025-05-15 09:06:53 +01:00
Guido D'Orsi
75328ac49d Merge pull request #2227 from sectore/fix/pnpm-flake
fix(flake): stick with `pnpm@9.x`
2025-05-15 10:04:03 +02:00
Guido D'Orsi
0acdcf5f5f Merge pull request #2235 from garden-co/changeset-release/main
Version Packages
2025-05-15 09:39:49 +02:00
github-actions[bot]
dafcce5ecd Version Packages 2025-05-15 07:35:31 +00:00
Guido D'Orsi
c93536f795 Merge pull request #2198 from garden-co/fix/storage-sync-manager
fix(storage): create specialized sync/async storage managers
2025-05-15 09:33:06 +02:00
Guido D'Orsi
7bad34f2f5 chore: disable flaky test 2025-05-15 09:32:34 +02:00
Guido D'Orsi
91e0c09f33 feat(sqlite): smarter work scheduling 2025-05-15 09:24:17 +02:00
Guido D'Orsi
e2d6ba3922 fix(storage): create specialized sync/async storage managers 2025-05-15 09:21:50 +02:00
Guido D'Orsi
ba460c7b70 Merge pull request #2233 from garden-co/feat/smart-retry
feat(load): increase retry delay and immediately resolve on available
2025-05-15 09:20:25 +02:00
Guido D'Orsi
fc9f7c9199 Merge pull request #2232 from garden-co/fix/downgrade-writeonly
fix(group): correctly rotate the readKey when downgrating a member to writeOnly
2025-05-15 09:20:02 +02:00
Guido D'Orsi
2fcea1e91b Merge pull request #2201 from garden-co/fix/inspector-colist-items
fix(inspector): colist shows too many items after navigating from a longer colist
2025-05-14 18:55:30 +02:00
Emil Sayahi
191ae380c8 feat: jazz cloud auth & better auth integration (#1580)
* feat(auth): cloud authentication client

* new client function

* key splitting

TODO:
- POST signed key shard to keyserver
- GET key shard from keyserver & reassemble (sending JWT and signer ID)

* key shard merging

* start cloudauth example

TODO: CloudAuth with React Native

* separate packages

* fix sign-up

Bug: sqlite3 can't store updated user details (`secretSeed` is a byte array)

* fix: login

* trying to fix signup then login

* fix: XOR was skipping some bytes!!

* fix: yay! logins work for real this time

* feat: sealer secret sharding

TODO:
- Tests
- Investigate login proceeding despite Better Auth failing to authenticate (eg, with incorrect password)

* feat: provide `CryptoProvider`

* feat: specify `baseUrl` and `keyserver`

also, fixed logging in with `CloudAuthBasicUI` still happening when the user authenticates with Better Auth successfully, logs out in Jazz, then tries to log back in to the Better Auth server with incorrect credentials.
note: with this change, if the key shards are lost in the keyserver (eg, it restarts), then you cannot log back into the Better Auth account.

* feat: e2e test

* Update pnpm-lock.yaml

* fix imports

* disable cloudauth tests for now

* feat(auth): cloud authentication client

* new client function

* key splitting

TODO:
- POST signed key shard to keyserver
- GET key shard from keyserver & reassemble (sending JWT and signer ID)

* key shard merging

* start cloudauth example

TODO: CloudAuth with React Native

* separate packages

* fix sign-up

Bug: sqlite3 can't store updated user details (`secretSeed` is a byte array)

* fix: login

* trying to fix signup then login

* fix: XOR was skipping some bytes!!

* fix: yay! logins work for real this time

* feat: sealer secret sharding

TODO:
- Tests
- Investigate login proceeding despite Better Auth failing to authenticate (eg, with incorrect password)

* feat: provide `CryptoProvider`

* feat: specify `baseUrl` and `keyserver`

also, fixed logging in with `CloudAuthBasicUI` still happening when the user authenticates with Better Auth successfully, logs out in Jazz, then tries to log back in to the Better Auth server with incorrect credentials.
note: with this change, if the key shards are lost in the keyserver (eg, it restarts), then you cannot log back into the Better Auth account.

* feat: e2e test

* Update pnpm-lock.yaml

* fix imports

* disable cloudauth tests for now

* feat: clientside of new cloudauth spec

todo: run test server, test example app locally

* fix: tests

* feat(cloudauth): more developed example

* fix(cloudauth): use new `resolve` API

* fix(deps): remove unused `better-auth`

* docs(auth): cloud/better auth

* feat: additional plugins

* docs(auth): expo better auth

* feat: better auth options

* fix: docs

* rename packages

* merge

TODO: update docs

* docs: auth docs

* feat(examples): improve betterauth example

TODO:
- Self-hosted Better Auth

* feat(examples): self-hosted betterauth

* refactor

* feat(betterauth): api refactor

* fix(docs): build error

* feat(examples): email otp

* feat(examples): account deletion, verification, linking

* feat(tests): enable `betterauth` tests

* feat: begin Better Auth components

* fix: provider button text

* fix: tailwind class detection

* feat: see description

- feat: `providers` parameter for sign-in, sign-up, and settings components
- feat: `AccountProviders` component
- fix: auth state not updated on Next.js redirects
- feat: pass Better Auth client options to provider, not client object
  - feat: improved auth client type-checking in jazz packages
- docs: show usage of auth provider component

* fix: memory management

* fix: `lucide-react` import errors

* Update pnpm-lock.yaml

* Update `pnpm-lock.yaml`

* design system is driving me crazy

* Update `homepage/pnpm-lock.yaml`

`git clean -dfX; rm ./pnpm-lock.yaml; rm ./homepage/pnpm-lock.yaml; pnpm install; cd homepage && pnpm install; cd ../; pnpm install; pnpm format-and-lint:fix; pnpm build`

* fix: just move the design system package

* please just work

* widen react range

* fix: re-rendering too often

* Update `pnpm-lock.yaml`

* todo: replace alert, heading, input

* replace alert, heading, input

* Update `pnpm-lock.yaml`

* fix: minimise number of auth fetches

* Update pnpm-lock.yaml

* fix(deps): missing doc dep

* misc: optional `options` param

* feat(docs): hide documentation page

* feat(ci): add tests

* fix: `useSession` effect

* feat: remove key rotation

* fix: minimal number of fetches

* Delete JazzBetterAuth.test.ts.disabled

* feat: upgrade @noble deps

---------

Co-authored-by: Guido D'Orsi <gu.dorsi@gmail.com>
Co-authored-by: Guido D'Orsi <guido@garden.co>
2025-05-14 12:53:57 -04:00
Margaret Culotta
63d0b0673e run linter 2025-05-14 11:49:21 -05:00
Margaret Culotta
2b456b5e07 add approval code snippet 2025-05-14 11:45:25 -05:00
Margaret Culotta
e20809d314 fix errors in code snippets 2025-05-14 11:12:26 -05:00
Guido D'Orsi
eef1a5d994 feat(load): increase retry delay and immediately resolve on available 2025-05-14 17:38:21 +02:00
Guido D'Orsi
daee7b900d fix(group): correctly rotate the readKey when downgrading a member to writeOnly 2025-05-14 17:24:02 +02:00
Trisha Lim
9afcd38e3b link to discord and github from every docs page (#2224)
* link to discord and github from every docs page

* change to hr

* fix: incorrect url

* lint fix

* move links to right nav

* mobile

* use issue template to set labels and assignee

* update github link text

* increase focus area of links

* remove ComingSoon component
2025-05-14 15:50:03 +01:00
Trisha Lim
477ff0284a Merge pull request #2229 from garden-co/fix/form-docs
Add twoslash type check to design pattern docs
2025-05-14 15:45:53 +01:00
Guido D'Orsi
85604ec4c5 Merge pull request #2228 from garden-co/changeset-release/main
Version Packages
2025-05-14 16:32:12 +02:00
Trisha Lim
1c641ad03d fix import 2025-05-14 15:14:37 +01:00
Trisha Lim
87cfca41f0 Add twoslash type check to organization design pattern docs 2025-05-14 15:11:32 +01:00
Trisha Lim
2783f8c308 Add twoslash type check to form design pattern docs 2025-05-14 14:49:42 +01:00
github-actions[bot]
de783063e2 Version Packages 2025-05-14 12:46:57 +00:00
Guido D'Orsi
9681691701 Merge pull request #2226 from garden-co/feat/ws-connect-events
feat(worker): add waitForConnection and subscribeToConnectionChange APIs to handle connection drops
2025-05-14 14:42:50 +02:00
Guido D'Orsi
6c7ae1faee Merge pull request #2225 from garden-co/feat/dependencies-load
fix: recovery from missing dependencies when getting new content
2025-05-14 14:42:23 +02:00
jk
9472347b57 nix flake update 2025-05-14 14:37:57 +02:00
jk
b43395d8ed fix(flake) stick to pnpm@9.x
to be in sync with pnpm definition in `package.json`. In other case
`pnpm@10` is used and `pnpm i` or other commands won't work properly
2025-05-14 14:36:04 +02:00
Anselm Eickhoff
12e9837858 Update issue templates 2025-05-14 13:27:49 +01:00
Guido D'Orsi
422dbc4222 feat(worker): add waitForConnection and subscribeToConnectionChange APIs to handle connection drops 2025-05-14 13:09:10 +02:00
Guido D'Orsi
e7ccb2c054 fix: recovery from missing dependencies when getting new content 2025-05-14 12:58:39 +02:00
Guido D'Orsi
2f7046002d Merge pull request #2214 from garden-co/feat/sync-polish
feat: make the SyncManager async-free, support parallel load on server peers
2025-05-14 12:55:36 +02:00
Benjamin S. Leveritt
20c1588249 Merge pull request #2218 from garden-co/2217-type-check-accounts-and-migrations
Adds typechecking to Accounts and Migrations
2025-05-14 10:36:29 +01:00
Benjamin S. Leveritt
f3d3d4dc5d Adds typechecking to Accounts and Migrations 2025-05-14 09:50:38 +01:00
Anselm Eickhoff
3135d711d4 Merge pull request #2216 from garden-co/fix-account-resolve-docs
Fix account resolution in accounts-and-migrations.mdx
2025-05-14 09:02:58 +01:00
Anselm Eickhoff
14ad9622ea Update accounts-and-migrations.mdx 2025-05-14 09:02:24 +01:00
Guido D'Orsi
0fee2aa21b chore: make the SyncManager async-free, support parallel load on server peers 2025-05-13 21:44:10 +02:00
Margaret Culotta
b6de11e125 Merge branch 'main' into feat/1936-add-request-invites-to-docs 2025-05-13 12:56:38 -05:00
Guido D'Orsi
1e6581cd68 Merge pull request #2206 from garden-co/changeset-release/main
Version Packages
2025-05-13 17:48:05 +02:00
github-actions[bot]
aaacaf0130 Version Packages 2025-05-13 15:35:24 +00:00
Guido D'Orsi
7dcca057e7 Merge pull request #2205 from garden-co/feat/self-revoke
feat: allow accounts to self-remove from groups
2025-05-13 17:32:57 +02:00
Anselm
09b815b87e WIP Account schemas 2025-05-13 16:27:52 +01:00
Guido D'Orsi
63570520a3 feat: allow accounts to self-remove from groups 2025-05-13 17:27:51 +02:00
Trisha Lim
aeed9595ae Merge pull request #2203 from garden-co/docs/server-workers-example 2025-05-13 13:40:23 +01:00
Trisha Lim
6755e28d0f docs: link to server workers example 2025-05-13 12:28:18 +01:00
Trisha Lim
8e5ff13115 fix(inspector): colist shows too many items after navigating from a longer colist 2025-05-13 12:00:38 +01:00
Guido D'Orsi
23521e6468 Merge pull request #2197 from garden-co/changeset-release/main
Version Packages
2025-05-12 20:06:14 +02:00
github-actions[bot]
1627eb7652 Version Packages 2025-05-12 18:05:04 +00:00
Guido D'Orsi
ff846d9095 fix: loading RawAccount with the new subscription engine 2025-05-12 20:02:57 +02:00
Benjamin S. Leveritt
1ab839bd59 Switch to mapping by grapheme, rather than code points 2025-05-12 10:49:02 +01:00
Benjamin S. Leveritt
af3b13428c Replace Intl.Segmenter with unicode-segmenter 2025-05-12 10:48:23 +01:00
Benjamin S. Leveritt
fe241e7e7c Add extended tests for complex grapheme splitting 2025-05-12 10:12:56 +01:00
Anselm
db3c737e9f Make co.feed() work 2025-05-09 16:31:24 +01:00
Anselm
28d7fe9b90 Start updating the homepage 2025-05-09 15:29:55 +01:00
Anselm
4c70ca198b Port coList tests to zod 2025-05-09 14:40:54 +01:00
Anselm
742283263f Get rid of coField<...>, stop using instance getters on CoMaps 2025-05-09 14:26:55 +01:00
Anselm
5f4e9a9936 Trying to make records work 2025-05-09 10:35:18 +01:00
Anselm
2b40b3052c Implement the rest of CoMap loading & subscribing 2025-05-08 15:05:55 +01:00
Anselm
9dd926a59a Add todo for discriminated union narrowing 2025-05-08 12:08:35 +01:00
Anselm
9aa6ab6fea Make discriminated unions of CoMaps work 2025-05-08 12:03:31 +01:00
Anselm
4207fb5914 Use zod schemas for simple CoMap tests 2025-05-08 10:58:02 +01:00
Anselm
cb3e5cbe81 Fix build, update RN (to support zod4's wildcard exports) and make tests pass 2025-05-07 20:07:55 +01:00
Anselm
d199fb06b3 Make ImageDefs work, fix circular imports 2025-05-07 17:29:52 +01:00
Anselm
0eaa500aef Make basic chat app work 2025-05-07 11:17:39 +01:00
Anselm
774c05cef0 Merge branch 'main' into feature/zod-horribly 2025-05-07 09:28:45 +01:00
Anselm
96a1f303fe Merge branch 'refactor/combine-covalue-core-and-state' into feature/zod-horribly 2025-05-06 15:14:47 +01:00
Anselm
6a55a548a0 Replacing ID<CoValue> in favor of string, initial "soft" step 2025-05-06 11:17:22 +01:00
Anselm
0e87c1c971 Fix more occurences of coField 2025-05-05 15:28:48 +01:00
Anselm
89fac342bf Rename co -> coField in preparation of giving co a new meaning 2025-05-05 11:38:35 +01:00
Margaret Culotta
d23c71d511 working through twoslash errors 2025-04-30 08:11:32 -05:00
Benjamin S. Leveritt
b24071cf33 Fixes example for TwoSlash 2025-04-28 16:36:25 +01:00
Benjamin S. Leveritt
a5c88c08de Merge main into feat/1936-add-request-invites-to-docs 2025-04-28 16:14:17 +01:00
Margaret Culotta
906932db1e update imports and mocks for twoslash 2025-04-24 12:22:17 -05:00
Margaret Culotta
2033e35a41 Merge branch 'main' into feat/1936-add-request-invites-to-docs 2025-04-24 11:26:09 -05:00
Margaret Culotta
5a2a12ccbb update twoslash imports 2025-04-18 08:10:50 -05:00
Margaret Culotta
d288cb6954 update docs for request invite 2025-04-17 10:18:17 -05:00
1939 changed files with 127363 additions and 83909 deletions

View File

@@ -2,38 +2,24 @@
"$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"linked": [
"linked": [],
"fixed": [
[
"cojson",
"cojson-storage",
"cojson-core-wasm",
"cojson-storage-indexeddb",
"cojson-storage-sqlite",
"cojson-transport-ws",
"jazz-browser",
"jazz-auth-clerk",
"jazz-browser-media-images",
"jazz-expo",
"jazz-inspector",
"jazz-inspector-element",
"jazz-nodejs",
"jazz-react",
"jazz-react-core",
"jazz-react-auth-clerk",
"jazz-react-native-core",
"jazz-react-native",
"jazz-react-native-media-images",
"jazz-auth-betterauth",
"jazz-betterauth-client-plugin",
"jazz-betterauth-server-plugin",
"jazz-react-auth-betterauth",
"jazz-run",
"jazz-svelte",
"jazz-tools",
"jazz-vue"
"community-jazz-vue"
]
],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": [],
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
"onlyUpdatePeerDependentsWhenOutOfRange": true
}
"updateInternalDependencies": "minor"
}

View File

@@ -0,0 +1,5 @@
---
"jazz-tools": patch
---
Explicit loadAs in CoList.upsertUnique to use it without loaded context

View File

@@ -0,0 +1,8 @@
---
"cojson": patch
---
Fix admin permission downgrade to writeOnly
- Allow admin to self-downgrade to writeOnly
- Prevent admin from downgrading other admins to writeOnly

View File

@@ -0,0 +1,5 @@
---
"cojson": patch
---
Skip agent resolution when skipVerify is true

8
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1,8 @@
./packages @garden-co/framework
./tests @garden-co/framework
./packages/quint-ui @garden-co/ui
./homepage @garden-co/ui
./homepage/homepage/content/docs @garden-co/docs
./starters @garden-co/docs
./examples @garden-co/docs @garden-co/ui

10
.github/ISSUE_TEMPLATE/docs-request.md vendored Normal file
View File

@@ -0,0 +1,10 @@
---
name: Docs request
about: Allow people to quickly report issues & improvements for the docs
title: 'Docs: '
labels: docs, requested
assignees: bensleveritt
---

23
.github/pull_request_template.md vendored Normal file
View File

@@ -0,0 +1,23 @@
# Description
<!-- Please include a summary of the change and which issue is fixed -->
<!-- Please also include relevant motivation and context -->
<!-- Include any links to documentation like RFCs if necessary -->
<!-- Add a link to to relevant preview environments or anything that would simplify visual review process -->
<!-- Supplemental screenshots and video are encouraged, but the primary description should be in text -->
## Manual testing instructions
<!-- Add any actions required to manually test the changes -->
## Tests
- [ ] Tests have been added and/or updated
- [ ] Tests have not been updated, because: <!-- Insert reason for not updating tests here -->
- [ ] I need help with writing tests
## Checklist
- [ ] I've updated the part of the docs that are affected the PR changes
- [ ] I've generated a changeset, if a version bump is required
- [ ] I've updated the jsDoc comments to the public APIs I've modified, or added them when missing

View File

@@ -1,37 +0,0 @@
name: Build Examples
on:
push:
branches: [ "main" ]
jobs:
build-examples:
runs-on: blacksmith-4vcpu-ubuntu-2204
strategy:
matrix:
example: [
"chat",
"clerk",
"passkey",
"inspector",
"music-player",
"password-manager",
"pets",
"reactions",
"todo",
]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: true
- name: Setup Source Code
uses: ./.github/actions/source-code/
- name: Pnpm Build
run: |
pnpm install
pnpm turbo build;
working-directory: ./examples/${{ matrix.example }}

View File

@@ -1,26 +0,0 @@
name: Build Starters
on:
push:
branches: ["main"]
jobs:
build-starters:
runs-on: blacksmith-4vcpu-ubuntu-2204
strategy:
matrix:
starter: ["react-passkey-auth"]
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Setup Source Code
uses: ./.github/actions/source-code/
- name: Pnpm Build
run: |
pnpm install
pnpm turbo build;
working-directory: ./starters/${{ matrix.starter }}

View File

@@ -1,21 +1,27 @@
name: Code quality
concurrency:
# For pushes, this lets concurrent runs happen, so each push gets a result.
# But for other events (e.g. PRs), we can cancel the previous runs.
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
on:
push:
branches:
- "main"
pull_request:
jobs:
quality:
runs-on: blacksmith-4vcpu-ubuntu-2204
runs-on: blacksmith-2vcpu-ubuntu-2404-arm
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Biome
uses: biomejs/setup-biome@v2
with:
version: latest
version: 2.1.3
- name: Run Biome
run: biome ci .
- name: Check Catalog Dependencies
run: node scripts/check-catalog-deps.js

77
.github/workflows/create-jazz-app.yml vendored Normal file
View File

@@ -0,0 +1,77 @@
name: Test `create-jazz-app` Distribution
concurrency:
# For pushes, this lets concurrent runs happen, so each push gets a result.
# But for other events (e.g. PRs), we can cancel the previous runs.
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
on:
pull_request:
types: [opened, synchronize, reopened]
paths:
- 'packages/create-jazz-app/**'
jobs:
test-create-jazz-app-distribution:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Source Code
uses: ./.github/actions/source-code/
- name: Setup Bun
uses: oven-sh/setup-bun@v1
with:
bun-version: latest
- name: Build create-jazz-app
run: pnpm build
working-directory: packages/create-jazz-app
- name: Pack create-jazz-app
run: pnpm pack
working-directory: packages/create-jazz-app
- name: Create test directory
run: mkdir -p /tmp/test-create-jazz-app
- name: Initialize test package
run: |
cd /tmp/test-create-jazz-app
bun init -y
- name: Install packed create-jazz-app
run: |
cd /tmp/test-create-jazz-app
bun install ${{ github.workspace }}/packages/create-jazz-app/create-jazz-app-*.tgz
- name: Test basic functionality
run: |
cd /tmp/test-create-jazz-app
bunx create-jazz-app --help
- name: Create test project and validate catalog resolution
run: |
cd /tmp/test-create-jazz-app
mkdir test-project
cd test-project
echo -e "\n\n\n\n\n\n\n\n" | bunx create-jazz-app . --framework react --starter react-passkey-auth --package-manager bun --git false
- name: Validate no unresolved catalog references
run: |
cd /tmp/test-create-jazz-app/test-project
# Check for unresolved catalog: references in package.json
if grep -r "catalog:" package.json; then
echo "❌ Found unresolved catalog: references in generated project"
exit 1
fi
# Check for unresolved workspace: references
if grep -r "workspace:" package.json; then
echo "❌ Found unresolved workspace: references in generated project"
exit 1
fi
echo "✅ All catalog and workspace references resolved successfully"

View File

@@ -1,5 +1,11 @@
name: End-to-End Tests for React Native
concurrency:
# For pushes, this lets concurrent runs happen, so each push gets a result.
# But for other events (e.g. PRs), we can cancel the previous runs.
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
on:
pull_request:
types: [opened, synchronize, reopened]
@@ -38,7 +44,6 @@ jobs:
- name: chat-rn-expo App Pre Build
working-directory: ./examples/chat-rn-expo
run: |
pnpm build
pnpm expo prebuild --clean
- name: Install Maestro
@@ -61,7 +66,8 @@ jobs:
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -no-metrics
disable-animations: true
working-directory: ./examples/chat-rn-expo/
script: ./test/e2e/run.sh
# killall due to this issue: https://github.com/ReactiveCircus/android-emulator-runner/issues/385
script: ./test/e2e/run.sh && ( killall -INT crashpad_handler || true )
- name: Copy Maestro Output
if: steps.e2e_test.outcome != 'success'

View File

@@ -1,5 +1,11 @@
name: Jazz Run Tests
concurrency:
# For pushes, this lets concurrent runs happen, so each push gets a result.
# But for other events (e.g. PRs), we can cancel the previous runs.
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
on:
push:
branches: ["main"]
@@ -8,7 +14,7 @@ on:
jobs:
test:
runs-on: blacksmith-4vcpu-ubuntu-2204
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 5
steps:

View File

@@ -1,5 +1,11 @@
name: Playwright Tests
concurrency:
# For pushes, this lets concurrent runs happen, so each push gets a result.
# But for other events (e.g. PRs), we can cancel the previous runs.
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
on:
push:
branches: ["main"]
@@ -9,11 +15,11 @@ on:
jobs:
test:
timeout-minutes: 60
runs-on: blacksmith-4vcpu-ubuntu-2204
runs-on: blacksmith-4vcpu-ubuntu-2404
continue-on-error: true
strategy:
matrix:
project: ["tests/e2e", "examples/chat", "examples/clerk", "examples/file-share-svelte", "examples/form", "examples/music-player", "examples/pets", "starters/react-passkey-auth"]
shard: ["1/2", "2/2"]
steps:
- uses: actions/checkout@v4
@@ -23,21 +29,131 @@ jobs:
- name: Setup Source Code
uses: ./.github/actions/source-code/
- name: Pnpm Build
run: pnpm turbo build
working-directory: ./${{ matrix.project }}
- name: Install Playwright Browsers
run: pnpm exec playwright install
working-directory: ./${{ matrix.project }}
- name: Run Playwright tests
run: pnpm exec playwright test
working-directory: ./${{ matrix.project }}
- uses: actions/upload-artifact@v4
if: failure()
with:
name: ${{ hashFiles(format('{0}/package.json', matrix.project)) }}-playwright-report
path: ./${{ matrix.project }}/playwright-report/
retention-days: 30
- name: Run Playwright tests for shard ${{ matrix.shard }}
run: |
# Parse shard information (e.g., "1/2" -> shard_num=1, total_shards=2)
IFS='/' read -r shard_num total_shards <<< "${{ matrix.shard }}"
shard_index=$((shard_num - 1)) # Convert to 0-based index
# Debug: Print parsed values
echo "Parsed shard_num: $shard_num"
echo "Parsed total_shards: $total_shards"
echo "Calculated shard_index: $shard_index"
# Define all projects to test
all_projects=(
"tests/e2e"
"examples/chat"
"examples/chat-svelte"
"examples/community-clerk-vue"
"examples/clerk"
"examples/betterauth"
"examples/file-share-svelte"
"examples/form"
"examples/inspector"
"examples/music-player"
"examples/organization"
"examples/server-worker-http"
"starters/react-passkey-auth"
"starters/svelte-passkey-auth"
"tests/jazz-svelte"
)
# Calculate which projects this shard should run
shard_projects=()
for i in "${!all_projects[@]}"; do
if [ $((i % total_shards)) -eq $shard_index ]; then
shard_projects+=("${all_projects[i]}")
fi
done
# Track project results
overall_exit_code=0
failed_projects=()
passed_projects=()
echo "=== Running tests for shard ${{ matrix.shard }} ==="
echo "Projects in this shard:"
printf '%s\n' "${shard_projects[@]}"
echo
# Run tests for each project
for project in "${shard_projects[@]}"; do
echo "=== Testing project: $project ==="
# Check if project directory exists
if [ ! -d "$project" ]; then
echo "❌ FAILED: Project directory $project does not exist"
failed_projects+=("$project (directory not found)")
overall_exit_code=1
continue
fi
# Check if project has package.json
if [ ! -f "$project/package.json" ]; then
echo "❌ FAILED: No package.json found in $project"
failed_projects+=("$project (no package.json)")
overall_exit_code=1
continue
fi
# Build the project
echo "🔨 Building $project..."
cd "$project"
if [ -f .env.test ]; then
cp .env.test .env
fi
if ! pnpm turbo build; then
echo "❌ BUILD FAILED: $project"
failed_projects+=("$project (build failed)")
overall_exit_code=1
cd - > /dev/null
continue
fi
# Run Playwright tests
echo "🧪 Running Playwright tests for $project..."
if ! pnpm exec playwright test; then
echo "❌ TESTS FAILED: $project"
failed_projects+=("$project (tests failed)")
overall_exit_code=1
else
echo "✅ TESTS PASSED: $project"
passed_projects+=("$project")
fi
cd - > /dev/null
echo "=== Finished testing $project ==="
echo
done
# Print summary report
echo "=========================================="
echo "📊 TEST SUMMARY FOR SHARD ${{ matrix.shard }}"
echo "=========================================="
if [ ${#passed_projects[@]} -gt 0 ]; then
echo "✅ PASSED (${#passed_projects[@]}):"
printf ' - %s\n' "${passed_projects[@]}"
echo
fi
if [ ${#failed_projects[@]} -gt 0 ]; then
echo "❌ FAILED (${#failed_projects[@]}):"
printf ' - %s\n' "${failed_projects[@]}"
echo
fi
echo "Total projects in shard: ${#shard_projects[@]}"
echo "Passed: ${#passed_projects[@]}"
echo "Failed: ${#failed_projects[@]}"
echo "=========================================="
# Exit with overall status
exit $overall_exit_code

View File

@@ -1,4 +1,11 @@
name: Pre-Publish tagged Pull Requests
concurrency:
# For pushes, this lets concurrent runs happen, so each push gets a result.
# But for other events (e.g. PRs), we can cancel the previous runs.
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
on:
pull_request:
types: [opened, synchronize, reopened, labeled]

View File

@@ -17,7 +17,7 @@ concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
release:
name: Release
runs-on: blacksmith-4vcpu-ubuntu-2204
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- name: Checkout Repo
uses: actions/checkout@v4

View File

@@ -1,5 +1,11 @@
name: Unit Tests
concurrency:
# For pushes, this lets concurrent runs happen, so each push gets a result.
# But for other events (e.g. PRs), we can cancel the previous runs.
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
on:
pull_request:
types: [opened, synchronize, reopened]
@@ -9,7 +15,7 @@ on:
jobs:
unit-tests:
runs-on: blacksmith-4vcpu-ubuntu-2204
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- name: Checkout

5
.gitignore vendored
View File

@@ -20,6 +20,9 @@ __screenshots__
# Playwright
test-results
# Java
.java-version
.husky
.vscode/*
@@ -29,3 +32,5 @@ test-results
.cursorrules
.windsurfrules
playwright-report

View File

@@ -63,7 +63,7 @@ You'll need Node.js 22.x installed (we're working on support for 23.x), and pnpm
4. **Build the packages**:
```bash
pnpm build
pnpm build:packages
```
5. **Run tests** to verify everything is working:

171
bench/comap.create.bench.ts Normal file
View File

@@ -0,0 +1,171 @@
import { describe, bench } from "vitest";
import * as tools from "jazz-tools";
import * as toolsLatest from "jazz-tools-latest";
import { WasmCrypto } from "cojson/crypto/WasmCrypto";
import { WasmCrypto as WasmCryptoLatest } from "cojson-latest/crypto/WasmCrypto";
import { PureJSCrypto } from "cojson/crypto/PureJSCrypto";
import { PureJSCrypto as PureJSCryptoLatest } from "cojson-latest/crypto/PureJSCrypto";
const sampleReactions = ["👍", "❤️", "😄", "🎉"];
const sampleHiddenIn = ["user1", "user2", "user3"];
// Define the schemas based on the provided Message schema
async function createSchema(
tools: typeof toolsLatest,
WasmCrypto: typeof WasmCryptoLatest,
) {
const Embed = tools.co.map({
url: tools.z.string(),
title: tools.z.string().optional(),
description: tools.z.string().optional(),
image: tools.z.string().optional(),
});
const Message = tools.co.map({
content: tools.z.string(),
createdAt: tools.z.date(),
updatedAt: tools.z.date(),
hiddenIn: tools.co.list(tools.z.string()),
replyTo: tools.z.string().optional(),
reactions: tools.co.list(tools.z.string()),
softDeleted: tools.z.boolean().optional(),
embeds: tools.co.optional(tools.co.list(Embed)),
author: tools.z.string().optional(),
threadId: tools.z.string().optional(),
});
const ctx = await tools.createJazzContextForNewAccount({
creationProps: {
name: "Test Account",
},
// @ts-expect-error
crypto: await WasmCrypto.create(),
});
return {
Message,
sampleReactions,
sampleHiddenIn,
Group: tools.Group,
account: ctx.account,
};
}
const PUREJS = false;
// @ts-expect-error
const schema = await createSchema(tools, PUREJS ? PureJSCrypto : WasmCrypto);
const schemaLatest = await createSchema(
toolsLatest,
// @ts-expect-error
PUREJS ? PureJSCryptoLatest : WasmCryptoLatest,
);
const message = schema.Message.create(
{
content: "A".repeat(1024),
createdAt: new Date(),
updatedAt: new Date(),
hiddenIn: sampleHiddenIn,
reactions: sampleReactions,
author: "user123",
},
schema.Group.create(schema.account).makePublic(),
);
const content = await tools.exportCoValue(schema.Message, message.id, {
// @ts-expect-error
loadAs: schema.account,
});
tools.importContentPieces(content ?? [], schema.account as any);
toolsLatest.importContentPieces(content ?? [], schemaLatest.account);
schema.account._raw.core.node.internalDeleteCoValue(message.id as any);
schemaLatest.account._raw.core.node.internalDeleteCoValue(message.id as any);
describe("Message.create", () => {
bench(
"current version",
() => {
schema.Message.create(
{
content: "A".repeat(1024),
createdAt: new Date(),
updatedAt: new Date(),
hiddenIn: sampleHiddenIn,
reactions: sampleReactions,
author: "user123",
},
schema.Group.create(schema.account),
);
},
{ iterations: 1000 },
);
bench(
"Jazz 0.17.9",
() => {
schemaLatest.Message.create(
{
content: "A".repeat(1024),
createdAt: new Date(),
updatedAt: new Date(),
hiddenIn: sampleHiddenIn,
reactions: sampleReactions,
author: "user123",
},
schemaLatest.Group.create(schemaLatest.account),
);
},
{ iterations: 1000 },
);
});
describe("Message import", () => {
bench(
"current version",
() => {
tools.importContentPieces(content ?? [], schema.account as any);
schema.account._raw.core.node.internalDeleteCoValue(message.id as any);
},
{ iterations: 5000 },
);
bench(
"Jazz 0.17.9",
() => {
toolsLatest.importContentPieces(content ?? [], schemaLatest.account);
schemaLatest.account._raw.core.node.internalDeleteCoValue(
message.id as any,
);
},
{ iterations: 5000 },
);
});
describe("import+ decrypt", () => {
bench(
"current version",
() => {
tools.importContentPieces(content ?? [], schema.account as any);
const node = schema.account._raw.core.node;
node.expectCoValueLoaded(message.id as any).getCurrentContent();
node.internalDeleteCoValue(message.id as any);
},
{ iterations: 5000 },
);
bench(
"Jazz 0.17.9",
() => {
toolsLatest.importContentPieces(content ?? [], schemaLatest.account);
const node = schemaLatest.account._raw.core.node;
node.expectCoValueLoaded(message.id as any).getCurrentContent();
node.internalDeleteCoValue(message.id as any);
},
{ iterations: 5000 },
);
});

14
bench/package.json Normal file
View File

@@ -0,0 +1,14 @@
{
"name": "jazz-tools-benchmark",
"private": true,
"type": "module",
"dependencies": {
"cojson": "workspace:*",
"jazz-tools": "workspace:*",
"cojson-latest": "npm:cojson@0.17.9",
"jazz-tools-latest": "npm:jazz-tools@0.17.9"
},
"scripts": {
"bench": "vitest bench"
}
}

7
bench/vitest.config.ts Normal file
View File

@@ -0,0 +1,7 @@
import { defineProject } from "vitest/config";
export default defineProject({
test: {
name: "bench",
},
});

View File

@@ -1,5 +1,5 @@
{
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
"$schema": "https://biomejs.dev/schemas/2.1.3/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
@@ -7,38 +7,36 @@
},
"files": {
"ignoreUnknown": false,
"ignore": [
"jazz-tools.json",
"**/ios/**",
"**/android/**",
"packages/jazz-svelte/**",
"examples/*svelte*/**",
"examples/jazz-paper-scissors/src/routeTree.gen.ts",
"homepage/homepage/**",
"**/package.json"
"includes": [
"**",
"!crates/**",
"!**/jazz-tools.json",
"!**/ios/**",
"!**/android/**",
"!**/tests/jazz-svelte/src/**",
"!**/examples/**/*svelte*/**",
"!**/starters/**/*svelte*/**",
"!**/examples/server-worker-inbox/src/routeTree.gen.ts",
"!**/homepage/homepage/**",
"!**/package.json",
"!**/*svelte*/**"
]
},
"formatter": {
"enabled": true,
"indentStyle": "space"
},
"organizeImports": {
"enabled": true
},
"assist": { "actions": { "source": { "organizeImports": "off" } } },
"linter": {
"enabled": false,
"rules": {
"recommended": true,
"correctness": {
"useExhaustiveDependencies": "off",
"useImportExtensions": {
"level": "error",
"options": {
"suggestedExtensions": {
"ts": {
"module": "js",
"component": "jsx"
}
}
"forceJsExtensions": true
}
}
}
@@ -46,16 +44,7 @@
},
"overrides": [
{
"include": ["packages/**/src/**"],
"linter": {
"enabled": true,
"rules": {
"recommended": false
}
}
},
{
"include": ["packages/cojson-storage*/**", "cojson-transport-ws/**"],
"includes": ["packages/community-jazz-vue/src/**"],
"linter": {
"enabled": true,
"rules": {
@@ -64,7 +53,28 @@
}
},
{
"include": ["packages/**/src/tests/**"],
"includes": ["**/packages/**/src/**"],
"linter": {
"enabled": true,
"rules": {
"recommended": false
}
}
},
{
"includes": [
"**/packages/cojson/src/storage/**/*/**",
"**/cojson-transport-ws/**"
],
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
}
},
{
"includes": ["**/tests/**"],
"linter": {
"rules": {
"correctness": {
@@ -74,7 +84,7 @@
"noNonNullAssertion": "off"
},
"suspicious": {
"noExplicitAny": "info"
"noExplicitAny": "off"
}
}
}

8
crates/.gitignore vendored Normal file
View File

@@ -0,0 +1,8 @@
# Rust
/target
# Test artifacts
lzy/compressed_66k.lzy
# OS generated files
.DS_Store

1164
crates/Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

7
crates/Cargo.toml Normal file
View File

@@ -0,0 +1,7 @@
[workspace]
resolver = "2"
members = [
"lzy",
"cojson-core",
"cojson-core-wasm",
]

View File

@@ -0,0 +1,3 @@
# cojson-core-wasm
## 0.17.10

View File

@@ -0,0 +1,29 @@
[package]
name = "cojson-core-wasm"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib", "rlib"]
[dependencies]
cojson-core = { path = "../cojson-core" }
wasm-bindgen = "0.2"
console_error_panic_hook = { version = "0.1.7", optional = true }
ed25519-dalek = { version = "2.2.0", default-features = false, features = ["rand_core"] }
serde_json = "1.0"
serde-wasm-bindgen = "0.6"
serde = { version = "1.0", features = ["derive"] }
js-sys = "0.3"
getrandom = { version = "0.2", features = ["js"] }
thiserror = "1.0"
hex = "0.4"
blake3 = "1.5"
x25519-dalek = { version = "2.0", features = ["getrandom", "static_secrets"] }
crypto_secretbox = { version = "0.1.1", features = ["getrandom"] }
salsa20 = "0.10.2"
rand = "0.8"
bs58 = "0.5"
[features]
default = ["console_error_panic_hook"]

View File

@@ -0,0 +1,26 @@
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
mkdirSync("./public", { recursive: true });
const wasm = readFileSync("./pkg/cojson_core_wasm_bg.wasm");
writeFileSync(
"./public/cojson_core_wasm.wasm.js",
`export const data = "data:application/wasm;base64,${wasm.toString("base64")}";`,
);
writeFileSync(
"./public/cojson_core_wasm.wasm.d.ts",
"export const data: string;",
);
const glueJs = readFileSync("./pkg/cojson_core_wasm.js", "utf8").replace(
"module_or_path = new URL('cojson_core_wasm_bg.wasm', import.meta.url);",
"throw new Error();",
);
writeFileSync("./public/cojson_core_wasm.js", glueJs);
writeFileSync(
"./public/cojson_core_wasm.d.ts",
readFileSync("./pkg/cojson_core_wasm.d.ts", "utf8"),
);

3
crates/cojson-core-wasm/index.d.ts vendored Normal file
View File

@@ -0,0 +1,3 @@
export * from "./public/cojson_core_wasm.js";
export async function initialize(): Promise<void>;

View File

@@ -0,0 +1,8 @@
export * from "./public/cojson_core_wasm.js";
import __wbg_init from "./public/cojson_core_wasm.js";
import { data } from "./public/cojson_core_wasm.wasm.js";
export async function initialize() {
return await __wbg_init({ module_or_path: data });
}

View File

@@ -0,0 +1,22 @@
{
"name": "cojson-core-wasm",
"type": "module",
"version": "0.17.10",
"files": [
"public/cojson_core_wasm.js",
"public/cojson_core_wasm.d.ts",
"public/cojson_core_wasm.wasm.js",
"public/cojson_core_wasm.wasm.d.ts",
"index.js",
"index.d.ts"
],
"main": "index.js",
"types": "index.d.ts",
"scripts": {
"build:wasm": "wasm-pack build --release --target web && node build.js",
"build:dev": "wasm-pack build --dev --target web && node build.js"
},
"devDependencies": {
"wasm-pack": "^0.13.1"
}
}

View File

@@ -0,0 +1,291 @@
/* tslint:disable */
/* eslint-disable */
/**
* WASM-exposed function for XSalsa20 encryption without authentication.
* - `key`: 32-byte key for encryption
* - `nonce_material`: Raw bytes used to generate a 24-byte nonce via BLAKE3
* - `plaintext`: Raw bytes to encrypt
* Returns the encrypted bytes or throws a JsError if encryption fails.
* Note: This function does not provide authentication. Use encrypt_xsalsa20_poly1305 for authenticated encryption.
*/
export function encrypt_xsalsa20(key: Uint8Array, nonce_material: Uint8Array, plaintext: Uint8Array): Uint8Array;
/**
* WASM-exposed function for XSalsa20 decryption without authentication.
* - `key`: 32-byte key for decryption (must match encryption key)
* - `nonce_material`: Raw bytes used to generate a 24-byte nonce (must match encryption)
* - `ciphertext`: Encrypted bytes to decrypt
* Returns the decrypted bytes or throws a JsError if decryption fails.
* Note: This function does not provide authentication. Use decrypt_xsalsa20_poly1305 for authenticated decryption.
*/
export function decrypt_xsalsa20(key: Uint8Array, nonce_material: Uint8Array, ciphertext: Uint8Array): Uint8Array;
/**
* Generate a new Ed25519 signing key using secure random number generation.
* Returns 32 bytes of raw key material suitable for use with other Ed25519 functions.
*/
export function new_ed25519_signing_key(): Uint8Array;
/**
* WASM-exposed function to derive an Ed25519 verifying key from a signing key.
* - `signing_key`: 32 bytes of signing key material
* Returns 32 bytes of verifying key material or throws JsError if key is invalid.
*/
export function ed25519_verifying_key(signing_key: Uint8Array): Uint8Array;
/**
* WASM-exposed function to sign a message using Ed25519.
* - `signing_key`: 32 bytes of signing key material
* - `message`: Raw bytes to sign
* Returns 64 bytes of signature material or throws JsError if signing fails.
*/
export function ed25519_sign(signing_key: Uint8Array, message: Uint8Array): Uint8Array;
/**
* WASM-exposed function to verify an Ed25519 signature.
* - `verifying_key`: 32 bytes of verifying key material
* - `message`: Raw bytes that were signed
* - `signature`: 64 bytes of signature material
* Returns true if signature is valid, false otherwise, or throws JsError if verification fails.
*/
export function ed25519_verify(verifying_key: Uint8Array, message: Uint8Array, signature: Uint8Array): boolean;
/**
* WASM-exposed function to validate and copy Ed25519 signing key bytes.
* - `bytes`: 32 bytes of signing key material to validate
* Returns the same 32 bytes if valid or throws JsError if invalid.
*/
export function ed25519_signing_key_from_bytes(bytes: Uint8Array): Uint8Array;
/**
* WASM-exposed function to derive the public key from an Ed25519 signing key.
* - `signing_key`: 32 bytes of signing key material
* Returns 32 bytes of public key material or throws JsError if key is invalid.
*/
export function ed25519_signing_key_to_public(signing_key: Uint8Array): Uint8Array;
/**
* WASM-exposed function to sign a message with an Ed25519 signing key.
* - `signing_key`: 32 bytes of signing key material
* - `message`: Raw bytes to sign
* Returns 64 bytes of signature material or throws JsError if signing fails.
*/
export function ed25519_signing_key_sign(signing_key: Uint8Array, message: Uint8Array): Uint8Array;
/**
* WASM-exposed function to validate and copy Ed25519 verifying key bytes.
* - `bytes`: 32 bytes of verifying key material to validate
* Returns the same 32 bytes if valid or throws JsError if invalid.
*/
export function ed25519_verifying_key_from_bytes(bytes: Uint8Array): Uint8Array;
/**
* WASM-exposed function to validate and copy Ed25519 signature bytes.
* - `bytes`: 64 bytes of signature material to validate
* Returns the same 64 bytes if valid or throws JsError if invalid.
*/
export function ed25519_signature_from_bytes(bytes: Uint8Array): Uint8Array;
/**
* WASM-exposed function to sign a message using Ed25519.
* - `message`: Raw bytes to sign
* - `secret`: Raw Ed25519 signing key bytes
* Returns base58-encoded signature with "signature_z" prefix or throws JsError if signing fails.
*/
export function sign(message: Uint8Array, secret: Uint8Array): string;
/**
* WASM-exposed function to verify an Ed25519 signature.
* - `signature`: Raw signature bytes
* - `message`: Raw bytes that were signed
* - `id`: Raw Ed25519 verifying key bytes
* Returns true if signature is valid, false otherwise, or throws JsError if verification fails.
*/
export function verify(signature: Uint8Array, message: Uint8Array, id: Uint8Array): boolean;
/**
* WASM-exposed function to derive a signer ID from a signing key.
* - `secret`: Raw Ed25519 signing key bytes
* Returns base58-encoded verifying key with "signer_z" prefix or throws JsError if derivation fails.
*/
export function get_signer_id(secret: Uint8Array): string;
/**
* Generate a 24-byte nonce from input material using BLAKE3.
* - `nonce_material`: Raw bytes to derive the nonce from
* Returns 24 bytes suitable for use as a nonce in cryptographic operations.
* This function is deterministic - the same input will produce the same nonce.
*/
export function generate_nonce(nonce_material: Uint8Array): Uint8Array;
/**
* Hash data once using BLAKE3.
* - `data`: Raw bytes to hash
* Returns 32 bytes of hash output.
* This is the simplest way to compute a BLAKE3 hash of a single piece of data.
*/
export function blake3_hash_once(data: Uint8Array): Uint8Array;
/**
* Hash data once using BLAKE3 with a context prefix.
* - `data`: Raw bytes to hash
* - `context`: Context bytes to prefix to the data
* Returns 32 bytes of hash output.
* This is useful for domain separation - the same data hashed with different contexts will produce different outputs.
*/
export function blake3_hash_once_with_context(data: Uint8Array, context: Uint8Array): Uint8Array;
/**
* Get an empty BLAKE3 state for incremental hashing.
* Returns a new Blake3Hasher instance for incremental hashing.
*/
export function blake3_empty_state(): Blake3Hasher;
/**
* Update a BLAKE3 state with new data for incremental hashing.
* - `state`: Current Blake3Hasher instance
* - `data`: New data to incorporate into the hash
* Returns the updated Blake3Hasher.
*/
export function blake3_update_state(state: Blake3Hasher, data: Uint8Array): void;
/**
* Get the final hash from a BLAKE3 state.
* - `state`: The Blake3Hasher to finalize
* Returns 32 bytes of hash output.
* This finalizes an incremental hashing operation.
*/
export function blake3_digest_for_state(state: Blake3Hasher): Uint8Array;
/**
* Generate a new X25519 private key using secure random number generation.
* Returns 32 bytes of raw key material suitable for use with other X25519 functions.
* This key can be reused for multiple Diffie-Hellman exchanges.
*/
export function new_x25519_private_key(): Uint8Array;
/**
* WASM-exposed function to derive an X25519 public key from a private key.
* - `private_key`: 32 bytes of private key material
* Returns 32 bytes of public key material or throws JsError if key is invalid.
*/
export function x25519_public_key(private_key: Uint8Array): Uint8Array;
/**
* WASM-exposed function to perform X25519 Diffie-Hellman key exchange.
* - `private_key`: 32 bytes of private key material
* - `public_key`: 32 bytes of public key material
* Returns 32 bytes of shared secret material or throws JsError if key exchange fails.
*/
export function x25519_diffie_hellman(private_key: Uint8Array, public_key: Uint8Array): Uint8Array;
/**
* WASM-exposed function to derive a sealer ID from a sealer secret.
* - `secret`: Raw bytes of the sealer secret
* Returns a base58-encoded sealer ID with "sealer_z" prefix or throws JsError if derivation fails.
*/
export function get_sealer_id(secret: Uint8Array): string;
/**
* WASM-exposed function for sealing a message using X25519 + XSalsa20-Poly1305.
* Provides authenticated encryption with perfect forward secrecy.
* - `message`: Raw bytes to seal
* - `sender_secret`: Base58-encoded sender's private key with "sealerSecret_z" prefix
* - `recipient_id`: Base58-encoded recipient's public key with "sealer_z" prefix
* - `nonce_material`: Raw bytes used to generate the nonce
* Returns sealed bytes or throws JsError if sealing fails.
*/
export function seal(message: Uint8Array, sender_secret: string, recipient_id: string, nonce_material: Uint8Array): Uint8Array;
/**
* WASM-exposed function for unsealing a message using X25519 + XSalsa20-Poly1305.
* Provides authenticated decryption with perfect forward secrecy.
* - `sealed_message`: The sealed bytes to decrypt
* - `recipient_secret`: Base58-encoded recipient's private key with "sealerSecret_z" prefix
* - `sender_id`: Base58-encoded sender's public key with "sealer_z" prefix
* - `nonce_material`: Raw bytes used to generate the nonce (must match sealing)
* Returns unsealed bytes or throws JsError if unsealing fails.
*/
export function unseal(sealed_message: Uint8Array, recipient_secret: string, sender_id: string, nonce_material: Uint8Array): Uint8Array;
/**
* WASM-exposed function to encrypt bytes with a key secret and nonce material.
* - `value`: The raw bytes to encrypt
* - `key_secret`: A base58-encoded key secret with "keySecret_z" prefix
* - `nonce_material`: Raw bytes used to generate the nonce
* Returns the encrypted bytes or throws a JsError if encryption fails.
*/
export function encrypt(value: Uint8Array, key_secret: string, nonce_material: Uint8Array): Uint8Array;
/**
* WASM-exposed function to decrypt bytes with a key secret and nonce material.
* - `ciphertext`: The encrypted bytes to decrypt
* - `key_secret`: A base58-encoded key secret with "keySecret_z" prefix
* - `nonce_material`: Raw bytes used to generate the nonce (must match encryption)
* Returns the decrypted bytes or throws a JsError if decryption fails.
*/
export function decrypt(ciphertext: Uint8Array, key_secret: string, nonce_material: Uint8Array): Uint8Array;
export class Blake3Hasher {
free(): void;
constructor();
update(data: Uint8Array): void;
finalize(): Uint8Array;
clone(): Blake3Hasher;
}
export class SessionLog {
free(): void;
constructor(co_id: string, session_id: string, signer_id?: string | null);
clone(): SessionLog;
tryAdd(transactions_json: string[], new_signature_str: string, skip_verify: boolean): void;
addNewPrivateTransaction(changes_json: string, signer_secret: string, encryption_key: string, key_id: string, made_at: number): string;
addNewTrustingTransaction(changes_json: string, signer_secret: string, made_at: number): string;
decryptNextTransactionChangesJson(tx_index: number, encryption_key: string): string;
}
export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
export interface InitOutput {
readonly memory: WebAssembly.Memory;
readonly decrypt_xsalsa20: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number];
readonly encrypt_xsalsa20: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number];
readonly __wbg_sessionlog_free: (a: number, b: number) => void;
readonly sessionlog_new: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
readonly sessionlog_clone: (a: number) => number;
readonly sessionlog_tryAdd: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
readonly sessionlog_addNewPrivateTransaction: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => [number, number, number, number];
readonly sessionlog_addNewTrustingTransaction: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number];
readonly sessionlog_decryptNextTransactionChangesJson: (a: number, b: number, c: number, d: number) => [number, number, number, number];
readonly new_ed25519_signing_key: () => [number, number];
readonly ed25519_sign: (a: number, b: number, c: number, d: number) => [number, number, number, number];
readonly ed25519_verify: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number];
readonly ed25519_signing_key_from_bytes: (a: number, b: number) => [number, number, number, number];
readonly ed25519_signing_key_to_public: (a: number, b: number) => [number, number, number, number];
readonly ed25519_verifying_key_from_bytes: (a: number, b: number) => [number, number, number, number];
readonly ed25519_signature_from_bytes: (a: number, b: number) => [number, number, number, number];
readonly ed25519_verifying_key: (a: number, b: number) => [number, number, number, number];
readonly ed25519_signing_key_sign: (a: number, b: number, c: number, d: number) => [number, number, number, number];
readonly sign: (a: number, b: number, c: number, d: number) => [number, number, number, number];
readonly verify: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number];
readonly get_signer_id: (a: number, b: number) => [number, number, number, number];
readonly generate_nonce: (a: number, b: number) => [number, number];
readonly blake3_hash_once: (a: number, b: number) => [number, number];
readonly blake3_hash_once_with_context: (a: number, b: number, c: number, d: number) => [number, number];
readonly __wbg_blake3hasher_free: (a: number, b: number) => void;
readonly blake3hasher_finalize: (a: number) => [number, number];
readonly blake3hasher_clone: (a: number) => number;
readonly blake3_empty_state: () => number;
readonly blake3_update_state: (a: number, b: number, c: number) => void;
readonly blake3_digest_for_state: (a: number) => [number, number];
readonly blake3hasher_update: (a: number, b: number, c: number) => void;
readonly blake3hasher_new: () => number;
readonly new_x25519_private_key: () => [number, number];
readonly x25519_public_key: (a: number, b: number) => [number, number, number, number];
readonly x25519_diffie_hellman: (a: number, b: number, c: number, d: number) => [number, number, number, number];
readonly get_sealer_id: (a: number, b: number) => [number, number, number, number];
readonly seal: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => [number, number, number, number];
readonly unseal: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => [number, number, number, number];
readonly encrypt: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number];
readonly decrypt: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number];
readonly __wbindgen_malloc: (a: number, b: number) => number;
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
readonly __wbindgen_exn_store: (a: number) => void;
readonly __externref_table_alloc: () => number;
readonly __wbindgen_export_4: WebAssembly.Table;
readonly __externref_table_dealloc: (a: number) => void;
readonly __wbindgen_free: (a: number, b: number, c: number) => void;
readonly __wbindgen_start: () => void;
}
export type SyncInitInput = BufferSource | WebAssembly.Module;
/**
* Instantiates the given `module`, which can either be bytes or
* a precompiled `WebAssembly.Module`.
*
* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated.
*
* @returns {InitOutput}
*/
export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput;
/**
* If `module_or_path` is {RequestInfo} or {URL}, makes a request and
* for everything else, calls `WebAssembly.instantiate` directly.
*
* @param {{ module_or_path: InitInput | Promise<InitInput> }} module_or_path - Passing `InitInput` directly is deprecated.
*
* @returns {Promise<InitOutput>}
*/
export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise<InitInput> } | InitInput | Promise<InitInput>): Promise<InitOutput>;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
export const data: string;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,240 @@
use crate::error::CryptoError;
use ed25519_dalek::{Signer, SigningKey, Verifier, VerifyingKey};
use rand::rngs::OsRng;
use wasm_bindgen::prelude::*;
/// Generate a new Ed25519 signing key using secure random number generation.
/// Returns 32 bytes of raw key material suitable for use with other Ed25519 functions.
#[wasm_bindgen]
pub fn new_ed25519_signing_key() -> Box<[u8]> {
let mut rng = OsRng;
let signing_key = SigningKey::generate(&mut rng);
signing_key.to_bytes().into()
}
/// Internal function to derive an Ed25519 verifying key from a signing key.
/// Takes 32 bytes of signing key material and returns 32 bytes of verifying key material.
/// Returns CryptoError if the key length is invalid.
pub(crate) fn ed25519_verifying_key_internal(signing_key: &[u8]) -> Result<Box<[u8]>, CryptoError> {
let key_bytes: [u8; 32] = signing_key
.try_into()
.map_err(|_| CryptoError::InvalidKeyLength(32, signing_key.len()))?;
let signing_key = SigningKey::from_bytes(&key_bytes);
Ok(signing_key.verifying_key().to_bytes().into())
}
/// WASM-exposed function to derive an Ed25519 verifying key from a signing key.
/// - `signing_key`: 32 bytes of signing key material
/// Returns 32 bytes of verifying key material or throws JsError if key is invalid.
#[wasm_bindgen]
pub fn ed25519_verifying_key(signing_key: &[u8]) -> Result<Box<[u8]>, JsError> {
ed25519_verifying_key_internal(signing_key).map_err(|e| JsError::new(&e.to_string()))
}
/// Internal function to sign a message using Ed25519.
/// Takes 32 bytes of signing key material and arbitrary message bytes.
/// Returns 64 bytes of signature material or CryptoError if key is invalid.
pub(crate) fn ed25519_sign_internal(
signing_key: &[u8],
message: &[u8],
) -> Result<[u8; 64], CryptoError> {
let key_bytes: [u8; 32] = signing_key
.try_into()
.map_err(|_| CryptoError::InvalidKeyLength(32, signing_key.len()))?;
let signing_key = SigningKey::from_bytes(&key_bytes);
Ok(signing_key.sign(message).to_bytes())
}
/// WASM-exposed function to sign a message using Ed25519.
/// - `signing_key`: 32 bytes of signing key material
/// - `message`: Raw bytes to sign
/// Returns 64 bytes of signature material or throws JsError if signing fails.
#[wasm_bindgen]
pub fn ed25519_sign(signing_key: &[u8], message: &[u8]) -> Result<Box<[u8]>, JsError> {
Ok(ed25519_sign_internal(signing_key, message)?.into())
}
/// Internal function to verify an Ed25519 signature.
/// - `verifying_key`: 32 bytes of verifying key material
/// - `message`: Raw bytes that were signed
/// - `signature`: 64 bytes of signature material
/// Returns true if signature is valid, false otherwise, or CryptoError if key/signature format is invalid.
pub(crate) fn ed25519_verify_internal(
verifying_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<bool, CryptoError> {
let key_bytes: [u8; 32] = verifying_key
.try_into()
.map_err(|_| CryptoError::InvalidKeyLength(32, verifying_key.len()))?;
let verifying_key = VerifyingKey::from_bytes(&key_bytes)
.map_err(|e| CryptoError::InvalidVerifyingKey(e.to_string()))?;
let sig_bytes: [u8; 64] = signature
.try_into()
.map_err(|_| CryptoError::InvalidSignatureLength)?;
let signature = ed25519_dalek::Signature::from_bytes(&sig_bytes);
Ok(verifying_key.verify(message, &signature).is_ok())
}
/// WASM-exposed function to verify an Ed25519 signature.
/// - `verifying_key`: 32 bytes of verifying key material
/// - `message`: Raw bytes that were signed
/// - `signature`: 64 bytes of signature material
/// Returns true if signature is valid, false otherwise, or throws JsError if verification fails.
#[wasm_bindgen]
pub fn ed25519_verify(
verifying_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<bool, JsError> {
ed25519_verify_internal(verifying_key, message, signature)
.map_err(|e| JsError::new(&e.to_string()))
}
/// WASM-exposed function to validate and copy Ed25519 signing key bytes.
/// - `bytes`: 32 bytes of signing key material to validate
/// Returns the same 32 bytes if valid or throws JsError if invalid.
#[wasm_bindgen]
pub fn ed25519_signing_key_from_bytes(bytes: &[u8]) -> Result<Box<[u8]>, JsError> {
let key_bytes: [u8; 32] = bytes
.try_into()
.map_err(|_| JsError::new("Invalid signing key length"))?;
Ok(key_bytes.into())
}
/// WASM-exposed function to derive the public key from an Ed25519 signing key.
/// - `signing_key`: 32 bytes of signing key material
/// Returns 32 bytes of public key material or throws JsError if key is invalid.
#[wasm_bindgen]
pub fn ed25519_signing_key_to_public(signing_key: &[u8]) -> Result<Box<[u8]>, JsError> {
ed25519_verifying_key_internal(signing_key).map_err(|e| JsError::new(&e.to_string()))
}
/// WASM-exposed function to sign a message with an Ed25519 signing key.
/// - `signing_key`: 32 bytes of signing key material
/// - `message`: Raw bytes to sign
/// Returns 64 bytes of signature material or throws JsError if signing fails.
#[wasm_bindgen]
pub fn ed25519_signing_key_sign(signing_key: &[u8], message: &[u8]) -> Result<Box<[u8]>, JsError> {
Ok(ed25519_sign_internal(signing_key, message)?.into())
}
/// WASM-exposed function to validate and copy Ed25519 verifying key bytes.
/// - `bytes`: 32 bytes of verifying key material to validate
/// Returns the same 32 bytes if valid or throws JsError if invalid.
#[wasm_bindgen]
pub fn ed25519_verifying_key_from_bytes(bytes: &[u8]) -> Result<Box<[u8]>, JsError> {
let key_bytes: [u8; 32] = bytes
.try_into()
.map_err(|_| JsError::new("Invalid verifying key length"))?;
Ok(key_bytes.into())
}
/// WASM-exposed function to validate and copy Ed25519 signature bytes.
/// - `bytes`: 64 bytes of signature material to validate
/// Returns the same 64 bytes if valid or throws JsError if invalid.
#[wasm_bindgen]
pub fn ed25519_signature_from_bytes(bytes: &[u8]) -> Result<Box<[u8]>, JsError> {
let sig_bytes: [u8; 64] = bytes
.try_into()
.map_err(|_| JsError::new("Invalid signature length"))?;
Ok(sig_bytes.into())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_ed25519_key_generation_and_signing() {
// Test key generation
let signing_key = new_ed25519_signing_key();
assert_eq!(signing_key.len(), 32, "Signing key should be 32 bytes");
// Test verifying key derivation
let verifying_key = ed25519_verifying_key_internal(&signing_key).unwrap();
assert_eq!(verifying_key.len(), 32, "Verifying key should be 32 bytes");
// Test that different signing keys produce different verifying keys
let signing_key2 = new_ed25519_signing_key();
let verifying_key2 = ed25519_verifying_key_internal(&signing_key2).unwrap();
assert_ne!(
verifying_key, verifying_key2,
"Different signing keys should produce different verifying keys"
);
// Test signing and verification
let message = b"Test message";
let signature = ed25519_sign_internal(&signing_key, message).unwrap();
assert_eq!(signature.len(), 64, "Signature should be 64 bytes");
// Test successful verification
let verification_result =
ed25519_verify_internal(&verifying_key, message, &signature).unwrap();
assert!(
verification_result,
"Valid signature should verify successfully"
);
// Test verification with wrong message
let wrong_message = b"Wrong message";
let wrong_verification =
ed25519_verify_internal(&verifying_key, wrong_message, &signature).unwrap();
assert!(
!wrong_verification,
"Signature should not verify with wrong message"
);
// Test verification with wrong key
let wrong_verification =
ed25519_verify_internal(&verifying_key2, message, &signature).unwrap();
assert!(
!wrong_verification,
"Signature should not verify with wrong key"
);
// Test verification with tampered signature
let mut tampered_signature = signature.clone();
tampered_signature[0] ^= 1;
let wrong_verification =
ed25519_verify_internal(&verifying_key, message, &tampered_signature).unwrap();
assert!(!wrong_verification, "Tampered signature should not verify");
}
#[test]
fn test_ed25519_error_cases() {
// Test invalid signing key length
let invalid_signing_key = vec![0u8; 31]; // Too short
let result = ed25519_verifying_key_internal(&invalid_signing_key);
assert!(result.is_err());
let result = ed25519_sign_internal(&invalid_signing_key, b"test");
assert!(result.is_err());
// Test invalid verifying key length
let invalid_verifying_key = vec![0u8; 31]; // Too short
let valid_signing_key = new_ed25519_signing_key();
let valid_signature = ed25519_sign_internal(&valid_signing_key, b"test").unwrap();
let result = ed25519_verify_internal(&invalid_verifying_key, b"test", &valid_signature);
assert!(result.is_err());
// Test invalid signature length
let valid_verifying_key = ed25519_verifying_key_internal(&valid_signing_key).unwrap();
let invalid_signature = vec![0u8; 63]; // Too short
let result = ed25519_verify_internal(&valid_verifying_key, b"test", &invalid_signature);
assert!(result.is_err());
// Test with too long keys
let too_long_key = vec![0u8; 33]; // Too long
let result = ed25519_verifying_key_internal(&too_long_key);
assert!(result.is_err());
let result = ed25519_sign_internal(&too_long_key, b"test");
assert!(result.is_err());
// Test with too long signature
let too_long_signature = vec![0u8; 65]; // Too long
let result = ed25519_verify_internal(&valid_verifying_key, b"test", &too_long_signature);
assert!(result.is_err());
}
}

View File

@@ -0,0 +1,113 @@
use crate::error::CryptoError;
use crate::hash::blake3::generate_nonce;
use bs58;
use wasm_bindgen::prelude::*;
/// Internal function to encrypt bytes with a key secret and nonce material.
/// Takes a base58-encoded key secret with "keySecret_z" prefix and raw nonce material.
/// Returns the encrypted bytes or a CryptoError if the key format is invalid.
pub fn encrypt_internal(
plaintext: &[u8],
key_secret: &str,
nonce_material: &[u8],
) -> Result<Box<[u8]>, CryptoError> {
// Decode the base58 key secret (removing the "keySecret_z" prefix)
let key_secret = key_secret
.strip_prefix("keySecret_z")
.ok_or(CryptoError::InvalidPrefix("key secret", "keySecret_z"))?;
let key = bs58::decode(key_secret)
.into_vec()
.map_err(|e| CryptoError::Base58Error(e.to_string()))?;
// Generate nonce from nonce material
let nonce = generate_nonce(nonce_material);
// Encrypt using XSalsa20
Ok(super::xsalsa20::encrypt_xsalsa20_raw_internal(&key, &nonce, plaintext)?.into())
}
/// Internal function to decrypt bytes with a key secret and nonce material.
/// Takes a base58-encoded key secret with "keySecret_z" prefix and raw nonce material.
/// Returns the decrypted bytes or a CryptoError if the key format is invalid.
pub fn decrypt_internal(
ciphertext: &[u8],
key_secret: &str,
nonce_material: &[u8],
) -> Result<Box<[u8]>, CryptoError> {
// Decode the base58 key secret (removing the "keySecret_z" prefix)
let key_secret = key_secret
.strip_prefix("keySecret_z")
.ok_or(CryptoError::InvalidPrefix("key secret", "keySecret_z"))?;
let key = bs58::decode(key_secret)
.into_vec()
.map_err(|e| CryptoError::Base58Error(e.to_string()))?;
// Generate nonce from nonce material
let nonce = generate_nonce(nonce_material);
// Decrypt using XSalsa20
Ok(super::xsalsa20::decrypt_xsalsa20_raw_internal(&key, &nonce, ciphertext)?.into())
}
/// WASM-exposed function to encrypt bytes with a key secret and nonce material.
/// - `value`: The raw bytes to encrypt
/// - `key_secret`: A base58-encoded key secret with "keySecret_z" prefix
/// - `nonce_material`: Raw bytes used to generate the nonce
/// Returns the encrypted bytes or throws a JsError if encryption fails.
#[wasm_bindgen(js_name = encrypt)]
pub fn encrypt(
value: &[u8],
key_secret: &str,
nonce_material: &[u8],
) -> Result<Box<[u8]>, JsError> {
encrypt_internal(value, key_secret, nonce_material).map_err(|e| JsError::new(&e.to_string()))
}
/// WASM-exposed function to decrypt bytes with a key secret and nonce material.
/// - `ciphertext`: The encrypted bytes to decrypt
/// - `key_secret`: A base58-encoded key secret with "keySecret_z" prefix
/// - `nonce_material`: Raw bytes used to generate the nonce (must match encryption)
/// Returns the decrypted bytes or throws a JsError if decryption fails.
#[wasm_bindgen(js_name = decrypt)]
pub fn decrypt(
ciphertext: &[u8],
key_secret: &str,
nonce_material: &[u8],
) -> Result<Box<[u8]>, JsError> {
Ok(decrypt_internal(ciphertext, key_secret, nonce_material)?.into())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_encrypt_decrypt() {
// Test data
let plaintext = b"Hello, World!";
let key_secret = "keySecret_z11111111111111111111111111111111"; // Example base58 encoded key
let nonce_material = b"test_nonce_material";
// Test encryption
let ciphertext = encrypt_internal(plaintext, key_secret, nonce_material).unwrap();
assert!(!ciphertext.is_empty());
// Test decryption
let decrypted = decrypt_internal(&ciphertext, key_secret, nonce_material).unwrap();
assert_eq!(&*decrypted, plaintext);
}
#[test]
fn test_invalid_key_secret() {
let plaintext = b"test";
let nonce_material = b"nonce";
// Test with invalid key secret format
let result = encrypt_internal(plaintext, "invalid_key", nonce_material);
assert!(result.is_err());
// Test with invalid base58 encoding
let result = encrypt_internal(plaintext, "keySecret_z!!!!", nonce_material);
assert!(result.is_err());
}
}

View File

@@ -0,0 +1,200 @@
use crate::crypto::x25519::x25519_diffie_hellman_internal;
use crate::crypto::xsalsa20::{decrypt_xsalsa20_poly1305, encrypt_xsalsa20_poly1305};
use crate::error::CryptoError;
use crate::hash::blake3::generate_nonce;
use bs58;
use wasm_bindgen::prelude::*;
/// Internal function to seal a message using X25519 + XSalsa20-Poly1305.
/// - `message`: Raw bytes to seal
/// - `sender_secret`: Base58-encoded sender's private key with "sealerSecret_z" prefix
/// - `recipient_id`: Base58-encoded recipient's public key with "sealer_z" prefix
/// - `nonce_material`: Raw bytes used to generate the nonce
/// Returns sealed bytes or CryptoError if key formats are invalid.
///
/// The sealing process:
/// 1. Decode base58 keys and validate prefixes
/// 2. Generate shared secret using X25519 key exchange
/// 3. Generate nonce from nonce material using BLAKE3
/// 4. Encrypt message using XSalsa20-Poly1305 with the shared secret
pub fn seal_internal(
message: &[u8],
sender_secret: &str,
recipient_id: &str,
nonce_material: &[u8],
) -> Result<Vec<u8>, CryptoError> {
// Decode the base58 sender secret (removing the "sealerSecret_z" prefix)
let sender_secret =
sender_secret
.strip_prefix("sealerSecret_z")
.ok_or(CryptoError::InvalidPrefix(
"sealer secret",
"sealerSecret_z",
))?;
let sender_private_key = bs58::decode(sender_secret)
.into_vec()
.map_err(|e| CryptoError::Base58Error(e.to_string()))?;
// Decode the base58 recipient ID (removing the "sealer_z" prefix)
let recipient_id = recipient_id
.strip_prefix("sealer_z")
.ok_or(CryptoError::InvalidPrefix("sealer ID", "sealer_z"))?;
let recipient_public_key = bs58::decode(recipient_id)
.into_vec()
.map_err(|e| CryptoError::Base58Error(e.to_string()))?;
let nonce = generate_nonce(nonce_material);
// Generate shared secret using X25519
let shared_secret = x25519_diffie_hellman_internal(&sender_private_key, &recipient_public_key)?;
// Encrypt message using XSalsa20-Poly1305
Ok(encrypt_xsalsa20_poly1305(&shared_secret, &nonce, message)?.into())
}
/// Internal function to unseal a message using X25519 + XSalsa20-Poly1305.
/// - `sealed_message`: The sealed bytes to decrypt
/// - `recipient_secret`: Base58-encoded recipient's private key with "sealerSecret_z" prefix
/// - `sender_id`: Base58-encoded sender's public key with "sealer_z" prefix
/// - `nonce_material`: Raw bytes used to generate the nonce (must match sealing)
/// Returns unsealed bytes or CryptoError if key formats are invalid or authentication fails.
///
/// The unsealing process:
/// 1. Decode base58 keys and validate prefixes
/// 2. Generate shared secret using X25519 key exchange
/// 3. Generate nonce from nonce material using BLAKE3
/// 4. Decrypt and authenticate message using XSalsa20-Poly1305 with the shared secret
fn unseal_internal(
sealed_message: &[u8],
recipient_secret: &str,
sender_id: &str,
nonce_material: &[u8],
) -> Result<Box<[u8]>, CryptoError> {
// Decode the base58 recipient secret (removing the "sealerSecret_z" prefix)
let recipient_secret =
recipient_secret
.strip_prefix("sealerSecret_z")
.ok_or(CryptoError::InvalidPrefix(
"sealer secret",
"sealerSecret_z",
))?;
let recipient_private_key = bs58::decode(recipient_secret)
.into_vec()
.map_err(|e| CryptoError::Base58Error(e.to_string()))?;
// Decode the base58 sender ID (removing the "sealer_z" prefix)
let sender_id = sender_id
.strip_prefix("sealer_z")
.ok_or(CryptoError::InvalidPrefix("sealer ID", "sealer_z"))?;
let sender_public_key = bs58::decode(sender_id)
.into_vec()
.map_err(|e| CryptoError::Base58Error(e.to_string()))?;
let nonce = generate_nonce(nonce_material);
// Generate shared secret using X25519
let shared_secret = x25519_diffie_hellman_internal(&recipient_private_key, &sender_public_key)?;
// Decrypt message using XSalsa20-Poly1305
Ok(decrypt_xsalsa20_poly1305(&shared_secret, &nonce, sealed_message)?.into())
}
/// WASM-exposed function for sealing a message using X25519 + XSalsa20-Poly1305.
/// Provides authenticated encryption with perfect forward secrecy.
/// - `message`: Raw bytes to seal
/// - `sender_secret`: Base58-encoded sender's private key with "sealerSecret_z" prefix
/// - `recipient_id`: Base58-encoded recipient's public key with "sealer_z" prefix
/// - `nonce_material`: Raw bytes used to generate the nonce
/// Returns sealed bytes or throws JsError if sealing fails.
#[wasm_bindgen(js_name = seal)]
pub fn seal(
message: &[u8],
sender_secret: &str,
recipient_id: &str,
nonce_material: &[u8],
) -> Result<Box<[u8]>, JsError> {
Ok(seal_internal(message, sender_secret, recipient_id, nonce_material)?.into())
}
/// WASM-exposed function for unsealing a message using X25519 + XSalsa20-Poly1305.
/// Provides authenticated decryption with perfect forward secrecy.
/// - `sealed_message`: The sealed bytes to decrypt
/// - `recipient_secret`: Base58-encoded recipient's private key with "sealerSecret_z" prefix
/// - `sender_id`: Base58-encoded sender's public key with "sealer_z" prefix
/// - `nonce_material`: Raw bytes used to generate the nonce (must match sealing)
/// Returns unsealed bytes or throws JsError if unsealing fails.
#[wasm_bindgen(js_name = unseal)]
pub fn unseal(
sealed_message: &[u8],
recipient_secret: &str,
sender_id: &str,
nonce_material: &[u8],
) -> Result<Box<[u8]>, JsError> {
Ok(unseal_internal(sealed_message, recipient_secret, sender_id, nonce_material)?.into())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::crypto::x25519::{new_x25519_private_key, x25519_public_key_internal};
#[test]
fn test_seal_unseal() {
// Generate real keys
let sender_private = new_x25519_private_key();
let sender_public = x25519_public_key_internal(&sender_private).unwrap();
// Encode keys with proper prefixes
let sender_secret = format!(
"sealerSecret_z{}",
bs58::encode(&sender_private).into_string()
);
let recipient_id = format!("sealer_z{}", bs58::encode(&sender_public).into_string());
// Test data
let message = b"Secret message";
let nonce_material = b"test_nonce_material";
// Test sealing
let sealed = seal_internal(message, &sender_secret, &recipient_id, nonce_material).unwrap();
assert!(!sealed.is_empty());
// Test unsealing (using same keys since it's a test)
let unsealed =
unseal_internal(&sealed, &sender_secret, &recipient_id, nonce_material).unwrap();
assert_eq!(&*unsealed, message);
}
#[test]
fn test_invalid_keys() {
let message = b"test";
let nonce_material = b"nonce";
// Test with invalid sender secret format
let result = seal_internal(
message,
"invalid_key",
"sealer_z22222222222222222222222222222222",
nonce_material,
);
assert!(result.is_err());
// Test with invalid recipient ID format
let result = seal_internal(
message,
"sealerSecret_z11111111111111111111111111111111",
"invalid_key",
nonce_material,
);
assert!(result.is_err());
// Test with invalid base58 encoding
let result = seal_internal(
message,
"sealerSecret_z!!!!",
"sealer_z22222222222222222222222222222222",
nonce_material,
);
assert!(result.is_err());
}
}

View File

@@ -0,0 +1,184 @@
use crate::crypto::ed25519::{
ed25519_sign_internal, ed25519_verify_internal, ed25519_verifying_key_internal,
};
use crate::error::CryptoError;
use bs58;
use wasm_bindgen::prelude::*;
/// Internal function to sign a message using Ed25519.
/// - `message`: Raw bytes to sign
/// - `secret`: Base58-encoded signing key with "signerSecret_z" prefix
/// Returns base58-encoded signature with "signature_z" prefix or error string.
pub fn sign_internal(message: &[u8], secret: &str) -> Result<String, CryptoError> {
let secret_bytes = bs58::decode(secret.strip_prefix("signerSecret_z").ok_or(
CryptoError::InvalidPrefix("signer secret", "signerSecret_z"),
)?)
.into_vec()
.map_err(|e| CryptoError::Base58Error(e.to_string()))?;
let signature = ed25519_sign_internal(&secret_bytes, message)
.map_err(|e| CryptoError::InvalidVerifyingKey(e.to_string()))?;
Ok(format!(
"signature_z{}",
bs58::encode(signature).into_string()
))
}
/// Internal function to verify an Ed25519 signature.
/// - `signature`: Base58-encoded signature with "signature_z" prefix
/// - `message`: Raw bytes that were signed
/// - `id`: Base58-encoded verifying key with "signer_z" prefix
/// Returns true if signature is valid, false otherwise, or error string if formats are invalid.
pub fn verify_internal(signature: &str, message: &[u8], id: &str) -> Result<bool, CryptoError> {
let signature_bytes = bs58::decode(
signature
.strip_prefix("signature_z")
.ok_or(CryptoError::InvalidPrefix("signature_z", "signature"))?,
)
.into_vec()
.map_err(|e| CryptoError::Base58Error(e.to_string()))?;
let verifying_key = bs58::decode(
id.strip_prefix("signer_z")
.ok_or(CryptoError::InvalidPrefix("signer_z", "signer ID"))?,
)
.into_vec()
.map_err(|e| CryptoError::Base58Error(e.to_string()))?;
ed25519_verify_internal(&verifying_key, message, &signature_bytes)
.map_err(|e| CryptoError::InvalidVerifyingKey(e.to_string()))
}
/// Internal function to derive a signer ID from a signing key.
/// - `secret`: Base58-encoded signing key with "signerSecret_z" prefix
/// Returns base58-encoded verifying key with "signer_z" prefix or error string.
pub fn get_signer_id_internal(secret: &str) -> Result<String, CryptoError> {
let secret_bytes = bs58::decode(secret.strip_prefix("signerSecret_z").ok_or(
CryptoError::InvalidPrefix("signerSecret_z", "signer secret"),
)?)
.into_vec()
.map_err(|e| CryptoError::Base58Error(e.to_string()))?;
let verifying_key = ed25519_verifying_key_internal(&secret_bytes)
.map_err(|e| CryptoError::InvalidVerifyingKey(e.to_string()))?;
Ok(format!(
"signer_z{}",
bs58::encode(verifying_key).into_string()
))
}
/// WASM-exposed function to sign a message using Ed25519.
/// - `message`: Raw bytes to sign
/// - `secret`: Raw Ed25519 signing key bytes
/// Returns base58-encoded signature with "signature_z" prefix or throws JsError if signing fails.
#[wasm_bindgen(js_name = sign)]
pub fn sign(message: &[u8], secret: &[u8]) -> Result<String, JsError> {
let secret_str = std::str::from_utf8(secret)
.map_err(|e| JsError::new(&format!("Invalid UTF-8 in secret: {:?}", e)))?;
sign_internal(message, secret_str).map_err(|e| JsError::new(&e.to_string()))
}
/// WASM-exposed function to verify an Ed25519 signature.
/// - `signature`: Raw signature bytes
/// - `message`: Raw bytes that were signed
/// - `id`: Raw Ed25519 verifying key bytes
/// Returns true if signature is valid, false otherwise, or throws JsError if verification fails.
#[wasm_bindgen(js_name = verify)]
pub fn verify(signature: &[u8], message: &[u8], id: &[u8]) -> Result<bool, JsError> {
let signature_str = std::str::from_utf8(signature)
.map_err(|e| JsError::new(&format!("Invalid UTF-8 in signature: {:?}", e)))?;
let id_str = std::str::from_utf8(id)
.map_err(|e| JsError::new(&format!("Invalid UTF-8 in id: {:?}", e)))?;
verify_internal(signature_str, message, id_str).map_err(|e| JsError::new(&e.to_string()))
}
/// WASM-exposed function to derive a signer ID from a signing key.
/// - `secret`: Raw Ed25519 signing key bytes
/// Returns base58-encoded verifying key with "signer_z" prefix or throws JsError if derivation fails.
#[wasm_bindgen(js_name = get_signer_id)]
pub fn get_signer_id(secret: &[u8]) -> Result<String, JsError> {
let secret_str = std::str::from_utf8(secret)
.map_err(|e| JsError::new(&format!("Invalid UTF-8 in secret: {:?}", e)))?;
get_signer_id_internal(secret_str).map_err(|e| JsError::new(&e.to_string()))
}
#[cfg(test)]
mod tests {
use super::*;
use crate::crypto::ed25519::new_ed25519_signing_key;
#[test]
fn test_sign_and_verify() {
let message = b"hello world";
// Create a test signing key
let signing_key = new_ed25519_signing_key();
let secret = format!("signerSecret_z{}", bs58::encode(&signing_key).into_string());
// Sign the message
let signature = sign_internal(message, &secret).unwrap();
// Get the public key for verification
let secret_bytes = bs58::decode(secret.strip_prefix("signerSecret_z").unwrap())
.into_vec()
.unwrap();
let verifying_key = ed25519_verifying_key_internal(&secret_bytes).unwrap();
let signer_id = format!("signer_z{}", bs58::encode(&verifying_key).into_string());
// Verify the signature
assert!(verify_internal(&signature, message, &signer_id).unwrap());
}
#[test]
fn test_invalid_inputs() {
let message = b"hello world";
// Test invalid base58 in secret
let result = sign_internal(message, "signerSecret_z!!!invalid!!!");
assert!(matches!(result, Err(CryptoError::Base58Error(_))));
// Test invalid signature format
let result = verify_internal("not_a_signature", message, "signer_z123");
assert!(matches!(
result,
Err(CryptoError::InvalidPrefix("signature_z", "signature"))
));
// Test invalid signer ID format
let result = verify_internal("signature_z123", message, "not_a_signer");
assert!(matches!(
result,
Err(CryptoError::InvalidPrefix("signer_z", "signer ID"))
));
}
#[test]
fn test_get_signer_id() {
// Create a test signing key
let signing_key = new_ed25519_signing_key();
let secret = format!("signerSecret_z{}", bs58::encode(&signing_key).into_string());
// Get signer ID
let signer_id = get_signer_id_internal(&secret).unwrap();
assert!(signer_id.starts_with("signer_z"));
// Test that same secret produces same ID
let signer_id2 = get_signer_id_internal(&secret).unwrap();
assert_eq!(signer_id, signer_id2);
// Test invalid secret format
let result = get_signer_id_internal("invalid_secret");
assert!(matches!(
result,
Err(CryptoError::InvalidPrefix(
"signerSecret_z",
"signer secret"
))
));
// Test invalid base58
let result = get_signer_id_internal("signerSecret_z!!!invalid!!!");
assert!(matches!(result, Err(CryptoError::Base58Error(_))));
}
}

View File

@@ -0,0 +1,168 @@
use crate::error::CryptoError;
use bs58;
use wasm_bindgen::prelude::*;
use x25519_dalek::{PublicKey, StaticSecret};
/// Generate a new X25519 private key using secure random number generation.
/// Returns 32 bytes of raw key material suitable for use with other X25519 functions.
/// This key can be reused for multiple Diffie-Hellman exchanges.
#[wasm_bindgen]
pub fn new_x25519_private_key() -> Vec<u8> {
let secret = StaticSecret::random();
secret.to_bytes().to_vec()
}
/// Internal function to derive an X25519 public key from a private key.
/// Takes 32 bytes of private key material and returns 32 bytes of public key material.
/// Returns CryptoError if the key length is invalid.
pub(crate) fn x25519_public_key_internal(private_key: &[u8]) -> Result<[u8; 32], CryptoError> {
let bytes: [u8; 32] = private_key
.try_into()
.map_err(|_| CryptoError::InvalidKeyLength(32, private_key.len()))?;
let secret = StaticSecret::from(bytes);
Ok(PublicKey::from(&secret).to_bytes())
}
/// WASM-exposed function to derive an X25519 public key from a private key.
/// - `private_key`: 32 bytes of private key material
/// Returns 32 bytes of public key material or throws JsError if key is invalid.
#[wasm_bindgen]
pub fn x25519_public_key(private_key: &[u8]) -> Result<Vec<u8>, JsError> {
Ok(x25519_public_key_internal(private_key)?.to_vec())
}
/// Internal function to perform X25519 Diffie-Hellman key exchange.
/// Takes 32 bytes each of private and public key material.
/// Returns 32 bytes of shared secret material or CryptoError if key lengths are invalid.
pub(crate) fn x25519_diffie_hellman_internal(
private_key: &[u8],
public_key: &[u8],
) -> Result<[u8; 32], CryptoError> {
let private_bytes: [u8; 32] = private_key
.try_into()
.map_err(|_| CryptoError::InvalidKeyLength(32, private_key.len()))?;
let public_bytes: [u8; 32] = public_key
.try_into()
.map_err(|_| CryptoError::InvalidKeyLength(32, public_key.len()))?;
let secret = StaticSecret::from(private_bytes);
let public = PublicKey::from(public_bytes);
Ok(secret.diffie_hellman(&public).to_bytes())
}
/// WASM-exposed function to perform X25519 Diffie-Hellman key exchange.
/// - `private_key`: 32 bytes of private key material
/// - `public_key`: 32 bytes of public key material
/// Returns 32 bytes of shared secret material or throws JsError if key exchange fails.
#[wasm_bindgen]
pub fn x25519_diffie_hellman(private_key: &[u8], public_key: &[u8]) -> Result<Vec<u8>, JsError> {
Ok(x25519_diffie_hellman_internal(private_key, public_key)?.to_vec())
}
/// Internal function to derive a sealer ID from a sealer secret.
/// Takes a base58-encoded sealer secret with "sealerSecret_z" prefix.
/// Returns a base58-encoded sealer ID with "sealer_z" prefix or error string if format is invalid.
pub fn get_sealer_id_internal(secret: &str) -> Result<String, CryptoError> {
let private_bytes = bs58::decode(secret.strip_prefix("sealerSecret_z").ok_or(
CryptoError::InvalidPrefix("sealerSecret_z", "sealer secret"),
)?)
.into_vec()
.map_err(|e| CryptoError::Base58Error(e.to_string()))?;
let public_bytes = x25519_public_key_internal(&private_bytes)
.map_err(|e| CryptoError::InvalidPublicKey(e.to_string()))?;
Ok(format!(
"sealer_z{}",
bs58::encode(public_bytes).into_string()
))
}
/// WASM-exposed function to derive a sealer ID from a sealer secret.
/// - `secret`: Raw bytes of the sealer secret
/// Returns a base58-encoded sealer ID with "sealer_z" prefix or throws JsError if derivation fails.
#[wasm_bindgen]
pub fn get_sealer_id(secret: &[u8]) -> Result<String, JsError> {
let secret_str = std::str::from_utf8(secret)
.map_err(|e| JsError::new(&format!("Invalid UTF-8 in secret: {:?}", e)))?;
get_sealer_id_internal(secret_str).map_err(|e| JsError::new(&e.to_string()))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_x25519_key_generation() {
// Test that we get the correct length keys
let private_key = new_x25519_private_key();
assert_eq!(private_key.len(), 32);
// Test that public key generation works and produces correct length
let public_key = x25519_public_key_internal(&private_key).unwrap();
assert_eq!(public_key.len(), 32);
// Test that different private keys produce different public keys
let private_key2 = new_x25519_private_key();
let public_key2 = x25519_public_key_internal(&private_key2).unwrap();
assert_ne!(public_key, public_key2);
}
#[test]
fn test_x25519_key_exchange() {
// Generate sender's keypair
let sender_private = new_x25519_private_key();
let sender_public = x25519_public_key_internal(&sender_private).unwrap();
// Generate recipient's keypair
let recipient_private = new_x25519_private_key();
let recipient_public = x25519_public_key_internal(&recipient_private).unwrap();
// Test properties we expect from the shared secret
let shared_secret1 =
x25519_diffie_hellman_internal(&sender_private, &recipient_public).unwrap();
let shared_secret2 =
x25519_diffie_hellman_internal(&recipient_private, &sender_public).unwrap();
// Both sides should arrive at the same shared secret
assert_eq!(shared_secret1, shared_secret2);
// Shared secret should be 32 bytes
assert_eq!(shared_secret1.len(), 32);
// Different recipient should produce different shared secret
let other_recipient_private = new_x25519_private_key();
let other_recipient_public = x25519_public_key_internal(&other_recipient_private).unwrap();
let different_shared_secret =
x25519_diffie_hellman_internal(&sender_private, &other_recipient_public).unwrap();
assert_ne!(shared_secret1, different_shared_secret);
}
#[test]
fn test_get_sealer_id() {
// Create a test private key
let private_key = new_x25519_private_key();
let secret = format!("sealerSecret_z{}", bs58::encode(&private_key).into_string());
// Get sealer ID
let sealer_id = get_sealer_id_internal(&secret).unwrap();
assert!(sealer_id.starts_with("sealer_z"));
// Test that same secret produces same ID
let sealer_id2 = get_sealer_id_internal(&secret).unwrap();
assert_eq!(sealer_id, sealer_id2);
// Test invalid secret format
let result = get_sealer_id_internal("invalid_secret");
assert!(matches!(
result,
Err(CryptoError::InvalidPrefix(
"sealerSecret_z",
"sealer secret"
))
));
// Test invalid base58
let result = get_sealer_id_internal("sealerSecret_z!!!invalid!!!");
assert!(matches!(result, Err(CryptoError::Base58Error(_))));
}
}

View File

@@ -0,0 +1,256 @@
use crate::error::CryptoError;
use crate::hash::blake3::generate_nonce;
use crypto_secretbox::{
aead::{Aead, KeyInit},
XSalsa20Poly1305,
};
use salsa20::cipher::{KeyIvInit, StreamCipher};
use salsa20::XSalsa20;
use wasm_bindgen::prelude::*;
/// WASM-exposed function for XSalsa20 encryption without authentication.
/// - `key`: 32-byte key for encryption
/// - `nonce_material`: Raw bytes used to generate a 24-byte nonce via BLAKE3
/// - `plaintext`: Raw bytes to encrypt
/// Returns the encrypted bytes or throws a JsError if encryption fails.
/// Note: This function does not provide authentication. Use encrypt_xsalsa20_poly1305 for authenticated encryption.
#[wasm_bindgen]
pub fn encrypt_xsalsa20(
key: &[u8],
nonce_material: &[u8],
plaintext: &[u8],
) -> Result<Box<[u8]>, JsError> {
let nonce = generate_nonce(nonce_material);
Ok(encrypt_xsalsa20_raw_internal(key, &nonce, plaintext)?.into())
}
/// WASM-exposed function for XSalsa20 decryption without authentication.
/// - `key`: 32-byte key for decryption (must match encryption key)
/// - `nonce_material`: Raw bytes used to generate a 24-byte nonce (must match encryption)
/// - `ciphertext`: Encrypted bytes to decrypt
/// Returns the decrypted bytes or throws a JsError if decryption fails.
/// Note: This function does not provide authentication. Use decrypt_xsalsa20_poly1305 for authenticated decryption.
#[wasm_bindgen]
pub fn decrypt_xsalsa20(
key: &[u8],
nonce_material: &[u8],
ciphertext: &[u8],
) -> Result<Box<[u8]>, JsError> {
let nonce = generate_nonce(nonce_material);
Ok(decrypt_xsalsa20_raw_internal(key, &nonce, ciphertext)?.into())
}
/// Internal function for raw XSalsa20 encryption without nonce generation.
/// Takes a 32-byte key and 24-byte nonce directly.
/// Returns encrypted bytes or CryptoError if key/nonce lengths are invalid.
pub fn encrypt_xsalsa20_raw_internal(
key: &[u8],
nonce: &[u8],
plaintext: &[u8],
) -> Result<Box<[u8]>, CryptoError> {
// Key must be 32 bytes
let key_bytes: [u8; 32] = key
.try_into()
.map_err(|_| CryptoError::InvalidKeyLength(32, key.len()))?;
// Nonce must be 24 bytes
let nonce_bytes: [u8; 24] = nonce
.try_into()
.map_err(|_| CryptoError::InvalidNonceLength)?;
// Create cipher instance and encrypt
let mut cipher = XSalsa20::new_from_slices(&key_bytes, &nonce_bytes)
.map_err(|_| CryptoError::CipherError)?;
let mut buffer = plaintext.to_vec();
cipher.apply_keystream(&mut buffer);
Ok(buffer.into_boxed_slice())
}
/// Internal function for raw XSalsa20 decryption without nonce generation.
/// Takes a 32-byte key and 24-byte nonce directly.
/// Returns decrypted bytes or CryptoError if key/nonce lengths are invalid.
pub fn decrypt_xsalsa20_raw_internal(
key: &[u8],
nonce: &[u8],
ciphertext: &[u8],
) -> Result<Box<[u8]>, CryptoError> {
// Key must be 32 bytes
let key_bytes: [u8; 32] = key
.try_into()
.map_err(|_| CryptoError::InvalidKeyLength(32, key.len()))?;
// Nonce must be 24 bytes
let nonce_bytes: [u8; 24] = nonce
.try_into()
.map_err(|_| CryptoError::InvalidNonceLength)?;
// Create cipher instance and decrypt (XSalsa20 is symmetric)
let mut cipher = XSalsa20::new_from_slices(&key_bytes, &nonce_bytes)
.map_err(|_| CryptoError::CipherError)?;
let mut buffer = ciphertext.to_vec();
cipher.apply_keystream(&mut buffer);
Ok(buffer.into_boxed_slice())
}
/// XSalsa20-Poly1305 encryption
pub fn encrypt_xsalsa20_poly1305(
key: &[u8],
nonce: &[u8],
plaintext: &[u8],
) -> Result<Box<[u8]>, CryptoError> {
// Key must be 32 bytes
let key_bytes: [u8; 32] = key
.try_into()
.map_err(|_| CryptoError::InvalidKeyLength(32, key.len()))?;
// Nonce must be 24 bytes
let nonce_bytes: [u8; 24] = nonce
.try_into()
.map_err(|_| CryptoError::InvalidNonceLength)?;
// Create cipher instance
let cipher = XSalsa20Poly1305::new(&key_bytes.into());
// Encrypt the plaintext
cipher
.encrypt(&nonce_bytes.into(), plaintext)
.map(|v| v.into_boxed_slice())
.map_err(|_| CryptoError::WrongTag)
}
/// XSalsa20-Poly1305 decryption
pub fn decrypt_xsalsa20_poly1305(
key: &[u8],
nonce: &[u8],
ciphertext: &[u8],
) -> Result<Box<[u8]>, CryptoError> {
// Key must be 32 bytes
let key_bytes: [u8; 32] = key
.try_into()
.map_err(|_| CryptoError::InvalidKeyLength(32, key.len()))?;
// Nonce must be 24 bytes
let nonce_bytes: [u8; 24] = nonce
.try_into()
.map_err(|_| CryptoError::InvalidNonceLength)?;
// Create cipher instance
let cipher = XSalsa20Poly1305::new(&key_bytes.into());
// Decrypt the ciphertext
cipher
.decrypt(&nonce_bytes.into(), ciphertext)
.map(|v| v.into_boxed_slice())
.map_err(|_| CryptoError::WrongTag)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_xsalsa20() {
// Test vectors
let key = [0u8; 32]; // All zeros key
let nonce = [0u8; 24]; // All zeros nonce
let plaintext = b"Hello, World!";
// Test encryption
let ciphertext = encrypt_xsalsa20_raw_internal(&key, &nonce, plaintext).unwrap();
assert_ne!(&*ciphertext, plaintext); // Ciphertext should be different from plaintext
// Test decryption
let decrypted = decrypt_xsalsa20_raw_internal(&key, &nonce, &ciphertext).unwrap();
assert_eq!(&*decrypted, plaintext);
// Test that different nonce produces different ciphertext
let nonce2 = [1u8; 24];
let ciphertext2 = encrypt_xsalsa20_raw_internal(&key, &nonce2, plaintext).unwrap();
assert_ne!(ciphertext, ciphertext2);
// Test that different key produces different ciphertext
let key2 = [1u8; 32];
let ciphertext3 = encrypt_xsalsa20_raw_internal(&key2, &nonce, plaintext).unwrap();
assert_ne!(ciphertext, ciphertext3);
// Test invalid key length
assert!(encrypt_xsalsa20_raw_internal(&key[..31], &nonce, plaintext).is_err());
assert!(decrypt_xsalsa20_raw_internal(&key[..31], &nonce, &ciphertext).is_err());
// Test invalid nonce length
assert!(encrypt_xsalsa20_raw_internal(&key, &nonce[..23], plaintext).is_err());
assert!(decrypt_xsalsa20_raw_internal(&key, &nonce[..23], &ciphertext).is_err());
}
#[test]
fn test_xsalsa20_error_handling() {
let key = [0u8; 32];
let nonce = [0u8; 24];
let plaintext = b"test message";
// Test encryption with invalid key length
let invalid_key = vec![0u8; 31]; // Too short
let result = encrypt_xsalsa20_raw_internal(&invalid_key, &nonce, plaintext);
assert!(result.is_err());
// Test with too long key
let too_long_key = vec![0u8; 33]; // Too long
let result = encrypt_xsalsa20_raw_internal(&too_long_key, &nonce, plaintext);
assert!(result.is_err());
// Test decryption with invalid key length
let ciphertext = encrypt_xsalsa20_raw_internal(&key, &nonce, plaintext).unwrap();
let result = decrypt_xsalsa20_raw_internal(&invalid_key, &nonce, &ciphertext);
assert!(result.is_err());
// Test decryption with too long key
let result = decrypt_xsalsa20_raw_internal(&too_long_key, &nonce, &ciphertext);
assert!(result.is_err());
// Test with invalid nonce length
let invalid_nonce = vec![0u8; 23]; // Too short
let result = encrypt_xsalsa20_raw_internal(&key, &invalid_nonce, plaintext);
assert!(result.is_err());
let result = decrypt_xsalsa20_raw_internal(&key, &invalid_nonce, &ciphertext);
assert!(result.is_err());
// Test with too long nonce
let too_long_nonce = vec![0u8; 25]; // Too long
let result = encrypt_xsalsa20_raw_internal(&key, &too_long_nonce, plaintext);
assert!(result.is_err());
let result = decrypt_xsalsa20_raw_internal(&key, &too_long_nonce, &ciphertext);
assert!(result.is_err());
}
#[test]
fn test_xsalsa20_poly1305() {
let key = [0u8; 32]; // All zeros key
let nonce = [0u8; 24]; // All zeros nonce
let plaintext = b"Hello, World!";
// Test encryption
let ciphertext = encrypt_xsalsa20_poly1305(&key, &nonce, plaintext).unwrap();
assert!(ciphertext.len() > plaintext.len()); // Should include authentication tag
// Test decryption
let decrypted = decrypt_xsalsa20_poly1305(&key, &nonce, &ciphertext).unwrap();
assert_eq!(&*decrypted, plaintext);
// Test that different nonce produces different ciphertext
let nonce2 = [1u8; 24];
let ciphertext2 = encrypt_xsalsa20_poly1305(&key, &nonce2, plaintext).unwrap();
assert_ne!(ciphertext, ciphertext2);
// Test that different key produces different ciphertext
let key2 = [1u8; 32];
let ciphertext3 = encrypt_xsalsa20_poly1305(&key2, &nonce, plaintext).unwrap();
assert_ne!(ciphertext, ciphertext3);
// Test that decryption fails with wrong key
assert!(decrypt_xsalsa20_poly1305(&key2, &nonce, &ciphertext).is_err());
// Test that decryption fails with wrong nonce
assert!(decrypt_xsalsa20_poly1305(&key, &nonce2, &ciphertext).is_err());
// Test that decryption fails with tampered ciphertext
let mut tampered = ciphertext.clone();
tampered[0] ^= 1;
assert!(decrypt_xsalsa20_poly1305(&key, &nonce, &tampered).is_err());
}
}

View File

@@ -0,0 +1,43 @@
use std::fmt;
#[derive(Debug)]
pub enum CryptoError {
InvalidKeyLength(usize, usize),
InvalidNonceLength,
InvalidSealerSecretFormat,
InvalidSignatureLength,
InvalidVerifyingKey(String),
InvalidPublicKey(String),
WrongTag,
CipherError,
InvalidPrefix(&'static str, &'static str),
Base58Error(String),
}
impl fmt::Display for CryptoError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
CryptoError::InvalidKeyLength(expected, actual) => {
write!(f, "Invalid key length (expected {expected}, got {actual})")
}
CryptoError::InvalidNonceLength => write!(f, "Invalid nonce length"),
CryptoError::InvalidSealerSecretFormat => {
write!(
f,
"Invalid sealer secret format: must start with 'sealerSecret_z'"
)
}
CryptoError::InvalidSignatureLength => write!(f, "Invalid signature length"),
CryptoError::InvalidVerifyingKey(e) => write!(f, "Invalid verifying key: {}", e),
CryptoError::InvalidPublicKey(e) => write!(f, "Invalid public key: {}", e),
CryptoError::WrongTag => write!(f, "Wrong tag"),
CryptoError::CipherError => write!(f, "Failed to create cipher"),
CryptoError::InvalidPrefix(prefix, field) => {
write!(f, "Invalid {} format: must start with '{}'", field, prefix)
}
CryptoError::Base58Error(e) => write!(f, "Invalid base58: {}", e),
}
}
}
impl std::error::Error for CryptoError {}

View File

@@ -0,0 +1,218 @@
use wasm_bindgen::prelude::*;
/// Generate a 24-byte nonce from input material using BLAKE3.
/// - `nonce_material`: Raw bytes to derive the nonce from
/// Returns 24 bytes suitable for use as a nonce in cryptographic operations.
/// This function is deterministic - the same input will produce the same nonce.
#[wasm_bindgen]
pub fn generate_nonce(nonce_material: &[u8]) -> Box<[u8]> {
let mut hasher = blake3::Hasher::new();
hasher.update(nonce_material);
hasher.finalize().as_bytes()[..24].into()
}
/// Hash data once using BLAKE3.
/// - `data`: Raw bytes to hash
/// Returns 32 bytes of hash output.
/// This is the simplest way to compute a BLAKE3 hash of a single piece of data.
#[wasm_bindgen]
pub fn blake3_hash_once(data: &[u8]) -> Box<[u8]> {
let mut hasher = blake3::Hasher::new();
hasher.update(data);
hasher.finalize().as_bytes().to_vec().into_boxed_slice()
}
/// Hash data once using BLAKE3 with a context prefix.
/// - `data`: Raw bytes to hash
/// - `context`: Context bytes to prefix to the data
/// Returns 32 bytes of hash output.
/// This is useful for domain separation - the same data hashed with different contexts will produce different outputs.
#[wasm_bindgen]
pub fn blake3_hash_once_with_context(data: &[u8], context: &[u8]) -> Box<[u8]> {
let mut hasher = blake3::Hasher::new();
hasher.update(context);
hasher.update(data);
hasher.finalize().as_bytes().to_vec().into_boxed_slice()
}
#[wasm_bindgen]
pub struct Blake3Hasher(blake3::Hasher);
#[wasm_bindgen]
impl Blake3Hasher {
#[wasm_bindgen(constructor)]
pub fn new() -> Self {
Blake3Hasher(blake3::Hasher::new())
}
pub fn update(&mut self, data: &[u8]) {
self.0.update(data);
}
pub fn finalize(&self) -> Box<[u8]> {
self.0.finalize().as_bytes().to_vec().into_boxed_slice()
}
pub fn clone(&self) -> Self {
// The blake3::Hasher type implements Clone
Blake3Hasher(self.0.clone())
}
}
/// Get an empty BLAKE3 state for incremental hashing.
/// Returns a new Blake3Hasher instance for incremental hashing.
#[wasm_bindgen]
pub fn blake3_empty_state() -> Blake3Hasher {
Blake3Hasher::new()
}
/// Update a BLAKE3 state with new data for incremental hashing.
/// - `state`: Current Blake3Hasher instance
/// - `data`: New data to incorporate into the hash
/// Returns the updated Blake3Hasher.
#[wasm_bindgen]
pub fn blake3_update_state(state: &mut Blake3Hasher, data: &[u8]) {
state.update(data);
}
/// Get the final hash from a BLAKE3 state.
/// - `state`: The Blake3Hasher to finalize
/// Returns 32 bytes of hash output.
/// This finalizes an incremental hashing operation.
#[wasm_bindgen]
pub fn blake3_digest_for_state(state: Blake3Hasher) -> Box<[u8]> {
state.finalize()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_nonce_generation() {
let input = b"test input";
let nonce = generate_nonce(input);
assert_eq!(nonce.len(), 24);
// Same input should produce same nonce
let nonce2 = generate_nonce(input);
assert_eq!(nonce, nonce2);
// Different input should produce different nonce
let nonce3 = generate_nonce(b"different input");
assert_ne!(nonce, nonce3);
}
#[test]
fn test_blake3_hash_once() {
let input = b"test input";
let hash = blake3_hash_once(input);
// BLAKE3 produces 32-byte hashes
assert_eq!(hash.len(), 32);
// Same input should produce same hash
let hash2 = blake3_hash_once(input);
assert_eq!(hash, hash2);
// Different input should produce different hash
let hash3 = blake3_hash_once(b"different input");
assert_ne!(hash, hash3);
}
#[test]
fn test_blake3_hash_once_with_context() {
let input = b"test input";
let context = b"test context";
let hash = blake3_hash_once_with_context(input, context);
// BLAKE3 produces 32-byte hashes
assert_eq!(hash.len(), 32);
// Same input and context should produce same hash
let hash2 = blake3_hash_once_with_context(input, context);
assert_eq!(hash, hash2);
// Different input should produce different hash
let hash3 = blake3_hash_once_with_context(b"different input", context);
assert_ne!(hash, hash3);
// Different context should produce different hash
let hash4 = blake3_hash_once_with_context(input, b"different context");
assert_ne!(hash, hash4);
// Hash with context should be different from hash without context
let hash_no_context = blake3_hash_once(input);
assert_ne!(hash, hash_no_context);
}
#[test]
fn test_blake3_incremental() {
// Initial state
let mut state = blake3_empty_state();
// First update with [1,2,3,4,5]
let data1 = &[1u8, 2, 3, 4, 5];
blake3_update_state(&mut state, data1);
// Check that this matches a direct hash
let direct_hash = blake3_hash_once(data1);
let state_hash = state.finalize();
assert_eq!(
state_hash, direct_hash,
"First update should match direct hash"
);
// Create new state for second test
let mut state = blake3_empty_state();
blake3_update_state(&mut state, data1);
// Verify the exact expected hash from the TypeScript test for the first update
let expected_first_hash = [
2, 79, 103, 192, 66, 90, 61, 192, 47, 186, 245, 140, 185, 61, 229, 19, 46, 61, 117,
197, 25, 250, 160, 186, 218, 33, 73, 29, 136, 201, 112, 87,
]
.to_vec()
.into_boxed_slice();
assert_eq!(
state.finalize(),
expected_first_hash,
"First update should match expected hash"
);
// Test with two updates
let mut state = blake3_empty_state();
let data1 = &[1u8, 2, 3, 4, 5];
let data2 = &[6u8, 7, 8, 9, 10];
blake3_update_state(&mut state, data1);
blake3_update_state(&mut state, data2);
// Compare with a single hash of all data
let mut all_data = Vec::new();
all_data.extend_from_slice(data1);
all_data.extend_from_slice(data2);
let direct_hash_all = blake3_hash_once(&all_data);
assert_eq!(
state.finalize(),
direct_hash_all,
"Final state should match direct hash of all data"
);
// Test final hash matches expected value
let mut state = blake3_empty_state();
blake3_update_state(&mut state, data1);
blake3_update_state(&mut state, data2);
let expected_final_hash = [
165, 131, 141, 69, 2, 69, 39, 236, 196, 244, 180, 213, 147, 124, 222, 39, 68, 223, 54,
176, 242, 97, 200, 101, 204, 79, 21, 233, 56, 51, 1, 199,
]
.to_vec()
.into_boxed_slice();
assert_eq!(
state.finalize(),
expected_final_hash,
"Final state should match expected hash"
);
}
}

View File

@@ -0,0 +1,165 @@
use cojson_core::{
CoID, CoJsonCoreError, KeyID, KeySecret, SessionID, SessionLogInternal, Signature, SignerID, SignerSecret, TransactionMode
};
use serde_json::value::RawValue;
use serde::{Deserialize, Serialize};
use thiserror::Error;
use wasm_bindgen::prelude::*;
mod error;
pub use error::CryptoError;
pub mod hash {
pub mod blake3;
pub use blake3::*;
}
pub mod crypto {
pub mod ed25519;
pub mod encrypt;
pub mod seal;
pub mod sign;
pub mod x25519;
pub mod xsalsa20;
pub use ed25519::*;
pub use encrypt::*;
pub use seal::*;
pub use sign::*;
pub use x25519::*;
pub use xsalsa20::*;
}
#[derive(Error, Debug)]
pub enum CojsonCoreWasmError {
#[error(transparent)]
CoJson(#[from] CoJsonCoreError),
#[error(transparent)]
Serde(#[from] serde_json::Error),
#[error(transparent)]
SerdeWasmBindgen(#[from] serde_wasm_bindgen::Error),
#[error("JsValue Error: {0:?}")]
Js(JsValue),
}
impl From<CojsonCoreWasmError> for JsValue {
fn from(err: CojsonCoreWasmError) -> Self {
JsValue::from_str(&err.to_string())
}
}
#[wasm_bindgen]
#[derive(Clone)]
pub struct SessionLog {
internal: SessionLogInternal,
}
#[derive(Serialize, Deserialize)]
struct PrivateTransactionResult {
signature: String,
encrypted_changes: String,
}
#[wasm_bindgen]
impl SessionLog {
#[wasm_bindgen(constructor)]
pub fn new(co_id: String, session_id: String, signer_id: Option<String>) -> SessionLog {
let co_id = CoID(co_id);
let session_id = SessionID(session_id);
let signer_id = signer_id.map(|id| SignerID(id));
let internal = SessionLogInternal::new(co_id, session_id, signer_id);
SessionLog { internal }
}
#[wasm_bindgen(js_name = clone)]
pub fn clone_js(&self) -> SessionLog {
self.clone()
}
#[wasm_bindgen(js_name = tryAdd)]
pub fn try_add(
&mut self,
transactions_json: Vec<String>,
new_signature_str: String,
skip_verify: bool,
) -> Result<(), CojsonCoreWasmError> {
let transactions: Vec<Box<RawValue>> = transactions_json
.into_iter()
.map(|s| {
serde_json::from_str(&s).map_err(|e| {
CojsonCoreWasmError::Js(JsValue::from(format!(
"Failed to parse transaction string: {}",
e
)))
})
})
.collect::<Result<Vec<_>, _>>()?;
let new_signature = Signature(new_signature_str);
self.internal
.try_add(transactions, &new_signature, skip_verify)?;
Ok(())
}
#[wasm_bindgen(js_name = addNewPrivateTransaction)]
pub fn add_new_private_transaction(
&mut self,
changes_json: &str,
signer_secret: String,
encryption_key: String,
key_id: String,
made_at: f64,
) -> Result<String, CojsonCoreWasmError> {
let (signature, transaction) = self.internal.add_new_transaction(
changes_json,
TransactionMode::Private{key_id: KeyID(key_id), key_secret: KeySecret(encryption_key)},
&SignerSecret(signer_secret),
made_at as u64,
);
// Extract encrypted_changes from the private transaction
let encrypted_changes = match transaction {
cojson_core::Transaction::Private(private_tx) => private_tx.encrypted_changes.value,
_ => return Err(CojsonCoreWasmError::Js(JsValue::from_str("Expected private transaction"))),
};
let result = PrivateTransactionResult{
signature: signature.0,
encrypted_changes,
};
Ok(serde_json::to_string(&result)?)
}
#[wasm_bindgen(js_name = addNewTrustingTransaction)]
pub fn add_new_trusting_transaction(
&mut self,
changes_json: &str,
signer_secret: String,
made_at: f64,
) -> Result<String, CojsonCoreWasmError> {
let (signature, _) = self.internal.add_new_transaction(
changes_json,
TransactionMode::Trusting,
&SignerSecret(signer_secret),
made_at as u64,
);
Ok(signature.0)
}
#[wasm_bindgen(js_name = decryptNextTransactionChangesJson)]
pub fn decrypt_next_transaction_changes_json(
&self,
tx_index: u32,
encryption_key: String,
) -> Result<String, CojsonCoreWasmError> {
Ok(self
.internal
.decrypt_next_transaction_changes_json(tx_index, KeySecret(encryption_key))?)
}
}

View File

@@ -0,0 +1,18 @@
[package]
name = "cojson-core"
version = "0.1.0"
edition = "2021"
[dependencies]
lzy = { path = "../lzy", optional = true }
serde = { version = "1.0", features = ["derive"] }
serde_json = { version = "1.0", features = ["raw_value"] }
ed25519-dalek = { version = "2.2.0", features = ["rand_core"] }
bs58 = "0.5.1"
blake3 = "1.5.1"
salsa20 = "0.10.2"
base64 = "0.22.1"
thiserror = "1.0"
[dev-dependencies]
rand_core = { version = "0.6", features = ["getrandom"] }

View File

@@ -0,0 +1,8 @@
{
"coID": "co_zUsz4gkwCCWqMXa4LHXdwyAkVK3",
"signerID":"signer_z3FdM2ucYXUkbJQgPRf8R4Di6exd2sNPVaHaJHhQ8WAqi",
"knownKeys":[],
"exampleBase": {
"co_zkNajJ1BhLzR962jpzvXxx917ZB_session_zXzrQLTtp8rR":{"transactions":[{"changes":"[{\"key\":\"co_zkNajJ1BhLzR962jpzvXxx917ZB\",\"op\":\"set\",\"value\":\"admin\"}]","madeAt":1750685354142,"privacy":"trusting"},{"changes":"[{\"key\":\"key_z268nqpkZYFFWPoGzL_for_co_zkNajJ1BhLzR962jpzvXxx917ZB\",\"op\":\"set\",\"value\":\"sealed_UmZaEEzCUrP3Q-t2KrN00keV66wzA4LWadqhEmw0jlku5frSW2QyXUY3zYIC_XLig6BDS9rcZZdTm3CwnLjTPzp9hgd9TlJLf_Q==\"}]","madeAt":1750685354142,"privacy":"trusting"},{"changes":"[{\"key\":\"readKey\",\"op\":\"set\",\"value\":\"key_z268nqpkZYFFWPoGzL\"}]","madeAt":1750685354143,"privacy":"trusting"},{"changes":"[{\"key\":\"everyone\",\"op\":\"set\",\"value\":\"writer\"}]","madeAt":1750685354143,"privacy":"trusting"},{"changes":"[{\"key\":\"key_z268nqpkZYFFWPoGzL_for_everyone\",\"op\":\"set\",\"value\":\"keySecret_zHRFDaEsnpYSZh6rUAvXS8uUrKCxJAzeBPSSaVU1r9RZY\"}]","madeAt":1750685354143,"privacy":"trusting"}],"lastHash":"hash_z5j1DUZjBiTKm5XnLi8ZrNPV3P7zGuXnMNCZfh2qGXGC7","streamingHash":{"state":{"__wbg_ptr":1127736},"crypto":{}},"lastSignature":"signature_z4LoRVDLnJBfAzHvRn3avgK4RVBd7iAfqUMJdpDEtV8HGLKGAqLyweBkNp8jggcNUQZatrMeU9tdc31ct9qxw7rib","signatureAfter":{}}
}
}

View File

@@ -0,0 +1,6 @@
{
"coID": "co_zWnX74VrMP3n3dkm9wZVPszfiCw",
"signerID":"signer_z3FdM2ucYXUkbJQgPRf8R4Di6exd2sNPVaHaJHhQ8WAqi",
"knownKeys":[{"secret":"keySecret_zHRFDaEsnpYSZh6rUAvXS8uUrKCxJAzeBPSSaVU1r9RZY","id":"key_z268nqpkZYFFWPoGzL"}],
"exampleBase":{"co_zkNajJ1BhLzR962jpzvXxx917ZB_session_zXzrQLTtp8rR":{"transactions":[{"encryptedChanges":"encrypted_UxN_r7X7p-3GUE3GRGRO4NfIhEUvB01m-HaSSipRRrUsTmNBW9dZ-pkAk-NoVP_iEB0moLFbG9GDq9U9S-rUDfSPcaWCJtpE=","keyUsed":"key_z268nqpkZYFFWPoGzL","madeAt":1750685368555,"privacy":"private"}],"lastHash":"hash_zJCdoTRgDuFdUK2XogR7qgNnxezfYAVih3qve2UV65L5X","streamingHash":{"state":{"__wbg_ptr":1129680},"crypto":{}},"lastSignature":"signature_z3UErpugJAqDEYKgzUhs88xBMohzmaL228PgkNhEomf6AeVr7NYNxY17iUoCmPQTpGJNqYPo3y82mGX4oWBhkqN4y","signatureAfter":{}}}
}

View File

@@ -0,0 +1,689 @@
use base64::{engine::general_purpose::URL_SAFE, Engine as _};
use bs58;
use ed25519_dalek::{Signature as Ed25519Signature, Signer, SigningKey, Verifier, VerifyingKey};
use salsa20::{
cipher::{KeyIvInit, StreamCipher},
XSalsa20,
};
use serde::{Deserialize, Serialize};
use serde_json::{value::RawValue, Number, Value as JsonValue};
use thiserror::Error;
// Re-export lzy for convenience
#[cfg(feature = "lzy")]
pub use lzy;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct SessionID(pub String);
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct SignerID(pub String);
impl From<VerifyingKey> for SignerID {
fn from(key: VerifyingKey) -> Self {
SignerID(format!(
"signer_z{}",
bs58::encode(key.to_bytes()).into_string()
))
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct SignerSecret(pub String);
impl From<SigningKey> for SignerSecret {
fn from(key: SigningKey) -> Self {
SignerSecret(format!(
"signerSecret_z{}",
bs58::encode(key.to_bytes()).into_string()
))
}
}
impl Into<SigningKey> for &SignerSecret {
fn into(self) -> SigningKey {
let key_bytes = decode_z(&self.0).expect("Invalid key secret");
SigningKey::from_bytes(&key_bytes.try_into().expect("Invalid key secret length"))
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct Signature(pub String);
impl From<Ed25519Signature> for Signature {
fn from(signature: Ed25519Signature) -> Self {
Signature(format!(
"signature_z{}",
bs58::encode(signature.to_bytes()).into_string()
))
}
}
impl Into<Ed25519Signature> for &Signature {
fn into(self) -> Ed25519Signature {
let signature_bytes = decode_z(&self.0).expect("Invalid signature");
Ed25519Signature::from_bytes(
&signature_bytes
.try_into()
.expect("Invalid signature length"),
)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct Hash(pub String);
impl From<blake3::Hash> for Hash {
fn from(hash: blake3::Hash) -> Self {
Hash(format!("hash_z{}", bs58::encode(hash.as_bytes()).into_string()))
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct KeyID(pub String);
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct KeySecret(pub String);
impl Into<[u8; 32]> for &KeySecret {
fn into(self) -> [u8; 32] {
let key_bytes = decode_z(&self.0).expect("Invalid key secret");
key_bytes.try_into().expect("Invalid key secret length")
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct CoID(pub String);
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TransactionID {
#[serde(rename = "sessionID")]
pub session_id: SessionID,
#[serde(rename = "txIndex")]
pub tx_index: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct Encrypted<T> {
pub value: String,
_phantom: std::marker::PhantomData<T>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PrivateTransaction {
#[serde(rename = "encryptedChanges")]
pub encrypted_changes: Encrypted<JsonValue>,
#[serde(rename = "keyUsed")]
pub key_used: KeyID,
#[serde(rename = "madeAt")]
pub made_at: Number,
pub privacy: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TrustingTransaction {
pub changes: String,
#[serde(rename = "madeAt")]
pub made_at: Number,
pub privacy: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Transaction {
Private(PrivateTransaction),
Trusting(TrustingTransaction),
}
pub enum TransactionMode {
Private {
key_id: KeyID,
key_secret: KeySecret,
},
Trusting,
}
#[derive(Error, Debug)]
pub enum CoJsonCoreError {
#[error("Transaction not found at index {0}")]
TransactionNotFound(u32),
#[error("Invalid encrypted prefix in transaction")]
InvalidEncryptedPrefix,
#[error("Base64 decoding failed")]
Base64Decode(#[from] base64::DecodeError),
#[error("UTF-8 conversion failed")]
Utf8(#[from] std::string::FromUtf8Error),
#[error("JSON deserialization failed")]
Json(#[from] serde_json::Error),
#[error("Signature verification failed: (hash: {0})")]
SignatureVerification(String),
}
#[derive(Clone)]
pub struct SessionLogInternal {
co_id: CoID,
session_id: SessionID,
public_key: Option<VerifyingKey>,
hasher: blake3::Hasher,
transactions_json: Vec<String>,
last_signature: Option<Signature>,
}
impl SessionLogInternal {
pub fn new(co_id: CoID, session_id: SessionID, signer_id: Option<SignerID>) -> Self {
let hasher = blake3::Hasher::new();
let public_key = match signer_id {
Some(signer_id) => Some(VerifyingKey::try_from(
decode_z(&signer_id.0)
.expect("Invalid public key")
.as_slice(),
)
.expect("Invalid public key")),
None => None,
};
Self {
co_id,
session_id,
public_key,
hasher,
transactions_json: Vec::new(),
last_signature: None,
}
}
pub fn transactions_json(&self) -> &Vec<String> {
&self.transactions_json
}
pub fn last_signature(&self) -> Option<&Signature> {
self.last_signature.as_ref()
}
fn expected_hash_after(&self, transactions: &[Box<RawValue>]) -> blake3::Hasher {
let mut hasher = self.hasher.clone();
for tx in transactions {
hasher.update(tx.get().as_bytes());
}
hasher
}
pub fn try_add(
&mut self,
transactions: Vec<Box<RawValue>>,
new_signature: &Signature,
skip_verify: bool,
) -> Result<(), CoJsonCoreError> {
if !skip_verify {
let hasher = self.expected_hash_after(&transactions);
let new_hash_encoded_stringified = format!(
"\"hash_z{}\"",
bs58::encode(hasher.finalize().as_bytes()).into_string()
);
if let Some(public_key) = self.public_key {
match public_key.verify(
new_hash_encoded_stringified.as_bytes(),
&(new_signature).into(),
) {
Ok(()) => {}
Err(_) => {
return Err(CoJsonCoreError::SignatureVerification(
new_hash_encoded_stringified.replace("\"", ""),
));
}
}
} else {
return Err(CoJsonCoreError::SignatureVerification(
new_hash_encoded_stringified.replace("\"", ""),
));
}
self.hasher = hasher;
}
for tx in transactions {
self.transactions_json.push(tx.get().to_string());
}
self.last_signature = Some(new_signature.clone());
Ok(())
}
pub fn add_new_transaction(
&mut self,
changes_json: &str,
mode: TransactionMode,
signer_secret: &SignerSecret,
made_at: u64,
) -> (Signature, Transaction) {
let new_tx = match mode {
TransactionMode::Private { key_id, key_secret } => {
let tx_index = self.transactions_json.len() as u32;
let nonce_material = JsonValue::Object(serde_json::Map::from_iter(vec![
("in".to_string(), JsonValue::String(self.co_id.0.clone())),
(
"tx".to_string(),
serde_json::to_value(TransactionID {
session_id: self.session_id.clone(),
tx_index,
})
.unwrap(),
),
]));
let nonce = self.generate_json_nonce(&nonce_material);
let secret_key_bytes: [u8; 32] = (&key_secret).into();
let mut ciphertext = changes_json.as_bytes().to_vec();
let mut cipher = XSalsa20::new(&secret_key_bytes.into(), &nonce.into());
cipher.apply_keystream(&mut ciphertext);
let encrypted_str = format!("encrypted_U{}", URL_SAFE.encode(&ciphertext));
Transaction::Private(PrivateTransaction {
encrypted_changes: Encrypted {
value: encrypted_str,
_phantom: std::marker::PhantomData,
},
key_used: key_id.clone(),
made_at: Number::from(made_at),
privacy: "private".to_string(),
})
}
TransactionMode::Trusting => Transaction::Trusting(TrustingTransaction {
changes: changes_json.to_string(),
made_at: Number::from(made_at),
privacy: "trusting".to_string(),
}),
};
let tx_json = serde_json::to_string(&new_tx).unwrap();
self.hasher.update(tx_json.as_bytes());
self.transactions_json.push(tx_json);
let new_hash = self.hasher.finalize();
let new_hash_encoded_stringified = format!("\"hash_z{}\"", bs58::encode(new_hash.as_bytes()).into_string());
let signing_key: SigningKey = signer_secret.into();
let new_signature: Signature = signing_key.sign(new_hash_encoded_stringified.as_bytes()).into();
self.last_signature = Some(new_signature.clone());
(new_signature, new_tx)
}
pub fn decrypt_next_transaction_changes_json(
&self,
tx_index: u32,
key_secret: KeySecret,
) -> Result<String, CoJsonCoreError> {
let tx_json = self
.transactions_json
.get(tx_index as usize)
.ok_or(CoJsonCoreError::TransactionNotFound(tx_index))?;
let tx: Transaction = serde_json::from_str(tx_json)?;
match tx {
Transaction::Private(private_tx) => {
let nonce_material = JsonValue::Object(serde_json::Map::from_iter(vec![
("in".to_string(), JsonValue::String(self.co_id.0.clone())),
(
"tx".to_string(),
serde_json::to_value(TransactionID {
session_id: self.session_id.clone(),
tx_index,
})?,
),
]));
let nonce = self.generate_json_nonce(&nonce_material);
let encrypted_val = private_tx.encrypted_changes.value;
let prefix = "encrypted_U";
if !encrypted_val.starts_with(prefix) {
return Err(CoJsonCoreError::InvalidEncryptedPrefix);
}
let ciphertext_b64 = &encrypted_val[prefix.len()..];
let mut ciphertext = URL_SAFE.decode(ciphertext_b64)?;
let secret_key_bytes: [u8; 32] = (&key_secret).into();
let mut cipher = XSalsa20::new((&secret_key_bytes).into(), &nonce.into());
cipher.apply_keystream(&mut ciphertext);
Ok(String::from_utf8(ciphertext)?)
}
Transaction::Trusting(trusting_tx) => Ok(trusting_tx.changes),
}
}
fn generate_nonce(&self, material: &[u8]) -> [u8; 24] {
let mut hasher = blake3::Hasher::new();
hasher.update(material);
let mut output = [0u8; 24];
let mut output_reader = hasher.finalize_xof();
output_reader.fill(&mut output);
output
}
fn generate_json_nonce(&self, material: &JsonValue) -> [u8; 24] {
let stable_json = serde_json::to_string(&material).unwrap();
self.generate_nonce(stable_json.as_bytes())
}
}
pub fn decode_z(value: &str) -> Result<Vec<u8>, String> {
let prefix_end = value.find("_z").ok_or("Invalid prefix")? + 2;
bs58::decode(&value[prefix_end..])
.into_vec()
.map_err(|e| e.to_string())
}
#[cfg(test)]
mod tests {
use super::*;
use rand_core::OsRng;
use std::{collections::HashMap, fs};
#[test]
fn it_works() {
let mut csprng = OsRng;
let signing_key = SigningKey::generate(&mut csprng);
let verifying_key = signing_key.verifying_key();
let session = SessionLogInternal::new(
CoID("co_test1".to_string()),
SessionID("session_test1".to_string()),
verifying_key.into(),
);
assert!(session.last_signature.is_none());
}
#[test]
fn test_add_from_example_json() {
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
struct TestSession<'a> {
last_signature: Signature,
#[serde(borrow)]
transactions: Vec<&'a RawValue>,
last_hash: String,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
struct Root<'a> {
#[serde(borrow)]
example_base: HashMap<String, TestSession<'a>>,
#[serde(rename = "signerID")]
signer_id: SignerID,
}
let data = fs::read_to_string("data/singleTxSession.json")
.expect("Unable to read singleTxSession.json");
let root: Root = serde_json::from_str(&data).unwrap();
let (session_id_str, example) = root.example_base.into_iter().next().unwrap();
let session_id = SessionID(session_id_str.clone());
let co_id = CoID(
session_id_str
.split("_session_")
.next()
.unwrap()
.to_string(),
);
let mut session = SessionLogInternal::new(co_id, session_id, root.signer_id);
let new_signature = example.last_signature;
let result = session.try_add(
vec![example.transactions[0].to_owned()],
&new_signature,
false,
);
match result {
Ok(returned_final_hash) => {
let final_hash = session.hasher.finalize();
let final_hash_encoded = format!(
"hash_z{}",
bs58::encode(final_hash.as_bytes()).into_string()
);
assert_eq!(final_hash_encoded, example.last_hash);
assert_eq!(session.last_signature, Some(new_signature));
}
Err(CoJsonCoreError::SignatureVerification(new_hash_encoded)) => {
assert_eq!(new_hash_encoded, example.last_hash);
panic!("Signature verification failed despite same hash");
}
Err(e) => {
panic!("Unexpected error: {:?}", e);
}
}
}
#[test]
fn test_add_from_example_json_multi_tx() {
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
struct TestSession<'a> {
last_signature: Signature,
#[serde(borrow)]
transactions: Vec<&'a RawValue>,
last_hash: String,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
struct Root<'a> {
#[serde(borrow)]
example_base: HashMap<String, TestSession<'a>>,
#[serde(rename = "signerID")]
signer_id: SignerID,
}
let data = fs::read_to_string("data/multiTxSession.json")
.expect("Unable to read multiTxSession.json");
let root: Root = serde_json::from_str(&data).unwrap();
let (session_id_str, example) = root.example_base.into_iter().next().unwrap();
let session_id = SessionID(session_id_str.clone());
let co_id = CoID(
session_id_str
.split("_session_")
.next()
.unwrap()
.to_string(),
);
let mut session = SessionLogInternal::new(co_id, session_id, root.signer_id);
let new_signature = example.last_signature;
let result = session.try_add(
example.transactions.into_iter().map(|tx| tx.to_owned()).collect(),
&new_signature,
false,
);
match result {
Ok(returned_final_hash) => {
let final_hash = session.hasher.finalize();
let final_hash_encoded = format!(
"hash_z{}",
bs58::encode(final_hash.as_bytes()).into_string()
);
assert_eq!(final_hash_encoded, example.last_hash);
assert_eq!(session.last_signature, Some(new_signature));
}
Err(CoJsonCoreError::SignatureVerification(new_hash_encoded)) => {
assert_eq!(new_hash_encoded, example.last_hash);
panic!("Signature verification failed despite same hash");
}
Err(e) => {
panic!("Unexpected error: {:?}", e);
}
}
}
#[test]
fn test_add_new_transaction() {
// Load the example data to get all the pieces we need
let data = fs::read_to_string("data/singleTxSession.json")
.expect("Unable to read singleTxSession.json");
let root: serde_json::Value = serde_json::from_str(&data).unwrap();
let session_data =
&root["exampleBase"]["co_zkNajJ1BhLzR962jpzvXxx917ZB_session_zXzrQLTtp8rR"];
let tx_from_example = &session_data["transactions"][0];
let known_key = &root["knownKeys"][0];
// Since we don't have the original private key, we generate a new one for this test.
let mut csprng = OsRng;
let signing_key = SigningKey::generate(&mut csprng);
let public_key = signing_key.verifying_key();
// Initialize an empty session
let mut session = SessionLogInternal::new(
CoID(root["coID"].as_str().unwrap().to_string()),
SessionID("co_zkNajJ1BhLzR962jpzvXxx917ZB_session_zXzrQLTtp8rR".to_string()),
public_key.into(),
);
// The plaintext changes we want to add
let changes_json =
r#"[{"after":"start","op":"app","value":"co_zMphsnYN6GU8nn2HDY5suvyGufY"}]"#;
// Extract all the necessary components from the example data
let key_secret = KeySecret(known_key["secret"].as_str().unwrap().to_string());
let key_id = KeyID(known_key["id"].as_str().unwrap().to_string());
let made_at = tx_from_example["madeAt"].as_u64().unwrap();
// Call the function we are testing
let (new_signature, _new_tx) = session.add_new_transaction(
changes_json,
TransactionMode::Private {
key_id: key_id,
key_secret: key_secret,
},
&signing_key.into(),
made_at,
);
// 1. Check that the transaction we created matches the one in the file
let created_tx_json = &session.transactions_json[0];
let expected_tx_json = serde_json::to_string(tx_from_example).unwrap();
assert_eq!(created_tx_json, &expected_tx_json);
// 2. Check that the final hash of the session matches the one in the file
let final_hash = session.hasher.finalize();
let final_hash_encoded = format!(
"hash_z{}",
bs58::encode(final_hash.as_bytes()).into_string()
);
assert_eq!(
final_hash_encoded,
session_data["lastHash"].as_str().unwrap()
);
let final_hash_encoded_stringified = format!(
"\"{}\"",
final_hash_encoded
);
// 3. Check that the signature is valid for our generated key
assert!(session
.public_key
.verify(final_hash_encoded_stringified.as_bytes(), &(&new_signature).into())
.is_ok());
assert_eq!(session.last_signature, Some(new_signature));
}
#[test]
fn test_decrypt_from_example_json() {
#[derive(Deserialize, Debug)]
struct KnownKey {
secret: String,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
#[serde(bound(deserialize = "'de: 'a"))]
struct TestSession<'a> {
last_signature: String,
#[serde(borrow)]
transactions: Vec<&'a RawValue>,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
#[serde(bound(deserialize = "'de: 'a"))]
struct Root<'a> {
#[serde(borrow)]
example_base: HashMap<String, TestSession<'a>>,
#[serde(rename = "signerID")]
signer_id: SignerID,
known_keys: Vec<KnownKey>,
#[serde(rename = "coID")]
co_id: CoID,
}
let data = fs::read_to_string("data/singleTxSession.json")
.expect("Unable to read singleTxSession.json");
let root: Root = serde_json::from_str(&data).unwrap();
let (session_id_str, example) = root.example_base.into_iter().next().unwrap();
let session_id = SessionID(session_id_str.clone());
let public_key =
VerifyingKey::from_bytes(&decode_z(&root.signer_id.0).unwrap().try_into().unwrap())
.unwrap();
let mut session = SessionLogInternal::new(root.co_id, session_id, public_key.into());
let new_signature = Signature(example.last_signature);
session
.try_add(
example
.transactions
.into_iter()
.map(|v| v.to_owned())
.collect(),
&new_signature,
true, // Skipping verification because we don't have the right initial state
)
.unwrap();
let key_secret = KeySecret(root.known_keys[0].secret.clone());
let decrypted = session
.decrypt_next_transaction_changes_json(0, key_secret)
.unwrap();
assert_eq!(
decrypted,
r#"[{"after":"start","op":"app","value":"co_zMphsnYN6GU8nn2HDY5suvyGufY"}]"#
);
}
}

15
crates/lzy/Cargo.toml Normal file
View File

@@ -0,0 +1,15 @@
[package]
name = "lzy"
version = "0.1.0"
edition = "2021"
[dependencies]
[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
[[bench]]
name = "compression_benchmark"
harness = false

View File

@@ -0,0 +1,36 @@
use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput};
use lzy::{compress, decompress};
use std::fs;
use std::time::Duration;
fn compression_benchmark(c: &mut Criterion) {
let data = fs::read("data/compression_66k_JSON.txt").expect("Failed to read benchmark data");
let mut group = c.benchmark_group("LZY Compression");
group.measurement_time(Duration::from_secs(10));
group.sample_size(10);
group.throughput(Throughput::Bytes(data.len() as u64));
let compressed = compress(&data);
let compression_ratio = compressed.len() as f64 / data.len() as f64;
println!(
"Compression ratio (compressed/original): {:.4} ({} / {} bytes)",
compression_ratio,
compressed.len(),
data.len()
);
group.bench_function("compress", |b| {
b.iter(|| compress(black_box(&data)))
});
let decompressed = decompress(&compressed).unwrap();
assert_eq!(data, decompressed);
group.bench_function("decompress", |b| {
b.iter(|| decompress(black_box(&compressed)))
});
}
criterion_group!(benches, compression_benchmark);
criterion_main!(benches);

File diff suppressed because one or more lines are too long

348
crates/lzy/src/lib.rs Normal file
View File

@@ -0,0 +1,348 @@
const MIN_MATCH_LEN: usize = 4;
const MAX_MATCH_LEN: usize = 15 + 3;
const MAX_LITERALS: usize = 15;
const HASH_LOG: u32 = 16;
const HASH_TABLE_SIZE: usize = 1 << HASH_LOG;
fn hash(data: &[u8]) -> usize {
const KNUTH_MULT_PRIME: u32 = 2654435761;
let val = u32::from_le_bytes(data.try_into().unwrap());
((val.wrapping_mul(KNUTH_MULT_PRIME)) >> (32 - HASH_LOG)) as usize
}
#[derive(Debug, PartialEq)]
pub enum DecompressionError {
InvalidToken,
UnexpectedEof,
}
pub fn decompress(input: &[u8]) -> Result<Vec<u8>, DecompressionError> {
let mut decompressed = Vec::with_capacity(input.len() * 2);
let mut i = 0;
while i < input.len() {
let token = input[i];
i += 1;
let literal_len = (token >> 4) as usize;
let match_len_token = (token & 0x0F) as usize;
if i + literal_len > input.len() {
return Err(DecompressionError::UnexpectedEof);
}
decompressed.extend_from_slice(&input[i..i + literal_len]);
i += literal_len;
if match_len_token > 0 {
if i + 2 > input.len() {
return Err(DecompressionError::UnexpectedEof);
}
let offset = u16::from_le_bytes([input[i], input[i + 1]]) as usize;
i += 2;
if offset == 0 || offset > decompressed.len() {
return Err(DecompressionError::InvalidToken);
}
let match_len = match_len_token + 3;
let match_start = decompressed.len() - offset;
for k in 0..match_len {
decompressed.push(decompressed[match_start + k]);
}
}
}
Ok(decompressed)
}
pub fn compress(input: &[u8]) -> Vec<u8> {
let mut compressor = Compressor::new();
compressor.compress_chunk(input)
}
fn emit_sequence(out: &mut Vec<u8>, mut literals: &[u8], match_len: usize, offset: u16) {
while literals.len() > MAX_LITERALS {
let token = (MAX_LITERALS as u8) << 4;
out.push(token);
out.extend_from_slice(&literals[..MAX_LITERALS]);
literals = &literals[MAX_LITERALS..];
}
let lit_len_token = literals.len() as u8;
let match_len_token = if match_len > 0 {
(match_len - 3) as u8
} else {
0
};
let token = lit_len_token << 4 | match_len_token;
out.push(token);
out.extend_from_slice(literals);
if match_len > 0 {
out.extend_from_slice(&offset.to_le_bytes());
}
}
pub struct Compressor {
hash_table: Vec<u32>,
history: Vec<u8>,
}
impl Compressor {
pub fn new() -> Self {
Self {
hash_table: vec![0; HASH_TABLE_SIZE],
history: Vec::new(),
}
}
pub fn compress_chunk(&mut self, chunk: &[u8]) -> Vec<u8> {
let mut compressed_chunk = Vec::new();
let chunk_start_cursor = self.history.len();
self.history.extend_from_slice(chunk);
let mut cursor = chunk_start_cursor;
let mut literal_anchor = chunk_start_cursor;
while cursor < self.history.len() {
let mut best_match: Option<(u16, usize)> = None;
if self.history.len() - cursor >= MIN_MATCH_LEN {
let h = hash(&self.history[cursor..cursor + 4]);
let match_pos = self.hash_table[h] as usize;
if match_pos < cursor && cursor - match_pos < u16::MAX as usize {
if self.history.get(match_pos..match_pos + MIN_MATCH_LEN) == Some(&self.history[cursor..cursor + MIN_MATCH_LEN]) {
let mut match_len = MIN_MATCH_LEN;
while cursor + match_len < self.history.len()
&& match_len < MAX_MATCH_LEN
&& self.history.get(match_pos + match_len) == self.history.get(cursor + match_len)
{
match_len += 1;
}
best_match = Some(((cursor - match_pos) as u16, match_len));
}
}
self.hash_table[h] = cursor as u32;
}
if let Some((offset, match_len)) = best_match {
let literals = &self.history[literal_anchor..cursor];
emit_sequence(&mut compressed_chunk, literals, match_len, offset);
cursor += match_len;
literal_anchor = cursor;
} else {
cursor += 1;
}
}
if literal_anchor < cursor {
let literals = &self.history[literal_anchor..cursor];
emit_sequence(&mut compressed_chunk, literals, 0, 0);
}
compressed_chunk
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_simple_roundtrip() {
let data = b"hello world, hello people";
let compressed = compress(data);
println!("Compressed '{}': {:x?}", std::str::from_utf8(data).unwrap(), compressed);
let decompressed = decompress(&compressed).unwrap();
assert_eq!(data, decompressed.as_slice());
}
#[test]
fn test_long_literals() {
let data = b"abcdefghijklmnopqrstuvwxyz";
let compressed = compress(data);
println!("Compressed '{}': {:x?}", std::str::from_utf8(data).unwrap(), compressed);
let decompressed = decompress(&compressed).unwrap();
assert_eq!(data, decompressed.as_slice());
}
#[test]
fn test_decompress_empty() {
let data = b"";
let compressed = compress(data);
assert!(compressed.is_empty());
let decompressed = decompress(&compressed).unwrap();
assert_eq!(data, decompressed.as_slice());
}
#[test]
fn test_overlapping_match() {
let data = b"abcdeabcdeabcdeabcde"; // repeating sequence
let compressed = compress(data);
println!("Compressed '{}': {:x?}", std::str::from_utf8(data).unwrap(), compressed);
let decompressed = decompress(&compressed).unwrap();
assert_eq!(data, decompressed.as_slice());
let data2 = b"abababababababababab";
let compressed2 = compress(data2);
println!("Compressed '{}': {:x?}", std::str::from_utf8(data2).unwrap(), compressed2);
let decompressed2 = decompress(&compressed2).unwrap();
assert_eq!(data2, decompressed2.as_slice());
}
#[test]
fn test_json_roundtrip() {
let data = std::fs::read("data/compression_66k_JSON.txt").unwrap();
let compressed = compress(&data);
std::fs::write("compressed_66k.lzy", &compressed).unwrap();
let decompressed = decompress(&compressed).unwrap();
assert_eq!(data, decompressed.as_slice());
}
mod crdt_helpers {
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct After {
pub session_id: String,
pub tx_index: u32,
pub change_idx: u32,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Transaction {
pub op: String,
pub value: String,
pub after: After,
}
pub fn generate_transactions(text: &str, session_id: &str) -> Vec<String> {
let mut transactions = Vec::new();
for (i, c) in text.chars().enumerate() {
let tx = Transaction {
op: "app".to_string(),
value: c.to_string(),
after: After {
session_id: session_id.to_string(),
tx_index: i as u32,
change_idx: 0,
},
};
transactions.push(serde_json::to_string(&tx).unwrap());
}
transactions
}
pub fn generate_shorthand_transactions(text: &str) -> Vec<String> {
let mut transactions = Vec::new();
for c in text.chars() {
transactions.push(serde_json::to_string(&c.to_string()).unwrap());
}
transactions
}
}
#[test]
fn test_crdt_transaction_generation() {
let sample_text = "This is a sample text for our CRDT simulation. \
It should be long enough to see some interesting compression results later on. \
Let's add another sentence to make it a bit more substantial.";
let session_id = "co_zRtnoNffeMHge9wvyL5mK1RWbdz_session_zKvAVFSV5cqW";
let transactions = crdt_helpers::generate_transactions(sample_text, session_id);
println!("--- Generated CRDT Transactions ---");
for tx in &transactions {
println!("{}", tx);
}
println!("--- End of CRDT Transactions ---");
assert!(!transactions.is_empty());
assert_eq!(transactions.len(), sample_text.chars().count());
}
#[test]
fn test_crdt_chunked_compression() {
let sample_text = "This is a sample text for our CRDT simulation. \
It should be long enough to see some interesting compression results later on. \
Let's add another sentence to make it a bit more substantial.";
let session_id = "co_zRtnoNffeMHge9wvyL5mK1RWbdz_session_zKvAVFSV5cqW";
let transactions_json = crdt_helpers::generate_transactions(sample_text, session_id);
let mut compressor = Compressor::new();
let mut compressed_log = Vec::new();
let mut total_json_len = 0;
for tx_json in &transactions_json {
let compressed_chunk = compressor.compress_chunk(tx_json.as_bytes());
compressed_log.extend_from_slice(&compressed_chunk);
total_json_len += tx_json.len();
}
let decompressed = decompress(&compressed_log).unwrap();
// Verify roundtrip
let original_log_concatenated = transactions_json.join("");
assert_eq!(decompressed, original_log_concatenated.as_bytes());
let plaintext_len = sample_text.len();
let compressed_len = compressed_log.len();
let compression_ratio = compressed_len as f64 / total_json_len as f64;
let overhead_ratio = compressed_len as f64 / plaintext_len as f64;
println!("\n--- CRDT Chunked Compression Test ---");
println!("Plaintext size: {} bytes", plaintext_len);
println!("Total JSON size: {} bytes", total_json_len);
println!("Compressed log size: {} bytes", compressed_len);
println!("Compression ratio (compressed/json): {:.4}", compression_ratio);
println!("Overhead ratio (compressed/plaintext): {:.4}", overhead_ratio);
println!("--- End of Test ---");
}
#[test]
fn test_crdt_shorthand_compression() {
let sample_text = "This is a sample text for our CRDT simulation. \
It should be long enough to see some interesting compression results later on. \
Let's add another sentence to make it a bit more substantial.";
let transactions_json = crdt_helpers::generate_shorthand_transactions(sample_text);
let mut compressor = Compressor::new();
let mut compressed_log = Vec::new();
let mut total_json_len = 0;
for tx_json in &transactions_json {
let compressed_chunk = compressor.compress_chunk(tx_json.as_bytes());
compressed_log.extend_from_slice(&compressed_chunk);
total_json_len += tx_json.len();
}
let decompressed = decompress(&compressed_log).unwrap();
// Verify roundtrip
let original_log_concatenated = transactions_json.join("");
assert_eq!(decompressed, original_log_concatenated.as_bytes());
let plaintext_len = sample_text.len();
let compressed_len = compressed_log.len();
let compression_ratio = compressed_len as f64 / total_json_len as f64;
let overhead_ratio = compressed_len as f64 / plaintext_len as f64;
println!("\n--- CRDT Shorthand Compression Test ---");
println!("Plaintext size: {} bytes", plaintext_len);
println!("Total JSON size: {} bytes", total_json_len);
println!("Compressed log size: {} bytes", compressed_len);
println!("Compression ratio (compressed/json): {:.4}", compression_ratio);
println!("Overhead ratio (compressed/plaintext): {:.4}", overhead_ratio);
println!("--- End of Test ---");
}
}

View File

@@ -0,0 +1 @@
BETTER_AUTH_SECRET="TEST_SECRET"

49
examples/betterauth/.gitignore vendored Normal file
View File

@@ -0,0 +1,49 @@
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/
sqlite.db
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# env files (can opt-in for committing if needed)
.env
.env.*
!.env.example
!.env.test
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts

View File

@@ -0,0 +1,298 @@
# betterauth
## 0.1.25
### Patch Changes
- Updated dependencies [048ac1d]
- jazz-tools@0.14.22
- jazz-betterauth-server-plugin@0.14.22
- jazz-inspector@0.14.22
- jazz-react@0.14.22
- jazz-react-auth-betterauth@0.14.22
- jazz-betterauth-client-plugin@0.14.22
## 0.1.24
### Patch Changes
- Updated dependencies [e7e505e]
- Updated dependencies [13b57aa]
- Updated dependencies [5662faa]
- Updated dependencies [2116a59]
- jazz-tools@0.14.21
- jazz-betterauth-server-plugin@0.14.21
- jazz-inspector@0.14.21
- jazz-react@0.14.21
- jazz-react-auth-betterauth@0.14.21
- jazz-betterauth-client-plugin@0.14.21
## 0.1.23
### Patch Changes
- Updated dependencies [6f72419]
- Updated dependencies [04b20c2]
- jazz-tools@0.14.20
- jazz-betterauth-server-plugin@0.14.20
- jazz-inspector@0.14.20
- jazz-react@0.14.20
- jazz-react-auth-betterauth@0.14.20
- jazz-betterauth-client-plugin@0.14.20
## 0.1.22
### Patch Changes
- jazz-betterauth-client-plugin@0.14.19
- jazz-betterauth-server-plugin@0.14.19
- jazz-react-auth-betterauth@0.14.19
- jazz-inspector@0.14.19
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.1.21
### Patch Changes
- Updated dependencies [4b950bc]
- Updated dependencies [d6d9c0a]
- Updated dependencies [c559054]
- jazz-tools@0.14.18
- jazz-betterauth-server-plugin@0.14.18
- jazz-inspector@0.14.18
- jazz-react@0.14.18
- jazz-react-auth-betterauth@0.14.18
- jazz-betterauth-client-plugin@0.14.18
## 0.1.20
### Patch Changes
- Updated dependencies [e512df4]
- jazz-betterauth-server-plugin@0.14.17
- jazz-tools@0.14.17
- jazz-betterauth-client-plugin@0.14.17
- jazz-inspector@0.14.17
- jazz-react@0.14.17
- jazz-react-auth-betterauth@0.14.17
## 0.1.19
### Patch Changes
- jazz-betterauth-server-plugin@0.14.16
- jazz-inspector@0.14.16
- jazz-react@0.14.16
- jazz-react-auth-betterauth@0.14.16
- jazz-tools@0.14.16
- jazz-betterauth-client-plugin@0.14.16
## 0.1.18
### Patch Changes
- Updated dependencies [f9590f9]
- jazz-react@0.14.15
- jazz-betterauth-server-plugin@0.14.15
- jazz-inspector@0.14.15
- jazz-react-auth-betterauth@0.14.15
- jazz-tools@0.14.15
- jazz-betterauth-client-plugin@0.14.15
## 0.1.17
### Patch Changes
- Updated dependencies [e32a1f7]
- jazz-tools@0.14.14
- jazz-betterauth-server-plugin@0.14.14
- jazz-inspector@0.14.14
- jazz-react@0.14.14
- jazz-react-auth-betterauth@0.14.14
- jazz-betterauth-client-plugin@0.14.14
## 0.1.16
### Patch Changes
- jazz-inspector@0.14.13
- jazz-react@0.14.13
- jazz-react-auth-betterauth@0.14.13
## 0.1.15
### Patch Changes
- jazz-inspector@0.14.12
- jazz-react@0.14.12
- jazz-react-auth-betterauth@0.14.12
## 0.1.14
### Patch Changes
- Updated dependencies [dc746a2]
- Updated dependencies [f869d9a]
- Updated dependencies [3fe6832]
- jazz-react-auth-betterauth@0.14.10
- jazz-inspector@0.14.10
- jazz-react@0.14.10
- jazz-tools@0.14.10
- jazz-betterauth-server-plugin@0.14.10
- jazz-betterauth-client-plugin@0.14.10
## 0.1.13
### Patch Changes
- Updated dependencies [22c2600]
- jazz-tools@0.14.9
- jazz-betterauth-server-plugin@0.14.9
- jazz-inspector@0.14.9
- jazz-react@0.14.9
- jazz-react-auth-betterauth@0.14.9
- jazz-betterauth-client-plugin@0.14.9
## 0.1.12
### Patch Changes
- Updated dependencies [637ae13]
- jazz-tools@0.14.8
- jazz-betterauth-server-plugin@0.14.8
- jazz-inspector@0.14.8
- jazz-react@0.14.8
- jazz-react-auth-betterauth@0.14.8
- jazz-betterauth-client-plugin@0.14.8
## 0.1.11
### Patch Changes
- Updated dependencies [365b0ea]
- jazz-tools@0.14.7
- jazz-betterauth-server-plugin@0.14.7
- jazz-inspector@0.14.7
- jazz-react@0.14.7
- jazz-react-auth-betterauth@0.14.7
- jazz-betterauth-client-plugin@0.14.7
## 0.1.10
### Patch Changes
- Updated dependencies [9d6d9fe]
- Updated dependencies [9d6d9fe]
- jazz-tools@0.14.6
- jazz-betterauth-server-plugin@0.14.6
- jazz-inspector@0.14.6
- jazz-react@0.14.6
- jazz-react-auth-betterauth@0.14.6
- jazz-betterauth-client-plugin@0.14.6
## 0.1.9
### Patch Changes
- Updated dependencies [91cbb2f]
- Updated dependencies [20b3d88]
- jazz-tools@0.14.5
- jazz-betterauth-server-plugin@0.14.5
- jazz-inspector@0.14.5
- jazz-react@0.14.5
- jazz-react-auth-betterauth@0.14.5
- jazz-betterauth-client-plugin@0.14.5
## 0.1.8
### Patch Changes
- Updated dependencies [011af55]
- jazz-tools@0.14.4
- jazz-betterauth-server-plugin@0.14.4
- jazz-inspector@0.14.4
- jazz-react@0.14.4
- jazz-react-auth-betterauth@0.14.4
- jazz-betterauth-client-plugin@0.14.4
## 0.1.7
### Patch Changes
- Updated dependencies [3d1027f]
- Updated dependencies [c240eed]
- jazz-tools@0.14.2
- jazz-betterauth-server-plugin@0.14.2
- jazz-inspector@0.14.2
- jazz-react@0.14.2
- jazz-react-auth-betterauth@0.14.2
- jazz-betterauth-client-plugin@0.14.2
## 0.1.6
### Patch Changes
- Updated dependencies [cdfc105]
- jazz-tools@0.14.1
- jazz-betterauth-server-plugin@0.14.1
- jazz-inspector@0.14.1
- jazz-react@0.14.1
- jazz-react-auth-betterauth@0.14.1
- jazz-betterauth-client-plugin@0.14.1
## 0.1.5
### Patch Changes
- Updated dependencies [5835ed1]
- jazz-tools@0.14.0
- jazz-betterauth-server-plugin@0.14.0
- jazz-inspector@0.14.0
- jazz-react@0.14.0
- jazz-react-auth-betterauth@0.14.0
- jazz-betterauth-client-plugin@0.14.0
## 0.1.4
### Patch Changes
- jazz-betterauth-server-plugin@0.13.32
- jazz-react@0.13.32
- jazz-react-auth-betterauth@0.13.32
- jazz-betterauth-client-plugin@0.13.32
## 0.1.3
### Patch Changes
- Updated dependencies [e5b170f]
- jazz-tools@0.13.31
- jazz-betterauth-server-plugin@0.13.31
- jazz-inspector@0.13.31
- jazz-react@0.13.31
- jazz-react-auth-betterauth@0.13.31
- jazz-betterauth-client-plugin@0.13.31
## 0.1.2
### Patch Changes
- jazz-betterauth-server-plugin@0.13.30
- jazz-inspector@0.13.30
- jazz-react@0.13.30
- jazz-react-auth-betterauth@0.13.30
- jazz-tools@0.13.30
- jazz-betterauth-client-plugin@0.13.30
## 0.1.1
### Patch Changes
- Updated dependencies [8e5ff13]
- jazz-inspector@0.13.29
- jazz-betterauth-server-plugin@0.0.1
- jazz-react@0.13.29
- jazz-react-auth-betterauth@0.0.1
- jazz-tools@0.13.29
- jazz-betterauth-client-plugin@0.0.1

View File

@@ -0,0 +1,82 @@
# Better Auth Integration Example
This example demonstrates how to integrate [Better Auth](https://www.better-auth.com/) with Jazz.
## Getting started
To run this example, you may either:
- Clone the Jazz monorepo and run this example from within.
- Create a new Jazz project using this example as a template, and run that new project.
### Setting environment variables
- `NEXT_PUBLIC_AUTH_BASE_URL`: A URL to a Better Auth server. If undefined, the example will self-host a Better Auth server.
- `BETTER_AUTH_SECRET`: The encryption secret used by the self-hosted Better Auth server (required only if `NEXT_PUBLIC_AUTH_BASE_URL` is undefined)
- `GITHUB_CLIENT_ID`: The client ID for the GitHub OAuth provider used by the self-hosted Better Auth server (required only if `NEXT_PUBLIC_AUTH_BASE_URL` is undefined)
- `GITHUB_CLIENT_SECRET`: The client secret for the GitHub OAuth provider used by the self-hosted Better Auth server (required only if `NEXT_PUBLIC_AUTH_BASE_URL` is undefined)
### Using this example as a template
1. Create a new Jazz project, and use this example as a template.
```sh
npx create-jazz-app@latest betterauth-app --example betterauth
```
2. Navigate to the new project and install dependencies.
```sh
cd betterauth-app
pnpm install
```
3. Create a .env file (don't forget to set your [BETTER_AUTH_SECRET](https://www.better-auth.com/docs/installation#set-environment-variables)!)
```sh
mv .env.example .env
```
4. Start the development server
```sh
pnpm dev
```
https://www.better-auth.com/docs/installation#set-environment-variables
### Using the monorepo
This requires `pnpm` to be installed, see [https://pnpm.io/installation](https://pnpm.io/installation).
Clone the jazz repository.
```bash
git clone https://github.com/garden-co/jazz.git
```
Install and build dependencies.
```bash
pnpm i && npx turbo build
```
Go to the example directory.
```bash
cd jazz/examples/betterauth/
```
Create a .env file (don't forget to set your [BETTER_AUTH_SECRET](https://www.better-auth.com/docs/installation#set-environment-variables)!)
```sh
mv .env.example .env
```
Start the dev server.
```bash
pnpm dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.

View File

@@ -0,0 +1,21 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": false,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/styles/globals.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}

View File

@@ -0,0 +1,7 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
/* config options here */
};
export default nextConfig;

View File

@@ -0,0 +1,48 @@
{
"name": "betterauth",
"private": true,
"type": "module",
"scripts": {
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
"lint": "next lint",
"format-and-lint": "biome check .",
"format-and-lint:fix": "biome check . --write",
"test:e2e": "playwright test",
"test:e2e:ui": "playwright test --ui",
"email": "email dev --dir src/components/emails"
},
"dependencies": {
"@icons-pack/react-simple-icons": "^12.8.0",
"@radix-ui/react-label": "^2.1.6",
"@radix-ui/react-slot": "^1.2.2",
"better-auth": "^1.2.4",
"better-sqlite3": "^11.9.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"jazz-react-auth-betterauth": "workspace:*",
"jazz-betterauth-client-plugin": "workspace:*",
"jazz-betterauth-server-plugin": "workspace:*",
"jazz-tools": "workspace:*",
"lucide-react": "^0.510.0",
"next": "15.3.2",
"react": "catalog:react",
"react-dom": "catalog:react",
"sonner": "^2.0.3",
"tailwind-merge": "^3.3.0",
"tw-animate-css": "^1.2.5"
},
"devDependencies": {
"@biomejs/biome": "catalog:default",
"@playwright/test": "^1.50.1",
"@tailwindcss/postcss": "^4",
"@types/better-sqlite3": "^7.6.12",
"@types/node": "^20",
"@types/react": "catalog:react",
"@types/react-dom": "catalog:react",
"react-email": "^4.0.11",
"tailwindcss": "^4",
"typescript": "catalog:default"
}
}

View File

@@ -0,0 +1,53 @@
import { defineConfig, devices } from "@playwright/test";
import isCI from "is-ci";
/**
* Read environment variables from file.
* https://github.com/motdotla/dotenv
*/
// import dotenv from 'dotenv';
// dotenv.config({ path: path.resolve(__dirname, '.env') });
/**
* See https://playwright.dev/docs/test-configuration.
*/
export default defineConfig({
testDir: "./tests",
/* Run tests in files in parallel */
fullyParallel: true,
/* Fail the build on CI if you accidentally left test.only in the source code. */
forbidOnly: isCI,
/* Retry on CI only */
retries: isCI ? 2 : 0,
/* Opt out of parallel tests on CI. */
workers: isCI ? 1 : undefined,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: "html",
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
/* Base URL to use in actions like `await page.goto('/')`. */
baseURL: "http://localhost:3000/",
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: "on-first-retry",
permissions: ["clipboard-read", "clipboard-write"],
},
/* Configure projects for major browsers */
projects: [
{
name: "chromium",
use: { ...devices["Desktop Chrome"] },
},
],
/* Run your local dev server before starting the tests */
webServer: [
{
command: "pnpm dev",
url: "http://localhost:3000/",
reuseExistingServer: !isCI,
},
],
});

View File

@@ -0,0 +1,5 @@
const config = {
plugins: ["@tailwindcss/postcss"],
};
export default config;

View File

@@ -0,0 +1,15 @@
<svg
viewBox="0 0 386 146"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
>
<path id="text"
d="M176.725 33.865H188.275V22.7H176.725V33.865ZM164.9 129.4H172.875C182.72 129.4 188.275 123.9 188.275 114.22V43.6H176.725V109.545C176.725 115.65 173.975 118.51 167.925 118.51H164.9V129.4ZM245.298 53.28C241.613 45.47 233.363 41.95 222.748 41.95C208.998 41.95 200.748 48.44 197.888 58.615L208.613 61.915C210.648 55.315 216.368 52.565 222.638 52.565C231.933 52.565 235.673 56.415 236.058 64.61C226.433 65.93 216.643 67.195 209.768 69.23C200.583 72.145 195.743 77.865 195.743 86.83C195.743 96.51 202.673 104.65 215.818 104.65C225.443 104.65 232.318 101.35 237.213 94.365V103H247.388V66.425C247.388 61.475 247.168 57.185 245.298 53.28ZM217.853 95.245C210.483 95.245 207.128 91.34 207.128 86.72C207.128 82.045 210.593 79.515 215.323 77.92C220.328 76.435 226.983 75.5 235.948 74.18C235.893 76.93 235.673 80.725 234.738 83.475C233.418 89.25 227.643 95.245 217.853 95.245ZM251.22 103H301.545V92.715H269.535L303.195 45.47V43.6H254.3V53.885H284.935L251.22 101.185V103ZM304.815 103H355.14V92.715H323.13L356.79 45.47V43.6H307.895V53.885H338.53L304.815 101.185V103Z"
/>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M136.179 44.8277C136.179 44.8277 136.179 44.8277 136.179 44.8276V21.168C117.931 28.5527 97.9854 32.6192 77.0897 32.6192C65.1466 32.6192 53.5138 31.2908 42.331 28.7737V51.4076C42.331 51.4076 42.331 51.4076 42.331 51.4076V81.1508C41.2955 80.4385 40.1568 79.8458 38.9405 79.3915C36.1732 78.358 33.128 78.0876 30.1902 78.6145C27.2524 79.1414 24.5539 80.4419 22.4358 82.3516C20.3178 84.2613 18.8754 86.6944 18.291 89.3433C17.7066 91.9921 18.0066 94.7377 19.1528 97.2329C20.2991 99.728 22.2403 101.861 24.7308 103.361C27.2214 104.862 30.1495 105.662 33.1448 105.662H33.1455C33.6061 105.662 33.8365 105.662 34.0314 105.659C44.5583 105.449 53.042 96.9656 53.2513 86.4386C53.2534 86.3306 53.2544 86.2116 53.2548 86.0486H53.2552V85.7149L53.2552 85.5521V82.0762L53.2552 53.1993C61.0533 54.2324 69.0092 54.7656 77.0897 54.7656C77.6696 54.7656 78.2489 54.7629 78.8276 54.7574V110.696C77.792 109.983 76.6533 109.391 75.437 108.936C72.6697 107.903 69.6246 107.632 66.6867 108.159C63.7489 108.686 61.0504 109.987 58.9323 111.896C56.8143 113.806 55.3719 116.239 54.7875 118.888C54.2032 121.537 54.5031 124.283 55.6494 126.778C56.7956 129.273 58.7368 131.405 61.2273 132.906C63.7179 134.406 66.646 135.207 69.6414 135.207C70.1024 135.207 70.3329 135.207 70.5279 135.203C81.0548 134.994 89.5385 126.51 89.7478 115.983C89.7517 115.788 89.7517 115.558 89.7517 115.097V111.621L89.7517 54.3266C101.962 53.4768 113.837 51.4075 125.255 48.2397V80.9017C124.219 80.1894 123.081 79.5966 121.864 79.1424C119.097 78.1089 116.052 77.8384 113.114 78.3653C110.176 78.8922 107.478 80.1927 105.36 82.1025C103.242 84.0122 101.799 86.4453 101.215 89.0941C100.631 91.743 100.931 94.4886 102.077 96.9837C103.223 99.4789 105.164 101.612 107.655 103.112C110.145 104.612 113.073 105.413 116.069 105.413C116.53 105.413 116.76 105.413 116.955 105.409C127.482 105.2 135.966 96.7164 136.175 86.1895C136.179 85.9945 136.179 85.764 136.179 85.3029V81.8271L136.179 44.8277Z"
fill="#146AFF"
/>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,12 @@
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 125 125"
fill="none"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M118.179 29.6597V6C99.931 13.3847 79.9854 17.4512 59.0897 17.4512C47.1466 17.4512 35.5138 16.1228 24.331 13.6057V36.2396V65.9828C23.2955 65.2705 22.1568 64.6778 20.9405 64.2235C18.1732 63.19 15.128 62.9196 12.1902 63.4465C9.25242 63.9734 6.55392 65.2739 4.43582 67.1836C2.31782 69.0933 0.875416 71.5264 0.291016 74.1753C-0.293384 76.8241 0.00661504 79.5697 1.15281 82.0649C2.29911 84.56 4.24032 86.693 6.73082 88.193C9.22142 89.694 12.1495 90.494 15.1448 90.494C15.6054 90.494 15.8365 90.494 16.0314 90.491C26.5583 90.281 35.042 81.7976 35.2513 71.2706C35.2534 71.1626 35.2544 71.0436 35.2548 70.8806L35.2552 70.5469V70.3841V66.9082V38.0313C43.0533 39.0644 51.0092 39.5976 59.0897 39.5976C59.6696 39.5976 60.2489 39.5949 60.8276 39.5894V95.528C59.792 94.815 58.6533 94.223 57.437 93.768C54.6697 92.735 51.6246 92.464 48.6867 92.991C45.7489 93.518 43.0504 94.819 40.9323 96.728C38.8143 98.638 37.3719 101.071 36.7875 103.72C36.2032 106.369 36.5031 109.115 37.6494 111.61C38.7956 114.105 40.7368 116.237 43.2273 117.738C45.7179 119.238 48.646 120.039 51.6414 120.039C52.1024 120.039 52.3329 120.039 52.5279 120.035C63.0548 119.826 71.5385 111.342 71.7478 100.815C71.7517 100.62 71.7517 100.39 71.7517 99.929V96.453V39.1586C83.962 38.3088 95.837 36.2395 107.255 33.0717V65.7337C106.219 65.0214 105.081 64.4286 103.864 63.9744C101.097 62.9409 98.052 62.6704 95.114 63.1973C92.176 63.7242 89.478 65.0247 87.36 66.9345C85.242 68.8442 83.799 71.2773 83.215 73.9261C82.631 76.575 82.931 79.3206 84.077 81.8157C85.223 84.3109 87.164 86.444 89.655 87.944C92.145 89.444 95.073 90.245 98.069 90.245C98.53 90.245 98.76 90.245 98.955 90.241C109.482 90.032 117.966 81.5484 118.175 71.0215C118.179 70.8265 118.179 70.596 118.179 70.1349V66.6591V29.6597Z"
fill="#146AFF"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,22 @@
import { Navbar } from "@/components/navbar";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Jazz Example: Better Auth",
description: "Jazz example application demonstrating Better Auth integration",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<>
<Navbar />
<div className="container mx-auto pt-16 min-h-screen flex flex-col items-center justify-center">
{children}
</div>
</>
);
}

View File

@@ -0,0 +1,113 @@
"use client";
import { Button } from "@/components/ui/button";
import { Account } from "jazz-tools";
import { useAccount } from "jazz-tools/react";
import {
AppWindowMacIcon,
FileTextIcon,
GlobeIcon,
WrenchIcon,
} from "lucide-react";
import Image from "next/image";
export default function Home() {
const { me } = useAccount(Account, { resolve: { profile: {} } });
if (!me) {
return null;
}
return (
<div className="grow flex flex-col items-center justify-center">
<main className="flex flex-col gap-8 row-start-2 grow justify-center">
<Image
src="/jazz-logo.svg"
alt="Jazz logo"
width={180}
height={38}
priority
/>
<p className="text-sm/6 text-center sm:text-left">
Signed in as{" "}
<span className="bg-black/[.05] dark:bg-white/[.06] px-1 py-0.5 rounded font-mono font-semibold">
{me.profile.name}
</span>{" "}
with id{" "}
<span className="bg-black/[.05] dark:bg-white/[.06] px-1 py-0.5 rounded font-mono font-semibold">
{me.id}
</span>
</p>
<div className="flex gap-4 items-center flex-row">
<Button asChild size="lg">
<a
href="https://jazz.tools/docs"
target="_blank"
rel="noopener noreferrer"
>
<Image src="/jazz.svg" alt="" width={20} height={20} />
Start building
</a>
</Button>
<Button asChild variant="secondary" size="lg">
<a
href="https://jazz.tools/docs"
target="_blank"
rel="noopener noreferrer"
>
<FileTextIcon className="size-4" />
Read the docs
</a>
</Button>
</div>
</main>
<footer className="flex gap-4 py-8">
<Button asChild variant="ghost">
<a
href="https://jazz.tools/api-reference"
target="_blank"
rel="noopener noreferrer"
>
<FileTextIcon className="size-4" />
API reference
</a>
</Button>
<Button asChild variant="ghost">
<a
href="https://jazz.tools/examples"
target="_blank"
rel="noopener noreferrer"
>
<AppWindowMacIcon className="size-4" />
Examples
</a>
</Button>
<Button asChild variant="ghost">
<a
href="https://jazz.tools/status"
target="_blank"
rel="noopener noreferrer"
>
<GlobeIcon className="size-4" />
Status
</a>
</Button>
<Button asChild variant="ghost">
<a
href="https://jazz.tools/showcase"
target="_blank"
rel="noopener noreferrer"
>
<WrenchIcon className="size-4" />
Built with Jazz
</a>
</Button>
</footer>
</div>
);
}

View File

@@ -0,0 +1,14 @@
import { UserSettings } from "@/components/user-settings";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Settings | Jazz Example: Better Auth",
};
export default function SettingsPage() {
return (
<div className="max-w-screen-md w-full mx-auto px-4">
<UserSettings />
</div>
);
}

View File

@@ -0,0 +1,10 @@
import { auth } from "@/lib/auth";
import { toNextJsHandler } from "better-auth/next-js";
export const { GET, POST } = (() => {
if (!process.env.NEXT_PUBLIC_AUTH_BASE_URL) {
return toNextJsHandler(auth.handler);
} else {
return { GET: undefined, POST: undefined };
}
})();

View File

@@ -0,0 +1,10 @@
import { ForgotPasswordForm } from "@/components/forgot-password-form";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Forgot password | Jazz Example: Better Auth",
};
export default function ForgotPasswordPage() {
return <ForgotPasswordForm />;
}

View File

@@ -0,0 +1,23 @@
import Image from "next/image";
import Link from "next/link";
interface Props {
children: React.ReactNode;
}
export default function AuthLayout({ children }: Props) {
return (
<div className="bg-muted flex min-h-svh flex-col items-center justify-center gap-6 p-6 md:p-10">
<div className="flex w-full max-w-sm flex-col gap-6">
<Link
href="/"
className="flex items-center gap-2 self-center font-medium"
>
<Image src="/jazz.svg" alt="Jazz Logo" width={24} height={24} />
Jazz BetterAuth Demo
</Link>
{children}
</div>
</div>
);
}

View File

@@ -0,0 +1,10 @@
import { ResetPasswordForm } from "@/components/reset-password-form";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Reset password | Jazz Example: Better Auth",
};
export default function ResetPasswordPage() {
return <ResetPasswordForm />;
}

View File

@@ -0,0 +1,11 @@
import { SigninForm } from "@/components/signin-form";
import type { Metadata } from "next";
import { ssoProviders } from "../sso-providers";
export const metadata: Metadata = {
title: "Sign in | Jazz Example: Better Auth",
};
export default function LoginPage() {
return <SigninForm providers={ssoProviders} />;
}

View File

@@ -0,0 +1,11 @@
import { SignupForm } from "@/components/signup-form";
import type { Metadata } from "next";
import { ssoProviders } from "../sso-providers";
export const metadata: Metadata = {
title: "Sign up | Jazz Example: Better Auth",
};
export default function LoginPage() {
return <SignupForm providers={ssoProviders} />;
}

View File

@@ -0,0 +1,4 @@
import type { SSOProviderType } from "jazz-react-auth-betterauth";
// Fill in the providers you want to use
export const ssoProviders: SSOProviderType[] = ["github"];

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,123 @@
@import "tailwindcss";
@import "tw-animate-css";
@custom-variant dark (&:is(.dark *));
:root {
--background: oklch(1 0 0);
--foreground: oklch(0.145 0 0);
--card: oklch(1 0 0);
--card-foreground: oklch(0.145 0 0);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.145 0 0);
--primary: oklch(0.205 0 0);
--primary-foreground: oklch(0.985 0 0);
--secondary: oklch(0.97 0 0);
--secondary-foreground: oklch(0.205 0 0);
--muted: oklch(0.97 0 0);
--muted-foreground: oklch(0.556 0 0);
--accent: oklch(0.97 0 0);
--accent-foreground: oklch(0.205 0 0);
--destructive: oklch(0.577 0.245 27.325);
--destructive-foreground: oklch(0.577 0.245 27.325);
--border: oklch(0.922 0 0);
--input: oklch(0.922 0 0);
--ring: oklch(0.708 0 0);
--chart-1: oklch(0.646 0.222 41.116);
--chart-2: oklch(0.6 0.118 184.704);
--chart-3: oklch(0.398 0.07 227.392);
--chart-4: oklch(0.828 0.189 84.429);
--chart-5: oklch(0.769 0.188 70.08);
--radius: 0.625rem;
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.145 0 0);
--sidebar-primary: oklch(0.205 0 0);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.97 0 0);
--sidebar-accent-foreground: oklch(0.205 0 0);
--sidebar-border: oklch(0.922 0 0);
--sidebar-ring: oklch(0.708 0 0);
}
.dark {
--background: oklch(0.145 0 0);
--foreground: oklch(0.985 0 0);
--card: oklch(0.145 0 0);
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.145 0 0);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.985 0 0);
--primary-foreground: oklch(0.205 0 0);
--secondary: oklch(0.269 0 0);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.269 0 0);
--muted-foreground: oklch(0.708 0 0);
--accent: oklch(0.269 0 0);
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.396 0.141 25.723);
--destructive-foreground: oklch(0.637 0.237 25.331);
--border: oklch(0.269 0 0);
--input: oklch(0.269 0 0);
--ring: oklch(0.439 0 0);
--chart-1: oklch(0.488 0.243 264.376);
--chart-2: oklch(0.696 0.17 162.48);
--chart-3: oklch(0.769 0.188 70.08);
--chart-4: oklch(0.627 0.265 303.9);
--chart-5: oklch(0.645 0.246 16.439);
--sidebar: oklch(0.205 0 0);
--sidebar-foreground: oklch(0.985 0 0);
--sidebar-primary: oklch(0.488 0.243 264.376);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.269 0 0);
--sidebar-accent-foreground: oklch(0.985 0 0);
--sidebar-border: oklch(0.269 0 0);
--sidebar-ring: oklch(0.439 0 0);
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-destructive-foreground: var(--destructive-foreground);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
}

View File

@@ -0,0 +1,26 @@
import { JazzAndAuth } from "@/components/JazzAndAuth";
import { Toaster } from "@/components/ui/sonner";
import type { Metadata } from "next";
import "./globals.css";
export const metadata: Metadata = {
title: "Jazz Example: Better Auth",
description: "Jazz example application demonstrating Better Auth integration",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body className="antialiased">
<JazzAndAuth>
{children}
<Toaster richColors />
</JazzAndAuth>
</body>
</html>
);
}

View File

@@ -0,0 +1,33 @@
"use client";
import { AuthProvider } from "jazz-react-auth-betterauth";
import { JazzReactProvider } from "jazz-tools/react";
import { type ReactNode, lazy } from "react";
const JazzDevTools =
process.env.NODE_ENV === "production"
? () => null
: lazy(() =>
import("jazz-tools/inspector").then((res) => ({
default: res.JazzInspector,
})),
);
export function JazzAndAuth({ children }: { children: ReactNode }) {
return (
<JazzReactProvider
sync={{
peer: "wss://cloud.jazz.tools/?key=betterauth-example@garden.co",
}}
>
<AuthProvider
options={{
baseURL: process.env.NEXT_PUBLIC_AUTH_BASE_URL,
}}
>
{children}
</AuthProvider>
<JazzDevTools />
</JazzReactProvider>
);
}

View File

@@ -0,0 +1,137 @@
import { Button } from "@/components/ui/button";
import {
SiApple,
SiDiscord,
SiDropbox,
SiFacebook,
SiGithub,
SiGitlab,
SiGoogle,
SiKick,
SiReddit,
SiRoblox,
SiSpotify,
SiTiktok,
SiTwitch,
SiVk,
SiX,
SiZoom,
} from "@icons-pack/react-simple-icons";
import { type SSOProviderType, useAuth } from "jazz-react-auth-betterauth";
import { useRouter } from "next/navigation";
import type { ReactNode } from "react";
import { toast } from "sonner";
interface SocialProvider {
name: string;
icon?: ReactNode;
}
const socialProviderMap: Record<SSOProviderType, SocialProvider> = {
github: {
name: "GitHub",
icon: <SiGithub />,
},
google: {
name: "Google",
icon: <SiGoogle />,
},
apple: {
name: "Apple",
icon: <SiApple />,
},
discord: {
name: "Discord",
icon: <SiDiscord />,
},
facebook: {
name: "Facebook",
icon: <SiFacebook />,
},
microsoft: {
name: "Microsoft",
},
twitter: {
name: "X",
icon: <SiX />,
},
dropbox: {
name: "Dropbox",
icon: <SiDropbox />,
},
linkedin: {
name: "LinkedIn",
},
gitlab: {
name: "GitLab",
icon: <SiGitlab />,
},
kick: {
name: "Kick",
icon: <SiKick />,
},
tiktok: {
name: "TikTok",
icon: <SiTiktok />,
},
twitch: {
name: "Twitch",
icon: <SiTwitch />,
},
vk: {
name: "VK",
icon: <SiVk />,
},
zoom: {
name: "Zoom",
icon: <SiZoom />,
},
roblox: {
name: "Roblox",
icon: <SiRoblox />,
},
reddit: {
name: "Reddit",
icon: <SiReddit />,
},
spotify: {
name: "Spotify",
icon: <SiSpotify />,
},
};
interface Props {
provider: SSOProviderType;
}
export function SSOButton({ provider }: Props) {
const auth = useAuth();
const router = useRouter();
return (
<Button
type="button"
variant="outline"
onClick={() => {
auth.authClient.signIn.social(
{
provider,
},
{
onSuccess: () => {
router.push("/");
},
onError: (error) => {
toast.error("Error", {
description: error.error.message,
});
},
},
);
}}
>
{socialProviderMap[provider].icon}
Continue with {socialProviderMap[provider].name}
</Button>
);
}

View File

@@ -0,0 +1,85 @@
"use client";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { useAuth } from "jazz-react-auth-betterauth";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { toast } from "sonner";
export function ForgotPasswordForm() {
const router = useRouter();
const [email, setEmail] = useState("");
const auth = useAuth();
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
auth.authClient.forgetPassword(
{ email, redirectTo: `${window.location.origin}/auth/reset-password` },
{
onSuccess: () => {
toast.success("Email sent");
},
onError: (error) => {
toast.error("Error", {
description: error.error.message,
});
},
},
);
};
return (
<div className="flex flex-col gap-6">
<Card>
<CardHeader className="text-center">
<CardTitle className="text-xl">Recover password</CardTitle>
<CardDescription>
Enter your email to receive a link to reset your password
</CardDescription>
</CardHeader>
<CardContent>
<form onSubmit={handleSubmit}>
<div className="grid gap-6">
<div className="grid gap-6">
<div className="grid gap-3">
<Label htmlFor="email">Email</Label>
<Input
id="email"
type="email"
placeholder="you@example.com"
required
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
</div>
<Button type="submit" className="w-full">
Recover password
</Button>
</div>
<div className="text-center text-sm">
Back to{" "}
<Link
href="/auth/sign-in"
className="underline underline-offset-4"
>
Sign in
</Link>
</div>
</div>
</form>
</CardContent>
</Card>
</div>
);
}

View File

@@ -0,0 +1,55 @@
"use client";
import { Button } from "@/components/ui/button";
import { useAuth } from "jazz-react-auth-betterauth";
import { Account } from "jazz-tools";
import { useAccount, useIsAuthenticated } from "jazz-tools/react";
import Image from "next/image";
import Link from "next/link";
import { useCallback } from "react";
export function Navbar() {
const { authClient } = useAuth();
const { logOut } = useAccount(Account, { resolve: { profile: {} } });
const isAuthenticated = useIsAuthenticated();
const signOut = useCallback(() => {
authClient.signOut().catch(console.error).finally(logOut);
}, [logOut, authClient]);
return (
<header className="absolute p-4 top-0 left-0 w-full z-10 flex justify-between">
<nav className="flex gap-4">
<Link href="/">
<Image
src="/jazz-logo.svg"
alt="Jazz logo"
width={96}
height={96}
priority
/>
</Link>
{isAuthenticated && (
<Button asChild variant="link">
<Link href="/settings">Settings</Link>
</Button>
)}
</nav>
<nav className="flex gap-4">
{isAuthenticated ? (
<Button onClick={signOut}>Sign out</Button>
) : (
<>
<Button asChild variant="secondary">
<Link href="/auth/sign-in">Sign in</Link>
</Button>
<Button asChild>
<Link href="/auth/sign-up">Sign up</Link>
</Button>
</>
)}
</nav>
</header>
);
}

View File

@@ -0,0 +1,108 @@
"use client";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { useAuth } from "jazz-react-auth-betterauth";
import Link from "next/link";
import { useRouter, useSearchParams } from "next/navigation";
import { useState } from "react";
import { toast } from "sonner";
export function ResetPasswordForm() {
const router = useRouter();
const [password, setPassword] = useState("");
const [confirmPassword, setConfirmPassword] = useState("");
const auth = useAuth();
const searchParams = useSearchParams();
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
const token = searchParams.get("token");
if (password !== confirmPassword) {
toast.error("Passwords do not match");
return;
}
if (!token) {
toast.error("Invalid token");
return;
}
auth.authClient.resetPassword(
{ newPassword: password, token },
{
onSuccess: () => {
toast.success("Password successfully updated");
router.push("/auth/sign-in");
},
onError: (error) => {
toast.error("Error", {
description: error.error.message,
});
},
},
);
};
return (
<div className="flex flex-col gap-6">
<Card>
<CardHeader className="text-center">
<CardTitle className="text-xl">Reset password</CardTitle>
<CardDescription>Enter your new password</CardDescription>
</CardHeader>
<CardContent>
<form onSubmit={handleSubmit}>
<div className="grid gap-6">
<div className="grid gap-6">
<div className="grid gap-3">
<Label htmlFor="password">New password</Label>
<Input
id="password"
type="password"
required
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
</div>
<div className="grid gap-3">
<Label htmlFor="confirmPassword">Confirm password</Label>
<Input
id="confirmPassword"
type="password"
required
value={confirmPassword}
onChange={(e) => setConfirmPassword(e.target.value)}
/>
</div>
<Button type="submit" className="w-full">
Set password
</Button>
</div>
<div className="text-center text-sm">
Back to{" "}
<Link
href="/auth/sign-in"
className="underline underline-offset-4"
>
Sign in
</Link>
</div>
</div>
</form>
</CardContent>
</Card>
</div>
);
}

View File

@@ -0,0 +1,124 @@
"use client";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { type SSOProviderType, useAuth } from "jazz-react-auth-betterauth";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { toast } from "sonner";
import { SSOButton } from "./SSOButton";
interface Props {
providers: SSOProviderType[];
}
export function SigninForm({ providers }: Props) {
const router = useRouter();
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const auth = useAuth();
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
await auth.authClient.signIn.email(
{ email, password },
{
onSuccess: async () => {
await auth.logIn();
router.push("/");
},
onError: (error) => {
toast.error("Error", {
description: error.error.message,
});
},
},
);
};
return (
<div className="flex flex-col gap-6">
<Card>
<CardHeader className="text-center">
<CardTitle className="text-xl">Welcome back</CardTitle>
<CardDescription>
Sign in with one of the following providers
</CardDescription>
</CardHeader>
<CardContent>
<form onSubmit={handleSubmit}>
<div className="grid gap-6">
{providers.length > 0 && (
<>
<div className="flex flex-col gap-4">
{providers?.map((provider) => (
<SSOButton key={provider} provider={provider} />
))}
</div>
<div className="after:border-border relative text-center text-sm after:absolute after:inset-0 after:top-1/2 after:z-0 after:flex after:items-center after:border-t">
<span className="bg-card text-muted-foreground relative z-10 px-2">
Or continue with
</span>
</div>
</>
)}
<div className="grid gap-6">
<div className="grid gap-3">
<Label htmlFor="email">Email</Label>
<Input
id="email"
type="email"
placeholder="you@example.com"
required
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
</div>
<div className="grid gap-3">
<div className="flex items-center justify-between">
<Label htmlFor="password">Password</Label>
<Link
href="/auth/forgot-password"
className="ml-auto inline-block text-sm underline-offset-4 hover:underline"
>
Forgot your password?
</Link>
</div>
<Input
id="password"
type="password"
required
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
</div>
<Button type="submit" className="w-full">
Sign in
</Button>
</div>
<div className="text-center text-sm">
Don&apos;t have an account?{" "}
<Link
href="/auth/sign-up"
className="underline underline-offset-4"
>
Sign up
</Link>
</div>
</div>
</form>
</CardContent>
</Card>
</div>
);
}

View File

@@ -0,0 +1,151 @@
"use client";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { type SSOProviderType, useAuth } from "jazz-react-auth-betterauth";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { toast } from "sonner";
import { SSOButton } from "./SSOButton";
interface Props {
providers: SSOProviderType[];
}
export function SignupForm({ providers }: Props) {
const router = useRouter();
const auth = useAuth();
const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [confirmPassword, setConfirmPassword] = useState("");
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
if (password !== confirmPassword) {
toast.error("Error", {
description: "Passwords do not match",
});
return;
}
await auth.authClient.signUp.email(
{
email,
password,
name,
},
{
onSuccess: async () => {
await auth.signIn();
router.push("/");
},
onError: (error) => {
toast.error("Sign up error", {
description: error.error.message,
});
},
},
);
};
return (
<div className="flex flex-col gap-6">
<Card>
<CardHeader className="text-center">
<CardTitle className="text-xl">Welcome</CardTitle>
<CardDescription>
Sign up with one of the following providers
</CardDescription>
</CardHeader>
<CardContent>
<form onSubmit={handleSubmit}>
<div className="grid gap-6">
{providers.length > 0 && (
<>
<div className="flex flex-col gap-4">
{providers?.map((provider) => (
<SSOButton key={provider} provider={provider} />
))}
</div>
<div className="after:border-border relative text-center text-sm after:absolute after:inset-0 after:top-1/2 after:z-0 after:flex after:items-center after:border-t">
<span className="bg-card text-muted-foreground relative z-10 px-2">
Or continue with
</span>
</div>
</>
)}
<div className="grid gap-6">
<div className="grid gap-3">
<Label htmlFor="name">Name</Label>
<Input
id="name"
type="text"
placeholder="John Doe"
required
value={name}
onChange={(e) => setName(e.target.value)}
/>
</div>
<div className="grid gap-3">
<Label htmlFor="email">Email</Label>
<Input
id="email"
type="email"
placeholder="you@example.com"
required
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
</div>
<div className="grid gap-3">
<Label htmlFor="password">Password</Label>
<Input
id="password"
type="password"
placeholder="********"
required
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
</div>
<div className="grid gap-3">
<Label htmlFor="confirmPassword">Confirm password</Label>
<Input
id="confirmPassword"
type="password"
required
value={confirmPassword}
onChange={(e) => setConfirmPassword(e.target.value)}
/>
</div>
<Button type="submit" className="w-full">
Sign up
</Button>
</div>
<div className="text-center text-sm">
Already have an account?{" "}
<Link
href="/auth/sign-in"
className="underline underline-offset-4"
>
Sign in
</Link>
</div>
</div>
</form>
</CardContent>
</Card>
</div>
);
}

View File

@@ -0,0 +1,59 @@
import { Slot } from "@radix-ui/react-slot";
import { type VariantProps, cva } from "class-variance-authority";
import * as React from "react";
import { cn } from "@/lib/utils";
const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
{
variants: {
variant: {
default:
"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
destructive:
"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
outline:
"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
secondary:
"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
ghost:
"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-9 px-4 py-2 has-[>svg]:px-3",
sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
icon: "size-9",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
},
);
function Button({
className,
variant,
size,
asChild = false,
...props
}: React.ComponentProps<"button"> &
VariantProps<typeof buttonVariants> & {
asChild?: boolean;
}) {
const Comp = asChild ? Slot : "button";
return (
<Comp
data-slot="button"
className={cn(buttonVariants({ variant, size, className }))}
{...props}
/>
);
}
export { Button, buttonVariants };

View File

@@ -0,0 +1,92 @@
import * as React from "react";
import { cn } from "@/lib/utils";
function Card({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="card"
className={cn(
"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
className,
)}
{...props}
/>
);
}
function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="card-header"
className={cn(
"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
className,
)}
{...props}
/>
);
}
function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="card-title"
className={cn("leading-none font-semibold", className)}
{...props}
/>
);
}
function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="card-description"
className={cn("text-muted-foreground text-sm", className)}
{...props}
/>
);
}
function CardAction({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="card-action"
className={cn(
"col-start-2 row-span-2 row-start-1 self-start justify-self-end",
className,
)}
{...props}
/>
);
}
function CardContent({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="card-content"
className={cn("px-6", className)}
{...props}
/>
);
}
function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="card-footer"
className={cn("flex items-center px-6 [.border-t]:pt-6", className)}
{...props}
/>
);
}
export {
Card,
CardHeader,
CardFooter,
CardTitle,
CardAction,
CardDescription,
CardContent,
};

View File

@@ -0,0 +1,22 @@
"use client";
import { Toaster as Sonner, type ToasterProps } from "sonner";
const Toaster = ({ ...props }: ToasterProps) => {
return (
<Sonner
theme="light"
className="toaster group"
style={
{
"--normal-bg": "var(--popover)",
"--normal-text": "var(--popover-foreground)",
"--normal-border": "var(--border)",
} as React.CSSProperties
}
{...props}
/>
);
};
export { Toaster };

View File

@@ -0,0 +1,60 @@
"use client";
import { Button } from "@/components/ui/button";
import { useAuth } from "jazz-react-auth-betterauth";
import { useAccount, useIsAuthenticated } from "jazz-tools/react";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { toast } from "sonner";
export function UserSettings() {
const router = useRouter();
const { authClient } = useAuth();
const { logOut } = useAccount();
const isAuthenticated = useIsAuthenticated();
if (!isAuthenticated) {
return (
<div className="flex flex-col gap-8">
<h1 className="text-center text-2xl">Forbidden</h1>
<p className="text-center text-sm text-muted-foreground">
Please{" "}
<Link href="/auth/sign-in" className="underline text-primary">
sign in
</Link>{" "}
to access this page.
</p>
</div>
);
}
return (
<>
<div className="flex flex-col gap-8">
<h1 className="text-4xl font-semibold">Settings</h1>
<Button
variant="destructive"
className="relative"
type="button"
onClick={async (e) => {
e.preventDefault();
authClient.deleteUser(undefined, {
onSuccess: () => {
logOut();
router.push("/");
},
onError: (error) => {
toast.error("Error", {
description: error.error.message,
});
},
});
}}
>
Delete account
</Button>
</div>
</>
);
}

View File

@@ -0,0 +1,50 @@
import { betterAuth } from "better-auth";
import { getMigrations } from "better-auth/db";
import Database from "better-sqlite3";
import { jazzPlugin } from "jazz-betterauth-server-plugin";
import { socialProviders } from "./socialProviders";
export const auth = await (async () => {
// Configure Better Auth server
const auth = betterAuth({
appName: "Jazz Example: Better Auth",
database: new Database("sqlite.db"),
emailAndPassword: {
enabled: true,
async sendResetPassword({ url }) {
// Here we can send an email to the user with the reset password link
console.log("****** RESET PASSWORD ******");
console.log("navigate to", url, "to reset your password");
console.log("******");
},
},
emailVerification: {
async sendVerificationEmail(data) {
console.error("Not implemented");
},
},
socialProviders,
user: {
deleteUser: {
enabled: true,
},
},
plugins: [jazzPlugin()],
databaseHooks: {
user: {
create: {
async after(user) {
// Here we can send a welcome email to the user
console.error("Not implemented");
},
},
},
},
});
// Run database migrations
const migrations = await getMigrations(auth.options);
await migrations.runMigrations();
return auth;
})();

View File

@@ -0,0 +1,186 @@
const apple =
process.env.APPLE_CLIENT_ID &&
process.env.APPLE_CLIENT_SECRET &&
process.env.APPLE_APP_BUNDLE_IDENTIFIER
? {
apple: {
clientId: process.env.APPLE_CLIENT_ID as string,
clientSecret: process.env.APPLE_CLIENT_SECRET as string,
// For native iOS
appBundleIdentifier: process.env
.APPLE_APP_BUNDLE_IDENTIFIER as string,
},
}
: undefined;
const discord =
process.env.DISCORD_CLIENT_ID && process.env.DISCORD_CLIENT_SECRET
? {
discord: {
clientId: process.env.DISCORD_CLIENT_ID as string,
clientSecret: process.env.DISCORD_CLIENT_SECRET as string,
},
}
: undefined;
const facebook =
process.env.FACEBOOK_CLIENT_ID && process.env.FACEBOOK_CLIENT_SECRET
? {
facebook: {
clientId: process.env.FACEBOOK_CLIENT_ID as string,
clientSecret: process.env.FACEBOOK_CLIENT_SECRET as string,
},
}
: undefined;
const github =
process.env.GITHUB_CLIENT_ID && process.env.GITHUB_CLIENT_SECRET
? {
github: {
clientId: process.env.GITHUB_CLIENT_ID as string,
clientSecret: process.env.GITHUB_CLIENT_SECRET as string,
},
}
: undefined;
const google =
process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET
? {
google: {
clientId: process.env.GOOGLE_CLIENT_ID as string,
clientSecret: process.env.GOOGLE_CLIENT_SECRET as string,
},
}
: undefined;
const kick =
process.env.KICK_CLIENT_ID && process.env.KICK_CLIENT_SECRET
? {
kick: {
clientId: process.env.KICK_CLIENT_ID as string,
clientSecret: process.env.KICK_CLIENT_SECRET as string,
},
}
: undefined;
const microsoft =
process.env.MICROSOFT_CLIENT_ID && process.env.MICROSOFT_CLIENT_SECRET
? {
microsoft: {
clientId: process.env.MICROSOFT_CLIENT_ID as string,
clientSecret: process.env.MICROSOFT_CLIENT_SECRET as string,
tenantId: "common",
requireSelectAccount: true,
},
}
: undefined;
const tiktok =
process.env.TIKTOK_CLIENT_ID &&
process.env.TIKTOK_CLIENT_SECRET &&
process.env.TIKTOK_CLIENT_KEY
? {
tiktok: {
clientId: process.env.TIKTOK_CLIENT_ID,
clientSecret: process.env.TIKTOK_CLIENT_SECRET,
clientKey: process.env.TIKTOK_CLIENT_KEY,
},
}
: undefined;
const twitch =
process.env.TWITCH_CLIENT_ID && process.env.TWITCH_CLIENT_SECRET
? {
twitch: {
clientId: process.env.TWITCH_CLIENT_ID as string,
clientSecret: process.env.TWITCH_CLIENT_SECRET as string,
},
}
: undefined;
const twitter =
process.env.TWITTER_CLIENT_ID && process.env.TWITTER_CLIENT_SECRET
? {
twitter: {
clientId: process.env.TWITTER_CLIENT_ID,
clientSecret: process.env.TWITTER_CLIENT_SECRET,
},
}
: undefined;
const dropbox =
process.env.DROPBOX_CLIENT_ID && process.env.DROPBOX_CLIENT_SECRET
? {
dropbox: {
clientId: process.env.DROPBOX_CLIENT_ID as string,
clientSecret: process.env.DROPBOX_CLIENT_SECRET as string,
},
}
: undefined;
const linkedin =
process.env.LINKEDIN_CLIENT_ID && process.env.LINKEDIN_CLIENT_SECRET
? {
linkedin: {
clientId: process.env.LINKEDIN_CLIENT_ID as string,
clientSecret: process.env.LINKEDIN_CLIENT_SECRET as string,
},
}
: undefined;
const gitlab =
process.env.GITLAB_CLIENT_ID &&
process.env.GITLAB_CLIENT_SECRET &&
process.env.GITLAB_ISSUER
? {
gitlab: {
clientId: process.env.GITLAB_CLIENT_ID as string,
clientSecret: process.env.GITLAB_CLIENT_SECRET as string,
issuer: process.env.GITLAB_ISSUER as string,
},
}
: undefined;
const reddit =
process.env.REDDIT_CLIENT_ID && process.env.REDDIT_CLIENT_SECRET
? {
reddit: {
clientId: process.env.REDDIT_CLIENT_ID as string,
clientSecret: process.env.REDDIT_CLIENT_SECRET as string,
},
}
: undefined;
const roblox =
process.env.ROBLOX_CLIENT_ID && process.env.ROBLOX_CLIENT_SECRET
? {
roblox: {
clientId: process.env.ROBLOX_CLIENT_ID,
clientSecret: process.env.ROBLOX_CLIENT_SECRET,
},
}
: undefined;
const spotify =
process.env.SPOTIFY_CLIENT_ID && process.env.SPOTIFY_CLIENT_SECRET
? {
spotify: {
clientId: process.env.SPOTIFY_CLIENT_ID as string,
clientSecret: process.env.SPOTIFY_CLIENT_SECRET as string,
},
}
: undefined;
const vk =
process.env.VK_CLIENT_ID && process.env.VK_CLIENT_SECRET
? {
vk: {
clientId: process.env.VK_CLIENT_ID as string,
clientSecret: process.env.VK_CLIENT_SECRET as string,
},
}
: undefined;
export const socialProviders = {
...(apple && { ...apple }),
...(discord && { ...discord }),
...(facebook && { ...facebook }),
...(github && { ...github }),
...(google && { ...google }),
...(kick && { ...kick }),
...(microsoft && { ...microsoft }),
...(tiktok && { ...tiktok }),
...(twitch && { ...twitch }),
...(twitter && { ...twitter }),
...(dropbox && { ...dropbox }),
...(linkedin && { ...linkedin }),
...(gitlab && { ...gitlab }),
...(reddit && { ...reddit }),
...(roblox && { ...roblox }),
...(spotify && { ...spotify }),
...(vk && { ...vk }),
};

View File

@@ -0,0 +1,28 @@
import { randomBytes } from "node:crypto";
import { test } from "@playwright/test";
import { HomePage } from "./pages/HomePage";
test("should sign up, sign in, and logout", async ({ page }) => {
const username = randomBytes(4).toString("hex");
const email = `${username}@example.com`;
const password = randomBytes(8).toString("hex");
// Sign up
await page.goto("/");
const homePage = new HomePage(page);
await homePage.expectLoggedOut();
await homePage.signUpLink.click();
await homePage.signUpEmail(username, email, password);
await homePage.expectLoggedIn(username);
// Log out & sign in
await homePage.logout();
await homePage.expectLoggedOut();
await homePage.signInLink.click();
await homePage.signInEmail(email, password);
await homePage.expectLoggedIn(username);
// Logout
await homePage.logout();
await homePage.expectLoggedOut();
});

View File

@@ -0,0 +1,76 @@
import { type Page, expect } from "@playwright/test";
export class HomePage {
constructor(public page: Page) {}
usernameInput = this.page.getByRole("textbox", {
name: "Name",
exact: true,
});
emailInput = this.page.getByRole("textbox", {
name: "Email",
exact: true,
});
passwordInput = this.page.getByRole("textbox", {
name: "Password",
exact: true,
});
confirmPasswordInput = this.page.getByRole("textbox", {
name: "Confirm password",
exact: true,
});
signUpButton = this.page.getByRole("button", {
name: "Sign up",
exact: true,
});
signInButton = this.page.getByRole("button", {
name: "Sign in",
exact: true,
});
signUpLink = this.page.getByRole("link", {
name: "Sign up",
exact: true,
});
signInLink = this.page.getByRole("link", {
name: "Sign in",
exact: true,
});
logoutButton = this.page.getByRole("button", {
name: "Sign out",
exact: true,
});
async signUpEmail(name: string, email: string, password: string) {
await this.usernameInput.fill(name);
await this.emailInput.fill(email);
await this.passwordInput.fill(password);
await this.confirmPasswordInput.fill(password);
await this.signUpButton.click();
}
async signInEmail(email: string, password: string) {
await this.emailInput.fill(email);
await this.passwordInput.fill(password);
await this.signInButton.click();
}
async logout() {
await this.logoutButton.click();
}
async expectLoggedIn(name?: string) {
await expect(this.logoutButton).toBeVisible();
await expect(this.signInLink).not.toBeVisible();
await expect(this.signUpLink).not.toBeVisible();
if (name) {
await expect(this.page.getByText(`Signed in as ${name}`)).toBeVisible();
}
}
async expectLoggedOut() {
await expect(this.logoutButton).not.toBeVisible();
await expect(this.signInLink).toBeVisible();
await expect(this.signUpLink).toBeVisible();
await expect(this.page.getByText(`Anonymous user`)).toBeVisible();
}
}

View File

@@ -0,0 +1,27 @@
{
"compilerOptions": {
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}

View File

@@ -1,17 +0,0 @@
node_modules/
.expo/
dist/
npm-debug.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/
# macOS
.DS_Store
ios
android

File diff suppressed because it is too large Load Diff

View File

@@ -1,24 +0,0 @@
# 🎷 Jazz + Expo + `expo-router` + Clerk Auth
## 🚀 How to Run
### 1. Inside the Workspace Root
First, install dependencies and build the project:
```bash
pnpm i
pnpm run build
```
### 2. Inside the `examples/chat-rn-expo-clerk` Directory
Next, navigate to the specific example project and run the following commands:
```bash
pnpm expo prebuild
pnpx pod-install
pnpm expo run:ios
```
This will set up and launch the app on iOS. For Android, you can replace the last command with `pnpm expo run:android`.

View File

@@ -1,45 +0,0 @@
{
"expo": {
"name": "jazz-chat-rn-expo-clerk",
"scheme": "jazz-chat-rn-expo-clerk",
"slug": "jazz-chat-rn-expo-clerk",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/images/icon.png",
"userInterfaceStyle": "light",
"splash": {
"image": "./assets/images/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com.jazz.chatrnclerk"
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/images/adaptive-icon.png",
"backgroundColor": "#ffffff"
},
"package": "com.jazz.chatrnclerk"
},
"newArchEnabled": true,
"plugins": [
"expo-secure-store",
"expo-font",
"expo-router",
"expo-sqlite",
[
"expo-image-picker",
{
"photosPermission": "The app accesses your photos to let you share them with your friends."
}
]
],
"extra": {
"eas": {
"projectId": "ca3d46e5-a10a-47ec-9d77-3b841e1c62d4"
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More