Compare commits

..

40 Commits

Author SHA1 Message Date
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
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
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
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
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
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
175 changed files with 2591 additions and 6277 deletions

View File

@@ -0,0 +1,46 @@
name: Playwright Tests
on:
push:
branches: ["main"]
pull_request:
types: [opened, synchronize, reopened]
jobs:
test:
timeout-minutes: 60
runs-on: blacksmith-4vcpu-ubuntu-2204
strategy:
matrix:
project: ["homepage/homepage"]
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Setup Source Code
uses: ./.github/actions/source-code/
- name: Install project dependencies
run: pnpm install
working-directory: ./${{ matrix.project }}
- 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

View File

@@ -64,7 +64,7 @@
}
},
{
"include": ["packages/**/src/tests/**"],
"include": ["**/tests/**"],
"linter": {
"rules": {
"correctness": {

View File

@@ -1,5 +1,16 @@
# betterauth
## 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

View File

@@ -1,6 +1,6 @@
{
"name": "betterauth",
"version": "0.1.21",
"version": "0.1.22",
"private": true,
"type": "module",
"scripts": {

View File

@@ -1,5 +1,14 @@
# chat-rn-expo-clerk
## 1.0.142
### Patch Changes
- Updated dependencies [061ec99]
- jazz-expo@0.14.19
- jazz-react-native-media-images@0.14.19
- jazz-tools@0.14.19
## 1.0.141
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "chat-rn-expo-clerk",
"main": "index.js",
"version": "1.0.141",
"version": "1.0.142",
"scripts": {
"build": "expo export -p ios",
"start": "expo start",

View File

@@ -1,5 +1,13 @@
# chat-rn-expo
## 1.0.10
### Patch Changes
- Updated dependencies [061ec99]
- jazz-expo@0.14.19
- jazz-tools@0.14.19
## 1.0.9
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "chat-rn-expo",
"version": "1.0.9",
"version": "1.0.10",
"main": "index.ts",
"scripts": {
"build": "expo prebuild",

View File

@@ -1,5 +1,15 @@
# chat-rn
## 1.0.137
### Patch Changes
- Updated dependencies [061ec99]
- jazz-react-native@0.14.19
- cojson@0.14.19
- cojson-transport-ws@0.14.19
- jazz-tools@0.14.19
## 1.0.136
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "chat-rn",
"version": "1.0.136",
"version": "1.0.137",
"main": "index.js",
"scripts": {
"android": "react-native run-android",

View File

@@ -1,5 +1,13 @@
# chat-vue
## 0.0.117
### Patch Changes
- jazz-browser@0.14.19
- jazz-tools@0.14.19
- jazz-vue@0.14.19
## 0.0.116
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "chat-vue",
"version": "0.0.116",
"version": "0.0.117",
"private": true,
"type": "module",
"scripts": {
@@ -32,7 +32,7 @@
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11",
"vite": "6.3.5",
"vite-plugin-vue-devtools": "^7.4.6",
"vue-tsc": "^2.1.6"
}

View File

@@ -1,5 +1,13 @@
# jazz-example-chat
## 0.0.217
### Patch Changes
- jazz-inspector@0.14.19
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.216
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "jazz-example-chat",
"private": true,
"version": "0.0.216",
"version": "0.0.217",
"type": "module",
"scripts": {
"dev": "vite",
@@ -27,12 +27,12 @@
"@playwright/test": "^1.50.1",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react-swc": "^3.3.2",
"@vitejs/plugin-react-swc": "^3.10.1",
"autoprefixer": "^10.4.20",
"is-ci": "^3.0.1",
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,13 @@
# minimal-auth-clerk
## 0.0.116
### Patch Changes
- jazz-react@0.14.19
- jazz-react-auth-clerk@0.14.19
- jazz-tools@0.14.19
## 0.0.115
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "clerk",
"private": true,
"version": "0.0.115",
"version": "0.0.116",
"type": "module",
"scripts": {
"dev": "vite",
@@ -25,9 +25,9 @@
"@biomejs/biome": "1.9.4",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"globals": "^15.11.0",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,13 @@
# file-share-svelte
## 0.0.101
### Patch Changes
- jazz-inspector-element@0.14.19
- jazz-svelte@0.14.19
- jazz-tools@0.14.19
## 0.0.100
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "file-share-svelte",
"version": "0.0.100",
"version": "0.0.101",
"private": true,
"type": "module",
"scripts": {
@@ -35,7 +35,7 @@
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"typescript-eslint": "^8.0.0",
"vite": "6.0.11"
"vite": "6.3.5"
},
"dependencies": {
"@tailwindcss/typography": "^0.5.15",

View File

@@ -1,5 +1,13 @@
# jazz-tailwind-demo-auth-starter
## 0.0.56
### Patch Changes
- jazz-inspector@0.14.19
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.55
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "filestream",
"private": true,
"version": "0.0.55",
"version": "0.0.56",
"type": "module",
"scripts": {
"dev": "vite",
@@ -21,13 +21,13 @@
"@biomejs/biome": "1.9.4",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"autoprefixer": "^10.4.20",
"globals": "^15.11.0",
"is-ci": "^3.0.1",
"postcss": "^8.5.3",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,12 @@
# form
## 0.1.57
### Patch Changes
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.1.56
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "form",
"private": true,
"version": "0.1.56",
"version": "0.1.57",
"type": "module",
"scripts": {
"dev": "vite",
@@ -23,13 +23,13 @@
"@tailwindcss/forms": "^0.5.9",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"autoprefixer": "^10.4.20",
"globals": "^15.11.0",
"is-ci": "^3.0.1",
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,12 @@
# image-upload
## 0.0.113
### Patch Changes
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.112
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "image-upload",
"private": true,
"version": "0.0.112",
"version": "0.0.113",
"type": "module",
"scripts": {
"dev": "vite",
@@ -20,10 +20,10 @@
"@biomejs/biome": "1.9.4",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"globals": "^15.11.0",
"typescript": "5.6.2",
"vite": "6.0.11",
"vite": "6.3.5",
"autoprefixer": "^10.4.20",
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17"

View File

@@ -1,5 +1,13 @@
# jazz-example-inspector
## 0.0.166
### Patch Changes
- cojson@0.14.19
- cojson-transport-ws@0.14.19
- jazz-inspector@0.14.19
## 0.0.165
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "jazz-inspector-app",
"private": true,
"version": "0.0.165",
"version": "0.0.166",
"type": "module",
"scripts": {
"dev": "vite",
@@ -26,11 +26,11 @@
"devDependencies": {
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react-swc": "^3.3.2",
"@vitejs/plugin-react-swc": "^3.10.1",
"autoprefixer": "^10.4.20",
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,12 @@
# jazz-nextjs
## 0.1.6
### Patch Changes
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.1.5
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "jazz-nextjs",
"version": "0.1.5",
"version": "0.1.6",
"private": true,
"scripts": {
"dev": "next dev --turbopack",

View File

@@ -41,6 +41,6 @@
"npm-run-all": "^4.1.5",
"tsx": "^4.19.3",
"typescript": "~5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,12 @@
# multi-cursors
## 0.0.109
### Patch Changes
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.108
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "multi-cursors",
"private": true,
"version": "0.0.108",
"version": "0.0.109",
"type": "module",
"scripts": {
"dev": "vite",
@@ -23,14 +23,14 @@
"@biomejs/biome": "1.9.4",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"autoprefixer": "^10.4.20",
"globals": "^15.11.0",
"is-ci": "^3.0.1",
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11",
"vite": "6.3.5",
"vitest": "3.1.1"
}
}

View File

@@ -1,5 +1,13 @@
# multiauth
## 0.0.57
### Patch Changes
- jazz-react@0.14.19
- jazz-react-auth-clerk@0.14.19
- jazz-tools@0.14.19
## 0.0.56
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "multiauth",
"private": true,
"version": "0.0.56",
"version": "0.0.57",
"type": "module",
"scripts": {
"dev": "vite",
@@ -22,9 +22,9 @@
"@biomejs/biome": "1.9.4",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"globals": "^15.11.0",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,13 @@
# jazz-example-musicplayer
## 0.0.138
### Patch Changes
- jazz-inspector@0.14.19
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.137
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "jazz-example-music-player",
"private": true,
"version": "0.0.137",
"version": "0.0.138",
"type": "module",
"scripts": {
"dev": "vite",
@@ -37,11 +37,11 @@
"@playwright/test": "^1.50.1",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react-swc": "^3.3.2",
"@vitejs/plugin-react-swc": "^3.10.1",
"autoprefixer": "^10.4.20",
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -14,6 +14,7 @@ import { apiKey } from "@/apiKey.ts";
import { SidebarProvider } from "@/components/ui/sidebar";
import { JazzProvider } from "jazz-react";
import { onAnonymousAccountDiscarded } from "./4_actions";
import { KeyboardListener } from "./components/PlayerControls";
import { useUploadExampleData } from "./lib/useUploadExampleData";
/**
@@ -50,7 +51,7 @@ function Main() {
return (
<>
<RouterProvider router={router} />
{/* <PlayerControls mediaPlayer={mediaPlayer} /> */}
<KeyboardListener mediaPlayer={mediaPlayer} />
<Toaster />
</>
);

View File

@@ -67,7 +67,7 @@ export function HomePage({ mediaPlayer }: { mediaPlayer: MediaPlayer }) {
<SidebarInset className="flex flex-col h-screen text-gray-800 bg-blue-50">
<div className="flex flex-1 overflow-hidden">
<SidePanel mediaPlayer={mediaPlayer} />
<main className="flex-1 p-6 overflow-y-auto">
<main className="flex-1 p-6 overflow-y-auto overflow-x-hidden">
<SidebarTrigger />
<div className="flex items-center justify-between mb-6">
{isRootPlaylist ? (
@@ -90,7 +90,7 @@ export function HomePage({ mediaPlayer }: { mediaPlayer: MediaPlayer }) {
)}
</div>
</div>
<ul className="flex flex-col">
<ul className="flex flex-col max-w-full">
{playlist?.tracks?.map(
(track) =>
track && (

View File

@@ -62,9 +62,7 @@ export function MusicTrackRow({
return (
<li
className={
"flex gap-1 hover:bg-slate-200 group py-2 px-2 cursor-pointer"
}
className={"flex gap-1 hover:bg-slate-200 group py-2 px-2 cursor-pointer"}
onClick={handleTrackClick}
>
<button

View File

@@ -31,7 +31,7 @@ export function MusicTrackTitleInput({
return (
<div
className="relative flex-grow"
className="relative flex-grow max-w-64"
onClick={(evt) => evt.stopPropagation()}
>
<input

View File

@@ -15,13 +15,6 @@ export function PlayerControls({ mediaPlayer }: { mediaPlayer: MediaPlayer }) {
resolve: { root: { activePlaylist: true } },
}).me?.root.activePlaylist;
useMediaEndListener(mediaPlayer.playNextTrack);
useKeyboardListener("Space", () => {
if (document.activeElement !== document.body) return;
playState.toggle();
});
const activeTrack = useCoState(MusicTrack, mediaPlayer.activeTrackId, {
resolve: { waveform: true },
});
@@ -73,3 +66,18 @@ export function PlayerControls({ mediaPlayer }: { mediaPlayer: MediaPlayer }) {
</footer>
);
}
export function KeyboardListener({
mediaPlayer,
}: { mediaPlayer: MediaPlayer }) {
const playState = usePlayState();
useMediaEndListener(mediaPlayer.playNextTrack);
useKeyboardListener("Space", () => {
if (document.activeElement !== document.body) return;
playState.toggle();
});
return null;
}

View File

@@ -1,5 +1,12 @@
# organization
## 0.0.109
### Patch Changes
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.108
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "organization",
"private": true,
"version": "0.0.108",
"version": "0.0.109",
"type": "module",
"scripts": {
"dev": "vite",
@@ -27,12 +27,12 @@
"@tailwindcss/forms": "^0.5.9",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"autoprefixer": "^10.4.20",
"globals": "^15.11.0",
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,12 @@
# passkey-svelte
## 0.0.103
### Patch Changes
- jazz-svelte@0.14.19
- jazz-tools@0.14.19
## 0.0.102
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "passkey-svelte",
"version": "0.0.102",
"version": "0.0.103",
"type": "module",
"private": true,
"scripts": {
@@ -29,7 +29,7 @@
"svelte-check": "^4.0.0",
"typescript": "5.6.2",
"typescript-eslint": "^8.0.0",
"vite": "6.0.11"
"vite": "6.3.5"
},
"dependencies": {
"jazz-svelte": "workspace:*",

View File

@@ -1,5 +1,12 @@
# minimal-auth-passkey
## 0.0.114
### Patch Changes
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.113
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "passkey",
"private": true,
"version": "0.0.113",
"version": "0.0.114",
"type": "module",
"scripts": {
"dev": "vite",
@@ -20,9 +20,9 @@
"@biomejs/biome": "1.9.4",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"globals": "^15.11.0",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,12 @@
# passphrase
## 0.0.111
### Patch Changes
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.110
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "passphrase",
"private": true,
"version": "0.0.110",
"version": "0.0.111",
"type": "module",
"scripts": {
"dev": "vite",
@@ -20,9 +20,9 @@
"@biomejs/biome": "1.9.4",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"globals": "^15.11.0",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,12 @@
# jazz-password-manager
## 0.0.135
### Patch Changes
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.134
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "jazz-password-manager",
"private": true,
"version": "0.0.134",
"version": "0.0.135",
"type": "module",
"scripts": {
"dev": "vite",
@@ -22,12 +22,12 @@
"devDependencies": {
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react-swc": "^3.3.2",
"@vitejs/plugin-react": "^4.5.1",
"@vitejs/plugin-react-swc": "^3.10.1",
"autoprefixer": "^10.4.20",
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,12 @@
# jazz-example-pets
## 0.0.233
### Patch Changes
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.232
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "jazz-example-pets",
"private": true,
"version": "0.0.232",
"version": "0.0.233",
"type": "module",
"scripts": {
"dev": "vite",
@@ -37,14 +37,14 @@
"@types/qrcode": "^1.5.1",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react-swc": "^3.3.2",
"@vitejs/plugin-react-swc": "^3.10.1",
"autoprefixer": "^10.4.20",
"is-ci": "^3.0.1",
"jazz-run": "workspace:*",
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11",
"vite": "6.3.5",
"vite-plugin-top-level-await": "^1.4.4"
}
}

View File

@@ -1,5 +1,12 @@
# reactions
## 0.0.113
### Patch Changes
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.112
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "reactions",
"private": true,
"version": "0.0.112",
"version": "0.0.113",
"type": "module",
"scripts": {
"dev": "vite",
@@ -21,9 +21,9 @@
"@biomejs/biome": "1.9.4",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"globals": "^15.11.0",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,13 @@
# richtext-tiptap
## 0.1.26
### Patch Changes
- jazz-react@0.14.19
- jazz-richtext-tiptap@0.14.19
- jazz-tools@0.14.19
## 0.1.25
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "richtext-tiptap",
"private": true,
"version": "0.1.25",
"version": "0.1.26",
"type": "module",
"scripts": {
"dev": "vite",
@@ -33,13 +33,13 @@
"@playwright/test": "^1.50.1",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"autoprefixer": "^10.4.20",
"globals": "^15.11.0",
"is-ci": "^3.0.1",
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,13 @@
# richtext
## 0.0.103
### Patch Changes
- jazz-react@0.14.19
- jazz-richtext-prosemirror@0.14.19
- jazz-tools@0.14.19
## 0.0.102
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "richtext",
"private": true,
"version": "0.0.102",
"version": "0.0.103",
"type": "module",
"scripts": {
"dev": "vite",
@@ -30,13 +30,13 @@
"@playwright/test": "^1.50.1",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"autoprefixer": "^10.4.20",
"globals": "^15.11.0",
"is-ci": "^3.0.1",
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,13 @@
# todo-vue
## 0.0.115
### Patch Changes
- jazz-browser@0.14.19
- jazz-tools@0.14.19
- jazz-vue@0.14.19
## 0.0.114
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "todo-vue",
"version": "0.0.114",
"version": "0.0.115",
"private": true,
"type": "module",
"scripts": {
@@ -32,7 +32,7 @@
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11",
"vite": "6.3.5",
"vite-plugin-vue-devtools": "^7.4.6",
"vue-tsc": "^2.1.6"
}

View File

@@ -1,5 +1,12 @@
# jazz-example-todo
## 0.0.232
### Patch Changes
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.231
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "jazz-example-todo",
"private": true,
"version": "0.0.231",
"version": "0.0.232",
"type": "module",
"scripts": {
"dev": "vite",
@@ -33,11 +33,11 @@
"@types/qrcode": "^1.5.1",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react-swc": "^3.3.2",
"@vitejs/plugin-react-swc": "^3.10.1",
"autoprefixer": "^10.4.20",
"postcss": "^8.4.27",
"tailwindcss": "^3.4.17",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -1,5 +1,13 @@
# version-history
## 0.0.111
### Patch Changes
- jazz-inspector@0.14.19
- jazz-react@0.14.19
- jazz-tools@0.14.19
## 0.0.110
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "version-history",
"private": true,
"version": "0.0.110",
"version": "0.0.111",
"type": "module",
"scripts": {
"dev": "vite",
@@ -23,9 +23,9 @@
"@biomejs/biome": "1.9.4",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitejs/plugin-react": "^4.5.1",
"globals": "^15.11.0",
"typescript": "5.6.2",
"vite": "6.0.11"
"vite": "6.3.5"
}
}

View File

@@ -27,6 +27,7 @@ function App() {
),
estimate: 5,
status: "backlog",
createdAt: new Date(),
},
group,
);

View File

@@ -74,6 +74,8 @@ export function IssueVersionHistory({ id }: { id: string }) {
].sort((a, b) => (a.madeAt < b.madeAt ? -1 : a.madeAt > b.madeAt ? 1 : 0));
}, [issue?._edits]);
if (!issue) return;
return (
<>
<div className="flex flex-col text-sm gap-2">
@@ -98,6 +100,12 @@ export function IssueVersionHistory({ id }: { id: string }) {
<hr />
<DescriptionVersionHistory id={id} />
<hr />
<div>
<p>This issue was created at {issue.createdAt.toLocaleString()}</p>
</div>
</>
);
}

View File

@@ -22,6 +22,7 @@ export function ProjectComponent({ projectID }: { projectID: string }) {
description: CoPlainText.create("", project._owner),
estimate: 0,
status: "backlog",
createdAt: new Date(),
},
project._owner,
),

View File

@@ -10,6 +10,7 @@ export const Issue = co.map({
description: co.plainText(),
estimate: z.number(),
status: z.literal(["backlog", "in progress", "done"]),
createdAt: z.date(),
});
export const Project = co.map({

View File

@@ -34,5 +34,4 @@ yarn-error.log*
*.tsbuildinfo
next-env.d.ts
typedoc
codeSamples

View File

@@ -44,7 +44,6 @@
"autoprefixer": "^10",
"postcss": "^8",
"tailwindcss": "^3",
"typedoc": "^0.25.13",
"typescript": "^5.3.3"
}
}

View File

@@ -34,7 +34,6 @@ yarn-error.log*
*.tsbuildinfo
next-env.d.ts
typedoc
codeSamples
# Turborepo
.turbo

View File

@@ -1,29 +0,0 @@
import { PackageDocs } from "@/components/docs/packageDocs";
import { packages } from "@/content/packages";
import { notFound } from "next/navigation";
interface Props {
params: Promise<{ package: string }>;
}
export default async function Page({ params }: Props) {
const packageName = (await params).package;
if (!packages.map((p) => p.name).includes(packageName)) {
return notFound();
}
return <PackageDocs package={packageName} />;
}
export async function generateMetadata({ params }: Props) {
const packageName = (await params).package;
return {
title: `${packageName} - jazz`,
description: `API reference for ${packageName}.`,
};
}
export async function generateStaticParams() {
// TODO: ideally we check which files exist in ../../typedoc
return packages.map((pkg) => ({ package: pkg.name }));
}

View File

@@ -1,37 +0,0 @@
import { SideNavLayout } from "@/components/SideNavLayout";
import { ApiNav } from "@/components/docs/ApiNav";
import { JazzMobileNav } from "@/components/nav";
import { Prose } from "@garden-co/design-system/src/components/molecules/Prose";
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<SideNavLayout
sideNav={<ApiNav />}
floatingNavSections={[
{
name: "API Ref",
content: <ApiNav />,
icon: "package",
},
]}
>
<Prose className="overflow-x-hidden lg:flex-1 pb-10 pt-[calc(61px+2.5rem)] md:pt-10">
{children}
</Prose>
<JazzMobileNav
sections={[
{
name: "API Ref",
content: <ApiNav />,
icon: "package",
},
]}
/>
</SideNavLayout>
);
}

View File

@@ -1,107 +0,0 @@
import { packages } from "@/content/packages";
import { Icon } from "@garden-co/design-system/src/components/atoms/Icon";
import { clsx } from "clsx";
import type { Metadata } from "next";
import Link from "next/link";
export const metadata: Metadata = {
title: "API reference",
openGraph: {
title: "API reference",
},
};
const CardHeading = ({
children,
className,
}: {
children: React.ReactNode;
className?: string;
}) => {
return (
<h2
className={clsx(
className,
"font-medium text-stone-950 dark:text-white text-lg transition-colors",
)}
>
{children}
</h2>
);
};
const CardBody = ({
children,
className,
}: {
children: React.ReactNode;
className?: string;
}) => {
return <p className={clsx(className, "text-sm")}>{children}</p>;
};
const Card = ({
children,
className,
}: {
children: React.ReactNode;
className?: string;
}) => {
return (
<div
className={clsx(
className,
"not-prose p-4 h-full rounded-xl flex flex-col gap-1.5 group lg:p-5",
)}
>
{children}
</div>
);
};
export default function Page() {
return (
<>
<h1>API Reference</h1>
<div className="grid sm:grid-cols-2 lg:grid-cols-3 gap-4">
{packages.map(({ name, description }) => (
<Link
className="not-prose block"
href={`/api-reference/${name}`}
key={name}
>
<Card className="border shadow-sm">
<Icon name="package" className="text-stone-500" />
<CardHeading className="group-hover:text-primary dark:group-hover:text-blue-600">
{name}
</CardHeading>
<CardBody>{description}</CardBody>
</Card>
</Link>
))}
<Card className="bg-stone-50 dark:bg-stone-925">
<Icon name="help" size="md" className="text-stone-500 " />
<CardHeading>
Can&apos;t find what you&apos;re looking for?
</CardHeading>
<CardBody>
Get help from our{" "}
<Link href="https://discord.gg/utDMjHYg42" className="underline">
Discord
</Link>
, or open an issue on{" "}
<Link
href="https://github.com/garden-co/jazz"
className="underline"
>
GitHub
</Link>
.
</CardBody>
</Card>
</div>
</>
);
}

View File

@@ -1,78 +0,0 @@
import { SideNav, SideNavBody, SideNavHeader } from "@/components/SideNav";
import { SideNavItem } from "@/components/SideNavItem";
import { packages } from "@/content/packages";
import { Icon } from "@garden-co/design-system/src/components/atoms/Icon";
import Link from "next/link";
import { requestProject } from "./requestProject";
export function ApiNav({ className }: { className?: string }) {
return (
<SideNav className={className}>
<SideNavBody>
<SideNavHeader className="mb-5" href="/api-reference">
API Reference
</SideNavHeader>
<ul className="space-y-5">
{packages.map(({ name }) => (
<li key={name}>
<PackageNavItem package={name} />
</li>
))}
</ul>
</SideNavBody>
</SideNav>
);
}
export async function PackageNavItem({
package: packageName,
}: {
package: string;
}) {
let project = await requestProject(packageName as any);
return (
<>
<SideNavItem
className="mb-1 flex gap-2 items-center"
href={`/api-reference/${packageName}`}
>
<Icon name="package" size="xs" />
{packageName}
</SideNavItem>
{project.categories?.map((category) => {
return (
<details
key={category.title}
open={category.title !== "Other"}
className="group ml-1.5 border-l"
>
<summary className="pl-[13px] py-1 cursor-pointer flex gap-2 items-center justify-between hover:text-stone-800 dark:hover:text-stone-200 [&::-webkit-details-marker]:hidden">
{category.title}
<Icon
name="chevronRight"
size="sm"
className="text-stone-300 group-open:rotate-90 transition-transform dark:text-stone-800"
/>
</summary>
<div className="pl-6">
{category.children.map(
(child, i, children) =>
(i == 0 || child.name !== children[i - 1]!.name) && (
<Link
key={child.id}
className="block py-0.5 text-ellipsis overflow-hidden font-mono hover:text-stone-800 dark:hover:text-stone-200"
href={`/api-reference/${packageName}#${child.name}`}
>
{child.name}
</Link>
),
)}
</div>
</details>
);
})}
</>
);
}

View File

@@ -1,425 +0,0 @@
import { Icon } from "@garden-co/design-system/src/components/atoms/Icon";
import { Fragment } from "react";
import {
CommentDisplayPart,
DeclarationReflection,
ReflectionKind,
SignatureReflection,
SomeType,
TypeContext,
TypeParameterReflection,
} from "typedoc";
import { requestProject } from "./requestProject";
import {
ClassOrInterface,
DocComment,
FnDecl,
Highlight,
PropCategory,
PropDecl,
} from "./tags";
export async function PackageDocs({
package: packageName,
}: {
package: string;
}) {
let project = await requestProject(packageName as any);
// console.dir(project, {depth: 10});
return (
<>
<h2 className="flex items-center gap-2">
<code>{packageName}</code> <Icon name="package" size="md" />
</h2>
{project.categories?.map((category) => {
return (
<section key={category.title}>
<h2>{category.title}</h2>
{category.children.map(
(child) =>
// Ability to link external documents has been added. Turning it off for now
// https://typedoc.org/documents/External_Documents.html
child.variant !== "document" && (
<RenderPackageChild
child={child}
key={child.id}
inPackage={packageName}
/>
),
)}
</section>
);
})}
</>
);
}
function RenderPackageChild({
child,
inPackage,
}: {
child: DeclarationReflection;
inPackage: string;
}) {
if (
child.kind === ReflectionKind.Class ||
child.kind === ReflectionKind.Interface
) {
return (
<RenderClassOrInterface classOrInterface={child} inPackage={inPackage} />
);
} else if (child.kind === ReflectionKind.TypeAlias) {
return <RenderTypeAlias inPackage={inPackage} child={child} />;
} else if (child.kind === ReflectionKind.Function) {
return child.getAllSignatures().map((signature, i) => {
const paramTypes = printParamsWithTypes(signature);
return (
<div
key={i}
id={child.name}
className="not-prose mt-4 p-3 rounded bg-stone-50 dark:bg-stone-925"
>
{
<Highlight hide={[0, 2]}>
{`function \n${printSimpleSignature(child, signature) + ":"}\n {}`}
</Highlight>
}{" "}
<span className="opacity-75 text-xs pl-1">
<Highlight>{printType(signature.type)}</Highlight>
</span>
<div className="ml-4 mt-0 text-xs opacity-75 flex">
{paramTypes.length > 0 && (
<div>
<Highlight
hide={[0, 1 + paramTypes.length]}
>{`function fn(...args: [\n${paramTypes.join(
",\n",
)}\n]) {}`}</Highlight>
</div>
)}
</div>
</div>
);
});
} else {
return (
<h3 id={child.name}>
{child.name} {child.type?.type}
</h3>
);
}
}
function RenderTypeAlias({
inPackage,
child,
}: {
inPackage: string;
child: DeclarationReflection;
}) {
const typeParameters = child.typeParameters?.map(
(tParam) =>
tParam.name + (tParam.type ? ` extends ${printType(tParam.type)}` : ""),
);
return (
<div className="mt-4">
<h3 className="not-prose" id={child.name}>
<Highlight>{`type ${child.name}`}</Highlight>
</h3>
<p className="not-prose text-sm ml-4">
<Highlight>{`type ${child.name}${typeParameters?.length && `<${typeParameters?.join(", ")}>`} = ${printType(
child.type,
)}`}</Highlight>
</p>
<div className="ml-4 mt-2 flex-[3]">
<DocComment>
{child.comment
? renderSummary(child.comment.summary)
: "⚠️ undocumented"}
</DocComment>
</div>
</div>
);
}
function RenderClassOrInterface({
inPackage,
classOrInterface: classOrInterface,
}: {
inPackage: string;
classOrInterface: DeclarationReflection;
}) {
const commentSummary = classOrInterface.comment?.summary;
const typeParamsWithConstraints = printTypeParamsWithConstraints(
classOrInterface.typeParameters,
);
return (
<ClassOrInterface
inPackage={inPackage}
name={classOrInterface.name}
doc={renderSummary(commentSummary)}
isInterface={classOrInterface.kind === ReflectionKind.Interface}
typeParameters={
classOrInterface.typeParameters?.length
? "<" +
classOrInterface.typeParameters
.map((tParam) => tParam.name)
.join(", ") +
">"
: ""
}
>
{typeParamsWithConstraints.length > 0 && (
<div className="text-sm -mt-4">
<Highlight
hide={[0, 1 + typeParamsWithConstraints.length]}
>{`class Thing<\n${typeParamsWithConstraints.join(
",\n",
)}\n]> {}`}</Highlight>
</div>
)}
{classOrInterface.categories?.map((category) => (
<div className="flex flex-col mt-6 first:mt-0" key={category.title}>
<PropCategory
name={category.title}
description={renderSummary(
category.description?.filter(
(p) => p.kind !== "code" || !p.text.startsWith("```"),
),
)}
example={renderSummary(
category.description?.filter(
(p) => p.kind === "code" && p.text.startsWith("```"),
),
)}
/>
{category.children.map(
(prop) =>
prop.variant !== "document" && (
<RenderProp
prop={prop}
klass={classOrInterface}
key={prop.id}
/>
),
)}
</div>
))}
</ClassOrInterface>
);
}
function renderSummary(commentSummary: CommentDisplayPart[] | undefined) {
return commentSummary?.map((part, idx) =>
part.kind === "text" ? (
<span key={idx}>
{part.text.split("\n").map((line, i, lines) => (
<Fragment key={i}>
{line}
{i !== lines.length - 1 && <br />}
</Fragment>
))}
</span>
) : part.kind === "inline-tag" ? (
<code key={idx}>
{part.tag} {part.text}
</code>
) : part.text.startsWith("```") ? (
<pre key={idx} className="text-xs sm:text-sm">
<Highlight>{part.text.split("\n").slice(1, -1).join("\n")}</Highlight>
</pre>
) : (
<Highlight className="whitespace-nowrap" key={idx}>
{part.text.slice(1, -1)}
</Highlight>
),
);
}
function RenderProp({
prop,
klass,
}: {
prop: DeclarationReflection;
klass: DeclarationReflection;
}) {
const propOrGetSig = prop.getSignature ? prop.getSignature : prop;
return prop.kind & ReflectionKind.FunctionOrMethod ? (
prop
.getAllSignatures()
.map((signature) => (
<FnDecl
key={signature.id}
signature={printSimplePropSignature(prop, klass, signature)}
typeParams={printTypeParamsWithConstraints(signature.typeParameters)}
paramTypes={printParamsWithTypes(signature)}
returnType={printType(signature.type)}
doc={renderSummary(signature.comment?.summary)}
example={renderSummary(
signature.comment?.getTag("@example")?.content,
)}
/>
))
) : (
<PropDecl
name={
(prop.flags.isStatic ? klass.name : "") +
(prop.name.startsWith("[") ? "" : ".") +
prop.name
}
type={printType(propOrGetSig.type)}
doc={propOrGetSig.comment && renderSummary(propOrGetSig.comment.summary)}
example={renderSummary(propOrGetSig.comment?.getTag("@example")?.content)}
/>
);
}
function printSimplePropSignature(
prop: DeclarationReflection,
klass: DeclarationReflection,
signature: SignatureReflection,
): string {
return (
`${prop.flags.isStatic ? klass.name : ""}.` +
printSimpleSignature(prop, signature)
);
}
function printSimpleSignature(
item: DeclarationReflection,
signature: SignatureReflection,
) {
return `${item.name}${
signature.typeParameters?.length
? "<" +
signature.typeParameters.map((tParam) => tParam.name).join(", ") +
">"
: ""
}(${printParams(signature)?.join(", ")})`;
}
function printParams(signature: SignatureReflection) {
return (
signature.parameters?.flatMap((param) =>
param.name === "this"
? []
: [
param.name === "__namedParameters" &&
param.type?.type === "reflection"
? "{ " +
param.type.declaration.children
?.map(
(child) => child.name + (child.flags.isOptional ? "?" : ""),
)
.join(", ") +
" }"
: param.name + (param.defaultValue ? "?" : ""),
],
) || []
);
}
function printParamsWithTypes(signature: SignatureReflection) {
return (
signature.parameters?.map(
(param) =>
(param.name === "__namedParameters"
? ""
: param.name + (param.defaultValue ? "?" : "") + ": ") +
printType(param.type),
) || []
);
}
function printTypeParamsWithConstraints(
typeParams: TypeParameterReflection[] | undefined,
): string[] {
return (
typeParams?.flatMap((tParam) =>
tParam.type ? [`${tParam.name} extends ${printType(tParam.type)}`] : [],
) || []
);
}
function printType(type: SomeType | undefined): string {
if (!type) return "NO TYPE";
if (type.type === "reflection") {
if (type.declaration.kind === ReflectionKind.TypeLiteral) {
if (type.declaration.signatures?.length) {
return (
type.declaration.signatures
?.map(
(sig) =>
`(${printParamsWithTypes(sig).join(
", ",
)}) => ${printType(sig.type)}`,
)
.join(" | ") || ""
);
} else {
return (
"{ " +
type.declaration.children
?.map((child) => `${child.name}: ${printType(child.type)}`)
.join(", ") +
" }"
);
}
}
return "TODO reflection type " + type.declaration.kind;
} else if (type.type === "reference") {
return (
type.name +
(type.typeArguments?.length
? "<" + type.typeArguments.map(printType).join(", ") + ">"
: "")
);
} else if (type.type === "intersection") {
return (
type.types
?.map((part) =>
part.needsParenthesis(TypeContext["intersectionElement"])
? `(${printType(part)})`
: printType(part),
)
.join(" & ") || "NO TYPES"
);
} else if (type.type === "union") {
return (
type.types
.sort((a, b) => (a.type === "intrinsic" ? 1 : -1))
?.map((part) =>
part.needsParenthesis(TypeContext["unionElement"])
? `(${printType(part)})`
: printType(part),
)
.join(" | ") || "NO TYPES"
);
} else if (type.type === "tuple") {
return `[${type.elements.map(printType).join(", ")}]`;
} else if (type.type === "array") {
if (type.needsParenthesis()) {
return `(${printType(type.elementType)})[]`;
} else {
return printType(type.elementType) + "[]";
}
} else if (type.type === "mapped") {
return `{[${type.parameter} in ${printType(
type.parameterType,
)}]: ${printType(type.templateType)}}`;
} else if (type.type === "indexedAccess") {
return `${printType(type.objectType)}[${printType(type.indexType)}]`;
} else if (type.type === "intrinsic") {
return type.name;
} else if (type.type === "predicate") {
return `${type.name} is ${printType(type.targetType)}`;
} else if (type.type === "query") {
return printType(type.queryType);
} else if (type.type === "literal") {
return JSON.stringify(type.value);
} else {
return "TODO type " + type.type;
}
}

View File

@@ -1,31 +0,0 @@
import {
Deserializer,
FileRegistry,
JSONOutput,
ProjectReflection,
} from "typedoc";
import JazzBrowserMediaImagesDocs from "../../typedoc/jazz-browser-media-images.json";
import JazzBrowserDocs from "../../typedoc/jazz-browser.json";
import JazzNodejsDocs from "../../typedoc/jazz-nodejs.json";
import JazzReactDocs from "../../typedoc/jazz-react.json";
import JazzToolsDocs from "../../typedoc/jazz-tools.json";
const docs = {
"jazz-tools": JazzToolsDocs as unknown as JSONOutput.ProjectReflection,
"jazz-react": JazzReactDocs as unknown as JSONOutput.ProjectReflection,
"jazz-browser": JazzBrowserDocs as unknown as JSONOutput.ProjectReflection,
"jazz-browser-media-images":
JazzBrowserMediaImagesDocs as unknown as JSONOutput.ProjectReflection,
"jazz-nodejs": JazzNodejsDocs as unknown as JSONOutput.ProjectReflection,
};
export async function requestProject(
packageName: keyof typeof docs,
): Promise<ProjectReflection> {
const deserializer = new Deserializer({} as any);
return deserializer.reviveProject(packageName, docs[packageName], {
projectRoot: "/",
registry: new FileRegistry(),
});
}

View File

@@ -13,7 +13,7 @@ export function ExpoLogo(props: SVGProps<SVGSVGElement>) {
>
<path
d="M11.39 8.269c.19-.277.397-.312.565-.312.168 0 .447.035.637.312 1.49 2.03 3.95 6.075 5.765 9.06 1.184 1.945 2.093 3.44 2.28 3.63.7.714 1.66.269 2.218-.541.549-.797.701-1.357.701-1.954 0-.407-7.958-15.087-8.759-16.309C14.027.98 13.775.683 12.457.683h-.988c-1.315 0-1.505.297-2.276 1.472C8.392 3.377.433 18.057.433 18.463c0 .598.153 1.158.703 1.955.558.81 1.518 1.255 2.218.54.186-.19 1.095-1.684 2.279-3.63 1.815-2.984 4.267-7.029 5.758-9.06z"
fill="#000"
className="fill-black dark:fill-white"
/>
</svg>
);

View File

@@ -0,0 +1,246 @@
import { CodeGroup } from "@/components/forMdx";
export const metadata = { title: "History Patterns" };
# History Patterns
Jazz's automatic history tracking enables powerful patterns for building collaborative features. Here's how to implement common history-based functionality.
## Audit Logs
Build a complete audit trail showing all changes to your data:
<CodeGroup>
```ts twoslash
import { co, z } from 'jazz-tools'
import { createJazzTestAccount } from 'jazz-tools/testing'
const me = await createJazzTestAccount();
const Task = co.map({
title: z.string(),
status: z.literal(["todo", "in-progress", "completed"]),
});
type Task = co.loaded<typeof Task>;
const task = Task.create({ title: "New task", status: "todo" }, { owner: me });
// ---cut---
function getAuditLog(task: Task) {
const changes = [];
// Collect edits for all fields
const fields = Object.keys(task);
for (const field of fields) {
const editField = field as keyof typeof task._edits;
if (!task._edits[editField]) continue;
for (const edit of task._edits[editField].all) {
changes.push({
field,
value: edit.value,
by: edit.by,
at: edit.madeAt,
});
}
}
// Sort by timestamp (newest first)
return changes.sort((a, b) => b.at.getTime() - a.at.getTime());
}
// Use it to show change history
const auditLog = getAuditLog(task);
auditLog.forEach((entry) => {
const when = entry.at.toLocaleString();
const who = entry.by?.profile?.name;
const what = entry.field;
const value = entry.value;
console.log(`${when} - ${who} changed ${what} to "${value}"`);
// 22/05/2025, 12:00:00 - Alice changed title to "New task"
});
```
</CodeGroup>
## Activity Feeds
Show recent activity across your application:
<CodeGroup>
```ts twoslash
import { co, z } from 'jazz-tools'
import { createJazzTestAccount } from 'jazz-tools/testing'
const me = await createJazzTestAccount();
const Project = co.map({
name: z.string(),
status: z.literal(["todo", "in-progress", "completed"]),
});
type Project = co.loaded<typeof Project>;
const project = Project.create({ name: "New project", status: "todo" }, { owner: me });
const myProjects = [project];
// ---cut---
function getRecentActivity(projects: Project[], since: Date) {
const activity = [];
for (const project of projects) {
// Get all fields that might have edits
const fields = Object.keys(project);
// Check each field for edit history
for (const field of fields) {
const editField = field as keyof typeof project._edits;
// Skip if no edits exist for this field
if (!project._edits[editField]) continue;
for (const edit of project._edits[editField].all) {
// Only include edits made after the 'since' date
if (edit.madeAt > since) {
activity.push({
project: project.name,
field,
value: edit.value,
by: edit.by,
at: edit.madeAt
});
}
}
}
}
return activity.sort((a, b) => b.at.getTime() - a.at.getTime());
}
// Show activity from the last hour
const hourAgo = new Date(Date.now() - 60 * 60 * 1000);
const recentActivity = getRecentActivity(myProjects, hourAgo);
// [{
// project: "New project",
// field: "name",
// value: "New project",
// by: Account,
// at: Date
// }]
```
</CodeGroup>
## Change Indicators
Show when something was last updated:
<CodeGroup>
```ts twoslash
import { co, z } from 'jazz-tools'
import { createJazzTestAccount } from 'jazz-tools/testing'
const me = await createJazzTestAccount();
const Task = co.map({
title: z.string(),
status: z.literal(["todo", "in-progress", "completed"]),
});
type Task = co.loaded<typeof Task>;
const task = Task.create({ title: "New task", status: "todo" }, { owner: me });
// ---cut---
function getLastUpdated(task: Task) {
// Find the most recent edit across all fields
let lastEdit: any = null;
for (const field of Object.keys(task)) {
const editField = field as keyof typeof task._edits;
// Skip if no edits exist for this field
if (!task._edits[editField]) continue;
const fieldEdit = task._edits[editField];
if (fieldEdit && (!lastEdit || fieldEdit.madeAt > lastEdit.madeAt)) {
lastEdit = fieldEdit;
}
}
if (!lastEdit) return null;
return {
updatedBy: lastEdit.by?.profile?.name,
updatedAt: lastEdit.madeAt,
message: `Last updated by ${lastEdit.by?.profile?.name} at ${lastEdit.madeAt.toLocaleString()}`
};
}
const lastUpdated = getLastUpdated(task);
console.log(lastUpdated?.message);
// "Last updated by Alice at 22/05/2025, 12:00:00"
```
</CodeGroup>
## Finding Specific Changes
Query history for specific events:
<CodeGroup>
```ts twoslash
import { co, z } from 'jazz-tools'
import { createJazzTestAccount } from 'jazz-tools/testing'
const me = await createJazzTestAccount();
const Task = co.map({
title: z.string(),
status: z.literal(["todo", "in-progress", "completed"]),
});
type Task = co.loaded<typeof Task>;
const task = Task.create({ title: "New task", status: "todo" }, { owner: me });
task.status = "completed";
task.status = "in-progress";
task.status = "completed";
// ---cut---
// Find when a task was completed
function findCompletionTime(task: Task): Date | null {
if (!task._edits.status) return null;
// find() returns the FIRST completion time
// If status toggles (completed → in-progress → completed),
// this gives you the earliest completion, not the latest
const completionEdit = task._edits.status.all.find(
edit => edit.value === "completed"
);
return completionEdit?.madeAt || null;
}
// To get the LATEST completion time instead reverse the array, then find:
function findLatestCompletionTime(task: Task): Date | null {
if (!task._edits.status) return null;
// Reverse and find (stops at first match)
const latestCompletionEdit = task._edits.status.all
.slice() // Create copy to avoid mutating original
.reverse()
.find(edit => edit.value === "completed");
return latestCompletionEdit?.madeAt || null;
}
console.log(findCompletionTime(task)); // First completion
console.log(findLatestCompletionTime(task)); // Most recent completion
// Find who made a specific change
function findWhoChanged(task: Task, field: string, value: any) {
const edits = task._edits[field as keyof typeof task._edits];
if (!edits) return null;
const matchingEdit = edits.all.find(edit => edit.value === value);
return matchingEdit?.by || null;
}
const account = findWhoChanged(task, "status", "completed");
console.log(account?.profile?.name);
// Alice
```
</CodeGroup>
## Further Reading
- [History](/docs/using-covalues/history) - Complete reference for the history API
- [Subscription & Loading](/docs/using-covalues/subscription-and-loading) - Ensure CoValues are loaded before accessing history

View File

@@ -213,9 +213,9 @@ export const docNavigationItems = [
done: 80,
},
{
name: "History & time travel",
name: "History",
href: "/docs/using-covalues/history",
done: 0,
done: 100,
},
],
},
@@ -296,6 +296,11 @@ export const docNavigationItems = [
href: "/docs/design-patterns/organization",
done: 80,
},
{
name: "History Patterns",
href: "/docs/design-patterns/history-patterns",
done: 100,
},
],
},
{

View File

@@ -1,267 +0,0 @@
import { CodeGroup } from "@/components/forMdx";
# History & time-travel
One of Jazz's most powerful features is that every CoValue automatically tracks its complete edit history. This means you can see who changed what and when, examine the state of your data at any point in time, and build features like audit logs, activity feeds, and undo/redo functionality. This page explores how to access and work with the rich metadata that comes with every CoValue.
## Understanding Edit History
Every CoValue in Jazz maintains a full history of all changes made to it. This edit history is accessible through two main APIs:
`CoValue._edits` provides a structured, field-by-field view of a CoValue's edit history. It organizes edits by property name and makes them easily accessible. For each field:
- `_edits.fieldName` gives you the most recent edit
- `_edits.fieldName.all` provides all historical edits as an array
- `_edits.fieldName.madeAt` gives you the timestamp of the last edit
- Each edit contains the value, who made the change, and when it happened
`CoValue._raw` gives you access to the internal state and lower-level operations on a CoValue. As this is an internal API, it should be used with caution. If you find yourself using `_raw`, consider letting us know so we can consider adding a public API for your use case.
## Working with Edit History Metadata
CoValues track who made each change and when. Every edit has metadata attached to it, including the author, timestamp, value, and transaction ID. This metadata enables you to build powerful audit and history features without having to implement your own tracking system.
<CodeGroup>
```ts
class Task extends CoMap {
title = coField.string;
description = coField.string;
status = coField.literal("todo", "in-progress", "completed");
priority = coField.literal("low", "medium", "high");
subtasks = coField.optional.ref(ListOfTasks);
}
class ListOfTasks extends CoList.Of(coField.ref(Task)) {}
const task = Task.create({
title: "Plant spring vegetables",
description: "Plant peas, carrots, and lettuce in the south garden bed",
status: "todo",
priority: "medium",
});
// Change the status
task.status = "in-progress";
// Get the latest edit for a field
console.log("Latest edit:", task._edits.status);
// { value: "in-progress", by: Account, madeAt: Date, ... }
// Get when a field was last edited (timestamp)
const lastEditTime = task._edits.status.madeAt;
console.log(`Status was last changed at: ${lastEditTime?.toLocaleString()}`);
// Get the full edit history for a field
for (const edit of task._edits.status.all) {
console.log({
author: edit.by, // Account that made the change
timestamp: edit.madeAt, // When the change happened
value: edit.value, // Value of the change
});
}
```
</CodeGroup>
### Common Patterns
With knowledge of the edit history, you can build all sorts of useful features that enhance your application's user experience and administrative capabilities. Here are some common patterns that leverage CoValue metadata.
#### Audit Log
Getting all the changes to a CoValue in order allows you to build an audit log. This is especially useful for tracking important changes in collaborative environments or for compliance purposes:
<CodeGroup>
```ts
function getAuditLog(task: Task) {
const changes = [];
for (const field of Object.keys(task)) {
// Check if the field has edits to avoid accessing non-existent properties
if (task._edits[field as keyof typeof task._edits]) {
for (const edit of task._edits[field as keyof typeof task._edits].all) {
changes.push({
field,
...edit,
timestamp: edit.madeAt,
at: edit.madeAt,
by: edit.by,
});
}
}
}
// Sort by timestamp
return changes.sort((a, b) => b.at.getTime() - a.at.getTime());
}
// Example usage
const auditLog = getAuditLog(task);
auditLog.forEach((entry) => {
console.log(
`${entry.timestamp} - ${entry.field} changed to "${entry.value}" by ${entry.by?.id}`,
);
});
```
</CodeGroup>
#### Activity Feeds
Activity feeds are a great way to see recent changes to a CoValue, helping users understand what's happening in a collaborative workspace. They can show who did what and when, creating transparency in team environments:
<CodeGroup>
```ts
function getRecentActivity(project: Project) {
const activity = [];
const hourAgo = new Date(Date.now() - 3600000);
for (const field of Object.keys(project)) {
// Skip if the field doesn't have edits
if (!project._edits[field as keyof typeof project._edits]) continue;
for (const edit of project._edits[field as keyof typeof project._edits].all) {
if (edit.madeAt > hourAgo) {
activity.push({
field,
value: edit.value,
by: edit.by,
at: edit.madeAt
});
}
}
}
return activity.sort((a, b) => b.at.getTime() - a.at.getTime());
}
// Example usage
const recentActivity = getRecentActivity(gardenProject);
console.log("Recent Garden Activity:");
recentActivity.forEach(activity => {
console.log(`${activity.at.toLocaleString()} - ${activity.field} updated by ${activity.by?.id}`);
});
```
</CodeGroup>
## Edit History & Time Travel
CoValues track their entire history of changes, creating a timeline you can explore. You can see who changed what and when, or even view past states of the data. This capability enables powerful debugging tools and user-facing features like history browsing and restoration of previous versions:
<CodeGroup>
```ts
class Task extends CoMap {
title = coField.string;
description = coField.string;
status = coField.literal("todo", "in-progress", "completed");
priority = coField.literal("low", "medium", "high");
}
// Create a new task
const task = Task.create({
title: "Plant spring vegetables",
description: "Plant peas, carrots, and lettuce in the south garden bed",
status: "todo",
priority: "medium",
});
// Make some changes
task.status = "in-progress";
task.priority = "high";
// See all edits for a field
for (const edit of task._edits.status.all) {
console.log(
`${edit.madeAt.toISOString()}: Status changed to "${edit.value}" by ${edit.by?.id}`,
);
}
// Get the initial value
const initialStatus = task._edits.status.all[0]?.value;
console.log(`Original status: ${initialStatus}`);
// Get a specific edit by index
const previousEdit = task._edits.status.all[1]; // Second edit
console.log(`Previous status: ${previousEdit?.value}`);
// Check who made the most recent change
const latestEdit = task._edits.status;
console.log(`Latest change made by: ${latestEdit?.by?.id}`);
```
</CodeGroup>
## Time Travel
The ability to view a CoValue as it existed at any point in time is one of Jazz's most powerful features. Looking into the past can help you understand how things changed - perfect for audit logs, debugging, or showing user activity. You can reconstruct the exact state of any CoValue at any moment in its history:
<CodeGroup>
```ts
class Project extends CoMap {
name = coField.string;
status = coField.literal("planning", "active", "completed");
lastUpdate = coField.Date;
}
// See when a project was started
function findStatusChange(project: Project, targetStatus: string) {
// Get all the edits for the status field
const statusEdits = project._edits.status.all;
for (const edit of statusEdits) {
if (edit.value === targetStatus) {
console.log({
changeTime: edit.madeAt,
lastUpdate: project.lastUpdate,
changedBy: edit.by,
});
}
}
}
// Example usage
findStatusChange(gardenProject, "active");
```
</CodeGroup>
### Common Use Cases
The time travel capabilities of CoValues enable several practical use cases that would otherwise require complex custom implementations. Here are some examples of how you can use time travel in your applications:
<CodeGroup>
```ts
// Track task progress over time
function getTaskStatusHistory(task: Task, days: number = 7) {
const statusHistory = [];
const dayInMs = 86400000;
// Check every day for the past week
for (let day = 0; day < days; day++) {
const timePoint = new Date(Date.now() - day * dayInMs);
// Using the internal _raw API to get state at a specific point in time
const state = task._raw.atTime(timePoint);
statusHistory.push({
date: timePoint.toLocaleDateString(),
status: state.status,
priority: state.priority
});
}
return statusHistory;
}
// Example usage
const history = getTaskStatusHistory(plantingTask);
history.forEach(entry => {
console.log(`${entry.date}: Status was "${entry.status}" with ${entry.priority} priority`);
});
```
</CodeGroup>
### Best Practices
- Check field existence before accessing edits (`if (task._edits.fieldName)`)
- Access the most recent edit directly with `_edits.fieldName` instead of using any `.latest` property
- Cache historical queries if you're displaying them in UI
- Be specific about time ranges you care about
- Remember that accessing history requires loading the CoValue
- Consider using timestamps from your data rather than scanning all edits
Time travel is great for understanding how you got here, but keep queries focused on the range of time that matters to your use case.

View File

@@ -0,0 +1,202 @@
import { CodeGroup } from "@/components/forMdx";
export const metadata = { title: "History" };
# History
Jazz tracks every change to your data automatically. See who changed what, when they did it, and even look at your data from any point in the past.
See the [version history example](https://github.com/garden-co/jazz/tree/main/examples/version-history) for reference.
Let's use the following schema to see how we can use the edit history.
<CodeGroup>
```ts twoslash
import { co, z } from "jazz-tools";
// ---cut---
const Task = co.map({
title: z.string(),
status: z.literal(["todo", "in-progress", "completed"]),
});
```
</CodeGroup>
## The _edits Property
Every CoValue has an `_edits` property that contains the complete history for each field. Here's
how to get the edit history for `task.status`:
<CodeGroup>
```ts twoslash
import { createJazzTestAccount } from "jazz-tools/testing";
const me = await createJazzTestAccount();
import { co, z } from "jazz-tools";
const Task = co.map({
title: z.string(),
status: z.literal(["todo", "in-progress", "completed"]),
});
const task = Task.create({ title: "New task", status: "todo" }, { owner: me });
// ---cut---
// Access edit history for a field
task._edits.status
// Returns the latest edit
task._edits.status?.all
// Returns array of all edits in chronological order
// Check if edits exist
if (task._edits.status) {
const name = task._edits.status.by?.profile?.name;
console.log(`Last changed by ${name}`);
}
```
</CodeGroup>
## Edit Structure
Each edit contains:
<CodeGroup>
```ts twoslash
import { co, z } from "jazz-tools";
import { createJazzTestAccount } from "jazz-tools/testing";
const me = await createJazzTestAccount();
const Task = co.map({
title: z.string(),
status: z.literal(["todo", "in-progress", "completed"]),
});
const task = Task.create({ title: "New task", status: "todo" }, { owner: me });
task.status = "in-progress";
// ---cut---
const edit = task._edits.status;
// The edit object contains:
edit?.value // The new value: "in-progress"
edit?.by // Account that made the change
edit?.madeAt // Date when the change occurred
```
</CodeGroup>
## Accessing History
### Latest Edit
Get the most recent change to a field:
<CodeGroup>
```ts twoslash
import { co, z } from "jazz-tools";
import { createJazzTestAccount } from "jazz-tools/testing";
const me = await createJazzTestAccount();
const Task = co.map({
title: z.string(),
status: z.literal(["todo", "in-progress", "completed"]),
});
const task = Task.create({ title: "New task", status: "todo" }, { owner: me });
// ---cut---
// Direct access to latest edit
const latest = task._edits.title;
if (latest) {
console.log(`Title is now "${latest.value}"`);
}
```
</CodeGroup>
### All Edits
Get the complete history for a field:
<CodeGroup>
```ts twoslash
import { co, z } from "jazz-tools";
import { createJazzTestAccount } from "jazz-tools/testing";
const me = await createJazzTestAccount();
const Task = co.map({
title: z.string(),
status: z.literal(["todo", "in-progress", "completed"]),
});
const task = Task.create({ title: "New task", status: "todo" }, { owner: me });
task.status = "in-progress";
task.status = "completed";
// ---cut---
// Get all edits (chronologically)
const allStatusEdits = task._edits.status?.all || [];
allStatusEdits.forEach((edit, index) => {
console.log(`Edit ${index}: ${edit.value} at ${edit.madeAt.toISOString()}`);
});
// Edit 0: todo at 2025-05-22T13:00:00.000Z
// Edit 1: in-progress at 2025-05-22T14:00:00.000Z
// Edit 2: completed at 2025-05-22T15:30:00.000Z
```
</CodeGroup>
### Initial Values
The first edit contains the initial value:
<CodeGroup>
```ts twoslash
import { co, z } from "jazz-tools";
import { createJazzTestAccount } from "jazz-tools/testing";
const me = await createJazzTestAccount();
const Task = co.map({
title: z.string(),
status: z.literal(["todo", "in-progress", "completed"]),
});
const task = Task.create({ title: "New task", status: "todo" }, { owner: me });
task.status = "in-progress";
// ---cut---
const allEdits = task._edits.status?.all || [];
const initialValue = allEdits[0]?.value;
console.log(`Started as: ${initialValue}`);
// Started as: todo
```
</CodeGroup>
## Showing creation date
To show when a `Task` was created, store the date manually.
<CodeGroup>
```ts twoslash
import { co, z } from "jazz-tools";
// ---cut---
const Task = co.map({
title: z.string(),
status: z.literal(["todo", "in-progress", "completed"]),
createdAt: z.date(), // [!code ++]
});
```
</CodeGroup>
Alternatively, you can use the first edit's `madeAt` property.
## Requirements
- CoValues must be loaded to access history (see [Subscription & Loading](/docs/using-covalues/subscription-and-loading))
- History is only available for fields defined in your schema
- Edit arrays are ordered chronologically (oldest to newest)
## Common Patterns
For practical implementations using history, see [History Patterns](/docs/design-patterns/history-patterns):
- Building audit logs
- Creating activity feeds
- Implementing undo/redo
- Showing change indicators
- Querying historical data

View File

@@ -11,10 +11,6 @@ export const navigationItems: NavItemProps[] = [
title: "Examples",
href: "/examples",
},
// {
// title: "API ref",
// href: "/api-reference",
// },
{
title: "Built with Jazz",
href: "/showcase",

View File

@@ -2,205 +2,8 @@ import { promises as fs } from "fs";
import path from "path";
import { join } from "path";
import { readFile, readdir } from "fs/promises";
import { Deserializer } from "typedoc";
import { DOC_SECTIONS } from "./utils/config.mjs";
import { loadTypedocFiles, writeDocsFile } from "./utils/index.mjs";
function formatType(type) {
if (!type) return "unknown";
// Handle type aliases and references
if (type.type === "reference") {
const name = type.package ? `${type.package}.${type.name}` : type.name;
return (
name +
(type.typeArguments
? `<${type.typeArguments.map(formatType).join(", ")}>`
: "")
);
}
// Handle union types
if (type.type === "union") {
return type.types.map(formatType).join(" | ");
}
// Handle array types
if (type.type === "array") {
return `${formatType(type.elementType)}[]`;
}
// Handle basic types
if (type.type === "intrinsic" || type.type === "literal") {
return typeof type.value !== "undefined"
? JSON.stringify(type.value)
: type.name;
}
// Handle tuple types
if (type.type === "tuple") {
return `[${type.elements.map(formatType).join(", ")}]`;
}
// Handle intersection types
if (type.type === "intersection") {
return type.types.map(formatType).join(" & ");
}
// Handle template literal types
if (type.type === "template-literal") {
return `\`${type.head}${type.tail.map((t) => `\${${formatType(t[0])}}${t[1]}`).join("")}\``;
}
// Handle reflection types (object types and function types)
if (type.type === "reflection") {
if (type.declaration.signatures) {
const sig = type.declaration.signatures[0];
const params =
sig.parameters
?.map(
(p) =>
`${p.name}${p.flags?.isOptional ? "?" : ""}: ${formatType(p.type)}`,
)
.join(", ") || "";
return `(${params}) => ${formatType(sig.type)}`;
}
if (type.declaration.children) {
return (
"{ " +
type.declaration.children
.map((child) => {
const optional = child.flags?.isOptional ? "?" : "";
return `${child.name}${optional}: ${formatType(child.type)}`;
})
.join("; ") +
" }"
);
}
}
// Handle query types
if (type.type === "query") {
return `typeof ${formatType(type.queryType)}`;
}
// Handle conditional types
if (type.type === "conditional") {
return `${formatType(type.checkType)} extends ${formatType(type.extendsType)} ? ${formatType(type.trueType)} : ${formatType(type.falseType)}`;
}
// Handle index access types
if (type.type === "indexedAccess") {
return `${formatType(type.objectType)}[${formatType(type.indexType)}]`;
}
// Handle mapped types
if (type.type === "mapped") {
const readonly = type.readonlyModifier === "+" ? "readonly " : "";
const optional = type.optionalModifier === "+" ? "?" : "";
return `{ ${readonly}[${type.parameter} in ${formatType(type.parameterType)}]${optional}: ${formatType(type.templateType)} }`;
}
// Handle type operators
if (type.type === "typeOperator") {
return `${type.operator} ${formatType(type.target)}`;
}
// Handle predicate types
if (type.type === "predicate") {
return `${type.name} is ${formatType(type.targetType)}`;
}
// Handle inferred types
if (type.type === "inferred") {
return `infer ${type.name}`;
}
// Handle rest types
if (type.type === "rest") {
return `...${formatType(type.elementType)}`;
}
// Handle unknown types with more detail
if (type.toString) {
return type.toString();
}
return "unknown";
}
function formatComment(comment) {
if (!comment) return "";
let text =
comment.summary
?.map((part) => part.text)
.join("")
.trim() || "";
// Add parameter descriptions if available
if (comment.blockTags) {
const params = comment.blockTags
.filter((tag) => tag.tag === "@param")
.map((tag) => {
const paramName = tag.param;
let description = "";
let codeExample = "";
tag.content.forEach((part) => {
if (part.kind === "code") {
// Don't wrap in code blocks since examples are already wrapped
codeExample += "\n" + part.text + "\n";
} else {
description += part.text;
}
});
return `- ${paramName}: ${description.trim()}${codeExample}`;
});
if (params.length > 0) {
text += "\n\nParameters:\n" + params.join("\n");
}
// Add remarks if available
const remarks = comment.blockTags
.filter((tag) => tag.tag === "@remarks")
.map((tag) =>
tag.content
.map((part) => part.text)
.join("")
.trim(),
);
if (remarks.length > 0) {
text += "\n\nRemarks:\n" + remarks.join("\n");
}
// Add examples
const examples = comment.blockTags
.filter((tag) => tag.tag === "@example")
.map((tag) =>
tag.content
.map((part) => {
if (part.kind === "code") {
// Don't wrap in code blocks since examples are already wrapped
return "\n" + part.text + "\n";
}
return part.text;
})
.join("")
.trim(),
);
if (examples.length > 0) {
text += "\n\nExamples:\n" + examples.join("\n");
}
}
return text;
}
import { writeDocsFile } from "./utils/index.mjs";
async function readMdxContent(url) {
try {
@@ -280,9 +83,8 @@ async function readMdxContent(url) {
}
}
async function generateDetailedDocs(docs) {
async function generateDetailedDocs() {
const output = [];
const deserializer = new Deserializer();
// Project title
output.push("# Jazz\n");
@@ -402,8 +204,7 @@ async function readMusicExample(output) {
// Main execution
async function main() {
console.log("Generating detailed LLM docs...");
const docs = await loadTypedocFiles();
await generateDetailedDocs(docs);
await generateDetailedDocs();
}
main().catch(console.error);

View File

@@ -1,49 +0,0 @@
import { Application } from "typedoc";
import { PACKAGES } from "./utils/config.mjs";
for (const { packageName, entryPoint, tsconfig, typedocOptions } of PACKAGES) {
const app = await Application.bootstrapWithPlugins({
entryPoints: [
`../../packages/${packageName}/src/${entryPoint || "index.ts"}`,
],
tsconfig: `../../packages/${packageName}/${tsconfig || "tsconfig.json"}`,
sort: ["required-first"],
groupOrder: ["Functions", "Classes", "TypeAliases", "Namespaces"],
categoryOrder: [
"CoValues",
"Context & Hooks",
"Context Creation",
"Identity & Permissions",
"Schema definition",
"Abstract interfaces",
"Media",
"Auth Providers",
"Invite Links",
"Declaration",
"Content",
"Creation",
"Subscription & Loading",
"Collaboration",
"Stringifying & Inspection",
"Internals",
"Type Helpers",
"Other",
],
defaultCategory: "Other",
excludeInternal: true,
categorizeByGroup: false,
pretty: false,
preserveWatchOutput: true,
...typedocOptions,
});
if (process.argv.includes("--build")) {
const project = await app.convert();
await app.generateJson(project, "typedoc/" + packageName + ".json");
console.log(packageName + " done.");
} else {
app.convertAndWatch(async (project) => {
await app.generateJson(project, "typedoc/" + packageName + ".json");
console.log(packageName + " done.");
});
}
}

View File

@@ -16,29 +16,3 @@ function transformNavItems() {
}
export const DOC_SECTIONS = transformNavItems();
export const PACKAGES = [
{
packageName: "jazz-tools",
entryPoint: "exports.ts",
description:
"The base implementation for Jazz, a framework for distributed state. Provides a high-level API around the CoJSON protocol.",
},
{
packageName: "jazz-react",
entryPoint: "index.ts",
description: "React bindings for Jazz, a framework for distributed state.",
},
{
packageName: "jazz-browser",
description: "Browser (Vanilla JavaScript) bindings for Jazz",
},
{
packageName: "jazz-browser-media-images",
description: "Image handling utilities for Jazz in the browser",
},
{
packageName: "jazz-nodejs",
description: "NodeJS/Bun server worker bindings for Jazz",
},
];

View File

@@ -1,37 +1,7 @@
import path from "path";
import fs from "fs/promises";
import { PACKAGES } from "./config.mjs";
// Common configuration
export const PACKAGE_DESCRIPTIONS = {
"jazz-tools":
"The base implementation for Jazz, a framework for distributed state. Provides a high-level API around the CoJSON protocol.",
"jazz-react": "React bindings for Jazz, a framework for distributed state.",
"jazz-browser": "Browser (Vanilla JavaScript) bindings for Jazz",
"jazz-browser-media-images":
"Image handling utilities for Jazz in the browser",
"jazz-nodejs": "NodeJS/Bun server worker bindings for Jazz",
};
// Helper functions
export async function loadTypedocFiles() {
const docs = {};
for (const { packageName } of PACKAGES) {
docs[packageName] = JSON.parse(
await fs.readFile(
path.join(process.cwd(), "typedoc", packageName + ".json"),
"utf-8",
),
);
}
return docs;
}
export function getPackageDescription(packageName) {
const pkg = PACKAGES.find((p) => p.packageName === packageName);
return pkg?.description || "";
}
export function cleanDescription(description) {
if (!description) return "";
return (

View File

@@ -5,18 +5,20 @@
"type": "module",
"scripts": {
"dev": "next dev",
"build:generate-docs": "pnpm run generate:docs && pnpm run generate:llm-docs",
"build:generate-docs": "pnpm run generate:llm-docs",
"build": "next build",
"start": "next start",
"format-and-lint": "biome check .",
"format-and-lint:fix": "biome check . --write",
"generate:docs": "node generate-docs/typedocs.mjs --build",
"generate:llm-docs": "node generate-docs/llms-full.mjs",
"test": "pnpm run test:llm-docs",
"test:llm-docs": "node generate-docs/llms-full.test.mjs"
"test:llm-docs": "node generate-docs/llms-full.test.mjs",
"test:e2e": "playwright test"
},
"packageManager": "pnpm@9.14.0",
"dependencies": {
"@better-auth/expo": "^1.2.7",
"@garden-co/design-system": "workspace:*",
"@headlessui/react": "^2.2.0",
"@icons-pack/react-simple-icons": "^9.1.0",
"@mdx-js/loader": "^2.3.0",
@@ -33,15 +35,16 @@
"@vercel/speed-insights": "^1.0.12",
"clsx": "^2.1.1",
"estree-util-value-to-estree": "^3.3.2",
"@garden-co/design-system": "workspace:*",
"github-slugger": "^2.0.0",
"hast-util-heading-rank": "^3.0.0",
"hast-util-to-string": "^3.0.1",
"jazz-auth-betterauth": "link:../../packages/jazz-auth-betterauth",
"jazz-browser": "link:../../packages/jazz-browser",
"jazz-browser-media-images": "link:../../packages/jazz-browser-media-images",
"jazz-expo": "link:../../packages/jazz-expo",
"jazz-nodejs": "link:../../packages/jazz-nodejs",
"jazz-react": "link:../../packages/jazz-react",
"jazz-react-auth-betterauth": "link:../../packages/jazz-react-auth-betterauth",
"jazz-react-auth-clerk": "link:../../packages/jazz-react-auth-clerk",
"jazz-react-native": "link:../../packages/jazz-react-native",
"jazz-richtext-prosemirror": "link:../../packages/jazz-richtext-prosemirror",
@@ -58,13 +61,11 @@
"shiki": "^3.2.1",
"tailwind-merge": "^1.14.0",
"tailwindcss-animate": "^1.0.7",
"unist-util-visit": "^5.0.0",
"jazz-react-auth-betterauth": "link:../../packages/jazz-react-auth-betterauth",
"jazz-auth-betterauth": "link:../../packages/jazz-auth-betterauth",
"@better-auth/expo": "^1.2.7"
"unist-util-visit": "^5.0.0"
},
"devDependencies": {
"@biomejs/biome": "1.9.4",
"@playwright/test": "^1.52.0",
"@types/geojson": "^7946.0.14",
"@types/node": "^20",
"@types/react": "^18",
@@ -72,7 +73,7 @@
"autoprefixer": "^10",
"postcss": "^8",
"tailwindcss": "^3",
"typedoc": "^0.27.0",
"turbo": "^2.3.1",
"typescript": "~5.7.0"
}
}

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 start",
url: "http://localhost:3000/",
reuseExistingServer: !isCI,
},
],
});

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,54 @@
import { expect, test } from "@playwright/test";
test.describe("Top-level pages load", () => {
test("homepage loads", async ({ page }) => {
const response = await page.goto("/");
expect(response?.ok()).toBeTruthy();
});
test("examples page loads", async ({ page }) => {
const response = await page.goto("/examples");
expect(response?.ok()).toBeTruthy();
});
test("showcase page loads", async ({ page }) => {
const response = await page.goto("/showcase");
expect(response?.ok()).toBeTruthy();
});
test("cloud page loads", async ({ page }) => {
const response = await page.goto("/cloud");
expect(response?.ok()).toBeTruthy();
});
test("status page loads", async ({ page }) => {
const response = await page.goto("/status");
expect(response?.ok()).toBeTruthy();
});
});
test.describe("Docs pages load", () => {
test("docs intro loads", async ({ page }) => {
const response = await page.goto("/docs");
expect(response?.ok()).toBeTruthy();
});
[
"react",
"react-native",
"react-native-expo",
"vue",
"svelte",
"vanilla",
].forEach((framework) => {
test(`docs for ${framework} loads`, async ({ page }) => {
const response = await page.goto(`/docs/${framework}`);
expect(response?.ok()).toBeTruthy();
});
});
test("/docs redirects to /docs/react", async ({ page }) => {
await page.goto("/docs");
await expect(page).toHaveURL(/\/docs\/react$/);
});
});

View File

@@ -8,7 +8,7 @@
},
"build:generate-docs": {
"inputs": ["../../../packages/*/src/**"],
"outputs": ["typedoc/**", "public/llms.txt", "public/llms-full.txt"],
"outputs": [ "public/llms.txt", "public/llms-full.txt"],
"dependsOn": ["^build"]
},
"dev": {

274
homepage/pnpm-lock.yaml generated
View File

@@ -37,10 +37,10 @@ importers:
version: 0.436.0(react@18.3.1)
next:
specifier: 14.2.7
version: 14.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 14.2.7(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next-themes:
specifier: ^0.2.1
version: 0.2.1(next@14.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 0.2.1(next@14.2.7(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
postcss:
specifier: ^8
version: 8.5.3
@@ -104,10 +104,10 @@ importers:
version: 2.0.13
'@vercel/analytics':
specifier: ^1.3.1
version: 1.5.0(next@14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
version: 1.5.0(next@14.2.15(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
'@vercel/speed-insights':
specifier: ^1.0.12
version: 1.2.0(next@14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
version: 1.2.0(next@14.2.15(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -128,10 +128,10 @@ importers:
version: 3.0.0
next:
specifier: 14.2.15
version: 14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 14.2.15(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next-themes:
specifier: ^0.2.1
version: 0.2.1(next@14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 0.2.1(next@14.2.15(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react:
specifier: ^18
version: 18.3.1
@@ -175,9 +175,6 @@ importers:
tailwindcss:
specifier: ^3
version: 3.4.17
typedoc:
specifier: ^0.25.13
version: 0.25.13(typescript@5.7.3)
typescript:
specifier: ^5.3.3
version: 5.7.3
@@ -228,10 +225,10 @@ importers:
version: 3.1.5
'@vercel/analytics':
specifier: ^1.3.1
version: 1.5.0(next@15.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
version: 1.5.0(next@15.2.1(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
'@vercel/speed-insights':
specifier: ^1.0.12
version: 1.2.0(next@15.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
version: 1.2.0(next@15.2.1(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -294,10 +291,10 @@ importers:
version: 3.0.0
next:
specifier: 15.2.1
version: 15.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 15.2.1(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next-themes:
specifier: ^0.2.1
version: 0.2.1(next@15.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 0.2.1(next@15.2.1(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
qrcode:
specifier: ^1.5.4
version: 1.5.4
@@ -323,6 +320,9 @@ importers:
'@biomejs/biome':
specifier: 1.9.4
version: 1.9.4
'@playwright/test':
specifier: ^1.52.0
version: 1.52.0
'@types/geojson':
specifier: ^7946.0.14
version: 7946.0.16
@@ -344,9 +344,9 @@ importers:
tailwindcss:
specifier: ^3
version: 3.4.17
typedoc:
specifier: ^0.27.0
version: 0.27.9(typescript@5.7.3)
turbo:
specifier: ^2.3.1
version: 2.5.4
typescript:
specifier: ~5.7.0
version: 5.7.3
@@ -494,9 +494,6 @@ packages:
'@floating-ui/utils@0.2.9':
resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
'@gerrit0/mini-shiki@1.27.2':
resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==}
'@headlessui/react@2.2.2':
resolution: {integrity: sha512-zbniWOYBQ8GHSUIOPY7BbdIn6PzUOq0z41RFrF30HbjsxG6Rrfk+6QulR8Kgf2Vwj2a/rE6i62q5vo+2gI5dJA==}
engines: {node: '>=10'}
@@ -872,6 +869,11 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
'@playwright/test@1.52.0':
resolution: {integrity: sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==}
engines: {node: '>=18'}
hasBin: true
'@radix-ui/primitive@1.1.2':
resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==}
@@ -1134,9 +1136,6 @@ packages:
'@shikijs/engine-javascript@3.4.0':
resolution: {integrity: sha512-1ywDoe+z/TPQKj9Jw0eU61B003J9DqUFRfH+DVSzdwPUFhR7yOmfyLzUrFz0yw8JxFg/NgzXoQyyykXgO21n5Q==}
'@shikijs/engine-oniguruma@1.29.2':
resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==}
'@shikijs/engine-oniguruma@3.4.0':
resolution: {integrity: sha512-zwcWlZ4OQuJ/+1t32ClTtyTU1AiDkK1lhtviRWoq/hFqPjCNyLj22bIg9rB7BfoZKOEOfrsGz7No33BPCf+WlQ==}
@@ -1154,9 +1153,6 @@ packages:
peerDependencies:
typescript: '>=5.5.0'
'@shikijs/types@1.29.2':
resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==}
'@shikijs/types@3.4.0':
resolution: {integrity: sha512-EUT/0lGiE//7j5N/yTMNMT3eCWNcHJLrRKxT0NDXWIfdfSmFJKfPX7nMmRBrQnWboAzIsUziCThrYMMhjbMS1A==}
@@ -1788,9 +1784,6 @@ packages:
arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
asn1js@3.0.6:
resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==}
engines: {node: '>=12.0.0'}
@@ -2122,6 +2115,11 @@ packages:
fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
fsevents@2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -2311,9 +2309,6 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
linkify-it@5.0.0:
resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
loader-runner@4.3.0:
resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
engines: {node: '>=6.11.5'}
@@ -2346,9 +2341,6 @@ packages:
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc
lunr@2.3.9:
resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==}
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
@@ -2360,15 +2352,6 @@ packages:
resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==}
engines: {node: '>=0.10.0'}
markdown-it@14.1.0:
resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
hasBin: true
marked@4.3.0:
resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==}
engines: {node: '>= 12'}
hasBin: true
mdast-util-definitions@5.1.2:
resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
@@ -2426,9 +2409,6 @@ packages:
mdast-util-to-string@4.0.0:
resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
mdurl@2.0.0:
resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@@ -2792,6 +2772,16 @@ packages:
resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
engines: {node: '>= 6'}
playwright-core@1.52.0:
resolution: {integrity: sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==}
engines: {node: '>=18'}
hasBin: true
playwright@1.52.0:
resolution: {integrity: sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==}
engines: {node: '>=18'}
hasBin: true
pngjs@5.0.0:
resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
engines: {node: '>=10.13.0'}
@@ -2865,10 +2855,6 @@ packages:
property-information@7.1.0:
resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
punycode.js@2.3.1:
resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
engines: {node: '>=6'}
pvtsutils@1.3.6:
resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==}
@@ -3206,6 +3192,40 @@ packages:
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
turbo-darwin-64@2.5.4:
resolution: {integrity: sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ==}
cpu: [x64]
os: [darwin]
turbo-darwin-arm64@2.5.4:
resolution: {integrity: sha512-2+Nx6LAyuXw2MdXb7pxqle3MYignLvS7OwtsP9SgtSBaMlnNlxl9BovzqdYAgkUW3AsYiQMJ/wBRb7d+xemM5A==}
cpu: [arm64]
os: [darwin]
turbo-linux-64@2.5.4:
resolution: {integrity: sha512-5May2kjWbc8w4XxswGAl74GZ5eM4Gr6IiroqdLhXeXyfvWEdm2mFYCSWOzz0/z5cAgqyGidF1jt1qzUR8hTmOA==}
cpu: [x64]
os: [linux]
turbo-linux-arm64@2.5.4:
resolution: {integrity: sha512-/2yqFaS3TbfxV3P5yG2JUI79P7OUQKOUvAnx4MV9Bdz6jqHsHwc9WZPpO4QseQm+NvmgY6ICORnoVPODxGUiJg==}
cpu: [arm64]
os: [linux]
turbo-windows-64@2.5.4:
resolution: {integrity: sha512-EQUO4SmaCDhO6zYohxIjJpOKRN3wlfU7jMAj3CgcyTPvQR/UFLEKAYHqJOnJtymbQmiiM/ihX6c6W6Uq0yC7mA==}
cpu: [x64]
os: [win32]
turbo-windows-arm64@2.5.4:
resolution: {integrity: sha512-oQ8RrK1VS8lrxkLriotFq+PiF7iiGgkZtfLKF4DDKsmdbPo0O9R2mQxm7jHLuXraRCuIQDWMIw6dpcr7Iykf4A==}
cpu: [arm64]
os: [win32]
turbo@2.5.4:
resolution: {integrity: sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA==}
hasBin: true
twoslash-protocol@0.3.1:
resolution: {integrity: sha512-BMePTL9OkuNISSyyMclBBhV2s9++DiOCyhhCoV5Kaht6eaWLwVjCCUJHY33eZJPsyKeZYS8Wzz0h+XI01VohVw==}
@@ -3214,20 +3234,6 @@ packages:
peerDependencies:
typescript: ^5.5.0
typedoc@0.25.13:
resolution: {integrity: sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==}
engines: {node: '>= 16'}
hasBin: true
peerDependencies:
typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x
typedoc@0.27.9:
resolution: {integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==}
engines: {node: '>= 18'}
hasBin: true
peerDependencies:
typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x
typescript@5.7.3:
resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
engines: {node: '>=14.17'}
@@ -3238,9 +3244,6 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
uncrypto@0.1.3:
resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
@@ -3519,12 +3522,6 @@ snapshots:
'@floating-ui/utils@0.2.9': {}
'@gerrit0/mini-shiki@1.27.2':
dependencies:
'@shikijs/engine-oniguruma': 1.29.2
'@shikijs/types': 1.29.2
'@shikijs/vscode-textmate': 10.0.2
'@headlessui/react@2.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -3828,6 +3825,10 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
'@playwright/test@1.52.0':
dependencies:
playwright: 1.52.0
'@radix-ui/primitive@1.1.2': {}
'@radix-ui/react-arrow@1.1.6(@types/react-dom@18.3.7(@types/react@18.3.21))(@types/react@18.3.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
@@ -4079,11 +4080,6 @@ snapshots:
'@shikijs/vscode-textmate': 10.0.2
oniguruma-to-es: 4.3.3
'@shikijs/engine-oniguruma@1.29.2':
dependencies:
'@shikijs/types': 1.29.2
'@shikijs/vscode-textmate': 10.0.2
'@shikijs/engine-oniguruma@3.4.0':
dependencies:
'@shikijs/types': 3.4.0
@@ -4111,11 +4107,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@shikijs/types@1.29.2':
dependencies:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
'@shikijs/types@3.4.0':
dependencies:
'@shikijs/vscode-textmate': 10.0.2
@@ -5391,24 +5382,24 @@ snapshots:
'@ungap/structured-clone@1.3.0': {}
'@vercel/analytics@1.5.0(next@14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)':
'@vercel/analytics@1.5.0(next@14.2.15(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)':
optionalDependencies:
next: 14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 14.2.15(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
'@vercel/analytics@1.5.0(next@15.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)':
'@vercel/analytics@1.5.0(next@15.2.1(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)':
optionalDependencies:
next: 15.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 15.2.1(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
'@vercel/speed-insights@1.2.0(next@14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)':
'@vercel/speed-insights@1.2.0(next@14.2.15(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)':
optionalDependencies:
next: 14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 14.2.15(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
'@vercel/speed-insights@1.2.0(next@15.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)':
'@vercel/speed-insights@1.2.0(next@15.2.1(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)':
optionalDependencies:
next: 15.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 15.2.1(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
'@webassemblyjs/ast@1.14.1':
@@ -5534,8 +5525,6 @@ snapshots:
arg@5.0.2: {}
argparse@2.0.1: {}
asn1js@3.0.6:
dependencies:
pvtsutils: 1.3.6
@@ -5867,6 +5856,9 @@ snapshots:
fraction.js@4.3.7: {}
fsevents@2.3.2:
optional: true
fsevents@2.3.3:
optional: true
@@ -6066,10 +6058,6 @@ snapshots:
lines-and-columns@1.2.4: {}
linkify-it@5.0.0:
dependencies:
uc.micro: 2.1.0
loader-runner@4.3.0: {}
locate-path@5.0.0:
@@ -6094,25 +6082,12 @@ snapshots:
dependencies:
react: 18.3.1
lunr@2.3.9: {}
lz-string@1.5.0: {}
marchingsquares@1.3.3: {}
markdown-extensions@1.1.1: {}
markdown-it@14.1.0:
dependencies:
argparse: 2.0.1
entities: 4.5.0
linkify-it: 5.0.0
mdurl: 2.0.0
punycode.js: 2.3.1
uc.micro: 2.1.0
marked@4.3.0: {}
mdast-util-definitions@5.1.2:
dependencies:
'@types/mdast': 3.0.15
@@ -6313,8 +6288,6 @@ snapshots:
dependencies:
'@types/mdast': 4.0.4
mdurl@2.0.0: {}
merge-stream@2.0.0: {}
merge2@1.4.1: {}
@@ -6764,25 +6737,25 @@ snapshots:
neo-async@2.6.2: {}
next-themes@0.2.1(next@14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
next-themes@0.2.1(next@14.2.15(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
next: 14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 14.2.15(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
next-themes@0.2.1(next@14.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
next-themes@0.2.1(next@14.2.7(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
next: 14.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 14.2.7(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
next-themes@0.2.1(next@15.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
next-themes@0.2.1(next@15.2.1(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
next: 15.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next: 15.2.1(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
next@14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
next@14.2.15(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@next/env': 14.2.15
'@swc/helpers': 0.5.5
@@ -6803,11 +6776,12 @@ snapshots:
'@next/swc-win32-arm64-msvc': 14.2.15
'@next/swc-win32-ia32-msvc': 14.2.15
'@next/swc-win32-x64-msvc': 14.2.15
'@playwright/test': 1.52.0
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
next@14.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
next@14.2.7(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@next/env': 14.2.7
'@swc/helpers': 0.5.5
@@ -6828,11 +6802,12 @@ snapshots:
'@next/swc-win32-arm64-msvc': 14.2.7
'@next/swc-win32-ia32-msvc': 14.2.7
'@next/swc-win32-x64-msvc': 14.2.7
'@playwright/test': 1.52.0
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
next@15.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
next@15.2.1(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@next/env': 15.2.1
'@swc/counter': 0.1.3
@@ -6852,6 +6827,7 @@ snapshots:
'@next/swc-linux-x64-musl': 15.2.1
'@next/swc-win32-arm64-msvc': 15.2.1
'@next/swc-win32-x64-msvc': 15.2.1
'@playwright/test': 1.52.0
sharp: 0.33.5
transitivePeerDependencies:
- '@babel/core'
@@ -6929,6 +6905,14 @@ snapshots:
pirates@4.0.7: {}
playwright-core@1.52.0: {}
playwright@1.52.0:
dependencies:
playwright-core: 1.52.0
optionalDependencies:
fsevents: 2.3.2
pngjs@5.0.0: {}
point-in-polygon-hao@1.2.4:
@@ -6996,8 +6980,6 @@ snapshots:
property-information@7.1.0: {}
punycode.js@2.3.1: {}
pvtsutils@1.3.6:
dependencies:
tslib: 2.8.1
@@ -7382,6 +7364,33 @@ snapshots:
tslib@2.8.1: {}
turbo-darwin-64@2.5.4:
optional: true
turbo-darwin-arm64@2.5.4:
optional: true
turbo-linux-64@2.5.4:
optional: true
turbo-linux-arm64@2.5.4:
optional: true
turbo-windows-64@2.5.4:
optional: true
turbo-windows-arm64@2.5.4:
optional: true
turbo@2.5.4:
optionalDependencies:
turbo-darwin-64: 2.5.4
turbo-darwin-arm64: 2.5.4
turbo-linux-64: 2.5.4
turbo-linux-arm64: 2.5.4
turbo-windows-64: 2.5.4
turbo-windows-arm64: 2.5.4
twoslash-protocol@0.3.1: {}
twoslash@0.3.1(typescript@5.7.3):
@@ -7392,29 +7401,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
typedoc@0.25.13(typescript@5.7.3):
dependencies:
lunr: 2.3.9
marked: 4.3.0
minimatch: 9.0.5
shiki: 0.14.7
typescript: 5.7.3
typedoc@0.27.9(typescript@5.7.3):
dependencies:
'@gerrit0/mini-shiki': 1.27.2
lunr: 2.3.9
markdown-it: 14.1.0
minimatch: 9.0.5
typescript: 5.7.3
yaml: 2.7.1
typescript@5.7.3: {}
typescript@5.8.3: {}
uc.micro@2.1.0: {}
uncrypto@0.1.3: {}
undici-types@6.19.8: {}

View File

@@ -11,11 +11,11 @@
"@biomejs/biome": "catalog:",
"@changesets/cli": "^2.27.10",
"@playwright/test": "^1.50.1",
"@vitejs/plugin-react": "^4.3.3",
"@vitest/browser": "^3.1.1",
"@vitest/coverage-istanbul": "3.1.1",
"@vitest/coverage-v8": "3.1.1",
"@vitest/ui": "3.1.1",
"@vitejs/plugin-react": "^4.5.1",
"@vitest/browser": "catalog:",
"@vitest/coverage-istanbul": "catalog:",
"@vitest/coverage-v8": "catalog:",
"@vitest/ui": "catalog:",
"happy-dom": "^17.4.4",
"lefthook": "^1.8.2",
"pkg-pr-new": "^0.0.39",
@@ -30,7 +30,7 @@
"build": "turbo build && cd homepage/homepage && turbo build",
"lint": "turbo lint && cd homepage/homepage && pnpm run lint",
"test": "vitest",
"test:ci": "vitest --coverage.enabled=true",
"test:ci": "vitest run --watch=false --coverage.enabled=true && cd packages/jazz-svelte && pnpm exec vitest run --watch=false",
"test:coverage": "vitest --ui --coverage.enabled=true",
"format-and-lint": "biome check .",
"format-and-lint:fix": "biome check . --write",

View File

@@ -1,5 +1,12 @@
# cojson-storage-indexeddb
## 0.14.19
### Patch Changes
- cojson@0.14.19
- cojson-storage@0.14.19
## 0.14.18
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "cojson-storage-indexeddb",
"version": "0.14.18",
"version": "0.14.19",
"main": "dist/index.js",
"type": "module",
"types": "dist/index.d.ts",

View File

@@ -1,5 +1,12 @@
# cojson-storage-sqlite
## 0.14.19
### Patch Changes
- cojson@0.14.19
- cojson-storage@0.14.19
## 0.14.18
### Patch Changes

View File

@@ -1,13 +1,13 @@
{
"name": "cojson-storage-sqlite",
"type": "module",
"version": "0.14.18",
"version": "0.14.19",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"license": "MIT",
"dependencies": {
"better-sqlite3": "^11.7.0",
"cojson": "workspace:0.14.18",
"cojson": "workspace:0.14.19",
"cojson-storage": "workspace:*"
},
"devDependencies": {

View File

@@ -1,5 +1,11 @@
# cojson-storage
## 0.14.19
### Patch Changes
- cojson@0.14.19
## 0.14.18
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "cojson-storage",
"version": "0.14.18",
"version": "0.14.19",
"main": "dist/index.js",
"type": "module",
"types": "dist/index.d.ts",

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