Compare commits
33 Commits
jazz-bette
...
cojson-sto
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8fb1748433 | ||
|
|
c8644bf678 | ||
|
|
269ee94338 | ||
|
|
dae80eeba8 | ||
|
|
ce54667b4d | ||
|
|
5963658e28 | ||
|
|
71c1411bbd | ||
|
|
71b221dc79 | ||
|
|
2d11d448dc | ||
|
|
2d42fc9b34 | ||
|
|
c9bda7e1e3 | ||
|
|
476f2d7eee | ||
|
|
1ba3a2ca34 | ||
|
|
7dd3d005a3 | ||
|
|
2c2dfb52d4 | ||
|
|
d33917fbaa | ||
|
|
f0c73d9cc6 | ||
|
|
d9324a9809 | ||
|
|
f7b5454cc6 | ||
|
|
5de338bdaf | ||
|
|
e67d44d47a | ||
|
|
a310293346 | ||
|
|
716d770258 | ||
|
|
4e85b50e1b | ||
|
|
643297b42e | ||
|
|
261efd99be | ||
|
|
f75f4f9b2d | ||
|
|
a0021f060c | ||
|
|
86bd87e6d0 | ||
|
|
ae55e80801 | ||
|
|
e830caf966 | ||
|
|
2f7240121d | ||
|
|
60b5288042 |
3
.github/workflows/code-quality.yml
vendored
3
.github/workflows/code-quality.yml
vendored
@@ -25,6 +25,3 @@ jobs:
|
||||
version: 2.1.3
|
||||
- name: Run Biome
|
||||
run: biome ci .
|
||||
|
||||
- name: Check Catalog Dependencies
|
||||
run: node scripts/check-catalog-deps.js
|
||||
|
||||
@@ -27,22 +27,22 @@
|
||||
"jazz-tools": "workspace:*",
|
||||
"lucide-react": "^0.510.0",
|
||||
"next": "15.3.2",
|
||||
"react": "^18.0.0",
|
||||
"react-dom": "^18.0.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"sonner": "^2.0.3",
|
||||
"tailwind-merge": "^3.3.0",
|
||||
"tw-animate-css": "^1.2.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@playwright/test": "^1.50.1",
|
||||
"@tailwindcss/postcss": "^4",
|
||||
"@types/better-sqlite3": "^7.6.12",
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^18",
|
||||
"@types/react-dom": "^18",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"react-email": "^4.0.11",
|
||||
"tailwindcss": "^4",
|
||||
"typescript": "^5"
|
||||
"typescript": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,13 +13,13 @@
|
||||
"@bacons/text-decoder": "^0.0.0",
|
||||
"@bam.tech/react-native-image-resizer": "^3.0.11",
|
||||
"@react-native-community/netinfo": "11.4.1",
|
||||
"expo": "54.0.0-canary-20250701-6a945c5",
|
||||
"expo-clipboard": "^7.1.4",
|
||||
"expo-secure-store": "~14.2.3",
|
||||
"expo-sqlite": "~15.2.10",
|
||||
"expo": "catalog:expo",
|
||||
"expo-clipboard": "catalog:expo",
|
||||
"expo-secure-store": "catalog:expo",
|
||||
"expo-sqlite": "catalog:expo",
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-native": "0.80.0",
|
||||
"react": "catalog:expo",
|
||||
"react-native": "catalog:expo",
|
||||
"react-native-get-random-values": "^1.11.0",
|
||||
"readable-stream": "^4.7.0"
|
||||
},
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
"@react-navigation/native": "7.1.14",
|
||||
"@react-navigation/native-stack": "7.3.19",
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-native": "0.80.0",
|
||||
"react": "catalog:rn",
|
||||
"react-native": "catalog:rn",
|
||||
"react-native-get-random-values": "^1.11.0",
|
||||
"react-native-mmkv": "3.3.0",
|
||||
"react-native-safe-area-context": "5.5.0",
|
||||
@@ -31,16 +31,16 @@
|
||||
"@babel/plugin-transform-export-namespace-from": "^7.27.1",
|
||||
"@babel/preset-env": "^7.25.3",
|
||||
"@babel/runtime": "^7.25.0",
|
||||
"@react-native-community/cli": "19.0.0",
|
||||
"@react-native-community/cli-platform-android": "19.0.0",
|
||||
"@react-native-community/cli-platform-ios": "19.0.0",
|
||||
"@react-native/babel-preset": "0.80.0",
|
||||
"@react-native/eslint-config": "0.80.0",
|
||||
"@react-native/metro-config": "0.80.0",
|
||||
"@react-native/typescript-config": "0.80.0",
|
||||
"@react-native-community/cli": "catalog:rn",
|
||||
"@react-native-community/cli-platform-android": "catalog:rn",
|
||||
"@react-native-community/cli-platform-ios": "catalog:rn",
|
||||
"@react-native/babel-preset": "catalog:rn",
|
||||
"@react-native/eslint-config": "catalog:rn",
|
||||
"@react-native/metro-config": "catalog:rn",
|
||||
"@react-native/typescript-config": "catalog:rn",
|
||||
"@rnx-kit/metro-config": "^2.0.1",
|
||||
"@rnx-kit/metro-resolver-symlinks": "^0.2.5",
|
||||
"@types/react": "^19.1.0",
|
||||
"@types/react": "catalog:rn",
|
||||
"eslint": "^8.19.0",
|
||||
"pod-install": "^0.3.5",
|
||||
"prettier": "2.8.8",
|
||||
|
||||
@@ -1,5 +1,25 @@
|
||||
# passkey-svelte
|
||||
|
||||
## 0.0.118
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [5963658]
|
||||
- jazz-tools@0.17.5
|
||||
|
||||
## 0.0.117
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [7dd3d00]
|
||||
- jazz-tools@0.17.4
|
||||
|
||||
## 0.0.116
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-tools@0.17.3
|
||||
|
||||
## 0.0.115
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "chat-svelte",
|
||||
"version": "0.0.115",
|
||||
"version": "0.0.118",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -16,20 +16,20 @@
|
||||
"hash-slash": "workspace:*",
|
||||
"jazz-tools": "workspace:*",
|
||||
"lucide-react": "^0.536.0",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"zod": "3.25.76"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.50.1",
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react-swc": "^3.10.1",
|
||||
"is-ci": "^3.0.1",
|
||||
"postcss": "^8.4.40",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
@@ -14,21 +14,21 @@
|
||||
"@bam.tech/react-native-image-resizer": "^3.0.11",
|
||||
"@clerk/clerk-expo": "^2.13.1",
|
||||
"@react-native-community/netinfo": "11.4.1",
|
||||
"expo": "54.0.0-canary-20250701-6a945c5",
|
||||
"expo-crypto": "~14.1.5",
|
||||
"expo-linking": "~7.1.5",
|
||||
"expo-secure-store": "~14.2.3",
|
||||
"expo-sqlite": "~15.2.10",
|
||||
"expo-web-browser": "~14.2.0",
|
||||
"expo": "catalog:expo",
|
||||
"expo-crypto": "catalog:expo",
|
||||
"expo-linking": "catalog:expo",
|
||||
"expo-secure-store": "catalog:expo",
|
||||
"expo-sqlite": "catalog:expo",
|
||||
"expo-web-browser": "catalog:expo",
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-native": "0.80.0",
|
||||
"react": "catalog:expo",
|
||||
"react-native": "catalog:expo",
|
||||
"react-native-get-random-values": "^1.11.0",
|
||||
"readable-stream": "^4.7.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.25.2",
|
||||
"@types/react": "~19.0.10",
|
||||
"@types/react": "catalog:expo",
|
||||
"typescript": "~5.8.3"
|
||||
},
|
||||
"private": true
|
||||
|
||||
@@ -14,17 +14,17 @@
|
||||
"dependencies": {
|
||||
"@clerk/clerk-react": "^5.4.1",
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0"
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.50.1",
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,8 @@
|
||||
import { clerk } from "@clerk/testing/playwright";
|
||||
import { expect, test } from "@playwright/test";
|
||||
|
||||
test("login & expiration", async ({ page, context }) => {
|
||||
// Flaky on CI
|
||||
test.skip("login & expiration", async ({ page, context }) => {
|
||||
// Clear cookies first
|
||||
await context.clearCookies();
|
||||
|
||||
|
||||
@@ -11,20 +11,20 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0"
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"is-ci": "^3.0.1",
|
||||
"postcss": "^8.5.3",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,22 +12,22 @@
|
||||
"dependencies": {
|
||||
"hash-slash": "workspace:*",
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0"
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@playwright/test": "^1.50.1",
|
||||
"@tailwindcss/forms": "^0.5.10",
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"is-ci": "^3.0.1",
|
||||
"postcss": "^8.4.40",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,18 +11,18 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0"
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5",
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default",
|
||||
"postcss": "^8.4.40",
|
||||
"tailwindcss": "^4.1.10"
|
||||
}
|
||||
|
||||
@@ -17,19 +17,19 @@
|
||||
"cojson-transport-ws": "workspace:*",
|
||||
"hash-slash": "workspace:*",
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"react-use": "^17.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.50.1",
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react-swc": "^3.10.1",
|
||||
"postcss": "^8.4.40",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,22 +13,22 @@
|
||||
"dependencies": {
|
||||
"@react-spring/web": "^9.7.5",
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"zod": "3.25.76"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"is-ci": "^3.0.1",
|
||||
"postcss": "^8.4.40",
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5",
|
||||
"vitest": "3.1.1"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default",
|
||||
"vitest": "catalog:default"
|
||||
}
|
||||
}
|
||||
@@ -12,17 +12,17 @@
|
||||
"dependencies": {
|
||||
"@clerk/clerk-react": "^5.4.1",
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"tailwindcss": "^4.1.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
"clsx": "^2.1.1",
|
||||
"jazz-tools": "workspace:*",
|
||||
"lucide-react": "^0.536.0",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"react-router": "^6.16.0",
|
||||
"react-router-dom": "^6.16.0",
|
||||
"tailwind-merge": "^1.14.0"
|
||||
@@ -32,13 +32,13 @@
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.50.1",
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react-swc": "^3.10.1",
|
||||
"postcss": "^8.4.27",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5",
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default",
|
||||
"vite-plugin-pwa": "^1.0.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,23 +14,23 @@
|
||||
"dependencies": {
|
||||
"jazz-tools": "workspace:*",
|
||||
"lucide-react": "^0.536.0",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"react-router": "^6.16.0",
|
||||
"react-router-dom": "^6.16.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@playwright/test": "^1.50.1",
|
||||
"@tailwindcss/forms": "^0.5.10",
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"postcss": "^8.4.40",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,17 +11,17 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"tailwindcss": "^4.1.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,17 +12,17 @@
|
||||
"dependencies": {
|
||||
"hash-slash": "workspace:*",
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"tailwindcss": "^4.1.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,21 +19,21 @@
|
||||
"prosemirror-schema-list": "^1.5.1",
|
||||
"prosemirror-state": "^1.4.3",
|
||||
"prosemirror-view": "^1.39.1",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0"
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@playwright/test": "^1.50.1",
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"is-ci": "^3.0.1",
|
||||
"postcss": "^8.4.40",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,21 +22,21 @@
|
||||
"clsx": "^2.1.1",
|
||||
"jazz-tools": "workspace:*",
|
||||
"lucide-react": "^0.509.0",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0"
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@playwright/test": "^1.50.1",
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"is-ci": "^3.0.1",
|
||||
"postcss": "^8.4.40",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,20 +24,20 @@
|
||||
"clsx": "^2.1.1",
|
||||
"jazz-tools": "workspace:*",
|
||||
"lucide-react": "^0.485.0",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"tailwind-merge": "^3.0.2",
|
||||
"tailwindcss": "^4.0.17",
|
||||
"tw-animate-css": "^1.2.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.3.4",
|
||||
"jazz-run": "workspace:*",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"tsx": "^4.19.3",
|
||||
"typescript": "~5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
"jazz-tools": "workspace:*",
|
||||
"lucide-react": "^0.536.0",
|
||||
"qrcode": "^1.5.3",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"react-router": "^6.16.0",
|
||||
"react-router-dom": "^6.16.0",
|
||||
"tailwind-merge": "^1.14.0",
|
||||
@@ -29,12 +29,12 @@
|
||||
"devDependencies": {
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"@types/qrcode": "^1.5.1",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react-swc": "^3.10.1",
|
||||
"postcss": "^8.4.27",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,18 +12,18 @@
|
||||
"dependencies": {
|
||||
"@tailwindcss/forms": "^0.5.9",
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0"
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,11 +31,11 @@
|
||||
"tailwindcss-animate": "^1.0.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@biomejs/biome": "catalog:",
|
||||
"@csstools/postcss-oklab-function": "^3.0.6",
|
||||
"@types/node": "^20",
|
||||
"@types/react": "catalog:",
|
||||
"@types/react-dom": "catalog:",
|
||||
"typescript": "^5.3.3"
|
||||
"typescript": "catalog:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,13 +37,13 @@
|
||||
"unist-util-visit": "^5.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@biomejs/biome": "catalog:",
|
||||
"@types/node": "^20",
|
||||
"@types/react": "catalog:",
|
||||
"@types/react-dom": "catalog:",
|
||||
"autoprefixer": "^10",
|
||||
"postcss": "^8",
|
||||
"tailwindcss": "^3",
|
||||
"typescript": "^5.3.3"
|
||||
"typescript": "catalog:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
"tailwindcss-animate": "^1.0.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@biomejs/biome": "catalog:",
|
||||
"@next/mdx": "^15.3.3",
|
||||
"@playwright/test": "^1.52.0",
|
||||
"@types/geojson": "^7946.0.14",
|
||||
@@ -72,9 +72,9 @@
|
||||
"postcss": "^8",
|
||||
"tailwindcss": "^3",
|
||||
"turbo": "^2.3.1",
|
||||
"typescript": "~5.7.0",
|
||||
"typescript": "catalog:",
|
||||
"unified": "^11.0.5",
|
||||
"unist-util-visit": "^5.0.0",
|
||||
"vitest": "^3.2.3"
|
||||
"vitest": "catalog:"
|
||||
}
|
||||
}
|
||||
|
||||
246
homepage/pnpm-lock.yaml
generated
246
homepage/pnpm-lock.yaml
generated
@@ -6,6 +6,9 @@ settings:
|
||||
|
||||
catalogs:
|
||||
default:
|
||||
'@biomejs/biome':
|
||||
specifier: 2.1.3
|
||||
version: 2.1.3
|
||||
'@types/react':
|
||||
specifier: 19.1.0
|
||||
version: 19.1.0
|
||||
@@ -18,6 +21,12 @@ catalogs:
|
||||
react-dom:
|
||||
specifier: 19.1.0
|
||||
version: 19.1.0
|
||||
typescript:
|
||||
specifier: 5.6.2
|
||||
version: 5.6.2
|
||||
vitest:
|
||||
specifier: 3.2.4
|
||||
version: 3.2.4
|
||||
|
||||
importers:
|
||||
|
||||
@@ -82,8 +91,8 @@ importers:
|
||||
version: 1.0.7(tailwindcss@3.4.17)
|
||||
devDependencies:
|
||||
'@biomejs/biome':
|
||||
specifier: 1.9.4
|
||||
version: 1.9.4
|
||||
specifier: 'catalog:'
|
||||
version: 2.1.3
|
||||
'@csstools/postcss-oklab-function':
|
||||
specifier: ^3.0.6
|
||||
version: 3.0.19(postcss@8.5.3)
|
||||
@@ -97,8 +106,8 @@ importers:
|
||||
specifier: 'catalog:'
|
||||
version: 19.1.0(@types/react@19.1.0)
|
||||
typescript:
|
||||
specifier: ^5.3.3
|
||||
version: 5.7.3
|
||||
specifier: 'catalog:'
|
||||
version: 5.6.2
|
||||
|
||||
gcmp:
|
||||
dependencies:
|
||||
@@ -161,7 +170,7 @@ importers:
|
||||
version: 0.14.7
|
||||
shiki-twoslash:
|
||||
specifier: ^3.1.2
|
||||
version: 3.1.2(typescript@5.7.3)
|
||||
version: 3.1.2(typescript@5.6.2)
|
||||
tailwind-merge:
|
||||
specifier: ^1.14.0
|
||||
version: 1.14.0
|
||||
@@ -173,8 +182,8 @@ importers:
|
||||
version: 5.0.0
|
||||
devDependencies:
|
||||
'@biomejs/biome':
|
||||
specifier: 1.9.4
|
||||
version: 1.9.4
|
||||
specifier: 'catalog:'
|
||||
version: 2.1.3
|
||||
'@types/node':
|
||||
specifier: ^20
|
||||
version: 20.17.46
|
||||
@@ -194,8 +203,8 @@ importers:
|
||||
specifier: ^3
|
||||
version: 3.4.17
|
||||
typescript:
|
||||
specifier: ^5.3.3
|
||||
version: 5.7.3
|
||||
specifier: 'catalog:'
|
||||
version: 5.6.2
|
||||
|
||||
homepage:
|
||||
dependencies:
|
||||
@@ -225,7 +234,7 @@ importers:
|
||||
version: 3.4.0
|
||||
'@shikijs/twoslash':
|
||||
specifier: ^3.2.1
|
||||
version: 3.4.0(typescript@5.7.3)
|
||||
version: 3.4.0(typescript@5.6.2)
|
||||
'@stefanprobst/rehype-extract-toc':
|
||||
specifier: 3.0.0
|
||||
version: 3.0.0
|
||||
@@ -306,8 +315,8 @@ importers:
|
||||
version: 1.0.7(tailwindcss@3.4.17)
|
||||
devDependencies:
|
||||
'@biomejs/biome':
|
||||
specifier: 1.9.4
|
||||
version: 1.9.4
|
||||
specifier: 'catalog:'
|
||||
version: 2.1.3
|
||||
'@next/mdx':
|
||||
specifier: ^15.3.3
|
||||
version: 15.3.3(@mdx-js/loader@2.3.0(webpack@5.99.8))(@mdx-js/react@2.3.0(react@19.1.0))
|
||||
@@ -328,7 +337,7 @@ importers:
|
||||
version: 19.1.0(@types/react@19.1.0)
|
||||
'@vitest/ui':
|
||||
specifier: ^3.2.3
|
||||
version: 3.2.3(vitest@3.2.3)
|
||||
version: 3.2.3(vitest@3.2.4)
|
||||
autoprefixer:
|
||||
specifier: ^10
|
||||
version: 10.4.21(postcss@8.5.3)
|
||||
@@ -351,8 +360,8 @@ importers:
|
||||
specifier: ^2.3.1
|
||||
version: 2.5.4
|
||||
typescript:
|
||||
specifier: ~5.7.0
|
||||
version: 5.7.3
|
||||
specifier: 'catalog:'
|
||||
version: 5.6.2
|
||||
unified:
|
||||
specifier: ^11.0.5
|
||||
version: 11.0.5
|
||||
@@ -360,8 +369,8 @@ importers:
|
||||
specifier: ^5.0.0
|
||||
version: 5.0.0
|
||||
vitest:
|
||||
specifier: ^3.2.3
|
||||
version: 3.2.3(@types/debug@4.1.12)(@types/node@20.17.46)(@vitest/ui@3.2.3)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)
|
||||
specifier: 'catalog:'
|
||||
version: 3.2.4(@types/debug@4.1.12)(@types/node@20.17.46)(@vitest/ui@3.2.3)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)
|
||||
|
||||
packages:
|
||||
|
||||
@@ -534,55 +543,55 @@ packages:
|
||||
'@better-fetch/fetch@1.1.18':
|
||||
resolution: {integrity: sha512-rEFOE1MYIsBmoMJtQbl32PGHHXuG2hDxvEd7rUHE0vCBoFQVSDqaVs9hkZEtHCxRoY+CljXKFCOuJ8uxqw1LcA==}
|
||||
|
||||
'@biomejs/biome@1.9.4':
|
||||
resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==}
|
||||
'@biomejs/biome@2.1.3':
|
||||
resolution: {integrity: sha512-KE/tegvJIxTkl7gJbGWSgun7G6X/n2M6C35COT6ctYrAy7SiPyNvi6JtoQERVK/VRbttZfgGq96j2bFmhmnH4w==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
hasBin: true
|
||||
|
||||
'@biomejs/cli-darwin-arm64@1.9.4':
|
||||
resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==}
|
||||
'@biomejs/cli-darwin-arm64@2.1.3':
|
||||
resolution: {integrity: sha512-LFLkSWRoSGS1wVUD/BE6Nlt2dSn0ulH3XImzg2O/36BoToJHKXjSxzPEMAqT9QvwVtk7/9AQhZpTneERU9qaXA==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@biomejs/cli-darwin-x64@1.9.4':
|
||||
resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==}
|
||||
'@biomejs/cli-darwin-x64@2.1.3':
|
||||
resolution: {integrity: sha512-Q/4OTw8P9No9QeowyxswcWdm0n2MsdCwWcc5NcKQQvzwPjwuPdf8dpPPf4r+x0RWKBtl1FLiAUtJvBlri6DnYw==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@biomejs/cli-linux-arm64-musl@1.9.4':
|
||||
resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==}
|
||||
'@biomejs/cli-linux-arm64-musl@2.1.3':
|
||||
resolution: {integrity: sha512-KXouFSBnoxAWZYDQrnNRzZBbt5s9UJkIm40hdvSL9mBxSSoxRFQJbtg1hP3aa8A2SnXyQHxQfpiVeJlczZt76w==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@biomejs/cli-linux-arm64@1.9.4':
|
||||
resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==}
|
||||
'@biomejs/cli-linux-arm64@2.1.3':
|
||||
resolution: {integrity: sha512-2hS6LgylRqMFmAZCOFwYrf77QMdUwJp49oe8PX/O8+P2yKZMSpyQTf3Eo5ewnsMFUEmYbPOskafdV1ds1MZMJA==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@biomejs/cli-linux-x64-musl@1.9.4':
|
||||
resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==}
|
||||
'@biomejs/cli-linux-x64-musl@2.1.3':
|
||||
resolution: {integrity: sha512-KaLAxnROouzIWtl6a0Y88r/4hW5oDUJTIqQorOTVQITaKQsKjZX4XCUmHIhdEk8zMnaiLZzRTAwk1yIAl+mIew==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@biomejs/cli-linux-x64@1.9.4':
|
||||
resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==}
|
||||
'@biomejs/cli-linux-x64@2.1.3':
|
||||
resolution: {integrity: sha512-NxlSCBhLvQtWGagEztfAZ4WcE1AkMTntZV65ZvR+J9jp06+EtOYEBPQndA70ZGhHbEDG57bR6uNvqkd1WrEYVA==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@biomejs/cli-win32-arm64@1.9.4':
|
||||
resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==}
|
||||
'@biomejs/cli-win32-arm64@2.1.3':
|
||||
resolution: {integrity: sha512-V9CUZCtWH4u0YwyCYbQ3W5F4ZGPWp2C2TYcsiWFNNyRfmOW1j/TY/jAurl33SaRjgZPO5UUhGyr9m6BN9t84NQ==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@biomejs/cli-win32-x64@1.9.4':
|
||||
resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==}
|
||||
'@biomejs/cli-win32-x64@2.1.3':
|
||||
resolution: {integrity: sha512-dxy599q6lgp8ANPpR8sDMscwdp9oOumEsVXuVCVT9N2vAho8uYXlCz53JhxX6LtJOXaE73qzgkGQ7QqvFlMC0g==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
@@ -2631,11 +2640,11 @@ packages:
|
||||
vue-router:
|
||||
optional: true
|
||||
|
||||
'@vitest/expect@3.2.3':
|
||||
resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==}
|
||||
'@vitest/expect@3.2.4':
|
||||
resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==}
|
||||
|
||||
'@vitest/mocker@3.2.3':
|
||||
resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==}
|
||||
'@vitest/mocker@3.2.4':
|
||||
resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==}
|
||||
peerDependencies:
|
||||
msw: ^2.4.9
|
||||
vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
|
||||
@@ -2648,14 +2657,17 @@ packages:
|
||||
'@vitest/pretty-format@3.2.3':
|
||||
resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==}
|
||||
|
||||
'@vitest/runner@3.2.3':
|
||||
resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==}
|
||||
'@vitest/pretty-format@3.2.4':
|
||||
resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==}
|
||||
|
||||
'@vitest/snapshot@3.2.3':
|
||||
resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==}
|
||||
'@vitest/runner@3.2.4':
|
||||
resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==}
|
||||
|
||||
'@vitest/spy@3.2.3':
|
||||
resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==}
|
||||
'@vitest/snapshot@3.2.4':
|
||||
resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==}
|
||||
|
||||
'@vitest/spy@3.2.4':
|
||||
resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==}
|
||||
|
||||
'@vitest/ui@3.2.3':
|
||||
resolution: {integrity: sha512-9aR2tY/WT7GRHGEH/9sSIipJqeA21Eh3C6xmiOVmfyBCFmezUSUFLalpaSmRHlRzWCKQU10yz3AHhKuYcdnZGQ==}
|
||||
@@ -2665,6 +2677,9 @@ packages:
|
||||
'@vitest/utils@3.2.3':
|
||||
resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==}
|
||||
|
||||
'@vitest/utils@3.2.4':
|
||||
resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==}
|
||||
|
||||
'@webassemblyjs/ast@1.14.1':
|
||||
resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
|
||||
|
||||
@@ -3731,6 +3746,9 @@ packages:
|
||||
loupe@3.1.3:
|
||||
resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==}
|
||||
|
||||
loupe@3.2.0:
|
||||
resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==}
|
||||
|
||||
lru-cache@10.4.3:
|
||||
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
|
||||
|
||||
@@ -4877,8 +4895,8 @@ packages:
|
||||
resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
|
||||
tinypool@1.1.0:
|
||||
resolution: {integrity: sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==}
|
||||
tinypool@1.1.1:
|
||||
resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==}
|
||||
engines: {node: ^18.0.0 || >=20.0.0}
|
||||
|
||||
tinyqueue@2.0.3:
|
||||
@@ -4977,8 +4995,8 @@ packages:
|
||||
resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
typescript@5.7.3:
|
||||
resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
|
||||
typescript@5.6.2:
|
||||
resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==}
|
||||
engines: {node: '>=14.17'}
|
||||
hasBin: true
|
||||
|
||||
@@ -5100,8 +5118,8 @@ packages:
|
||||
vfile@6.0.3:
|
||||
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
|
||||
|
||||
vite-node@3.2.3:
|
||||
resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==}
|
||||
vite-node@3.2.4:
|
||||
resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==}
|
||||
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
|
||||
hasBin: true
|
||||
|
||||
@@ -5145,16 +5163,16 @@ packages:
|
||||
yaml:
|
||||
optional: true
|
||||
|
||||
vitest@3.2.3:
|
||||
resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==}
|
||||
vitest@3.2.4:
|
||||
resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==}
|
||||
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
'@edge-runtime/vm': '*'
|
||||
'@types/debug': ^4.1.12
|
||||
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
|
||||
'@vitest/browser': 3.2.3
|
||||
'@vitest/ui': 3.2.3
|
||||
'@vitest/browser': 3.2.4
|
||||
'@vitest/ui': 3.2.4
|
||||
happy-dom: '*'
|
||||
jsdom: '*'
|
||||
peerDependenciesMeta:
|
||||
@@ -5505,39 +5523,39 @@ snapshots:
|
||||
|
||||
'@better-fetch/fetch@1.1.18': {}
|
||||
|
||||
'@biomejs/biome@1.9.4':
|
||||
'@biomejs/biome@2.1.3':
|
||||
optionalDependencies:
|
||||
'@biomejs/cli-darwin-arm64': 1.9.4
|
||||
'@biomejs/cli-darwin-x64': 1.9.4
|
||||
'@biomejs/cli-linux-arm64': 1.9.4
|
||||
'@biomejs/cli-linux-arm64-musl': 1.9.4
|
||||
'@biomejs/cli-linux-x64': 1.9.4
|
||||
'@biomejs/cli-linux-x64-musl': 1.9.4
|
||||
'@biomejs/cli-win32-arm64': 1.9.4
|
||||
'@biomejs/cli-win32-x64': 1.9.4
|
||||
'@biomejs/cli-darwin-arm64': 2.1.3
|
||||
'@biomejs/cli-darwin-x64': 2.1.3
|
||||
'@biomejs/cli-linux-arm64': 2.1.3
|
||||
'@biomejs/cli-linux-arm64-musl': 2.1.3
|
||||
'@biomejs/cli-linux-x64': 2.1.3
|
||||
'@biomejs/cli-linux-x64-musl': 2.1.3
|
||||
'@biomejs/cli-win32-arm64': 2.1.3
|
||||
'@biomejs/cli-win32-x64': 2.1.3
|
||||
|
||||
'@biomejs/cli-darwin-arm64@1.9.4':
|
||||
'@biomejs/cli-darwin-arm64@2.1.3':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-darwin-x64@1.9.4':
|
||||
'@biomejs/cli-darwin-x64@2.1.3':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-linux-arm64-musl@1.9.4':
|
||||
'@biomejs/cli-linux-arm64-musl@2.1.3':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-linux-arm64@1.9.4':
|
||||
'@biomejs/cli-linux-arm64@2.1.3':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-linux-x64-musl@1.9.4':
|
||||
'@biomejs/cli-linux-x64-musl@2.1.3':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-linux-x64@1.9.4':
|
||||
'@biomejs/cli-linux-x64@2.1.3':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-win32-arm64@1.9.4':
|
||||
'@biomejs/cli-win32-arm64@2.1.3':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-win32-x64@1.9.4':
|
||||
'@biomejs/cli-win32-x64@2.1.3':
|
||||
optional: true
|
||||
|
||||
'@csstools/color-helpers@4.2.1': {}
|
||||
@@ -6984,12 +7002,12 @@ snapshots:
|
||||
'@shikijs/core': 3.4.0
|
||||
'@shikijs/types': 3.4.0
|
||||
|
||||
'@shikijs/twoslash@3.4.0(typescript@5.7.3)':
|
||||
'@shikijs/twoslash@3.4.0(typescript@5.6.2)':
|
||||
dependencies:
|
||||
'@shikijs/core': 3.4.0
|
||||
'@shikijs/types': 3.4.0
|
||||
twoslash: 0.3.1(typescript@5.7.3)
|
||||
typescript: 5.7.3
|
||||
twoslash: 0.3.1(typescript@5.6.2)
|
||||
typescript: 5.6.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -8322,10 +8340,10 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@typescript/vfs@1.6.1(typescript@5.7.3)':
|
||||
'@typescript/vfs@1.6.1(typescript@5.6.2)':
|
||||
dependencies:
|
||||
debug: 4.4.0
|
||||
typescript: 5.7.3
|
||||
typescript: 5.6.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -8341,17 +8359,17 @@ snapshots:
|
||||
next: 15.2.1(@babel/core@7.27.4)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
|
||||
react: 19.1.0
|
||||
|
||||
'@vitest/expect@3.2.3':
|
||||
'@vitest/expect@3.2.4':
|
||||
dependencies:
|
||||
'@types/chai': 5.2.2
|
||||
'@vitest/spy': 3.2.3
|
||||
'@vitest/utils': 3.2.3
|
||||
'@vitest/spy': 3.2.4
|
||||
'@vitest/utils': 3.2.4
|
||||
chai: 5.2.0
|
||||
tinyrainbow: 2.0.0
|
||||
|
||||
'@vitest/mocker@3.2.3(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1))':
|
||||
'@vitest/mocker@3.2.4(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1))':
|
||||
dependencies:
|
||||
'@vitest/spy': 3.2.3
|
||||
'@vitest/spy': 3.2.4
|
||||
estree-walker: 3.0.3
|
||||
magic-string: 0.30.17
|
||||
optionalDependencies:
|
||||
@@ -8361,23 +8379,27 @@ snapshots:
|
||||
dependencies:
|
||||
tinyrainbow: 2.0.0
|
||||
|
||||
'@vitest/runner@3.2.3':
|
||||
'@vitest/pretty-format@3.2.4':
|
||||
dependencies:
|
||||
'@vitest/utils': 3.2.3
|
||||
tinyrainbow: 2.0.0
|
||||
|
||||
'@vitest/runner@3.2.4':
|
||||
dependencies:
|
||||
'@vitest/utils': 3.2.4
|
||||
pathe: 2.0.3
|
||||
strip-literal: 3.0.0
|
||||
|
||||
'@vitest/snapshot@3.2.3':
|
||||
'@vitest/snapshot@3.2.4':
|
||||
dependencies:
|
||||
'@vitest/pretty-format': 3.2.3
|
||||
'@vitest/pretty-format': 3.2.4
|
||||
magic-string: 0.30.17
|
||||
pathe: 2.0.3
|
||||
|
||||
'@vitest/spy@3.2.3':
|
||||
'@vitest/spy@3.2.4':
|
||||
dependencies:
|
||||
tinyspy: 4.0.3
|
||||
|
||||
'@vitest/ui@3.2.3(vitest@3.2.3)':
|
||||
'@vitest/ui@3.2.3(vitest@3.2.4)':
|
||||
dependencies:
|
||||
'@vitest/utils': 3.2.3
|
||||
fflate: 0.8.2
|
||||
@@ -8386,7 +8408,7 @@ snapshots:
|
||||
sirv: 3.0.1
|
||||
tinyglobby: 0.2.14
|
||||
tinyrainbow: 2.0.0
|
||||
vitest: 3.2.3(@types/debug@4.1.12)(@types/node@20.17.46)(@vitest/ui@3.2.3)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)
|
||||
vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.17.46)(@vitest/ui@3.2.3)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)
|
||||
|
||||
'@vitest/utils@3.2.3':
|
||||
dependencies:
|
||||
@@ -8394,6 +8416,12 @@ snapshots:
|
||||
loupe: 3.1.3
|
||||
tinyrainbow: 2.0.0
|
||||
|
||||
'@vitest/utils@3.2.4':
|
||||
dependencies:
|
||||
'@vitest/pretty-format': 3.2.4
|
||||
loupe: 3.2.0
|
||||
tinyrainbow: 2.0.0
|
||||
|
||||
'@webassemblyjs/ast@1.14.1':
|
||||
dependencies:
|
||||
'@webassemblyjs/helper-numbers': 1.13.2
|
||||
@@ -9532,6 +9560,8 @@ snapshots:
|
||||
|
||||
loupe@3.1.3: {}
|
||||
|
||||
loupe@3.2.0: {}
|
||||
|
||||
lru-cache@10.4.3: {}
|
||||
|
||||
lru-cache@5.1.1:
|
||||
@@ -11054,13 +11084,13 @@ snapshots:
|
||||
|
||||
shell-quote@1.8.3: {}
|
||||
|
||||
shiki-twoslash@3.1.2(typescript@5.7.3):
|
||||
shiki-twoslash@3.1.2(typescript@5.6.2):
|
||||
dependencies:
|
||||
'@typescript/twoslash': 3.1.0
|
||||
'@typescript/vfs': 1.3.4
|
||||
fenceparser: 1.1.1
|
||||
shiki: 0.10.1
|
||||
typescript: 5.7.3
|
||||
typescript: 5.6.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -11290,7 +11320,7 @@ snapshots:
|
||||
fdir: 6.4.6(picomatch@4.0.2)
|
||||
picomatch: 4.0.2
|
||||
|
||||
tinypool@1.1.0: {}
|
||||
tinypool@1.1.1: {}
|
||||
|
||||
tinyqueue@2.0.3: {}
|
||||
|
||||
@@ -11353,11 +11383,11 @@ snapshots:
|
||||
|
||||
twoslash-protocol@0.3.1: {}
|
||||
|
||||
twoslash@0.3.1(typescript@5.7.3):
|
||||
twoslash@0.3.1(typescript@5.6.2):
|
||||
dependencies:
|
||||
'@typescript/vfs': 1.6.1(typescript@5.7.3)
|
||||
'@typescript/vfs': 1.6.1(typescript@5.6.2)
|
||||
twoslash-protocol: 0.3.1
|
||||
typescript: 5.7.3
|
||||
typescript: 5.6.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -11365,7 +11395,7 @@ snapshots:
|
||||
|
||||
type-fest@0.7.1: {}
|
||||
|
||||
typescript@5.7.3: {}
|
||||
typescript@5.6.2: {}
|
||||
|
||||
typescript@5.8.3: {}
|
||||
|
||||
@@ -11514,7 +11544,7 @@ snapshots:
|
||||
'@types/unist': 3.0.3
|
||||
vfile-message: 4.0.2
|
||||
|
||||
vite-node@3.2.3(@types/node@20.17.46)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1):
|
||||
vite-node@3.2.4(@types/node@20.17.46)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1):
|
||||
dependencies:
|
||||
cac: 6.7.14
|
||||
debug: 4.4.1
|
||||
@@ -11550,16 +11580,16 @@ snapshots:
|
||||
terser: 5.39.0
|
||||
yaml: 2.7.1
|
||||
|
||||
vitest@3.2.3(@types/debug@4.1.12)(@types/node@20.17.46)(@vitest/ui@3.2.3)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1):
|
||||
vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.17.46)(@vitest/ui@3.2.3)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1):
|
||||
dependencies:
|
||||
'@types/chai': 5.2.2
|
||||
'@vitest/expect': 3.2.3
|
||||
'@vitest/mocker': 3.2.3(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1))
|
||||
'@vitest/pretty-format': 3.2.3
|
||||
'@vitest/runner': 3.2.3
|
||||
'@vitest/snapshot': 3.2.3
|
||||
'@vitest/spy': 3.2.3
|
||||
'@vitest/utils': 3.2.3
|
||||
'@vitest/expect': 3.2.4
|
||||
'@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@20.17.46)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1))
|
||||
'@vitest/pretty-format': 3.2.4
|
||||
'@vitest/runner': 3.2.4
|
||||
'@vitest/snapshot': 3.2.4
|
||||
'@vitest/spy': 3.2.4
|
||||
'@vitest/utils': 3.2.4
|
||||
chai: 5.2.0
|
||||
debug: 4.4.1
|
||||
expect-type: 1.2.1
|
||||
@@ -11570,15 +11600,15 @@ snapshots:
|
||||
tinybench: 2.9.0
|
||||
tinyexec: 0.3.2
|
||||
tinyglobby: 0.2.14
|
||||
tinypool: 1.1.0
|
||||
tinypool: 1.1.1
|
||||
tinyrainbow: 2.0.0
|
||||
vite: 6.3.5(@types/node@20.17.46)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)
|
||||
vite-node: 3.2.3(@types/node@20.17.46)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)
|
||||
vite-node: 3.2.4(@types/node@20.17.46)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)
|
||||
why-is-node-running: 2.3.0
|
||||
optionalDependencies:
|
||||
'@types/debug': 4.1.12
|
||||
'@types/node': 20.17.46
|
||||
'@vitest/ui': 3.2.3(vitest@3.2.3)
|
||||
'@vitest/ui': 3.2.3(vitest@3.2.4)
|
||||
transitivePeerDependencies:
|
||||
- jiti
|
||||
- less
|
||||
|
||||
@@ -4,7 +4,11 @@ packages:
|
||||
- "gcmp"
|
||||
|
||||
catalog:
|
||||
"@biomejs/biome": 2.1.3
|
||||
"react": "19.1.0"
|
||||
"react-dom": "19.1.0"
|
||||
"@types/react": "19.1.0"
|
||||
"@types/react-dom": "19.1.0"
|
||||
"typescript": 5.6.2
|
||||
"vitest": 3.2.4
|
||||
|
||||
37
package.json
37
package.json
@@ -2,20 +2,24 @@
|
||||
"name": "jazz-monorepo",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"workspaces": ["packages/*", "examples/*", "starters/*"],
|
||||
"workspaces": [
|
||||
"packages/*",
|
||||
"examples/*",
|
||||
"starters/*"
|
||||
],
|
||||
"packageManager": "pnpm@9.15.0+sha512.76e2379760a4328ec4415815bcd6628dee727af3779aaa4c914e3944156c4299921a89f976381ee107d41f12cfa4b66681ca9c718f0668fa0831ed4c6d8ba56c",
|
||||
"engines": {
|
||||
"node": ">=22.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "catalog:",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@changesets/cli": "^2.27.10",
|
||||
"@playwright/test": "^1.50.1",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"@vitest/browser": "catalog:",
|
||||
"@vitest/coverage-istanbul": "catalog:",
|
||||
"@vitest/coverage-v8": "catalog:",
|
||||
"@vitest/ui": "catalog:",
|
||||
"@vitest/browser": "catalog:default",
|
||||
"@vitest/coverage-istanbul": "catalog:default",
|
||||
"@vitest/coverage-v8": "catalog:default",
|
||||
"@vitest/ui": "catalog:default",
|
||||
"happy-dom": "^17.4.4",
|
||||
"jazz-run": "workspace:*",
|
||||
"jazz-tools": "workspace:*",
|
||||
@@ -24,7 +28,7 @@
|
||||
"playwright": "^1.50.1",
|
||||
"turbo": "^2.3.1",
|
||||
"typedoc": "^0.25.13",
|
||||
"vitest": "catalog:"
|
||||
"vitest": "catalog:default"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "turbo dev",
|
||||
@@ -40,8 +44,7 @@
|
||||
"changeset-version": "changeset version && pnpm i --no-frozen-lockfile",
|
||||
"release": "turbo run build --filter='./packages/*' && pnpm changeset publish && git push --follow-tags",
|
||||
"clean": "rm -rf ./packages/*/dist && rm -rf ./packages/*/node_modules && rm -rf ./examples/*/node_modules && rm -rf ./examples/*/dist",
|
||||
"postinstall": "lefthook install",
|
||||
"check-catalog-deps": "node scripts/check-catalog-deps.js"
|
||||
"postinstall": "lefthook install"
|
||||
},
|
||||
"version": "0.0.0",
|
||||
"pnpm": {
|
||||
@@ -49,14 +52,18 @@
|
||||
"better-sqlite3"
|
||||
],
|
||||
"peerDependencyRules": {
|
||||
"ignoreMissing": ["@babel/*", "expo-modules-*", "typescript"]
|
||||
"ignoreMissing": [
|
||||
"@babel/*",
|
||||
"expo-modules-*",
|
||||
"typescript"
|
||||
]
|
||||
},
|
||||
"overrides": {
|
||||
"@types/react": "19.1.0",
|
||||
"@types/react-dom": "19.1.0",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"vite": "6.3.5",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"vite": "catalog:default",
|
||||
"esbuild": "0.24.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,26 @@
|
||||
# cojson-storage-indexeddb
|
||||
|
||||
## 0.17.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [71c1411]
|
||||
- Updated dependencies [2d11d44]
|
||||
- cojson@0.17.5
|
||||
|
||||
## 0.17.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- cojson@0.17.4
|
||||
|
||||
## 0.17.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f0c73d9]
|
||||
- cojson@0.17.3
|
||||
|
||||
## 0.17.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "cojson-storage-indexeddb",
|
||||
"version": "0.17.2",
|
||||
"version": "0.17.5",
|
||||
"main": "dist/index.js",
|
||||
"type": "module",
|
||||
"types": "dist/index.d.ts",
|
||||
@@ -9,7 +9,7 @@
|
||||
"cojson": "workspace:*"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "catalog:",
|
||||
"typescript": "catalog:default",
|
||||
"webdriverio": "^8.15.0"
|
||||
},
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,26 @@
|
||||
# cojson-storage-sqlite
|
||||
|
||||
## 0.17.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [71c1411]
|
||||
- Updated dependencies [2d11d44]
|
||||
- cojson@0.17.5
|
||||
|
||||
## 0.17.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- cojson@0.17.4
|
||||
|
||||
## 0.17.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f0c73d9]
|
||||
- cojson@0.17.3
|
||||
|
||||
## 0.17.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "cojson-storage-sqlite",
|
||||
"type": "module",
|
||||
"version": "0.17.2",
|
||||
"version": "0.17.5",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"license": "MIT",
|
||||
@@ -11,7 +11,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/better-sqlite3": "^7.6.12",
|
||||
"typescript": "catalog:"
|
||||
"typescript": "catalog:default"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "tsc --watch --sourceMap --outDir dist",
|
||||
|
||||
@@ -1,5 +1,26 @@
|
||||
# cojson-transport-nodejs-ws
|
||||
|
||||
## 0.17.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [71c1411]
|
||||
- Updated dependencies [2d11d44]
|
||||
- cojson@0.17.5
|
||||
|
||||
## 0.17.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- cojson@0.17.4
|
||||
|
||||
## 0.17.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f0c73d9]
|
||||
- cojson@0.17.3
|
||||
|
||||
## 0.17.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "cojson-transport-ws",
|
||||
"type": "module",
|
||||
"version": "0.17.2",
|
||||
"version": "0.17.5",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"license": "MIT",
|
||||
@@ -20,7 +20,7 @@
|
||||
"devDependencies": {
|
||||
"@opentelemetry/sdk-metrics": "^2.0.0",
|
||||
"@types/ws": "8.5.10",
|
||||
"typescript": "catalog:",
|
||||
"typescript": "catalog:default",
|
||||
"ws": "^8.14.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# cojson
|
||||
|
||||
## 0.17.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 71c1411: Removed some unnecessary content messages sent after a local transaction when sending a value as dependency before the ack response
|
||||
- 2d11d44: Make the CoValueCore.unmount function detach the CoValue from LocalNode
|
||||
|
||||
## 0.17.4
|
||||
|
||||
## 0.17.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- f0c73d9: Allow storing empty content with header in handleNewContent
|
||||
|
||||
## 0.17.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -25,11 +25,11 @@
|
||||
},
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"version": "0.17.2",
|
||||
"version": "0.17.5",
|
||||
"devDependencies": {
|
||||
"@opentelemetry/sdk-metrics": "^2.0.0",
|
||||
"libsql": "^0.5.13",
|
||||
"typescript": "catalog:"
|
||||
"typescript": "catalog:default"
|
||||
},
|
||||
"dependencies": {
|
||||
"@noble/ciphers": "^1.3.0",
|
||||
|
||||
@@ -33,11 +33,7 @@ export class GarbageCollector {
|
||||
const timeSinceLastAccessed = currentTime - verified.lastAccessed;
|
||||
|
||||
if (timeSinceLastAccessed > GARBAGE_COLLECTOR_CONFIG.MAX_AGE) {
|
||||
const unmounted = coValue.unmount();
|
||||
|
||||
if (unmounted) {
|
||||
this.coValues.delete(coValue.id);
|
||||
}
|
||||
coValue.unmount();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
import {
|
||||
CoValueHeader,
|
||||
Transaction,
|
||||
VerifiedState,
|
||||
} from "./coValueCore/verifiedState.js";
|
||||
import { CoValueHeader, Transaction } from "./coValueCore/verifiedState.js";
|
||||
import { TRANSACTION_CONFIG } from "./config.js";
|
||||
import { Signature } from "./crypto/crypto.js";
|
||||
import { RawCoID, SessionID } from "./ids.js";
|
||||
@@ -65,6 +61,7 @@ export function exceedsRecommendedSize(
|
||||
|
||||
export function knownStateFromContent(content: NewContentMessage) {
|
||||
const knownState = emptyKnownState(content.id);
|
||||
knownState.header = Boolean(content.header);
|
||||
|
||||
for (const [sessionID, session] of Object.entries(content.new)) {
|
||||
knownState.sessions[sessionID as SessionID] =
|
||||
|
||||
@@ -219,6 +219,8 @@ export class CoValueCore {
|
||||
this.groupInvalidationSubscription = undefined;
|
||||
}
|
||||
|
||||
this.node.internalDeleteCoValue(this.id);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -706,7 +706,10 @@ export class SyncManager {
|
||||
|
||||
const syncedPeers = [];
|
||||
|
||||
if (from !== "storage" && Object.keys(contentToStore.new).length > 0) {
|
||||
const hasNewContent =
|
||||
contentToStore.header || Object.keys(contentToStore.new).length > 0;
|
||||
|
||||
if (from !== "storage" && hasNewContent) {
|
||||
this.storeContent(contentToStore);
|
||||
}
|
||||
|
||||
|
||||
215
packages/cojson/src/tests/coValueContentMessage.test.ts
Normal file
215
packages/cojson/src/tests/coValueContentMessage.test.ts
Normal file
@@ -0,0 +1,215 @@
|
||||
import { describe, expect, test } from "vitest";
|
||||
import { knownStateFromContent } from "../coValueContentMessage.js";
|
||||
import { emptyKnownState } from "../sync.js";
|
||||
import type { NewContentMessage } from "../sync.js";
|
||||
import type { RawCoID, SessionID } from "../ids.js";
|
||||
import { stableStringify } from "../jsonStringify.js";
|
||||
import { CO_VALUE_PRIORITY } from "../priority.js";
|
||||
|
||||
describe("knownStateFromContent", () => {
|
||||
const mockCoID: RawCoID = "co_z1234567890abcdef";
|
||||
const mockSessionID1: SessionID = "sealer_z123/signer_z456_session_z789";
|
||||
const mockSessionID2: SessionID = "sealer_zabc/signer_zdef_session_zghi";
|
||||
|
||||
test("returns empty known state for content with no header and no sessions", () => {
|
||||
const content: NewContentMessage = {
|
||||
action: "content",
|
||||
id: mockCoID,
|
||||
header: undefined,
|
||||
priority: CO_VALUE_PRIORITY.HIGH,
|
||||
new: {},
|
||||
};
|
||||
|
||||
const result = knownStateFromContent(content);
|
||||
const expected = emptyKnownState(mockCoID);
|
||||
|
||||
expect(result).toEqual(expected);
|
||||
expect(result.id).toBe(mockCoID);
|
||||
expect(result.header).toBe(false);
|
||||
expect(result.sessions).toEqual({});
|
||||
});
|
||||
|
||||
test("sets header to true when content has header", () => {
|
||||
const content: NewContentMessage = {
|
||||
action: "content",
|
||||
id: mockCoID,
|
||||
header: {
|
||||
type: "comap",
|
||||
ruleset: { type: "unsafeAllowAll" },
|
||||
meta: null,
|
||||
uniqueness: null,
|
||||
createdAt: null,
|
||||
},
|
||||
priority: CO_VALUE_PRIORITY.HIGH,
|
||||
new: {},
|
||||
};
|
||||
|
||||
const result = knownStateFromContent(content);
|
||||
|
||||
expect(result.header).toBe(true);
|
||||
expect(result.id).toBe(mockCoID);
|
||||
expect(result.sessions).toEqual({});
|
||||
});
|
||||
|
||||
test("sets header to false when content has no header", () => {
|
||||
const content: NewContentMessage = {
|
||||
action: "content",
|
||||
id: mockCoID,
|
||||
priority: CO_VALUE_PRIORITY.HIGH,
|
||||
new: {},
|
||||
};
|
||||
|
||||
const result = knownStateFromContent(content);
|
||||
|
||||
expect(result.header).toBe(false);
|
||||
expect(result.id).toBe(mockCoID);
|
||||
expect(result.sessions).toEqual({});
|
||||
});
|
||||
|
||||
test("calculates session states correctly for single session", () => {
|
||||
const content: NewContentMessage = {
|
||||
action: "content",
|
||||
id: mockCoID,
|
||||
header: {
|
||||
type: "comap",
|
||||
ruleset: { type: "unsafeAllowAll" },
|
||||
meta: null,
|
||||
uniqueness: null,
|
||||
createdAt: null,
|
||||
},
|
||||
priority: CO_VALUE_PRIORITY.HIGH,
|
||||
new: {
|
||||
[mockSessionID1]: {
|
||||
after: 5,
|
||||
newTransactions: [
|
||||
{
|
||||
privacy: "trusting",
|
||||
madeAt: Date.now(),
|
||||
changes: stableStringify([]),
|
||||
},
|
||||
{
|
||||
privacy: "trusting",
|
||||
madeAt: Date.now(),
|
||||
changes: stableStringify([]),
|
||||
},
|
||||
{
|
||||
privacy: "trusting",
|
||||
madeAt: Date.now(),
|
||||
changes: stableStringify([]),
|
||||
},
|
||||
],
|
||||
lastSignature: "signature_z1234",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const result = knownStateFromContent(content);
|
||||
|
||||
expect(result.header).toBe(true);
|
||||
expect(result.sessions[mockSessionID1]).toBe(8); // 5 + 3
|
||||
expect(Object.keys(result.sessions)).toHaveLength(1);
|
||||
});
|
||||
|
||||
test("calculates session states correctly for multiple sessions", () => {
|
||||
const content: NewContentMessage = {
|
||||
action: "content",
|
||||
id: mockCoID,
|
||||
priority: CO_VALUE_PRIORITY.HIGH,
|
||||
new: {
|
||||
[mockSessionID1]: {
|
||||
after: 3,
|
||||
newTransactions: [
|
||||
{
|
||||
privacy: "trusting",
|
||||
madeAt: Date.now(),
|
||||
changes: stableStringify([]),
|
||||
},
|
||||
{
|
||||
privacy: "trusting",
|
||||
madeAt: Date.now(),
|
||||
changes: stableStringify([]),
|
||||
},
|
||||
],
|
||||
lastSignature: "signature_z1234",
|
||||
},
|
||||
[mockSessionID2]: {
|
||||
after: 7,
|
||||
newTransactions: [
|
||||
{
|
||||
privacy: "trusting",
|
||||
madeAt: Date.now(),
|
||||
changes: stableStringify([]),
|
||||
},
|
||||
{
|
||||
privacy: "trusting",
|
||||
madeAt: Date.now(),
|
||||
changes: stableStringify([]),
|
||||
},
|
||||
{
|
||||
privacy: "trusting",
|
||||
madeAt: Date.now(),
|
||||
changes: stableStringify([]),
|
||||
},
|
||||
{
|
||||
privacy: "trusting",
|
||||
madeAt: Date.now(),
|
||||
changes: stableStringify([]),
|
||||
},
|
||||
],
|
||||
lastSignature: "signature_z1234",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const result = knownStateFromContent(content);
|
||||
|
||||
expect(result.header).toBe(false);
|
||||
expect(result.sessions[mockSessionID1]).toBe(5); // 3 + 2
|
||||
expect(result.sessions[mockSessionID2]).toBe(11); // 7 + 4
|
||||
expect(Object.keys(result.sessions)).toHaveLength(2);
|
||||
});
|
||||
|
||||
test("handles session with no transactions", () => {
|
||||
const content: NewContentMessage = {
|
||||
action: "content",
|
||||
id: mockCoID,
|
||||
priority: CO_VALUE_PRIORITY.HIGH,
|
||||
new: {
|
||||
[mockSessionID1]: {
|
||||
after: 10,
|
||||
newTransactions: [],
|
||||
lastSignature: "signature_z1234",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const result = knownStateFromContent(content);
|
||||
|
||||
expect(result.sessions[mockSessionID1]).toBe(10); // 10 + 0
|
||||
});
|
||||
|
||||
test("handles session with after index 0", () => {
|
||||
const content: NewContentMessage = {
|
||||
action: "content",
|
||||
id: mockCoID,
|
||||
priority: CO_VALUE_PRIORITY.HIGH,
|
||||
new: {
|
||||
[mockSessionID1]: {
|
||||
after: 0,
|
||||
newTransactions: [
|
||||
{
|
||||
privacy: "trusting",
|
||||
madeAt: Date.now(),
|
||||
changes: stableStringify([]),
|
||||
},
|
||||
],
|
||||
lastSignature: "signature_z1234",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const result = knownStateFromContent(content);
|
||||
|
||||
expect(result.sessions[mockSessionID1]).toBe(1); // 0 + 1
|
||||
});
|
||||
});
|
||||
@@ -163,12 +163,10 @@ describe("sync after the garbage collector has run", () => {
|
||||
"edge -> storage | LOAD Map sessions: empty",
|
||||
"storage -> edge | CONTENT Group header: true new: After: 0 New: 5",
|
||||
"storage -> edge | CONTENT Map header: true new: After: 0 New: 1",
|
||||
"edge -> server | CONTENT Map header: true new: ",
|
||||
"edge -> client | CONTENT Group header: true new: After: 0 New: 5",
|
||||
"edge -> client | CONTENT Map header: true new: After: 0 New: 1",
|
||||
"server -> edge | KNOWN Map sessions: header/1",
|
||||
"server -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
||||
"server -> edge | KNOWN Map sessions: header/1",
|
||||
"client -> edge | KNOWN Group sessions: header/5",
|
||||
"client -> edge | KNOWN Map sessions: header/1",
|
||||
]
|
||||
|
||||
@@ -973,7 +973,6 @@ describe("loading coValues from server", () => {
|
||||
"server -> client | KNOWN Group sessions: header/6",
|
||||
"server -> client | KNOWN ParentGroup sessions: header/8",
|
||||
"server -> client | KNOWN Map sessions: header/1",
|
||||
"client -> server | CONTENT ParentGroup header: true new: ",
|
||||
]
|
||||
`);
|
||||
});
|
||||
|
||||
@@ -132,6 +132,10 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
||||
|
||||
group.extend(parentGroup);
|
||||
|
||||
// We wait for sync here to avoid flakiness on CI
|
||||
await parentGroup.core.waitForSync();
|
||||
await group.core.waitForSync();
|
||||
|
||||
const map = group.createMap();
|
||||
map.set("hello", "world");
|
||||
|
||||
@@ -154,19 +158,17 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
||||
"edge-france -> core | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
||||
"edge-france -> storage | CONTENT Group header: false new: After: 3 New: 2",
|
||||
"edge-france -> core | CONTENT Group header: false new: After: 3 New: 2",
|
||||
"edge-france -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
||||
"edge-france -> core | CONTENT Map header: true new: After: 0 New: 1",
|
||||
"core -> edge-france | KNOWN Group sessions: header/3",
|
||||
"core -> storage | CONTENT Group header: true new: After: 0 New: 3",
|
||||
"core -> edge-france | KNOWN ParentGroup sessions: header/6",
|
||||
"core -> storage | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
||||
"core -> edge-france | KNOWN Group sessions: header/5",
|
||||
"core -> storage | CONTENT Group header: false new: After: 3 New: 2",
|
||||
"edge-france -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
||||
"edge-france -> core | CONTENT Map header: true new: After: 0 New: 1",
|
||||
"core -> edge-france | KNOWN Map sessions: header/1",
|
||||
"core -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
||||
"edge-france -> core | CONTENT ParentGroup header: true new: ",
|
||||
"client -> edge-italy | LOAD Map sessions: empty",
|
||||
"core -> edge-france | KNOWN ParentGroup sessions: header/6",
|
||||
"edge-italy -> storage | LOAD Map sessions: empty",
|
||||
"storage -> edge-italy | KNOWN Map sessions: empty",
|
||||
"edge-italy -> core | LOAD Map sessions: empty",
|
||||
@@ -588,11 +590,9 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
||||
"client -> edge | KNOWN Group sessions: header/5",
|
||||
"client -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
||||
"client -> edge | KNOWN Map sessions: header/0",
|
||||
"client -> storage | CONTENT Map header: true new: ",
|
||||
"client -> edge | KNOWN Map sessions: header/41",
|
||||
"client -> storage | CONTENT Map header: false new: After: 0 New: 41",
|
||||
"storage -> client | KNOWN CORRECTION Map sessions: empty",
|
||||
"client -> storage | CONTENT Map header: true new: expectContentUntil: header/100",
|
||||
"client -> storage | CONTENT Map header: false new: After: 0 New: 41",
|
||||
"storage -> edge | CONTENT Map header: true new: After: 41 New: 21",
|
||||
"edge -> client | CONTENT Map header: false new: After: 41 New: 21",
|
||||
"edge -> core | CONTENT Group header: true new: After: 0 New: 5",
|
||||
@@ -607,11 +607,9 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
||||
"core -> edge | KNOWN Group sessions: header/5",
|
||||
"core -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
||||
"core -> edge | KNOWN Map sessions: header/0",
|
||||
"core -> storage | CONTENT Map header: true new: ",
|
||||
"core -> edge | KNOWN Map sessions: header/41",
|
||||
"core -> storage | CONTENT Map header: false new: After: 0 New: 41",
|
||||
"storage -> core | KNOWN CORRECTION Map sessions: empty",
|
||||
"core -> storage | CONTENT Map header: true new: expectContentUntil: header/100",
|
||||
"core -> storage | CONTENT Map header: false new: After: 0 New: 41",
|
||||
"core -> edge | KNOWN Map sessions: header/62",
|
||||
"core -> storage | CONTENT Map header: false new: After: 41 New: 21",
|
||||
"core -> edge | KNOWN Map sessions: header/83",
|
||||
|
||||
@@ -47,8 +47,6 @@ describe("peer reconciliation", () => {
|
||||
"server -> client | KNOWN Map sessions: empty",
|
||||
"server -> client | KNOWN Group sessions: header/3",
|
||||
"server -> client | KNOWN Map sessions: header/1",
|
||||
"client -> server | CONTENT Group header: true new: ",
|
||||
"client -> server | CONTENT Map header: true new: ",
|
||||
]
|
||||
`);
|
||||
});
|
||||
|
||||
@@ -555,4 +555,53 @@ describe("client syncs with a server with storage", () => {
|
||||
]
|
||||
`);
|
||||
});
|
||||
|
||||
test("should store values with no transactions", async () => {
|
||||
const alice = setupTestNode({
|
||||
connected: true,
|
||||
});
|
||||
const group = alice.node.createGroup();
|
||||
group.addMember("everyone", "writer");
|
||||
const map = group.createMap();
|
||||
|
||||
await map.core.waitForSync();
|
||||
|
||||
const bob = setupTestNode();
|
||||
bob.connectToSyncServer({
|
||||
ourName: "bob",
|
||||
});
|
||||
const { storage } = bob.addStorage({
|
||||
ourName: "bob",
|
||||
});
|
||||
|
||||
SyncMessagesLog.clear(); // We want to focus on the sync messages happening from now
|
||||
|
||||
await loadCoValueOrFail(bob.node, map.id);
|
||||
|
||||
// The map should be stored in bob's storage
|
||||
expect(storage.getKnownState(map.id)).toEqual({
|
||||
header: true,
|
||||
id: map.id,
|
||||
sessions: {},
|
||||
});
|
||||
|
||||
expect(
|
||||
SyncMessagesLog.getMessages({
|
||||
Group: group.core,
|
||||
Map: map.core,
|
||||
}),
|
||||
).toMatchInlineSnapshot(`
|
||||
[
|
||||
"bob -> storage | LOAD Map sessions: empty",
|
||||
"storage -> bob | KNOWN Map sessions: empty",
|
||||
"bob -> server | LOAD Map sessions: empty",
|
||||
"server -> bob | CONTENT Group header: true new: After: 0 New: 5",
|
||||
"server -> bob | CONTENT Map header: true new: ",
|
||||
"bob -> server | KNOWN Group sessions: header/5",
|
||||
"bob -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
||||
"bob -> server | KNOWN Map sessions: header/0",
|
||||
"bob -> storage | CONTENT Map header: true new: ",
|
||||
]
|
||||
`);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -86,7 +86,6 @@ describe("client to server upload", () => {
|
||||
"server -> client | KNOWN ParentGroup sessions: header/6",
|
||||
"server -> client | KNOWN Group sessions: header/5",
|
||||
"server -> client | KNOWN Map sessions: header/1",
|
||||
"client -> server | CONTENT ParentGroup header: true new: ",
|
||||
]
|
||||
`);
|
||||
});
|
||||
|
||||
@@ -1,5 +1,31 @@
|
||||
# jazz-react
|
||||
|
||||
## 0.17.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [71c1411]
|
||||
- Updated dependencies [2d11d44]
|
||||
- Updated dependencies [5963658]
|
||||
- cojson@0.17.5
|
||||
- jazz-tools@0.17.5
|
||||
|
||||
## 0.17.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [7dd3d00]
|
||||
- jazz-tools@0.17.4
|
||||
- cojson@0.17.4
|
||||
|
||||
## 0.17.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f0c73d9]
|
||||
- cojson@0.17.3
|
||||
- jazz-tools@0.17.3
|
||||
|
||||
## 0.17.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "community-jazz-vue",
|
||||
"version": "0.17.2",
|
||||
"version": "0.17.5",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.ts",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# create-jazz-app
|
||||
|
||||
## 0.1.26
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 86bd87e: Replace catalog entries on package.json with their current catalog value
|
||||
|
||||
## 0.1.25
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"types": "src/index.ts",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"version": "0.1.25",
|
||||
"version": "0.1.26",
|
||||
"bin": {
|
||||
"create-jazz-app": "./dist/index.js"
|
||||
},
|
||||
@@ -14,14 +14,15 @@
|
||||
"commander": "^11.0.0",
|
||||
"degit": "^2.8.4",
|
||||
"inquirer": "^9.2.10",
|
||||
"ora": "^7.0.1"
|
||||
"ora": "^7.0.1",
|
||||
"yaml": "^2.3.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/degit": "^2.8.3",
|
||||
"@types/gradient-string": "^1.1.2",
|
||||
"@types/inquirer": "^9.0.3",
|
||||
"typescript": "catalog:",
|
||||
"vitest": "catalog:"
|
||||
"typescript": "catalog:default",
|
||||
"vitest": "catalog:default"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "tsc --watch",
|
||||
|
||||
75
packages/create-jazz-app/src/catalog.ts
Normal file
75
packages/create-jazz-app/src/catalog.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
import fs from "fs";
|
||||
import path from "path";
|
||||
import chalk from "chalk";
|
||||
import YAML from "yaml";
|
||||
|
||||
type CatalogDefinitions = {
|
||||
[catalogName: string]: Record<string, string>;
|
||||
};
|
||||
|
||||
export function findWorkspaceRoot(): string {
|
||||
let currentDir = process.cwd();
|
||||
|
||||
while (currentDir !== path.dirname(currentDir)) {
|
||||
const workspaceFile = path.join(currentDir, "pnpm-workspace.yaml");
|
||||
if (fs.existsSync(workspaceFile)) {
|
||||
return currentDir;
|
||||
}
|
||||
currentDir = path.dirname(currentDir);
|
||||
}
|
||||
|
||||
throw new Error("Could not find pnpm-workspace.yaml in any parent directory");
|
||||
}
|
||||
|
||||
export function parseCatalogDefinitions(): CatalogDefinitions {
|
||||
try {
|
||||
const workspaceRoot = findWorkspaceRoot();
|
||||
const workspaceFile = path.join(workspaceRoot, "pnpm-workspace.yaml");
|
||||
const workspaceContent = fs.readFileSync(workspaceFile, "utf8");
|
||||
const workspaceConfig = YAML.parse(workspaceContent);
|
||||
|
||||
return workspaceConfig.catalogs || {};
|
||||
} catch (error) {
|
||||
console.warn(
|
||||
chalk.yellow(
|
||||
"Warning: Could not parse pnpm-workspace.yaml, catalog dependencies will not be resolved",
|
||||
),
|
||||
);
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
export function resolveCatalogVersion(
|
||||
packageName: string,
|
||||
catalogRef: string,
|
||||
catalogs: CatalogDefinitions,
|
||||
): string | null {
|
||||
// Parse catalog reference: "catalog:" uses default, "catalog:react" uses react catalog
|
||||
const catalogName = catalogRef.startsWith("catalog:")
|
||||
? catalogRef.slice(8) || "default"
|
||||
: null;
|
||||
|
||||
if (!catalogName) return null;
|
||||
|
||||
const catalog = catalogs[catalogName];
|
||||
if (!catalog) {
|
||||
console.warn(
|
||||
chalk.yellow(
|
||||
`Warning: Catalog "${catalogName}" not found in pnpm-workspace.yaml`,
|
||||
),
|
||||
);
|
||||
return null;
|
||||
}
|
||||
|
||||
const version = catalog[packageName];
|
||||
if (!version) {
|
||||
console.warn(
|
||||
chalk.yellow(
|
||||
`Warning: Package "${packageName}" not found in catalog "${catalogName}"`,
|
||||
),
|
||||
);
|
||||
return null;
|
||||
}
|
||||
|
||||
return version;
|
||||
}
|
||||
@@ -17,6 +17,7 @@ import {
|
||||
frameworks,
|
||||
} from "./config.js";
|
||||
import { type PackageManager, getPkgManager } from "./utils.js";
|
||||
import { parseCatalogDefinitions, resolveCatalogVersion } from "./catalog.js";
|
||||
|
||||
// Handle SIGINT (Ctrl+C) gracefully
|
||||
process.on("SIGINT", () => {
|
||||
@@ -176,7 +177,10 @@ async function scaffoldProject({
|
||||
const packageJsonPath = `${projectName}/package.json`;
|
||||
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
||||
|
||||
// Helper function to update workspace dependencies
|
||||
// Parse catalog definitions once
|
||||
const catalogs = parseCatalogDefinitions();
|
||||
|
||||
// Helper function to update workspace and catalog dependencies
|
||||
async function updateWorkspaceDependencies(
|
||||
dependencyType: "dependencies" | "devDependencies",
|
||||
) {
|
||||
@@ -187,8 +191,27 @@ async function scaffoldProject({
|
||||
|
||||
Object.entries(packageJson[dependencyType]).forEach(
|
||||
([pkg, version]) => {
|
||||
if (typeof version === "string" && version.includes("workspace:")) {
|
||||
packageJson[dependencyType][pkg] = latestVersions[pkg];
|
||||
if (typeof version === "string") {
|
||||
if (version.includes("workspace:")) {
|
||||
// Handle workspace: dependencies
|
||||
packageJson[dependencyType][pkg] = latestVersions[pkg];
|
||||
} else if (version.startsWith("catalog:")) {
|
||||
// Handle catalog: dependencies
|
||||
const resolvedVersion = resolveCatalogVersion(
|
||||
pkg,
|
||||
version,
|
||||
catalogs,
|
||||
);
|
||||
if (resolvedVersion) {
|
||||
packageJson[dependencyType][pkg] = resolvedVersion;
|
||||
} else {
|
||||
console.warn(
|
||||
chalk.yellow(
|
||||
`Warning: Could not resolve catalog dependency "${pkg}": "${version}"`,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
224
packages/create-jazz-app/tests/catalog-resolution.test.ts
Normal file
224
packages/create-jazz-app/tests/catalog-resolution.test.ts
Normal file
@@ -0,0 +1,224 @@
|
||||
import fs from "fs";
|
||||
import path from "path";
|
||||
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
||||
import YAML from "yaml";
|
||||
import {
|
||||
findWorkspaceRoot,
|
||||
parseCatalogDefinitions,
|
||||
resolveCatalogVersion,
|
||||
} from "../src/catalog.js";
|
||||
|
||||
describe("Catalog Resolution", () => {
|
||||
let mockWorkspaceRoot: string;
|
||||
let mockWorkspaceFile: string;
|
||||
|
||||
beforeEach(() => {
|
||||
// Create a temporary workspace structure for testing
|
||||
mockWorkspaceRoot = path.join(__dirname, "mock-workspace");
|
||||
mockWorkspaceFile = path.join(mockWorkspaceRoot, "pnpm-workspace.yaml");
|
||||
|
||||
if (!fs.existsSync(mockWorkspaceRoot)) {
|
||||
fs.mkdirSync(mockWorkspaceRoot, { recursive: true });
|
||||
}
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// Clean up mock workspace
|
||||
if (fs.existsSync(mockWorkspaceRoot)) {
|
||||
fs.rmSync(mockWorkspaceRoot, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
// Helper function to create a mock workspace file
|
||||
function createMockWorkspace(
|
||||
catalogs: Record<string, Record<string, string>>,
|
||||
) {
|
||||
const workspaceConfig = {
|
||||
packages: ["packages/*"],
|
||||
catalogs,
|
||||
};
|
||||
fs.writeFileSync(mockWorkspaceFile, YAML.stringify(workspaceConfig));
|
||||
}
|
||||
|
||||
describe("findWorkspaceRoot", () => {
|
||||
it("should find workspace root when run from workspace directory", () => {
|
||||
createMockWorkspace({});
|
||||
const originalCwd = process.cwd();
|
||||
|
||||
try {
|
||||
process.chdir(mockWorkspaceRoot);
|
||||
const result = findWorkspaceRoot();
|
||||
expect(result).toBe(mockWorkspaceRoot);
|
||||
} finally {
|
||||
process.chdir(originalCwd);
|
||||
}
|
||||
});
|
||||
|
||||
it("should find workspace root when run from subdirectory", () => {
|
||||
createMockWorkspace({});
|
||||
const subDir = path.join(mockWorkspaceRoot, "packages", "test");
|
||||
fs.mkdirSync(subDir, { recursive: true });
|
||||
const originalCwd = process.cwd();
|
||||
|
||||
try {
|
||||
process.chdir(subDir);
|
||||
const result = findWorkspaceRoot();
|
||||
expect(result).toBe(mockWorkspaceRoot);
|
||||
} finally {
|
||||
process.chdir(originalCwd);
|
||||
}
|
||||
});
|
||||
|
||||
it("should throw error when no workspace found", () => {
|
||||
// Start from filesystem root to ensure no workspace file is found
|
||||
const fsRoot = path.parse(process.cwd()).root;
|
||||
const originalCwd = process.cwd();
|
||||
|
||||
try {
|
||||
process.chdir(fsRoot);
|
||||
expect(() => findWorkspaceRoot()).toThrow(
|
||||
"Could not find pnpm-workspace.yaml in any parent directory",
|
||||
);
|
||||
} finally {
|
||||
process.chdir(originalCwd);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("parseCatalogDefinitions", () => {
|
||||
it("should parse catalog definitions correctly", () => {
|
||||
const mockCatalogs = {
|
||||
default: {
|
||||
typescript: "5.6.2",
|
||||
vite: "6.3.5",
|
||||
},
|
||||
react: {
|
||||
react: "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
},
|
||||
};
|
||||
|
||||
createMockWorkspace(mockCatalogs);
|
||||
const originalCwd = process.cwd();
|
||||
|
||||
try {
|
||||
process.chdir(mockWorkspaceRoot);
|
||||
const result = parseCatalogDefinitions();
|
||||
expect(result).toEqual(mockCatalogs);
|
||||
} finally {
|
||||
process.chdir(originalCwd);
|
||||
}
|
||||
});
|
||||
|
||||
it("should return empty object when no catalogs defined", () => {
|
||||
createMockWorkspace({});
|
||||
const originalCwd = process.cwd();
|
||||
|
||||
try {
|
||||
process.chdir(mockWorkspaceRoot);
|
||||
const result = parseCatalogDefinitions();
|
||||
expect(result).toEqual({});
|
||||
} finally {
|
||||
process.chdir(originalCwd);
|
||||
}
|
||||
});
|
||||
|
||||
it("should return empty object when file doesn't exist", () => {
|
||||
const originalCwd = process.cwd();
|
||||
const fsRoot = path.parse(process.cwd()).root;
|
||||
|
||||
try {
|
||||
process.chdir(fsRoot);
|
||||
const result = parseCatalogDefinitions();
|
||||
expect(result).toEqual({});
|
||||
} finally {
|
||||
process.chdir(originalCwd);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("resolveCatalogVersion", () => {
|
||||
const mockCatalogs = {
|
||||
default: {
|
||||
typescript: "5.6.2",
|
||||
vite: "6.3.5",
|
||||
vitest: "3.2.4",
|
||||
},
|
||||
react: {
|
||||
react: "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"@types/react": "19.1.0",
|
||||
},
|
||||
rn: {
|
||||
"react-native": "0.80.0",
|
||||
react: "19.1.0",
|
||||
},
|
||||
};
|
||||
|
||||
it("should resolve catalog: to default catalog", () => {
|
||||
const result = resolveCatalogVersion(
|
||||
"typescript",
|
||||
"catalog:",
|
||||
mockCatalogs,
|
||||
);
|
||||
expect(result).toBe("5.6.2");
|
||||
});
|
||||
|
||||
it("should resolve catalog:default explicitly", () => {
|
||||
const result = resolveCatalogVersion(
|
||||
"vite",
|
||||
"catalog:default",
|
||||
mockCatalogs,
|
||||
);
|
||||
expect(result).toBe("6.3.5");
|
||||
});
|
||||
|
||||
it("should resolve specific catalog references", () => {
|
||||
const reactResult = resolveCatalogVersion(
|
||||
"react",
|
||||
"catalog:react",
|
||||
mockCatalogs,
|
||||
);
|
||||
expect(reactResult).toBe("19.1.0");
|
||||
|
||||
const rnResult = resolveCatalogVersion(
|
||||
"react-native",
|
||||
"catalog:rn",
|
||||
mockCatalogs,
|
||||
);
|
||||
expect(rnResult).toBe("0.80.0");
|
||||
});
|
||||
|
||||
it("should return null for non-catalog references", () => {
|
||||
const result = resolveCatalogVersion("react", "^19.0.0", mockCatalogs);
|
||||
expect(result).toBeNull();
|
||||
});
|
||||
|
||||
it("should return null for missing catalog", () => {
|
||||
const result = resolveCatalogVersion(
|
||||
"react",
|
||||
"catalog:nonexistent",
|
||||
mockCatalogs,
|
||||
);
|
||||
expect(result).toBeNull();
|
||||
});
|
||||
|
||||
it("should return null for missing package in catalog", () => {
|
||||
const result = resolveCatalogVersion(
|
||||
"nonexistent",
|
||||
"catalog:react",
|
||||
mockCatalogs,
|
||||
);
|
||||
expect(result).toBeNull();
|
||||
});
|
||||
|
||||
it("should handle scoped package names", () => {
|
||||
const result = resolveCatalogVersion(
|
||||
"@types/react",
|
||||
"catalog:react",
|
||||
mockCatalogs,
|
||||
);
|
||||
expect(result).toBe("19.1.0");
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -2,6 +2,7 @@ import { execSync } from "child_process";
|
||||
import fs from "fs";
|
||||
import path from "path";
|
||||
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
||||
import YAML from "yaml";
|
||||
|
||||
describe("End-to-End CLI Tests", () => {
|
||||
const testDir = path.join(__dirname, "..", "test-temp");
|
||||
@@ -85,4 +86,210 @@ describe("End-to-End CLI Tests", () => {
|
||||
console.log("CLI executed successfully");
|
||||
}
|
||||
});
|
||||
|
||||
describe("Catalog Dependency Resolution", () => {
|
||||
let mockProjectDir: string;
|
||||
let mockWorkspaceRoot: string;
|
||||
|
||||
beforeEach(() => {
|
||||
mockProjectDir = path.join(testDir, "test-project");
|
||||
mockWorkspaceRoot = path.join(testDir, "workspace");
|
||||
|
||||
// Create mock workspace structure
|
||||
fs.mkdirSync(mockWorkspaceRoot, { recursive: true });
|
||||
fs.mkdirSync(mockProjectDir, { recursive: true });
|
||||
});
|
||||
|
||||
function createMockWorkspace(
|
||||
catalogs: Record<string, Record<string, string>>,
|
||||
) {
|
||||
const workspaceConfig = {
|
||||
packages: ["packages/*"],
|
||||
catalogs,
|
||||
};
|
||||
const workspaceFile = path.join(mockWorkspaceRoot, "pnpm-workspace.yaml");
|
||||
fs.writeFileSync(workspaceFile, YAML.stringify(workspaceConfig));
|
||||
}
|
||||
|
||||
function createMockPackageJson(
|
||||
dependencies: Record<string, string>,
|
||||
devDependencies?: Record<string, string>,
|
||||
) {
|
||||
const packageJson = {
|
||||
name: "test-project",
|
||||
version: "1.0.0",
|
||||
dependencies,
|
||||
...(devDependencies && { devDependencies }),
|
||||
};
|
||||
const packageJsonPath = path.join(mockProjectDir, "package.json");
|
||||
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
||||
return packageJsonPath;
|
||||
}
|
||||
|
||||
it("should resolve catalog: dependencies to default catalog versions", async () => {
|
||||
// Create mock workspace with catalogs
|
||||
createMockWorkspace({
|
||||
default: {
|
||||
typescript: "5.6.2",
|
||||
vite: "6.3.5",
|
||||
},
|
||||
});
|
||||
|
||||
// Create package.json with catalog dependencies
|
||||
const packageJsonPath = createMockPackageJson(
|
||||
{ "some-regular-dep": "^1.0.0" },
|
||||
{
|
||||
typescript: "catalog:",
|
||||
vite: "catalog:default",
|
||||
},
|
||||
);
|
||||
|
||||
// Test the catalog resolution logic by verifying the workspace structure
|
||||
const workspaceContent = fs.readFileSync(
|
||||
path.join(mockWorkspaceRoot, "pnpm-workspace.yaml"),
|
||||
"utf8",
|
||||
);
|
||||
const workspaceConfig = YAML.parse(workspaceContent);
|
||||
const catalogs = workspaceConfig.catalogs || {};
|
||||
|
||||
// Test catalog resolution logic
|
||||
const typescriptVersion = catalogs.default?.typescript;
|
||||
const viteVersion = catalogs.default?.vite;
|
||||
|
||||
expect(typescriptVersion).toBe("5.6.2");
|
||||
expect(viteVersion).toBe("6.3.5");
|
||||
|
||||
// Verify the workspace file was created correctly
|
||||
const workspaceFile = path.join(mockWorkspaceRoot, "pnpm-workspace.yaml");
|
||||
expect(fs.existsSync(workspaceFile)).toBe(true);
|
||||
|
||||
expect(workspaceConfig.catalogs.default.typescript).toBe("5.6.2");
|
||||
expect(workspaceConfig.catalogs.default.vite).toBe("6.3.5");
|
||||
});
|
||||
|
||||
it("should resolve catalog:react dependencies to react catalog versions", async () => {
|
||||
createMockWorkspace({
|
||||
react: {
|
||||
react: "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"@types/react": "19.1.0",
|
||||
},
|
||||
});
|
||||
|
||||
createMockPackageJson({
|
||||
react: "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
});
|
||||
|
||||
const workspaceFile = path.join(mockWorkspaceRoot, "pnpm-workspace.yaml");
|
||||
const workspaceContent = fs.readFileSync(workspaceFile, "utf8");
|
||||
const workspaceConfig = YAML.parse(workspaceContent);
|
||||
|
||||
expect(workspaceConfig.catalogs.react.react).toBe("19.1.0");
|
||||
expect(workspaceConfig.catalogs.react["react-dom"]).toBe("19.1.0");
|
||||
expect(workspaceConfig.catalogs.react["@types/react"]).toBe("19.1.0");
|
||||
});
|
||||
|
||||
it("should handle multiple catalog types (rn, expo)", async () => {
|
||||
createMockWorkspace({
|
||||
rn: {
|
||||
"react-native": "0.80.0",
|
||||
react: "19.1.0",
|
||||
},
|
||||
expo: {
|
||||
"react-native": "0.81.0",
|
||||
expo: "54.0.0-canary-20250701-6a945c5",
|
||||
"expo-crypto": "~14.1.5",
|
||||
},
|
||||
});
|
||||
|
||||
createMockPackageJson({
|
||||
"react-native": "catalog:rn",
|
||||
expo: "catalog:expo",
|
||||
"expo-crypto": "catalog:expo",
|
||||
});
|
||||
|
||||
const workspaceFile = path.join(mockWorkspaceRoot, "pnpm-workspace.yaml");
|
||||
const workspaceContent = fs.readFileSync(workspaceFile, "utf8");
|
||||
const workspaceConfig = YAML.parse(workspaceContent);
|
||||
|
||||
expect(workspaceConfig.catalogs.rn["react-native"]).toBe("0.80.0");
|
||||
expect(workspaceConfig.catalogs.expo.expo).toBe(
|
||||
"54.0.0-canary-20250701-6a945c5",
|
||||
);
|
||||
expect(workspaceConfig.catalogs.expo["expo-crypto"]).toBe("~14.1.5");
|
||||
});
|
||||
|
||||
it("should handle mixed workspace: and catalog: dependencies", async () => {
|
||||
createMockWorkspace({
|
||||
default: {
|
||||
typescript: "5.6.2",
|
||||
},
|
||||
react: {
|
||||
react: "19.1.0",
|
||||
},
|
||||
});
|
||||
|
||||
createMockPackageJson(
|
||||
{
|
||||
"some-workspace-dep": "workspace:*",
|
||||
react: "catalog:react",
|
||||
"regular-dep": "^1.0.0",
|
||||
},
|
||||
{
|
||||
typescript: "catalog:",
|
||||
"dev-workspace-dep": "workspace:^",
|
||||
},
|
||||
);
|
||||
|
||||
// Verify the structure is set up correctly for testing
|
||||
const packageJsonPath = path.join(mockProjectDir, "package.json");
|
||||
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
||||
|
||||
expect(packageJson.dependencies.react).toBe("catalog:react");
|
||||
expect(packageJson.dependencies["some-workspace-dep"]).toBe(
|
||||
"workspace:*",
|
||||
);
|
||||
expect(packageJson.devDependencies.typescript).toBe("catalog:");
|
||||
expect(packageJson.devDependencies["dev-workspace-dep"]).toBe(
|
||||
"workspace:^",
|
||||
);
|
||||
});
|
||||
|
||||
it("should gracefully handle missing catalogs", async () => {
|
||||
createMockWorkspace({
|
||||
default: {
|
||||
typescript: "5.6.2",
|
||||
},
|
||||
});
|
||||
|
||||
createMockPackageJson({
|
||||
react: "catalog:nonexistent",
|
||||
typescript: "catalog:",
|
||||
});
|
||||
|
||||
// Test that the workspace file doesn't contain the nonexistent catalog
|
||||
const workspaceFile = path.join(mockWorkspaceRoot, "pnpm-workspace.yaml");
|
||||
const workspaceContent = fs.readFileSync(workspaceFile, "utf8");
|
||||
const workspaceConfig = YAML.parse(workspaceContent);
|
||||
|
||||
expect(workspaceConfig.catalogs.nonexistent).toBeUndefined();
|
||||
expect(workspaceConfig.catalogs.default.typescript).toBe("5.6.2");
|
||||
});
|
||||
|
||||
it("should handle empty catalogs gracefully", async () => {
|
||||
createMockWorkspace({});
|
||||
|
||||
createMockPackageJson({
|
||||
react: "catalog:",
|
||||
typescript: "catalog:default",
|
||||
});
|
||||
|
||||
const workspaceFile = path.join(mockWorkspaceRoot, "pnpm-workspace.yaml");
|
||||
const workspaceContent = fs.readFileSync(workspaceFile, "utf8");
|
||||
const workspaceConfig = YAML.parse(workspaceContent);
|
||||
|
||||
expect(Object.keys(workspaceConfig.catalogs)).toHaveLength(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"devDependencies": {
|
||||
"@types/react": "^18.3.12",
|
||||
"react": "^18.3.1",
|
||||
"typescript": "catalog:"
|
||||
"typescript": "catalog:default"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "*"
|
||||
|
||||
@@ -1,5 +1,34 @@
|
||||
# jazz-auth-betterauth
|
||||
|
||||
## 0.17.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [71c1411]
|
||||
- Updated dependencies [2d11d44]
|
||||
- Updated dependencies [5963658]
|
||||
- cojson@0.17.5
|
||||
- jazz-tools@0.17.5
|
||||
- jazz-betterauth-client-plugin@0.17.5
|
||||
|
||||
## 0.17.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [7dd3d00]
|
||||
- jazz-tools@0.17.4
|
||||
- jazz-betterauth-client-plugin@0.17.4
|
||||
- cojson@0.17.4
|
||||
|
||||
## 0.17.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f0c73d9]
|
||||
- cojson@0.17.3
|
||||
- jazz-tools@0.17.3
|
||||
- jazz-betterauth-client-plugin@0.17.3
|
||||
|
||||
## 0.17.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
{
|
||||
"name": "jazz-auth-betterauth",
|
||||
"version": "0.17.2",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.ts",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cojson": "workspace:*",
|
||||
"jazz-tools": "workspace:*",
|
||||
"jazz-betterauth-client-plugin": "workspace:*"
|
||||
},
|
||||
"scripts": {
|
||||
"format-and-lint": "biome check .",
|
||||
"format-and-lint:fix": "biome check . --write",
|
||||
"build": "rm -rf ./dist && tsc --sourceMap --outDir dist",
|
||||
"prepublishOnly": "npm run build",
|
||||
"test": "vitest --run --root ../../ --project jazz-auth-betterauth",
|
||||
"test:watch": "vitest --watch --root ../../ --project jazz-auth-betterauth"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "catalog:"
|
||||
}
|
||||
"name": "jazz-auth-betterauth",
|
||||
"version": "0.17.5",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.ts",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cojson": "workspace:*",
|
||||
"jazz-tools": "workspace:*",
|
||||
"jazz-betterauth-client-plugin": "workspace:*"
|
||||
},
|
||||
"scripts": {
|
||||
"format-and-lint": "biome check .",
|
||||
"format-and-lint:fix": "biome check . --write",
|
||||
"build": "rm -rf ./dist && tsc --sourceMap --outDir dist",
|
||||
"prepublishOnly": "npm run build",
|
||||
"test": "vitest --run --root ../../ --project jazz-auth-betterauth",
|
||||
"test:watch": "vitest --watch --root ../../ --project jazz-auth-betterauth"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,23 @@
|
||||
# jazz-betterauth-client-plugin
|
||||
|
||||
## 0.17.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-betterauth-server-plugin@0.17.5
|
||||
|
||||
## 0.17.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-betterauth-server-plugin@0.17.4
|
||||
|
||||
## 0.17.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-betterauth-server-plugin@0.17.3
|
||||
|
||||
## 0.17.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jazz-betterauth-client-plugin",
|
||||
"version": "0.17.2",
|
||||
"version": "0.17.5",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.ts",
|
||||
|
||||
@@ -1,5 +1,31 @@
|
||||
# jazz-betterauth-server-plugin
|
||||
|
||||
## 0.17.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [71c1411]
|
||||
- Updated dependencies [2d11d44]
|
||||
- Updated dependencies [5963658]
|
||||
- cojson@0.17.5
|
||||
- jazz-tools@0.17.5
|
||||
|
||||
## 0.17.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [7dd3d00]
|
||||
- jazz-tools@0.17.4
|
||||
- cojson@0.17.4
|
||||
|
||||
## 0.17.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f0c73d9]
|
||||
- cojson@0.17.3
|
||||
- jazz-tools@0.17.3
|
||||
|
||||
## 0.17.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jazz-betterauth-server-plugin",
|
||||
"version": "0.17.2",
|
||||
"version": "0.17.5",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.ts",
|
||||
|
||||
@@ -1,5 +1,37 @@
|
||||
# jazz-react-auth-betterauth
|
||||
|
||||
## 0.17.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [71c1411]
|
||||
- Updated dependencies [2d11d44]
|
||||
- Updated dependencies [5963658]
|
||||
- cojson@0.17.5
|
||||
- jazz-tools@0.17.5
|
||||
- jazz-auth-betterauth@0.17.5
|
||||
- jazz-betterauth-client-plugin@0.17.5
|
||||
|
||||
## 0.17.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [7dd3d00]
|
||||
- jazz-tools@0.17.4
|
||||
- jazz-auth-betterauth@0.17.4
|
||||
- jazz-betterauth-client-plugin@0.17.4
|
||||
- cojson@0.17.4
|
||||
|
||||
## 0.17.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f0c73d9]
|
||||
- cojson@0.17.3
|
||||
- jazz-auth-betterauth@0.17.3
|
||||
- jazz-tools@0.17.3
|
||||
- jazz-betterauth-client-plugin@0.17.3
|
||||
|
||||
## 0.17.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
{
|
||||
"name": "jazz-react-auth-betterauth",
|
||||
"version": "0.17.2",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.tsx",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cojson": "workspace:*",
|
||||
"jazz-auth-betterauth": "workspace:*",
|
||||
"jazz-betterauth-client-plugin": "workspace:*",
|
||||
"jazz-tools": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "*"
|
||||
},
|
||||
"scripts": {
|
||||
"format-and-lint": "biome check .",
|
||||
"format-and-lint:fix": "biome check . --write",
|
||||
"build": "rm -rf ./dist && tsc --sourceMap --outDir dist",
|
||||
"prepublishOnly": "npm run build"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@testing-library/react": "^16.1.0",
|
||||
"@types/react": "^17 || ^18 || ^19",
|
||||
"typescript": "catalog:"
|
||||
}
|
||||
"name": "jazz-react-auth-betterauth",
|
||||
"version": "0.17.5",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.tsx",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cojson": "workspace:*",
|
||||
"jazz-auth-betterauth": "workspace:*",
|
||||
"jazz-betterauth-client-plugin": "workspace:*",
|
||||
"jazz-tools": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "*"
|
||||
},
|
||||
"scripts": {
|
||||
"format-and-lint": "biome check .",
|
||||
"format-and-lint:fix": "biome check . --write",
|
||||
"build": "rm -rf ./dist && tsc --sourceMap --outDir dist",
|
||||
"prepublishOnly": "npm run build"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@testing-library/react": "^16.1.0",
|
||||
"@types/react": "^17 || ^18 || ^19",
|
||||
"typescript": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,37 @@
|
||||
# jazz-run
|
||||
|
||||
## 0.17.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [71c1411]
|
||||
- Updated dependencies [2d11d44]
|
||||
- Updated dependencies [5963658]
|
||||
- cojson@0.17.5
|
||||
- jazz-tools@0.17.5
|
||||
- cojson-storage-sqlite@0.17.5
|
||||
- cojson-transport-ws@0.17.5
|
||||
|
||||
## 0.17.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [7dd3d00]
|
||||
- jazz-tools@0.17.4
|
||||
- cojson@0.17.4
|
||||
- cojson-storage-sqlite@0.17.4
|
||||
- cojson-transport-ws@0.17.4
|
||||
|
||||
## 0.17.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f0c73d9]
|
||||
- cojson@0.17.3
|
||||
- cojson-storage-sqlite@0.17.3
|
||||
- cojson-transport-ws@0.17.3
|
||||
- jazz-tools@0.17.3
|
||||
|
||||
## 0.17.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"bin": "./dist/index.js",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"version": "0.17.2",
|
||||
"version": "0.17.5",
|
||||
"exports": {
|
||||
"./startSyncServer": {
|
||||
"types": "./dist/startSyncServer.d.ts",
|
||||
@@ -28,15 +28,15 @@
|
||||
"@effect/printer-ansi": "^0.34.5",
|
||||
"@effect/schema": "^0.71.1",
|
||||
"@effect/typeclass": "^0.25.5",
|
||||
"cojson": "workspace:0.17.2",
|
||||
"cojson-storage-sqlite": "workspace:0.17.2",
|
||||
"cojson-transport-ws": "workspace:0.17.2",
|
||||
"cojson": "workspace:0.17.5",
|
||||
"cojson-storage-sqlite": "workspace:0.17.5",
|
||||
"cojson-transport-ws": "workspace:0.17.5",
|
||||
"effect": "^3.6.5",
|
||||
"jazz-tools": "workspace:0.17.2",
|
||||
"jazz-tools": "workspace:0.17.5",
|
||||
"ws": "^8.14.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/ws": "8.5.10",
|
||||
"typescript": "catalog:"
|
||||
"typescript": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { createServer } from "http";
|
||||
import { createServer, type Server } from "node:http";
|
||||
import { mkdir } from "node:fs/promises";
|
||||
import { dirname } from "node:path";
|
||||
import { LocalNode } from "cojson";
|
||||
@@ -104,5 +104,7 @@ export const startSyncServer = async ({
|
||||
return _close.call(server);
|
||||
};
|
||||
|
||||
return server;
|
||||
Object.defineProperty(server, "localNode", { value: localNode });
|
||||
|
||||
return server as Server & { localNode: LocalNode };
|
||||
};
|
||||
|
||||
@@ -1,5 +1,34 @@
|
||||
# jazz-tools
|
||||
|
||||
## 0.17.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 5963658: Implement/expose loadUnique and upsertUnique on co.list and co.record
|
||||
- Updated dependencies [71c1411]
|
||||
- Updated dependencies [2d11d44]
|
||||
- cojson@0.17.5
|
||||
- cojson-storage-indexeddb@0.17.5
|
||||
- cojson-transport-ws@0.17.5
|
||||
|
||||
## 0.17.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 7dd3d00: Export `Ref` class from jazz-tools package
|
||||
- cojson@0.17.4
|
||||
- cojson-storage-indexeddb@0.17.4
|
||||
- cojson-transport-ws@0.17.4
|
||||
|
||||
## 0.17.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f0c73d9]
|
||||
- cojson@0.17.3
|
||||
- cojson-storage-indexeddb@0.17.3
|
||||
- cojson-transport-ws@0.17.3
|
||||
|
||||
## 0.17.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"default": "./dist/expo/index.js"
|
||||
},
|
||||
"./expo/crypto": {
|
||||
"@jazz-tools/source": "./src/expo/crypto/index.ts",
|
||||
"@jazz-tools/source": "./src/expo/crypto.ts",
|
||||
"types": "./dist/expo/crypto.d.ts",
|
||||
"default": "./dist/expo/crypto.js"
|
||||
},
|
||||
@@ -91,7 +91,7 @@
|
||||
"default": "./dist/react-native/index.js"
|
||||
},
|
||||
"./react-native/crypto": {
|
||||
"@jazz-tools/source": "./src/react-native/crypto/index.ts",
|
||||
"@jazz-tools/source": "./src/react-native/crypto.ts",
|
||||
"types": "./dist/react-native/crypto.d.ts",
|
||||
"default": "./dist/react-native/crypto.js"
|
||||
},
|
||||
@@ -140,7 +140,7 @@
|
||||
},
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"version": "0.17.2",
|
||||
"version": "0.17.5",
|
||||
"dependencies": {
|
||||
"@manuscripts/prosemirror-recreate-steps": "^0.1.4",
|
||||
"@scure/base": "1.2.1",
|
||||
@@ -186,8 +186,8 @@
|
||||
"playwright": "^1.50.1",
|
||||
"queueueue": "^4.1.2",
|
||||
"tsup": "8.5.0",
|
||||
"typescript": "catalog:",
|
||||
"vitest": "catalog:",
|
||||
"typescript": "catalog:default",
|
||||
"vitest": "catalog:default",
|
||||
"ws": "^8.14.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -250,4 +250,4 @@
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
export * from "jazz-tools/react-native-core/crypto";
|
||||
export { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";
|
||||
|
||||
@@ -1 +1 @@
|
||||
export * from "jazz-tools/react-native-core/crypto";
|
||||
export { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { JsonValue, RawCoList } from "cojson";
|
||||
import { ControlledAccount, RawAccount } from "cojson";
|
||||
import type { JsonValue, RawCoList, CoValueUniqueness, RawCoID } from "cojson";
|
||||
import { ControlledAccount, RawAccount, cojsonInternals } from "cojson";
|
||||
import { calcPatch } from "fast-myers-diff";
|
||||
import type {
|
||||
Account,
|
||||
@@ -24,6 +24,7 @@ import {
|
||||
RegisteredSchemas,
|
||||
SchemaInit,
|
||||
accessChildByKey,
|
||||
activeAccountContext,
|
||||
coField,
|
||||
coValueClassFromCoValueClassOrSchema,
|
||||
coValuesCache,
|
||||
@@ -236,12 +237,21 @@ export class CoList<out Item = any> extends Array<Item> implements CoValue {
|
||||
static create<L extends CoList>(
|
||||
this: CoValueClass<L>,
|
||||
items: L[number][],
|
||||
options?: { owner: Account | Group } | Account | Group,
|
||||
options?:
|
||||
| {
|
||||
owner: Account | Group;
|
||||
unique?: CoValueUniqueness["uniqueness"];
|
||||
}
|
||||
| Account
|
||||
| Group,
|
||||
) {
|
||||
const { owner } = parseCoValueCreateOptions(options);
|
||||
const { owner, uniqueness } = parseCoValueCreateOptions(options);
|
||||
const instance = new this({ init: items, owner });
|
||||
const raw = owner._raw.createList(
|
||||
toRawItems(items, instance._schema[ItemsSym], owner),
|
||||
null,
|
||||
"private",
|
||||
uniqueness,
|
||||
);
|
||||
|
||||
Object.defineProperties(instance, {
|
||||
@@ -546,6 +556,116 @@ export class CoList<out Item = any> extends Array<Item> implements CoValue {
|
||||
return cl.fromRaw(this._raw) as InstanceType<Cl>;
|
||||
}
|
||||
|
||||
/** @deprecated Use `CoList.upsertUnique` and `CoList.loadUnique` instead. */
|
||||
static findUnique<L extends CoList>(
|
||||
this: CoValueClass<L>,
|
||||
unique: CoValueUniqueness["uniqueness"],
|
||||
ownerID: ID<Account> | ID<Group>,
|
||||
as?: Account | Group | AnonymousJazzAgent,
|
||||
) {
|
||||
return CoList._findUnique(unique, ownerID, as);
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
static _findUnique<L extends CoList>(
|
||||
this: CoValueClass<L>,
|
||||
unique: CoValueUniqueness["uniqueness"],
|
||||
ownerID: ID<Account> | ID<Group>,
|
||||
as?: Account | Group | AnonymousJazzAgent,
|
||||
) {
|
||||
as ||= activeAccountContext.get();
|
||||
|
||||
const header = {
|
||||
type: "colist" as const,
|
||||
ruleset: {
|
||||
type: "ownedByGroup" as const,
|
||||
group: ownerID as RawCoID,
|
||||
},
|
||||
meta: null,
|
||||
uniqueness: unique,
|
||||
};
|
||||
const crypto =
|
||||
as._type === "Anonymous" ? as.node.crypto : as._raw.core.node.crypto;
|
||||
return cojsonInternals.idforHeader(header, crypto) as ID<L>;
|
||||
}
|
||||
|
||||
/**
|
||||
* Given some data, updates an existing CoList or initialises a new one if none exists.
|
||||
*
|
||||
* Note: This method respects resolve options, and thus can return `null` if the references cannot be resolved.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* const activeItems = await ItemList.upsertUnique(
|
||||
* {
|
||||
* value: [item1, item2, item3],
|
||||
* unique: sourceData.identifier,
|
||||
* owner: workspace,
|
||||
* }
|
||||
* );
|
||||
* ```
|
||||
*
|
||||
* @param options The options for creating or loading the CoList. This includes the intended state of the CoList, its unique identifier, its owner, and the references to resolve.
|
||||
* @returns Either an existing & modified CoList, or a new initialised CoList if none exists.
|
||||
* @category Subscription & Loading
|
||||
*/
|
||||
static async upsertUnique<
|
||||
L extends CoList,
|
||||
const R extends RefsToResolve<L> = true,
|
||||
>(
|
||||
this: CoValueClass<L>,
|
||||
options: {
|
||||
value: L[number][];
|
||||
unique: CoValueUniqueness["uniqueness"];
|
||||
owner: Account | Group;
|
||||
resolve?: RefsToResolveStrict<L, R>;
|
||||
},
|
||||
): Promise<Resolved<L, R> | null> {
|
||||
let listId = CoList._findUnique(options.unique, options.owner.id);
|
||||
let list: Resolved<L, R> | null = await loadCoValueWithoutMe(this, listId, {
|
||||
...options,
|
||||
loadAs: options.owner._loadedAs,
|
||||
skipRetry: true,
|
||||
});
|
||||
if (!list) {
|
||||
list = (this as any).create(options.value, {
|
||||
owner: options.owner,
|
||||
unique: options.unique,
|
||||
}) as Resolved<L, R>;
|
||||
} else {
|
||||
(list as L).applyDiff(options.value);
|
||||
}
|
||||
|
||||
return await loadCoValueWithoutMe(this, listId, {
|
||||
...options,
|
||||
loadAs: options.owner._loadedAs,
|
||||
skipRetry: true,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a CoList by its unique identifier and owner's ID.
|
||||
* @param unique The unique identifier of the CoList to load.
|
||||
* @param ownerID The ID of the owner of the CoList.
|
||||
* @param options Additional options for loading the CoList.
|
||||
* @returns The loaded CoList, or null if unavailable.
|
||||
*/
|
||||
static loadUnique<L extends CoList, const R extends RefsToResolve<L> = true>(
|
||||
this: CoValueClass<L>,
|
||||
unique: CoValueUniqueness["uniqueness"],
|
||||
ownerID: ID<Account> | ID<Group>,
|
||||
options?: {
|
||||
resolve?: RefsToResolveStrict<L, R>;
|
||||
loadAs?: Account | AnonymousJazzAgent;
|
||||
},
|
||||
): Promise<Resolved<L, R> | null> {
|
||||
return loadCoValueWithoutMe(
|
||||
this,
|
||||
CoList._findUnique(unique, ownerID, options?.loadAs),
|
||||
{ ...options, skipRetry: true },
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for the `CoList` to be uploaded to the other peers.
|
||||
*
|
||||
|
||||
@@ -54,6 +54,7 @@ export {
|
||||
SubscriptionScope,
|
||||
exportCoValue,
|
||||
importContentPieces,
|
||||
Ref,
|
||||
} from "./internal.js";
|
||||
|
||||
export {
|
||||
|
||||
@@ -2,12 +2,14 @@ import {
|
||||
Account,
|
||||
CoList,
|
||||
Group,
|
||||
ID,
|
||||
RefsToResolve,
|
||||
RefsToResolveStrict,
|
||||
Resolved,
|
||||
SubscribeListenerOptions,
|
||||
coOptionalDefiner,
|
||||
} from "../../../internal.js";
|
||||
import { CoValueUniqueness } from "cojson";
|
||||
import { AnonymousJazzAgent } from "../../anonymousJazzAgent.js";
|
||||
import { CoListInit } from "../typeConverters/CoFieldInit.js";
|
||||
import { InstanceOrPrimitiveOfSchema } from "../typeConverters/InstanceOrPrimitiveOfSchema.js";
|
||||
@@ -29,7 +31,13 @@ export class CoListSchema<T extends AnyZodOrCoValueSchema>
|
||||
|
||||
create(
|
||||
items: CoListInit<T>,
|
||||
options?: { owner: Account | Group } | Account | Group,
|
||||
options?:
|
||||
| {
|
||||
owner: Account | Group;
|
||||
unique?: CoValueUniqueness["uniqueness"];
|
||||
}
|
||||
| Account
|
||||
| Group,
|
||||
): CoListInstance<T> {
|
||||
return this.coValueClass.create(items as any, options) as CoListInstance<T>;
|
||||
}
|
||||
@@ -62,6 +70,41 @@ export class CoListSchema<T extends AnyZodOrCoValueSchema>
|
||||
return this.coValueClass;
|
||||
}
|
||||
|
||||
/** @deprecated Use `CoList.upsertUnique` and `CoList.loadUnique` instead. */
|
||||
findUnique(
|
||||
unique: CoValueUniqueness["uniqueness"],
|
||||
ownerID: ID<Account> | ID<Group>,
|
||||
as?: Account | Group | AnonymousJazzAgent,
|
||||
): ID<CoListInstanceCoValuesNullable<T>> {
|
||||
return this.coValueClass.findUnique(unique, ownerID, as);
|
||||
}
|
||||
|
||||
upsertUnique<
|
||||
const R extends RefsToResolve<CoListInstanceCoValuesNullable<T>> = true,
|
||||
>(options: {
|
||||
value: CoListInit<T>;
|
||||
unique: CoValueUniqueness["uniqueness"];
|
||||
owner: Account | Group;
|
||||
resolve?: RefsToResolveStrict<CoListInstanceCoValuesNullable<T>, R>;
|
||||
}): Promise<Resolved<CoListInstanceCoValuesNullable<T>, R> | null> {
|
||||
// @ts-expect-error
|
||||
return this.coValueClass.upsertUnique(options);
|
||||
}
|
||||
|
||||
loadUnique<
|
||||
const R extends RefsToResolve<CoListInstanceCoValuesNullable<T>> = true,
|
||||
>(
|
||||
unique: CoValueUniqueness["uniqueness"],
|
||||
ownerID: ID<Account> | ID<Group>,
|
||||
options?: {
|
||||
resolve?: RefsToResolveStrict<CoListInstanceCoValuesNullable<T>, R>;
|
||||
loadAs?: Account | AnonymousJazzAgent;
|
||||
},
|
||||
): Promise<Resolved<CoListInstanceCoValuesNullable<T>, R> | null> {
|
||||
// @ts-expect-error
|
||||
return this.coValueClass.loadUnique(unique, ownerID, options);
|
||||
}
|
||||
|
||||
optional(): CoOptionalSchema<this> {
|
||||
return coOptionalDefiner(this);
|
||||
}
|
||||
|
||||
@@ -72,12 +72,37 @@ export interface CoRecordSchema<
|
||||
) => void,
|
||||
): () => void;
|
||||
|
||||
/** @deprecated Use `CoMap.upsertUnique` and `CoMap.loadUnique` instead. */
|
||||
findUnique(
|
||||
unique: CoValueUniqueness["uniqueness"],
|
||||
ownerID: ID<Account> | ID<Group>,
|
||||
as?: Account | Group | AnonymousJazzAgent,
|
||||
): ID<CoRecordInstanceCoValuesNullable<K, V>>;
|
||||
|
||||
upsertUnique<
|
||||
const R extends RefsToResolve<
|
||||
CoRecordInstanceCoValuesNullable<K, V>
|
||||
> = true,
|
||||
>(options: {
|
||||
value: Simplify<CoRecordInit<K, V>>;
|
||||
unique: CoValueUniqueness["uniqueness"];
|
||||
owner: Account | Group;
|
||||
resolve?: RefsToResolveStrict<CoRecordInstanceCoValuesNullable<K, V>, R>;
|
||||
}): Promise<Resolved<CoRecordInstanceCoValuesNullable<K, V>, R> | null>;
|
||||
|
||||
loadUnique<
|
||||
const R extends RefsToResolve<
|
||||
CoRecordInstanceCoValuesNullable<K, V>
|
||||
> = true,
|
||||
>(
|
||||
unique: CoValueUniqueness["uniqueness"],
|
||||
ownerID: ID<Account> | ID<Group>,
|
||||
options?: {
|
||||
resolve?: RefsToResolveStrict<CoRecordInstanceCoValuesNullable<K, V>, R>;
|
||||
loadAs?: Account | AnonymousJazzAgent;
|
||||
},
|
||||
): Promise<Resolved<CoRecordInstanceCoValuesNullable<K, V>, R> | null>;
|
||||
|
||||
getCoValueClass: () => typeof CoMap;
|
||||
|
||||
optional(): CoOptionalSchema<this>;
|
||||
|
||||
@@ -863,6 +863,173 @@ describe("CoList subscription", async () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("CoList unique methods", () => {
|
||||
test("loadUnique returns existing list", async () => {
|
||||
const ItemList = co.list(z.string());
|
||||
const group = Group.create();
|
||||
|
||||
const originalList = ItemList.create(["item1", "item2", "item3"], {
|
||||
owner: group,
|
||||
unique: "test-list",
|
||||
});
|
||||
|
||||
const foundList = await ItemList.loadUnique("test-list", group.id);
|
||||
expect(foundList).toEqual(originalList);
|
||||
expect(foundList?.length).toBe(3);
|
||||
expect(foundList?.[0]).toBe("item1");
|
||||
});
|
||||
|
||||
test("loadUnique returns null for non-existent list", async () => {
|
||||
const ItemList = co.list(z.string());
|
||||
const group = Group.create();
|
||||
|
||||
const foundList = await ItemList.loadUnique("non-existent", group.id);
|
||||
expect(foundList).toBeNull();
|
||||
});
|
||||
|
||||
test("upsertUnique creates new list when none exists", async () => {
|
||||
const ItemList = co.list(z.string());
|
||||
const group = Group.create();
|
||||
|
||||
const sourceData = ["item1", "item2", "item3"];
|
||||
|
||||
const result = await ItemList.upsertUnique({
|
||||
value: sourceData,
|
||||
unique: "new-list",
|
||||
owner: group,
|
||||
});
|
||||
|
||||
expect(result).not.toBeNull();
|
||||
expect(result?.length).toBe(3);
|
||||
expect(result?.[0]).toBe("item1");
|
||||
expect(result?.[1]).toBe("item2");
|
||||
expect(result?.[2]).toBe("item3");
|
||||
});
|
||||
|
||||
test("upsertUnique updates existing list", async () => {
|
||||
const ItemList = co.list(z.string());
|
||||
const group = Group.create();
|
||||
|
||||
// Create initial list
|
||||
const originalList = ItemList.create(["original1", "original2"], {
|
||||
owner: group,
|
||||
unique: "update-list",
|
||||
});
|
||||
|
||||
// Upsert with new data
|
||||
const updatedList = await ItemList.upsertUnique({
|
||||
value: ["updated1", "updated2", "updated3"],
|
||||
unique: "update-list",
|
||||
owner: group,
|
||||
});
|
||||
|
||||
expect(updatedList).toEqual(originalList); // Should be the same instance
|
||||
expect(updatedList?.length).toBe(3);
|
||||
expect(updatedList?.[0]).toBe("updated1");
|
||||
expect(updatedList?.[1]).toBe("updated2");
|
||||
expect(updatedList?.[2]).toBe("updated3");
|
||||
});
|
||||
|
||||
test("upsertUnique with CoValue items", async () => {
|
||||
const Item = co.map({
|
||||
name: z.string(),
|
||||
value: z.number(),
|
||||
});
|
||||
const ItemList = co.list(Item);
|
||||
const group = Group.create();
|
||||
|
||||
const items = [
|
||||
Item.create({ name: "First", value: 1 }, group),
|
||||
Item.create({ name: "Second", value: 2 }, group),
|
||||
];
|
||||
|
||||
const result = await ItemList.upsertUnique({
|
||||
value: items,
|
||||
unique: "item-list",
|
||||
owner: group,
|
||||
resolve: { $each: true },
|
||||
});
|
||||
|
||||
expect(result).not.toBeNull();
|
||||
expect(result?.length).toBe(2);
|
||||
expect(result?.[0]?.name).toBe("First");
|
||||
expect(result?.[1]?.name).toBe("Second");
|
||||
});
|
||||
|
||||
test("upsertUnique updates list with CoValue items", async () => {
|
||||
const Item = co.map({
|
||||
name: z.string(),
|
||||
value: z.number(),
|
||||
});
|
||||
const ItemList = co.list(Item);
|
||||
const group = Group.create();
|
||||
|
||||
// Create initial list
|
||||
const initialItems = [Item.create({ name: "Initial", value: 0 }, group)];
|
||||
const originalList = ItemList.create(initialItems, {
|
||||
owner: group,
|
||||
unique: "updateable-item-list",
|
||||
});
|
||||
|
||||
// Upsert with new items
|
||||
const newItems = [
|
||||
Item.create({ name: "Updated", value: 1 }, group),
|
||||
Item.create({ name: "Added", value: 2 }, group),
|
||||
];
|
||||
|
||||
const updatedList = await ItemList.upsertUnique({
|
||||
value: newItems,
|
||||
unique: "updateable-item-list",
|
||||
owner: group,
|
||||
resolve: { $each: true },
|
||||
});
|
||||
|
||||
expect(updatedList).toEqual(originalList); // Should be the same instance
|
||||
expect(updatedList?.length).toBe(2);
|
||||
expect(updatedList?.[0]?.name).toBe("Updated");
|
||||
expect(updatedList?.[1]?.name).toBe("Added");
|
||||
});
|
||||
|
||||
test("findUnique returns correct ID", async () => {
|
||||
const ItemList = co.list(z.string());
|
||||
const group = Group.create();
|
||||
|
||||
const originalList = ItemList.create(["test"], {
|
||||
owner: group,
|
||||
unique: "find-test",
|
||||
});
|
||||
|
||||
const foundId = ItemList.findUnique("find-test", group.id);
|
||||
expect(foundId).toBe(originalList.id);
|
||||
});
|
||||
|
||||
test("upsertUnique with resolve options", async () => {
|
||||
const Category = co.map({ title: z.string() });
|
||||
const Item = co.map({
|
||||
name: z.string(),
|
||||
category: Category,
|
||||
});
|
||||
const ItemList = co.list(Item);
|
||||
const group = Group.create();
|
||||
|
||||
const category = Category.create({ title: "Category 1" }, group);
|
||||
|
||||
const items = [Item.create({ name: "Item 1", category }, group)];
|
||||
|
||||
const result = await ItemList.upsertUnique({
|
||||
value: items,
|
||||
unique: "resolved-list",
|
||||
owner: group,
|
||||
resolve: { $each: { category: true } },
|
||||
});
|
||||
|
||||
expect(result).not.toBeNull();
|
||||
expect(result?.length).toBe(1);
|
||||
expect(result?.[0]?.name).toBe("Item 1");
|
||||
expect(result?.[0]?.category?.title).toBe("Category 1");
|
||||
});
|
||||
});
|
||||
|
||||
describe("co.list schema", () => {
|
||||
test("can access the inner schema of a co.list", () => {
|
||||
const Keywords = co.list(co.plainText());
|
||||
|
||||
@@ -460,3 +460,107 @@ describe("CoMap.Record", async () => {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("CoRecord unique methods", () => {
|
||||
test("loadUnique returns existing record", async () => {
|
||||
const ItemRecord = co.record(z.string(), z.number());
|
||||
const group = Group.create();
|
||||
|
||||
const originalRecord = ItemRecord.create(
|
||||
{ item1: 1, item2: 2, item3: 3 },
|
||||
{ owner: group, unique: "test-record" },
|
||||
);
|
||||
|
||||
const foundRecord = await ItemRecord.loadUnique("test-record", group.id);
|
||||
expect(foundRecord).toEqual(originalRecord);
|
||||
expect(foundRecord?.item1).toBe(1);
|
||||
expect(foundRecord?.item2).toBe(2);
|
||||
});
|
||||
|
||||
test("loadUnique returns null for non-existent record", async () => {
|
||||
const ItemRecord = co.record(z.string(), z.number());
|
||||
const group = Group.create();
|
||||
|
||||
const foundRecord = await ItemRecord.loadUnique("non-existent", group.id);
|
||||
expect(foundRecord).toBeNull();
|
||||
});
|
||||
|
||||
test("upsertUnique creates new record when none exists", async () => {
|
||||
const ItemRecord = co.record(z.string(), z.number());
|
||||
const group = Group.create();
|
||||
|
||||
const sourceData = { item1: 1, item2: 2, item3: 3 };
|
||||
|
||||
const result = await ItemRecord.upsertUnique({
|
||||
value: sourceData,
|
||||
unique: "new-record",
|
||||
owner: group,
|
||||
});
|
||||
|
||||
expect(result).not.toBeNull();
|
||||
expect(result?.item1).toBe(1);
|
||||
expect(result?.item2).toBe(2);
|
||||
expect(result?.item3).toBe(3);
|
||||
});
|
||||
|
||||
test("upsertUnique updates existing record", async () => {
|
||||
const ItemRecord = co.record(z.string(), z.number());
|
||||
const group = Group.create();
|
||||
|
||||
// Create initial record
|
||||
const originalRecord = ItemRecord.create(
|
||||
{ original1: 1, original2: 2 },
|
||||
{ owner: group, unique: "update-record" },
|
||||
);
|
||||
|
||||
// Upsert with new data
|
||||
const updatedRecord = await ItemRecord.upsertUnique({
|
||||
value: { updated1: 10, updated2: 20, updated3: 30 },
|
||||
unique: "update-record",
|
||||
owner: group,
|
||||
});
|
||||
|
||||
expect(updatedRecord).toEqual(originalRecord); // Should be the same instance
|
||||
expect(updatedRecord?.updated1).toBe(10);
|
||||
expect(updatedRecord?.updated2).toBe(20);
|
||||
expect(updatedRecord?.updated3).toBe(30);
|
||||
});
|
||||
|
||||
test("upsertUnique with CoValue items", async () => {
|
||||
const Item = co.map({
|
||||
name: z.string(),
|
||||
value: z.number(),
|
||||
});
|
||||
const ItemRecord = co.record(z.string(), Item);
|
||||
const group = Group.create();
|
||||
|
||||
const items = {
|
||||
first: Item.create({ name: "First", value: 1 }, group),
|
||||
second: Item.create({ name: "Second", value: 2 }, group),
|
||||
};
|
||||
|
||||
const result = await ItemRecord.upsertUnique({
|
||||
value: items,
|
||||
unique: "item-record",
|
||||
owner: group,
|
||||
resolve: { first: true, second: true },
|
||||
});
|
||||
|
||||
expect(result).not.toBeNull();
|
||||
expect(result?.first?.name).toBe("First");
|
||||
expect(result?.second?.name).toBe("Second");
|
||||
});
|
||||
|
||||
test("findUnique returns correct ID", async () => {
|
||||
const ItemRecord = co.record(z.string(), z.string());
|
||||
const group = Group.create();
|
||||
|
||||
const originalRecord = ItemRecord.create(
|
||||
{ test: "value" },
|
||||
{ owner: group, unique: "find-test" },
|
||||
);
|
||||
|
||||
const foundId = ItemRecord.findUnique("find-test", group.id);
|
||||
expect(foundId).toBe(originalRecord.id);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import Input from "@/src/components/input";
|
||||
import Label from "@/src/components/label";
|
||||
import { Input } from "@/src/components/input";
|
||||
import { Label } from "@/src/components/label";
|
||||
import { SearchIcon } from "lucide-react";
|
||||
|
||||
export default function InputPage() {
|
||||
|
||||
@@ -31,14 +31,14 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"next": "15.4.2",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"@tailwindcss/postcss": "^4.1.11",
|
||||
"@types/node": "^22.16.5",
|
||||
"@types/react": "19.1.8",
|
||||
"@types/react-dom": "19.1.6",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"lucide-react": "^0.525.0",
|
||||
"tailwindcss": "^4.1.11",
|
||||
"typescript": "^5.8.3"
|
||||
"typescript": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ type InputVariants = VariantProps<typeof input>;
|
||||
|
||||
interface InputProps extends ComponentProps<"input">, InputVariants {}
|
||||
|
||||
export default function Input({ sizeStyle, intent, ...props }: InputProps) {
|
||||
export function Input({ sizeStyle, intent, ...props }: InputProps) {
|
||||
return <BaseUiInput className={input({ sizeStyle, intent })} {...props} />;
|
||||
}
|
||||
|
||||
|
||||
@@ -7,11 +7,7 @@ type LabelVariants = VariantProps<typeof label>;
|
||||
|
||||
interface LabelProps extends ComponentProps<"label">, LabelVariants {}
|
||||
|
||||
export default function Label({
|
||||
size,
|
||||
isHiddenVisually,
|
||||
...props
|
||||
}: LabelProps) {
|
||||
export function Label({ size, isHiddenVisually, ...props }: LabelProps) {
|
||||
return (
|
||||
<label
|
||||
className={cn(
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
// COMPONENTS
|
||||
export { Button } from "./components/button.js";
|
||||
export { Icons } from "./components/icons.js";
|
||||
export { Input } from "./components/input.js";
|
||||
export { Label } from "./components/label.js";
|
||||
|
||||
// UTILS
|
||||
export { cn } from "./lib/utils.js";
|
||||
|
||||
822
pnpm-lock.yaml
generated
822
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -4,12 +4,40 @@ packages:
|
||||
- "starters/*"
|
||||
- "tests/*"
|
||||
|
||||
catalog:
|
||||
"@biomejs/biome": 2.1.3
|
||||
typescript: 5.6.2
|
||||
vite: 6.3.5
|
||||
vitest: 3.2.4
|
||||
"@vitest/browser": 3.2.4
|
||||
"@vitest/coverage-istanbul": 3.2.4
|
||||
"@vitest/coverage-v8": 3.2.4
|
||||
"@vitest/ui": 3.2.4
|
||||
catalogs:
|
||||
default:
|
||||
"@biomejs/biome": 2.1.3
|
||||
typescript: 5.6.2
|
||||
vite: 6.3.5
|
||||
vitest: 3.2.4
|
||||
"@vitest/browser": 3.2.4
|
||||
"@vitest/coverage-istanbul": 3.2.4
|
||||
"@vitest/coverage-v8": 3.2.4
|
||||
"@vitest/ui": 3.2.4
|
||||
react:
|
||||
"react": "19.1.0"
|
||||
"react-dom": "19.1.0"
|
||||
"@types/react": "19.1.0"
|
||||
"@types/react-dom": "19.1.0"
|
||||
rn:
|
||||
"react-native": "0.80.0"
|
||||
"react": "19.1.0"
|
||||
"@react-native-community/cli": "19.0.0"
|
||||
"@react-native-community/cli-platform-android": "19.0.0"
|
||||
"@react-native-community/cli-platform-ios": "19.0.0"
|
||||
"@react-native/babel-preset": "0.80.0"
|
||||
"@react-native/eslint-config": "0.80.0"
|
||||
"@react-native/metro-config": "0.80.0"
|
||||
"@react-native/typescript-config": "0.80.0"
|
||||
"@types/react": "^19.1.0"
|
||||
expo:
|
||||
"expo": "54.0.0-canary-20250701-6a945c5"
|
||||
"expo-clipboard": "^7.1.4"
|
||||
"expo-crypto": "~14.1.5"
|
||||
"expo-linking": "~7.1.5"
|
||||
"expo-secure-store": "~14.2.3"
|
||||
"expo-sqlite": "~15.2.10"
|
||||
"expo-web-browser": "~14.2.0"
|
||||
"react-native": "0.80.0"
|
||||
"react": "19.1.0"
|
||||
"@types/react": "^19.0.10"
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import { readdirSync, readFileSync } from "node:fs";
|
||||
import { join } from "node:path";
|
||||
|
||||
function findPackageJsonFiles(dir) {
|
||||
const files = readdirSync(dir, { withFileTypes: true });
|
||||
let packageJsonFiles = [];
|
||||
|
||||
for (const file of files) {
|
||||
const fullPath = join(dir, file.name);
|
||||
if (
|
||||
file.isDirectory() &&
|
||||
!file.name.startsWith(".") &&
|
||||
file.name !== "node_modules"
|
||||
) {
|
||||
packageJsonFiles = packageJsonFiles.concat(
|
||||
findPackageJsonFiles(fullPath),
|
||||
);
|
||||
} else if (file.name === "package.json") {
|
||||
packageJsonFiles.push(fullPath);
|
||||
}
|
||||
}
|
||||
|
||||
return packageJsonFiles;
|
||||
}
|
||||
|
||||
function checkCatalogDependencies(packageJsonPath) {
|
||||
const content = readFileSync(packageJsonPath, "utf-8");
|
||||
const packageJson = JSON.parse(content);
|
||||
const issues = [];
|
||||
|
||||
function checkDeps(deps, type) {
|
||||
if (!deps) return;
|
||||
for (const [pkg, version] of Object.entries(deps)) {
|
||||
if (version === "catalog:") {
|
||||
issues.push({
|
||||
package: pkg,
|
||||
type,
|
||||
path: packageJsonPath,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
checkDeps(packageJson.dependencies, "dependencies");
|
||||
checkDeps(packageJson.peerDependencies, "peerDependencies");
|
||||
|
||||
return issues;
|
||||
}
|
||||
|
||||
const rootDir = process.cwd();
|
||||
const packageJsonFiles = findPackageJsonFiles(rootDir);
|
||||
let hasIssues = false;
|
||||
|
||||
for (const file of packageJsonFiles) {
|
||||
if (file.includes("homepage")) continue;
|
||||
|
||||
const issues = checkCatalogDependencies(file);
|
||||
if (issues.length > 0) {
|
||||
hasIssues = true;
|
||||
console.log(`\nIssues found in ${file}:`);
|
||||
for (const issue of issues) {
|
||||
console.log(
|
||||
` - ${issue.package} in ${issue.type} uses 'catalog:' version`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (hasIssues) {
|
||||
console.log(
|
||||
'\nError: Found packages using "catalog:" as version. Please use specific versions instead.',
|
||||
);
|
||||
process.exit(1);
|
||||
} else {
|
||||
console.log('No issues found with "catalog:" dependencies.');
|
||||
process.exit(0);
|
||||
}
|
||||
@@ -1,5 +1,25 @@
|
||||
# jazz-react-tailwind-starter
|
||||
|
||||
## 0.0.149
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [5963658]
|
||||
- jazz-tools@0.17.5
|
||||
|
||||
## 0.0.148
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [7dd3d00]
|
||||
- jazz-tools@0.17.4
|
||||
|
||||
## 0.0.147
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-tools@0.17.3
|
||||
|
||||
## 0.0.146
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-react-passkey-auth-starter",
|
||||
"private": true,
|
||||
"version": "0.0.146",
|
||||
"version": "0.0.149",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
@@ -14,21 +14,21 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "18.3.1",
|
||||
"react-dom": "18.3.1"
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "1.9.4",
|
||||
"@biomejs/biome": "catalog:default",
|
||||
"@playwright/test": "^1.50.1",
|
||||
"@tailwindcss/postcss": "^4.1.10",
|
||||
"@types/react": "~18.3.12",
|
||||
"@types/react-dom": "^18.3.1",
|
||||
"@types/react": "catalog:react",
|
||||
"@types/react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"globals": "^15.11.0",
|
||||
"is-ci": "^3.0.1",
|
||||
"postcss": "^8.4.27",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"typescript": "~5.6.2",
|
||||
"vite": "^6.3.5"
|
||||
"typescript": "catalog:default",
|
||||
"vite": "catalog:default"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,25 @@
|
||||
# svelte-passkey-auth
|
||||
|
||||
## 0.0.123
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [5963658]
|
||||
- jazz-tools@0.17.5
|
||||
|
||||
## 0.0.122
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [7dd3d00]
|
||||
- jazz-tools@0.17.4
|
||||
|
||||
## 0.0.121
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-tools@0.17.3
|
||||
|
||||
## 0.0.120
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "svelte-passkey-auth",
|
||||
"version": "0.0.120",
|
||||
"version": "0.0.123",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"test:watch": "vitest --watch"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "catalog:"
|
||||
"typescript": "catalog:default"
|
||||
},
|
||||
"dependencies": {
|
||||
"cojson": "workspace:*",
|
||||
@@ -16,8 +16,8 @@
|
||||
"cojson-storage-sqlite": "workspace:*",
|
||||
"cojson-transport-ws": "workspace:*",
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0",
|
||||
"react": "catalog:react",
|
||||
"react-dom": "catalog:react",
|
||||
"@vitejs/plugin-react-swc": "^3.10.1",
|
||||
"@testing-library/react": "16.2.0",
|
||||
"@testing-library/jest-dom": "6.6.3"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"devDependencies": {
|
||||
"@cloudflare/workers-types": "^4.20250214.0",
|
||||
"execa": "^9.5.2",
|
||||
"typescript": "catalog:",
|
||||
"typescript": "catalog:default",
|
||||
"wrangler": "^3.109.2"
|
||||
},
|
||||
"dependencies": {
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
"@types/react-dom": "^18.2.7",
|
||||
"@vitejs/plugin-react-swc": "^3.10.1",
|
||||
"jstat": "^1.9.6",
|
||||
"typescript": "catalog:",
|
||||
"typescript": "catalog:default",
|
||||
"jazz-run": "workspace:*",
|
||||
"vite": "^6.3.5"
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
"jsdom": "^25.0.1",
|
||||
"svelte": "^5.33.0",
|
||||
"svelte-check": "^4.0.0",
|
||||
"typescript": "catalog:",
|
||||
"typescript": "catalog:default",
|
||||
"virtua": "^0.41.5",
|
||||
"vite": "^6.3.5"
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user