Compare commits
40 Commits
cojson-sto
...
jazz-brows
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aca5642671 | ||
|
|
a5bed20c4a | ||
|
|
09bf53a8d3 | ||
|
|
061ec996b1 | ||
|
|
7aae2441a1 | ||
|
|
650e95a528 | ||
|
|
3d80ab11d9 | ||
|
|
85e6489a3e | ||
|
|
45b6c87ade | ||
|
|
edadc4b986 | ||
|
|
455b722357 | ||
|
|
ad2e1d1e98 | ||
|
|
7c94b70c31 | ||
|
|
74bcf1752e | ||
|
|
97a54b3911 | ||
|
|
c393c8880f | ||
|
|
359157fa70 | ||
|
|
62d9680449 | ||
|
|
db6067439d | ||
|
|
5051d6a410 | ||
|
|
25efaf30f5 | ||
|
|
98aadd9842 | ||
|
|
d555b18c11 | ||
|
|
550111f8a1 | ||
|
|
3d4a00a19d | ||
|
|
d06c6677dc | ||
|
|
ce30f3c4ff | ||
|
|
1072b9c2fe | ||
|
|
5ea41c69ef | ||
|
|
2d8eed3b69 | ||
|
|
45c9c8558f | ||
|
|
dccb80edf0 | ||
|
|
156167e6d7 | ||
|
|
aef84cf2ef | ||
|
|
275a26e2c1 | ||
|
|
946ae63070 | ||
|
|
5cfe47ebbe | ||
|
|
6ee0ec755e | ||
|
|
8ffca202bd | ||
|
|
6d2bcc7490 |
46
.github/workflows/playwright-homepage.yml
vendored
Normal file
46
.github/workflows/playwright-homepage.yml
vendored
Normal 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
|
||||
@@ -64,7 +64,7 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"include": ["packages/**/src/tests/**"],
|
||||
"include": ["**/tests/**"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"correctness": {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "betterauth",
|
||||
"version": "0.1.21",
|
||||
"version": "0.1.22",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "chat-rn-expo",
|
||||
"version": "1.0.9",
|
||||
"version": "1.0.10",
|
||||
"main": "index.ts",
|
||||
"scripts": {
|
||||
"build": "expo prebuild",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "chat-rn",
|
||||
"version": "1.0.136",
|
||||
"version": "1.0.137",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"android": "react-native run-android",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jazz-nextjs",
|
||||
"version": "0.1.5",
|
||||
"version": "0.1.6",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev --turbopack",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 />
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -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 && (
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:*",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ function App() {
|
||||
),
|
||||
estimate: 5,
|
||||
status: "backlog",
|
||||
createdAt: new Date(),
|
||||
},
|
||||
group,
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ export function ProjectComponent({ projectID }: { projectID: string }) {
|
||||
description: CoPlainText.create("", project._owner),
|
||||
estimate: 0,
|
||||
status: "backlog",
|
||||
createdAt: new Date(),
|
||||
},
|
||||
project._owner,
|
||||
),
|
||||
|
||||
@@ -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({
|
||||
|
||||
1
homepage/gcmp/.gitignore
vendored
1
homepage/gcmp/.gitignore
vendored
@@ -34,5 +34,4 @@ yarn-error.log*
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
|
||||
typedoc
|
||||
codeSamples
|
||||
@@ -44,7 +44,6 @@
|
||||
"autoprefixer": "^10",
|
||||
"postcss": "^8",
|
||||
"tailwindcss": "^3",
|
||||
"typedoc": "^0.25.13",
|
||||
"typescript": "^5.3.3"
|
||||
}
|
||||
}
|
||||
|
||||
1
homepage/homepage/.gitignore
vendored
1
homepage/homepage/.gitignore
vendored
@@ -34,7 +34,6 @@ yarn-error.log*
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
|
||||
typedoc
|
||||
codeSamples
|
||||
# Turborepo
|
||||
.turbo
|
||||
|
||||
@@ -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 }));
|
||||
}
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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't find what you'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>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -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>
|
||||
);
|
||||
})}
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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(),
|
||||
});
|
||||
}
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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
|
||||
@@ -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,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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.
|
||||
202
homepage/homepage/content/docs/using-covalues/history.mdx
Normal file
202
homepage/homepage/content/docs/using-covalues/history.mdx
Normal 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
|
||||
@@ -11,10 +11,6 @@ export const navigationItems: NavItemProps[] = [
|
||||
title: "Examples",
|
||||
href: "/examples",
|
||||
},
|
||||
// {
|
||||
// title: "API ref",
|
||||
// href: "/api-reference",
|
||||
// },
|
||||
{
|
||||
title: "Built with Jazz",
|
||||
href: "/showcase",
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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.");
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
53
homepage/homepage/playwright.config.ts
Normal file
53
homepage/homepage/playwright.config.ts
Normal 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,
|
||||
},
|
||||
],
|
||||
});
|
||||
4157
homepage/homepage/pnpm-lock.yaml
generated
4157
homepage/homepage/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
54
homepage/homepage/tests/routes.spec.ts
Normal file
54
homepage/homepage/tests/routes.spec.ts
Normal 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$/);
|
||||
});
|
||||
});
|
||||
@@ -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
274
homepage/pnpm-lock.yaml
generated
@@ -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: {}
|
||||
|
||||
12
package.json
12
package.json
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# cojson-storage
|
||||
|
||||
## 0.14.19
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- cojson@0.14.19
|
||||
|
||||
## 0.14.18
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user