Compare commits

..

84 Commits

Author SHA1 Message Date
Guido D'Orsi
4327ecbfdf Merge pull request #2619 from garden-co/changeset-release/main
Version Packages
2025-07-08 17:34:26 +02:00
github-actions[bot]
32565f0e53 Version Packages 2025-07-08 12:20:12 +00:00
Sammii
61a5889bea Merge pull request #2615 from garden-co/fix/team-update 2025-07-08 13:18:08 +01:00
Sammii
82bd3e1ea6 adding nico 2025-07-08 12:00:09 +01:00
Sammii
b800a6fba2 Merge pull request #2401 from garden-co/feat/snippet-improvements
Feat/snippet improvements
2025-07-08 11:54:03 +01:00
Sammii
1b6dbfdfff adjusting side nav item design 2025-07-08 11:45:29 +01:00
Sammii
061a70f1b3 responsive design for dropdown select 2025-07-08 11:45:18 +01:00
Sammii
f1c1e0dafd adding div's profile link 2025-07-08 10:43:54 +01:00
Guido D'Orsi
c3912fdb37 Merge pull request #2618 from garden-co/fix/inspector-element
fix: simplify definition of the AccountSchema type
2025-07-07 22:19:49 +02:00
Guido D'Orsi
356bfa4860 docs: add jsDoc for coAccountDefiner 2025-07-07 19:50:41 +02:00
Guido D'Orsi
38446668c4 fix: simplify definition of the AccountSchema type 2025-07-07 19:44:21 +02:00
Guido D'Orsi
11dcfd703d Merge pull request #2616 from garden-co/changeset-release/main
Version Packages
2025-07-07 18:16:58 +02:00
github-actions[bot]
879b726537 Version Packages 2025-07-07 16:06:32 +00:00
Guido D'Orsi
66bbd03262 Merge pull request #2614 from garden-co/fix/inspector-element
fix: react bundling in jazz-tools/inspector/register-custom-element
2025-07-07 18:04:30 +02:00
Guido D'Orsi
c09b63698f fix: react bundling in jazz-tools/inspector/register-custom-element 2025-07-07 18:03:18 +02:00
Sammii
bed7db0a33 team page updates 2025-07-07 16:51:22 +01:00
Sammii
296da5a5c4 design amends 2025-07-07 16:40:30 +01:00
Guido D'Orsi
700a4f1ba1 fix: restore sync url in todo main 2025-07-07 16:46:18 +02:00
Guido D'Orsi
844cdc907f Merge pull request #2612 from garden-co/chore/playwright-tests
perf(ci): batch the e2e tests execution in 2 workflow runs
2025-07-07 16:02:45 +02:00
Guido D'Orsi
9e32d4cb92 perf(ci): batch the e2e tests execution in 2 workflow runs 2025-07-07 16:01:12 +02:00
Sammii
16c4d27e00 code tidy 2025-07-07 14:21:24 +01:00
Sammii
69170fe0e0 style amendments 2025-07-07 14:14:28 +01:00
Sammii
a646ba54b3 component refactor 2025-07-07 14:14:16 +01:00
Sammii
45d60fc3c8 get started snippet select improvements 2025-07-07 14:02:22 +01:00
Sammii
6f0c399ccd Merge branch 'main' into feat/snippet-improvements 2025-07-07 13:50:59 +01:00
Guido D'Orsi
40e1ca7cb1 Merge pull request #2606 from garden-co/changeset-release/main
Version Packages
2025-07-07 11:30:02 +02:00
github-actions[bot]
80cf21e453 Version Packages 2025-07-07 09:27:27 +00:00
Guido D'Orsi
48c8a3d219 Merge pull request #2603 from garden-co/PR-template-v2-simplify
simplify PR template for ease of use
2025-07-07 11:25:24 +02:00
Guido D'Orsi
31bb1201fc Merge pull request #2611 from garden-co/gio/update-lockfile
chore: update lockfile
2025-07-07 11:15:25 +02:00
Giordano Ricci
08d1b05607 chore: update lockfile 2025-07-07 09:47:51 +01:00
Guido D'Orsi
d64a14210d Merge pull request #2608 from jeffgca/main
Error: Loading PostCSS Plugin failed: Cannot find module '@tailwindcss/postcss'
2025-07-07 10:35:06 +02:00
Guido D'Orsi
7e53d33e9b Merge pull request #2609 from jeffgca/user_age_calc_fix
User age calc fix
2025-07-07 10:34:31 +02:00
Jeff Griffiths
ea2b39cc30 fixed off-by-one error 2025-07-04 21:27:54 -07:00
Jeff Griffiths
6b835f95cf enhanced getUserAge to calculate the user's age in a more precise way. 2025-07-04 21:14:32 -07:00
Jeff Griffiths
a229ae5f70 changed postcss dependency to the tailwind plugin instead. 2025-07-04 20:49:46 -07:00
Giordano Ricci
84fdc1d8fd Merge pull request #2605 from garden-co/gio/cancel-pending-workflows-on-push 2025-07-04 17:19:27 +01:00
Giordano Ricci
14a8b32522 differentiate workflows 2025-07-04 17:10:44 +01:00
Guido D'Orsi
ddc09a0d6b Merge pull request #2604 from garden-co/gio/get-only-direct-members
feat: allow to get only the direct members of a group
2025-07-04 18:09:55 +02:00
Giordano Ricci
3b45a3f2fd chore: cancel pending workflows on push 2025-07-04 17:05:45 +01:00
Giordano Ricci
9034a45da0 forgot the role 2025-07-04 16:51:07 +01:00
Giordano Ricci
a5ceaffb0c changeset, usemethod instead of getter, reuse logic 2025-07-04 16:47:19 +01:00
Giordano Ricci
dcee2f9b4e better test 2025-07-04 16:18:53 +01:00
Giordano Ricci
83fdc504ff feat: add directMembers get to get only the direct members of a given group 2025-07-04 16:07:30 +01:00
Guido D'Orsi
a34c0675cd Merge pull request #2599 from garden-co/changeset-release/main
Version Packages
2025-07-04 14:36:26 +02:00
Margaret Culotta
5a8a62b4a3 simplify PR template for ease of use 2025-07-02 13:23:56 -05:00
github-actions[bot]
325a554bd1 Version Packages 2025-07-02 17:07:22 +00:00
Guido D'Orsi
7422943e83 Merge pull request #2600 from garden-co/fix/react-native-peer-dependencies
Make all React Native deps in `jazz-tools` optional peer dependencies
2025-07-02 19:05:22 +02:00
NicoR
23bfea5861 Add changeset 2025-07-02 13:50:45 -03:00
NicoR
605a54eb11 Make react-native-fast-encoder an optional peer dependency 2025-07-02 13:49:04 -03:00
Brad Anderson
a7aaee51e6 Merge pull request #2587 from garden-co/feat/rn-betterauth
feat: add RN BetterAuth
2025-07-02 12:24:38 -04:00
Brad Anderson
4b8983858a chore: changeset 2025-07-02 12:07:25 -04:00
Brad Anderson
8a8c4d11e1 fix: small cleanup 2025-07-02 11:56:40 -04:00
Guido D'Orsi
b774bb345d chore: changeset 2025-07-02 10:52:44 +02:00
Guido D'Orsi
7fd891d7b9 chore: fix formatting 2025-07-02 10:52:10 +02:00
Guido D'Orsi
27cac4a6d7 Merge pull request #2596 from satendra03/main
fix #1914
2025-07-02 10:51:23 +02:00
Brad Anderson
2b71ef1181 fix: PR feedback 2025-07-01 21:46:25 -04:00
NicoR
ae169c7b3a Revert change for react-native-fast-encoder 2025-07-01 13:57:17 -03:00
NicoR
d888c99d9a Add expo-sqlite dependency to Expo Project setup docs 2025-07-01 13:53:01 -03:00
NicoR
0b54917f19 Make all React Native deps in jazz-tools optional peer dependencies 2025-07-01 12:21:38 -03:00
Guido D'Orsi
c87b215b75 Merge pull request #2594 from garden-co/fix-RNQuickCrypto-type-error
fix: `RNQuickCrypto` type error
2025-07-01 17:15:01 +02:00
NicoR
e4ba23cbef Add changeset 2025-07-01 12:13:40 -03:00
Brad Anderson
98c005a6e0 feat: more RN BetterAuth 2025-07-01 08:49:13 -04:00
Guido D'Orsi
8528db4de4 Merge pull request #2595 from garden-co/fix/make-jazz-tools-rn-deps-peer-dependencies
fix: make `react-native-nitro-modules` and `react-native-quick-crypto` optional peer dependencies
2025-07-01 11:30:14 +02:00
satendra03
e0fe5a20b7 fix #1914 2025-07-01 04:21:26 +05:30
NicoR
e16e4d53d1 Keep file extension in relative import 2025-06-30 16:52:09 -03:00
NicoR
d904fae506 fix: make react-native-quick-crypto an optional peer dependency 2025-06-30 15:44:04 -03:00
NicoR
f67c0b3db3 fix: make react-native-nitro-modules an optional peer dependency 2025-06-30 15:43:30 -03:00
NicoR
283d7c6bf0 fix: RNQuickCrypto type error 2025-06-30 15:13:10 -03:00
Guido D'Orsi
0e7a7dbbc0 Merge pull request #2591 from garden-co/fix/ci-e2e-exit-code
fix(ci): listen to e2e-rn-test's exit code
2025-06-30 17:53:34 +02:00
Matteo Manchi
63c69b6b95 fix(ci): listen to e2e-rn-test's exit code 2025-06-30 17:41:57 +02:00
Sammii
588ea02f63 refactoring Framework Select 2025-06-24 16:09:01 +01:00
Sammii
ddc69f2268 apply track on copy click to new snippet select component 2025-06-24 11:56:39 +01:00
Sammii
7c62689319 Merge branch 'main' into feat/snippet-improvements 2025-06-24 11:52:03 +01:00
Sammii
df7011167c making active dropdown item text primary 2025-06-02 17:14:45 +01:00
Sammii
28a785acb0 letting dropdown items be editable 2025-06-02 17:10:57 +01:00
Sammii
3ee557bfbe adding routerPush prop to framework select 2025-06-02 17:10:30 +01:00
Sammii
af94255166 updating HeroSection 2025-06-02 16:50:12 +01:00
Sammii
4a0dea3f75 create NpxCreateJazzApp.mdx 2025-06-02 16:49:46 +01:00
Sammii
6a42bc9655 creating GetStartedSnippetSelect component 2025-06-02 16:49:17 +01:00
Sammii
c6c8a7f6b7 amending Framework select 2025-06-02 16:48:41 +01:00
Sammii
133dd0e26d make dropdown classes last so you can edit them 2025-06-02 16:43:07 +01:00
Sammii
815339272f alter Feature Card styling 2025-06-02 14:47:30 +01:00
Sammii
9c1f340029 add new size to code group and amend copy button to be icon only on small 2025-06-02 13:54:29 +01:00
Sammii
b72ea9608d add new icon for clipboard success 2025-06-02 13:54:09 +01:00
74 changed files with 1188 additions and 374 deletions

View File

@@ -1,24 +1,23 @@
### What this Does
Brief summary of the change, ideally framed in user or product terms.
# Description
<!-- Please include a summary of the change and which issue is fixed -->
<!-- Please also include relevant motivation and context -->
<!-- Include any links to documentation like RFCs if necessary -->
<!-- Add a link to to relevant preview environments or anything that would simplify visual review process -->
<!-- Supplemental screenshots and video are encouraged, but the primary description should be in text -->
### Why Are We Doing This?
Link to the shaped pitch or explain what problem it solves.
## Manual testing instructions
### Scope / Boundaries
Includes:
- [x] Core feature functionality
- [x] Tests or validation steps
<!-- Add any actions required to manually test the changes -->
Do NOT include:
- [ ] Related stretch features or follow-ups
## Tests
### Testing Instructions
How a reviewer or QA can verify behavior, offer step-by-step instructions if possible. Screenshots or recordings are welcome.
- [ ] Tests have been added and/or updated
- [ ] Tests have not been updated, because: <!-- Insert reason for not updating tests here -->
- [ ] I need help with writing tests
### Known Issues / Open Questions (if any)
- [ ] Note anything youd like review on or decided async
### Related Links
- GitHub issue
- Linear pitch
- Design links or references
## Checklist
- [ ] I've updated the part of the docs that are affected the PR changes
- [ ] I've generated a changeset, if a version bump is required
- [ ] I've updated the jsDoc comments to the public APIs I've modified, or added them when missing

View File

@@ -1,5 +1,11 @@
name: Code quality
concurrency:
# For pushes, this lets concurrent runs happen, so each push gets a result.
# But for other events (e.g. PRs), we can cancel the previous runs.
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
on:
push:
branches:

View File

@@ -1,5 +1,11 @@
name: End-to-End Tests for React Native
concurrency:
# For pushes, this lets concurrent runs happen, so each push gets a result.
# But for other events (e.g. PRs), we can cancel the previous runs.
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
cancel-in-progress: true
on:
pull_request:
types: [opened, synchronize, reopened]
@@ -61,7 +67,7 @@ jobs:
disable-animations: true
working-directory: ./examples/chat-rn-expo/
# killall due to this issue: https://github.com/ReactiveCircus/android-emulator-runner/issues/385
script: ./test/e2e/run.sh && killall -INT crashpad_handler || true
script: ./test/e2e/run.sh && ( killall -INT crashpad_handler || true )
- name: Copy Maestro Output
if: steps.e2e_test.outcome != 'success'

View File

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

View File

@@ -1,46 +0,0 @@
name: Playwright Tests
on:
push:
branches: ["main"]
pull_request:
types: [opened, synchronize, reopened]
jobs:
test:
timeout-minutes: 60
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Setup Source Code
uses: ./.github/actions/source-code/
- name: Install root dependencies
run: pnpm install && pnpm exec turbo build --filter="./packages/*"
- name: Install project dependencies
run: pnpm install
working-directory: ./homepage/homepage
- name: Pnpm Build
run: pnpm exec turbo build
working-directory: ./homepage/homepage
- name: Install Playwright Browsers
run: pnpm exec playwright install
working-directory: ./homepage/homepage
- name: Run Playwright tests
run: pnpm exec playwright test
working-directory: ./homepage/homepage
- uses: actions/upload-artifact@v4
if: failure()
with:
name: homepage-playwright-report
path: ./homepage/homepage/playwright-report/
retention-days: 30

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,35 @@
# passkey-svelte
## 0.0.97
### Patch Changes
- Updated dependencies [3844666]
- jazz-tools@0.15.8
## 0.0.96
### Patch Changes
- Updated dependencies [c09b636]
- jazz-tools@0.15.7
## 0.0.95
### Patch Changes
- Updated dependencies [a5ceaff]
- jazz-tools@0.15.6
## 0.0.94
### Patch Changes
- Updated dependencies [23bfea5]
- Updated dependencies [e4ba23c]
- Updated dependencies [4b89838]
- jazz-tools@0.15.5
## 0.0.93
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "chat-svelte",
"version": "0.0.93",
"version": "0.0.97",
"type": "module",
"private": true,
"scripts": {

View File

@@ -17,6 +17,7 @@ import React from "react";
import { TodoAccount, TodoProject } from "./1_schema.ts";
import { NewProjectForm } from "./3_NewProjectForm.tsx";
import { ProjectTodoTable } from "./4_ProjectTodoTable.tsx";
import { apiKey } from "./apiKey.ts";
import {
Button,
ThemeProvider,
@@ -41,7 +42,7 @@ function JazzAndAuth({ children }: { children: React.ReactNode }) {
return (
<JazzReactProvider
sync={{
peer: `ws://localhost:4200`,
peer: `wss://cloud.jazz.tools/?key=${apiKey}`,
}}
AccountSchema={TodoAccount}
>

View File

@@ -12,6 +12,7 @@ import {
ChevronLeftIcon,
ChevronRight,
ChevronRightIcon,
ClipboardCheckIcon,
ClipboardIcon,
CodeIcon,
Eye,
@@ -66,6 +67,7 @@ export const icons = {
close: XIcon,
code: CodeIcon,
copy: ClipboardIcon,
copySuccess: ClipboardCheckIcon,
cursor: MousePointer2Icon,
darkTheme: MoonIcon,
delete: TrashIcon,

View File

@@ -11,7 +11,7 @@ export function CopyButton({
onCopy,
}: {
code: string;
size: "md" | "lg";
size: "sm" | "md" | "lg";
className?: string;
onCopy?: () => void;
}) {
@@ -32,13 +32,13 @@ export function CopyButton({
type="button"
className={clsx(
className,
"group/button absolute overflow-hidden rounded text-2xs font-medium md:opacity-0 backdrop-blur transition md:focus:opacity-100 group-hover:opacity-100",
"group/button absolute overflow-hidden rounded text-2xs font-medium md:opacity-0 backdrop-blur transition md:focus:opacity-100 group-hover:opacity-100 items-center align-middle p-0",
copied
? "bg-emerald-400/10 ring-1 ring-inset ring-emerald-400/20"
? "bg-blue-400/10 ring-1 ring-inset ring-blue-400/20"
: "bg-white/5 hover:bg-white/7.5 dark:bg-white/2.5 dark:hover:bg-white/5",
size == "md"
size === "md"
? "right-[8.5px] top-[8.5px] py-[2px] pl-1 pr-2"
: "right-2 top-2 py-1 pl-2 pr-3",
: "right-2 top-2 py-1 pl-2 pr-2",
)}
onClick={() => {
window.navigator.clipboard.writeText(code).then(() => {
@@ -60,18 +60,22 @@ export function CopyButton({
className={clsx(
size === "md" ? "size-3" : "size-4",
"stroke-stone-500 transition-colors group-hover/button:stroke-stone-600 dark:group-hover/button:stroke-stone-400",
copied && "stroke-primary",
)}
/>
Copy
{size !== "sm" && "Copy"}
</span>
<span
aria-hidden={!copied}
className={clsx(
"pointer-events-none absolute inset-0 flex items-center justify-center text-emerald-600 transition duration-300 dark:text-emerald-400",
"pointer-events-none absolute inset-0 flex items-center justify-center text-primary transition duration-300",
!copied && "translate-y-1.5 opacity-0",
)}
>
Copied!
{size === "sm" && (
<Icon name="copySuccess" size="xs" className="stroke-primary" />
)}
{size !== "sm" && "Copied!"}
</span>
</button>
);

View File

@@ -60,7 +60,7 @@ export function DropdownItem({
let classes = clsx(
className,
// Base styles
"group rounded-md space-x-2 focus:outline-none px-2.5 py-1.5",
"group rounded-md space-x-2 focus:outline-none px-2.5 py-1.5",
// Text styles
"text-left text-sm/6 dark:text-white forced-colors:text-[CanvasText]",
// Focus

View File

@@ -22,7 +22,7 @@ export type Style =
export const sizeClasses = {
sm: "text-sm py-1 px-2",
md: "py-1.5 px-3",
lg: "md:text-lg py-2 px-3 md:px-8 md:py-3",
lg: "py-2 px-5 md:px-6 md:py-2.5",
};
export const styleToBorderMap = {

View File

@@ -42,15 +42,6 @@ export const team: Array<TeamMember> = [
linkedin: "giordanoricci",
image: "gio.jpg",
},
{
name: "Trisha Lim",
slug: "trisha",
titles: ["Frontend Dev", "Marketing"],
image: "trisha.png",
location: "Lisbon, Portugal ",
github: "trishalim",
website: "https://trishalim.com",
},
{
name: "Meg Culotta",
slug: "meg",
@@ -73,7 +64,7 @@ export const team: Array<TeamMember> = [
name: "Sammii Kellow",
slug: "sammii",
location: "London, UK",
titles: ["Design Engineer", "Marketing"],
titles: ["Frontend & Design Engineer", "Marketing"],
x: "SammiiHaylock",
github: "sammii-hk",
website: "https://sammii.dev",
@@ -91,4 +82,25 @@ export const team: Array<TeamMember> = [
linkedin: "boorad",
image: "brad.png",
},
{
name: "Divya S",
slug: "div",
location: "New York, US",
titles: ["Platform Engineer"],
x: "shortdiv",
github: "shortdiv",
website: "https://shortdiv.com",
bluesky: "shortdiv.bsky.social",
linkedin: "shortdiv",
image: "div.jpg",
},
{
name: "Nico Rainhart",
slug: "nico",
location: "Buenos Aires, Argentina",
titles: ["Full-Stack Dev", "Framework Engineer"],
image: "nico.jpeg",
github: "nrainhart",
linkedin: "nicolás-rainhart",
},
];

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

View File

@@ -4,6 +4,7 @@ import { ComingSoonSection } from "@/components/home/ComingSoonSection";
import { EarlyAdopterSection } from "@/components/home/EarlyAdopterSection";
import { EncryptionSection } from "@/components/home/EncryptionSection";
import { FeaturesSection } from "@/components/home/FeaturesSection";
import { GetStartedSnippetSelect } from "@/components/home/GetStartedSnippetSelect";
import { HeroSection } from "@/components/home/HeroSection";
import { HowJazzWorksSection } from "@/components/home/HowJazzWorksSection";
import { LocalFirstFeaturesSection } from "@/components/home/LocalFirstFeaturesSection";
@@ -16,7 +17,8 @@ export default function Home() {
<>
<HeroSection />
<div className="container flex flex-col gap-12 mt-12 lg:gap-20 lg:mt-20">
<div className="container flex flex-col gap-12 lg:gap-20">
<GetStartedSnippetSelect />
<SupportedEnvironmentsSection />
<HowJazzWorksSection />

View File

@@ -17,7 +17,7 @@ export function SideNavItem({
}) {
const classes = clsx(
className,
"py-1 px-2 -mx-2 group rounded-md flex items-center transition-colors",
"py-1 px-2 group rounded-md flex items-center transition-colors",
);
const path = usePathname();
@@ -28,7 +28,7 @@ export function SideNavItem({
className={clsx(
classes,
path === href
? "text-stone-900 font-medium bg-stone-100 dark:text-white dark:bg-stone-900"
? "text-stone-900 font-medium bg-stone-200/50 dark:text-white dark:bg-stone-800/50"
: "hover:text-stone-900 dark:hover:text-stone-200",
)}
>

View File

@@ -10,10 +10,21 @@ import {
DropdownItem,
DropdownMenu,
} from "@garden-co/design-system/src/components/organisms/Dropdown";
import clsx from "clsx";
import { usePathname, useRouter } from "next/navigation";
import { useState } from "react";
export function FrameworkSelect() {
export function FrameworkSelect({
onSelect,
size = "md",
routerPush = true,
className,
}: {
onSelect?: (framework: Framework) => void;
size?: "sm" | "md";
routerPush?: boolean;
className?: string;
}) {
const router = useRouter();
const defaultFramework = useFramework();
const [selectedFramework, setSelectedFramework] =
@@ -23,26 +34,26 @@ export function FrameworkSelect() {
const selectFramework = (newFramework: Framework) => {
setSelectedFramework(newFramework);
router.push(path.replace(defaultFramework, newFramework));
onSelect && onSelect(newFramework);
routerPush && router.push(path.replace(defaultFramework, newFramework));
};
return (
<Dropdown>
<DropdownButton
className="w-full justify-between"
className={clsx("w-full justify-between overflow-hidden text-nowrap", size === "sm" && "text-sm", className)}
as={Button}
variant="outline"
intent="default"
>
{frameworkNames[selectedFramework].label}
<span className="text-nowrap max-w-full overflow-hidden text-ellipsis">{frameworkNames[selectedFramework].label}</span>
<Icon name="chevronDown" size="sm" />
</DropdownButton>
<DropdownMenu className="w-[--button-width] z-50" anchor="bottom start">
{Object.entries(frameworkNames)
.filter(([_, framework]) => !framework.hidden)
.map(([key, framework]) => (
<DropdownItem
className="items-baseline"
className={clsx("items-baseline", size === "sm" && "text-xs text-nowrap", selectedFramework === key && "text-primary dark:text-primary")}
key={key}
onClick={() => selectFramework(key as Framework)}
>

View File

@@ -0,0 +1,43 @@
'use client'
import { Framework } from "@/content/framework";
import { useFramework } from "@/lib/use-framework";
import NpxCreateJazzApp from "@/components/home/NpxCreateJazzApp.mdx";
import { CopyButton } from "@garden-co/design-system/src/components/molecules/CodeGroup";
import { useState } from "react";
import { Button } from "@garden-co/design-system/src/components/atoms/Button";
import Link from "next/link";
import { FrameworkSelect } from "../docs/FrameworkSelect";
import clsx from "clsx";
import { track } from "@vercel/analytics";
import { GappedGrid } from "@garden-co/design-system/src/components/molecules/GappedGrid";
export function GetStartedSnippetSelect() {
const defaultFramework = useFramework();
const [selectedFramework, setSelectedFramework] =
useState<Framework>(defaultFramework);
return (
<GappedGrid>
<div className="relative w-full col-span-2 lg:col-span-3 border-2 border-primary rounded-lg overflow-hidden">
<CopyButton
code="npx create-jazz-app@latest"
size="sm"
className={clsx("mt-0.5 mr-0.5 z-100 md:opacity-100 hidden md:block")}
onCopy={() => track("create-jazz-app command copied from hero")}
/>
<NpxCreateJazzApp />
</div>
<div className="col-span-2 lg:col-span-3 flex flex-row gap-2">
<div className="h-full items-center w-[175px]">
<FrameworkSelect onSelect={setSelectedFramework} size="md" routerPush={false} className="h-full md:px-4" />
</div>
<div className="flex h-full items-center">
<Button intent="primary" size="lg" className="w-full">
<Link className="my-[0.11rem]" href={`/docs/${selectedFramework}`}>Get started</Link>
</Button>
</div>
</div>
</GappedGrid>
);
}

View File

@@ -1,6 +1,5 @@
"use client";
import CreateJazzApp from "@/components/home/CreateJazzApp.mdx";
import { marketingCopy } from "@/content/marketingCopy";
import { H1 } from "@garden-co/design-system/src/components/atoms/Headings";
import {
@@ -8,11 +7,10 @@ import {
type IconName,
} from "@garden-co/design-system/src/components/atoms/Icon";
import { Kicker } from "@garden-co/design-system/src/components/atoms/Kicker";
import { CopyButton } from "@garden-co/design-system/src/components/molecules/CodeGroup";
import { Prose } from "@garden-co/design-system/src/components/molecules/Prose";
import { SectionHeader } from "@garden-co/design-system/src/components/molecules/SectionHeader";
import { track } from "@vercel/analytics";
import Link from "next/link";
import { GetStartedSnippetSelect } from "./GetStartedSnippetSelect";
const features: Array<{
title: string;
@@ -54,8 +52,8 @@ const features: Array<{
export function HeroSection() {
return (
<div className="container grid items-center gap-x-8 gap-y-12 my-12 md:my-16 lg:my-24 lg:gap-x-10 lg:grid-cols-3">
<div className="flex flex-col justify-center gap-5 lg:col-span-2 lg:gap-8">
<div className="container grid items-center gap-x-8 gap-y-12 my-12 md:my-16 lg:my-24 lg:gap-x-10 lg:grid-cols-12">
<div className="flex flex-col justify-center gap-5 lg:col-span-11 lg:gap-8">
<Kicker>Toolkit for backendless apps</Kicker>
<H1>
<span className="inline-block text-highlight">
@@ -94,31 +92,6 @@ export function HeroSection() {
))}
</div>
</div>
<div className="h-full group grid md:grid-cols-2 items-center lg:grid-cols-1 lg:pt-36">
<SectionHeader
className="md:col-span-2 lg:sr-only"
title="Get a Jazz app running in minutes."
/>
<div className="overflow-hidden sm:rounded-xl sm:border h-full sm:px-8 sm:pt-6 bg-stone-50 dark:bg-stone-950">
<div className="rounded-lg bg-white dark:bg-stone-925 sm:ring-4 ring-stone-400/20 sm:shadow-xl sm:shadow-blue/20 border relative sm:top-2 h-full w-full">
<div className="py-4 flex items-center gap-2.5 px-6 border-b">
<span className="rounded-full size-3 bg-stone-200 dark:bg-stone-900" />
<span className="rounded-full size-3 bg-stone-200 dark:bg-stone-900" />
<span className="rounded-full size-3 bg-stone-200 dark:bg-stone-900" />
<CopyButton
code="npx create-jazz-app@latest"
size="md"
className="mt-0.5 mr-0.5"
onCopy={() => track("create-jazz-app command copied from hero")}
/>
</div>
<div className="p-3">
<CreateJazzApp />
</div>
</div>
</div>
</div>
</div>
);
}

View File

@@ -0,0 +1,3 @@
```sh
npx create-jazz-app@latest
```

View File

@@ -118,7 +118,7 @@ To use it, install the following Packages:
<CodeGroup>
```bash
pnpm add react-native-quick-crypto@1.0.0-beta.18 react-native-nitro-modules
pnpm add react-native-quick-crypto@1.0.0-beta.18 react-native-nitro-modules react-native-fast-encoder
```
</CodeGroup>

View File

@@ -116,7 +116,7 @@ To use it, install the following Packages:
<CodeGroup>
```bash
pnpm add react-native-quick-crypto@1.0.0-beta.18 react-native-nitro-modules
pnpm add react-native-quick-crypto@1.0.0-beta.18 react-native-nitro-modules react-native-fast-encoder
```
</CodeGroup>

View File

@@ -40,7 +40,7 @@ npx expo prebuild
<CodeGroup>
```bash
# Expo dependencies
npx expo install expo-linking expo-secure-store expo-file-system @react-native-community/netinfo @bam.tech/react-native-image-resizer
npx expo install expo-linking expo-secure-store expo-sqlite expo-file-system @react-native-community/netinfo @bam.tech/react-native-image-resizer
# React Native polyfills
npm i -S @azure/core-asynciterator-polyfill react-native-url-polyfill readable-stream react-native-get-random-values

View File

@@ -23,8 +23,7 @@
"playwright": "^1.50.1",
"turbo": "^2.3.1",
"typedoc": "^0.25.13",
"vitest": "catalog:",
"yalc": "^1.0.0-pre.53"
"vitest": "catalog:"
},
"scripts": {
"dev": "turbo dev",
@@ -40,8 +39,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",
"check-catalog-deps": "node scripts/check-catalog-deps.js",
"yalc:all": "for d in packages/*/; do echo $d; cd $d; pnpm yalc push --replace --sig; cd '../../'; done"
"check-catalog-deps": "node scripts/check-catalog-deps.js"
},
"version": "0.0.0",
"pnpm": {

View File

@@ -1,5 +1,33 @@
# cojson-storage-indexeddb
## 0.15.8
### Patch Changes
- cojson@0.15.8
- cojson-storage@0.15.8
## 0.15.7
### Patch Changes
- cojson@0.15.7
- cojson-storage@0.15.7
## 0.15.6
### Patch Changes
- cojson@0.15.6
- cojson-storage@0.15.6
## 0.15.5
### Patch Changes
- cojson@0.15.5
- cojson-storage@0.15.5
## 0.15.4
### Patch Changes

View File

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

View File

@@ -1,5 +1,33 @@
# cojson-storage-sqlite
## 0.15.8
### Patch Changes
- cojson@0.15.8
- cojson-storage@0.15.8
## 0.15.7
### Patch Changes
- cojson@0.15.7
- cojson-storage@0.15.7
## 0.15.6
### Patch Changes
- cojson@0.15.6
- cojson-storage@0.15.6
## 0.15.5
### Patch Changes
- cojson@0.15.5
- cojson-storage@0.15.5
## 0.15.4
### Patch Changes

View File

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

View File

@@ -1,5 +1,29 @@
# cojson-storage
## 0.15.8
### Patch Changes
- cojson@0.15.8
## 0.15.7
### Patch Changes
- cojson@0.15.7
## 0.15.6
### Patch Changes
- cojson@0.15.6
## 0.15.5
### Patch Changes
- cojson@0.15.5
## 0.15.4
### Patch Changes

View File

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

View File

@@ -1,5 +1,29 @@
# cojson-transport-nodejs-ws
## 0.15.8
### Patch Changes
- cojson@0.15.8
## 0.15.7
### Patch Changes
- cojson@0.15.7
## 0.15.6
### Patch Changes
- cojson@0.15.6
## 0.15.5
### Patch Changes
- cojson@0.15.5
## 0.15.4
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "cojson-transport-ws",
"type": "module",
"version": "0.15.4",
"version": "0.15.8",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"license": "MIT",

View File

@@ -1,5 +1,13 @@
# cojson
## 0.15.8
## 0.15.7
## 0.15.6
## 0.15.5
## 0.15.4
### Patch Changes

View File

@@ -25,7 +25,7 @@
},
"type": "module",
"license": "MIT",
"version": "0.15.4",
"version": "0.15.8",
"devDependencies": {
"@opentelemetry/sdk-metrics": "^2.0.0",
"typescript": "catalog:"

View File

@@ -1,5 +1,11 @@
# create-jazz-app
## 0.1.25
### Patch Changes
- b774bb3: Add default project name
## 0.1.24
### Patch Changes

View File

@@ -5,7 +5,7 @@
"types": "src/index.ts",
"type": "module",
"license": "MIT",
"version": "0.1.24",
"version": "0.1.25",
"bin": {
"create-jazz-app": "./dist/index.js"
},

View File

@@ -493,10 +493,24 @@ async function promptUser(
}
if (!partialOptions.projectName) {
// Determine a default project name if possible
let defaultProjectName = undefined;
if (partialOptions.example) {
// Use the example name, affixed with -app if not already
defaultProjectName = partialOptions.example.endsWith("-app")
? partialOptions.example
: `${partialOptions.example}-app`;
} else if (partialOptions.starter) {
// Use the starter name, affixed with -app if not already
defaultProjectName = partialOptions.starter.endsWith("-app")
? partialOptions.starter
: `${partialOptions.starter}-app`;
}
questions.push({
type: "input",
name: "projectName",
message: chalk.cyan("Enter your project name:"),
default: defaultProjectName,
validate: (input: string) =>
input ? true : chalk.red("Project name cannot be empty"),
});
@@ -590,6 +604,17 @@ program
} else if (directory && !options.projectName) {
// If directory is provided but not project name, use directory as project name
partialOptions.projectName = directory;
} else if (!directory && !options.projectName) {
// If no directory or projectName, and example is provided, use example as default
if (options.example) {
partialOptions.projectName = options.example.endsWith("-app")
? options.example
: `${options.example}-app`;
} else if (options.starter) {
partialOptions.projectName = options.starter.endsWith("-app")
? options.starter
: `${options.starter}-app`;
}
}
if (options.starter)

View File

@@ -1,5 +1,44 @@
# jazz-auth-betterauth
## 0.15.8
### Patch Changes
- Updated dependencies [3844666]
- jazz-tools@0.15.8
- jazz-betterauth-client-plugin@0.15.8
- cojson@0.15.8
## 0.15.7
### Patch Changes
- Updated dependencies [c09b636]
- jazz-tools@0.15.7
- jazz-betterauth-client-plugin@0.15.7
- cojson@0.15.7
## 0.15.6
### Patch Changes
- Updated dependencies [a5ceaff]
- jazz-tools@0.15.6
- jazz-betterauth-client-plugin@0.15.6
- cojson@0.15.6
## 0.15.5
### Patch Changes
- 4b89838: Changes that verify the BetterAuth package for React also works with React Native and Expo apps
- Updated dependencies [23bfea5]
- Updated dependencies [e4ba23c]
- Updated dependencies [4b89838]
- jazz-tools@0.15.5
- jazz-betterauth-client-plugin@0.15.5
- cojson@0.15.5
## 0.15.4
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "jazz-auth-betterauth",
"version": "0.15.4",
"version": "0.15.8",
"type": "module",
"main": "dist/index.js",
"types": "src/index.ts",

View File

@@ -9,29 +9,33 @@ import {
} from "jazz-tools";
import type { AuthSetPayload } from "jazz-tools";
export const newAuthClient = <T extends ClientOptions>(options?: T) => {
type Plugins = Array<
| NonNullable<NonNullable<T>["plugins"]>[number]
| ReturnType<typeof jazzClientPlugin>
type Plugins<T extends ClientOptions> = Array<
| NonNullable<NonNullable<T>["plugins"]>[number]
| ReturnType<typeof jazzClientPlugin>
>;
type Options<T extends ClientOptions> = {
plugins: Plugins<T>;
} & T;
export type AuthClient<T extends ClientOptions> = ReturnType<
typeof createAuthClient<Options<T>>
> &
ReturnType<
typeof createAuthClient<{
plugins: [ReturnType<typeof jazzClientPlugin>];
}>
>;
type Options<T> = {
plugins: Plugins;
} & T;
type AuthClient<T> = ReturnType<typeof createAuthClient<Options<T>>> &
ReturnType<
typeof createAuthClient<{
plugins: [ReturnType<typeof jazzClientPlugin>];
}>
>;
export const newAuthClient = <T extends ClientOptions>(
options?: T,
): AuthClient<T> => {
return createAuthClient<Options<T>>({
...options,
plugins: [...(options?.plugins ?? []), ...[jazzClientPlugin()]],
} as Options<T>) as AuthClient<T>;
};
export type AuthClient<T extends ClientOptions> = ReturnType<
typeof newAuthClient<T>
>;
export type InferredSession<T extends ClientOptions> =
AuthClient<T>["$Infer"]["Session"];
export type Session<T extends ClientOptions> =

View File

@@ -1,5 +1,29 @@
# jazz-betterauth-client-plugin
## 0.15.8
### Patch Changes
- jazz-betterauth-server-plugin@0.15.8
## 0.15.7
### Patch Changes
- jazz-betterauth-server-plugin@0.15.7
## 0.15.6
### Patch Changes
- jazz-betterauth-server-plugin@0.15.6
## 0.15.5
### Patch Changes
- jazz-betterauth-server-plugin@0.15.5
## 0.15.4
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "jazz-betterauth-client-plugin",
"version": "0.15.4",
"version": "0.15.8",
"type": "module",
"main": "dist/index.js",
"types": "src/index.ts",

View File

@@ -1,5 +1,39 @@
# jazz-betterauth-server-plugin
## 0.15.8
### Patch Changes
- Updated dependencies [3844666]
- jazz-tools@0.15.8
- cojson@0.15.8
## 0.15.7
### Patch Changes
- Updated dependencies [c09b636]
- jazz-tools@0.15.7
- cojson@0.15.7
## 0.15.6
### Patch Changes
- Updated dependencies [a5ceaff]
- jazz-tools@0.15.6
- cojson@0.15.6
## 0.15.5
### Patch Changes
- Updated dependencies [23bfea5]
- Updated dependencies [e4ba23c]
- Updated dependencies [4b89838]
- jazz-tools@0.15.5
- cojson@0.15.5
## 0.15.4
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "jazz-betterauth-server-plugin",
"version": "0.15.4",
"version": "0.15.8",
"type": "module",
"main": "dist/index.js",
"types": "src/index.ts",

View File

@@ -1,5 +1,48 @@
# jazz-react-auth-betterauth
## 0.15.8
### Patch Changes
- Updated dependencies [3844666]
- jazz-tools@0.15.8
- jazz-auth-betterauth@0.15.8
- jazz-betterauth-client-plugin@0.15.8
- cojson@0.15.8
## 0.15.7
### Patch Changes
- Updated dependencies [c09b636]
- jazz-tools@0.15.7
- jazz-auth-betterauth@0.15.7
- jazz-betterauth-client-plugin@0.15.7
- cojson@0.15.7
## 0.15.6
### Patch Changes
- Updated dependencies [a5ceaff]
- jazz-tools@0.15.6
- jazz-auth-betterauth@0.15.6
- jazz-betterauth-client-plugin@0.15.6
- cojson@0.15.6
## 0.15.5
### Patch Changes
- 4b89838: Changes that verify the BetterAuth package for React also works with React Native and Expo apps
- Updated dependencies [23bfea5]
- Updated dependencies [e4ba23c]
- Updated dependencies [4b89838]
- jazz-tools@0.15.5
- jazz-auth-betterauth@0.15.5
- jazz-betterauth-client-plugin@0.15.5
- cojson@0.15.5
## 0.15.4
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "jazz-react-auth-betterauth",
"version": "0.15.4",
"version": "0.15.8",
"type": "module",
"main": "dist/index.js",
"types": "src/index.tsx",

View File

@@ -1,6 +1,5 @@
"use client";
import type { ClientOptions } from "better-auth/client";
import { createContext, useContext } from "react";
import { useBetterAuth } from "../index.js";

View File

@@ -4,7 +4,7 @@ import {
useAuthSecretStorage,
useIsAuthenticated,
useJazzContext,
} from "jazz-tools/react";
} from "jazz-tools/react-core";
import { useEffect, useMemo, useState } from "react";
export * from "./contexts/Auth.js";

View File

@@ -1,5 +1,47 @@
# jazz-run
## 0.15.8
### Patch Changes
- Updated dependencies [3844666]
- jazz-tools@0.15.8
- cojson@0.15.8
- cojson-storage-sqlite@0.15.8
- cojson-transport-ws@0.15.8
## 0.15.7
### Patch Changes
- Updated dependencies [c09b636]
- jazz-tools@0.15.7
- cojson@0.15.7
- cojson-storage-sqlite@0.15.7
- cojson-transport-ws@0.15.7
## 0.15.6
### Patch Changes
- Updated dependencies [a5ceaff]
- jazz-tools@0.15.6
- cojson@0.15.6
- cojson-storage-sqlite@0.15.6
- cojson-transport-ws@0.15.6
## 0.15.5
### Patch Changes
- Updated dependencies [23bfea5]
- Updated dependencies [e4ba23c]
- Updated dependencies [4b89838]
- jazz-tools@0.15.5
- cojson@0.15.5
- cojson-storage-sqlite@0.15.5
- cojson-transport-ws@0.15.5
## 0.15.4
### Patch Changes

View File

@@ -3,7 +3,7 @@
"bin": "./dist/index.js",
"type": "module",
"license": "MIT",
"version": "0.15.4",
"version": "0.15.8",
"exports": {
"./startSyncServer": {
"import": "./dist/startSyncServer.js",
@@ -28,11 +28,11 @@
"@effect/printer-ansi": "^0.34.5",
"@effect/schema": "^0.71.1",
"@effect/typeclass": "^0.25.5",
"cojson": "workspace:0.15.4",
"cojson-storage-sqlite": "workspace:0.15.4",
"cojson-transport-ws": "workspace:0.15.4",
"cojson": "workspace:0.15.8",
"cojson-storage-sqlite": "workspace:0.15.8",
"cojson-transport-ws": "workspace:0.15.8",
"effect": "^3.6.5",
"jazz-tools": "workspace:0.15.4",
"jazz-tools": "workspace:0.15.8",
"ws": "^8.14.2"
},
"devDependencies": {

View File

@@ -1,5 +1,47 @@
# jazz-tools
## 0.15.8
### Patch Changes
- 3844666: Refactor AccountSchema types to solve "This is likely not portable. A type annotation is necessary" issue when using co.account()
- cojson@0.15.8
- cojson-storage@0.15.8
- cojson-storage-indexeddb@0.15.8
- cojson-transport-ws@0.15.8
## 0.15.7
### Patch Changes
- c09b636: Fix react bundling in jazz-tools/inspector/register-custom-element
- cojson@0.15.7
- cojson-storage@0.15.7
- cojson-storage-indexeddb@0.15.7
- cojson-transport-ws@0.15.7
## 0.15.6
### Patch Changes
- a5ceaff: add Group.getDirectMembers to get only direct members of a group
- cojson@0.15.6
- cojson-storage@0.15.6
- cojson-storage-indexeddb@0.15.6
- cojson-transport-ws@0.15.6
## 0.15.5
### Patch Changes
- 23bfea5: Make all React Native dependencies in `jazz-tools` optional peer dependencies
- e4ba23c: Fix type error with `RNQuickCrypto` that prevented using it as a `CryptoProvider`
- 4b89838: Changes that verify the BetterAuth package for React also works with React Native and Expo apps
- cojson@0.15.5
- cojson-storage@0.15.5
- cojson-storage-indexeddb@0.15.5
- cojson-transport-ws@0.15.5
## 0.15.4
### Patch Changes

View File

@@ -139,10 +139,9 @@
},
"type": "module",
"license": "MIT",
"version": "0.15.4",
"version": "0.15.8",
"dependencies": {
"@manuscripts/prosemirror-recreate-steps": "^0.1.4",
"@op-engineering/op-sqlite": "^11.4.8",
"@scure/base": "1.2.1",
"@scure/bip39": "^1.3.0",
"@tiptap/core": "^2.12.0",
@@ -152,7 +151,6 @@
"cojson-storage": "workspace:*",
"cojson-storage-indexeddb": "workspace:*",
"cojson-transport-ws": "workspace:*",
"expo-sqlite": "15.2.9",
"fast-myers-diff": "^3.2.0",
"goober": "^2.1.16",
"image-blob-reduce": "^4.1.0",
@@ -163,10 +161,6 @@
"prosemirror-schema-basic": "^1.2.2",
"prosemirror-state": "^1.4.3",
"prosemirror-transform": "^1.9.0",
"react-native-fast-encoder": "^0.2.0",
"react-native-mmkv": "^3.2.0",
"react-native-nitro-modules": "0.25.2",
"react-native-quick-crypto": "1.0.0-beta.16",
"zod": "3.25.28"
},
"scripts": {
@@ -196,27 +190,39 @@
},
"peerDependencies": {
"@bam.tech/react-native-image-resizer": "*",
"@op-engineering/op-sqlite": "^11.4.8",
"@react-native-community/netinfo": "*",
"expo-file-system": "*",
"expo-secure-store": "*",
"expo-sqlite": "15.2.9",
"react": "*",
"react-dom": "*",
"react-native": "*",
"react-native-fast-encoder": "^0.2.0",
"react-native-mmkv": "^3.2.0",
"react-native-nitro-modules": "0.25.2",
"react-native-quick-crypto": "1.0.0-beta.16",
"svelte": "^5.0.0"
},
"peerDependenciesMeta": {
"@bam.tech/react-native-image-resizer": {
"optional": true
},
"expo-file-system": {
"@op-engineering/op-sqlite": {
"optional": true
},
"@react-native-community/netinfo": {
"optional": true
},
"expo-file-system": {
"optional": true
},
"expo-secure-store": {
"optional": true
},
"expo-sqlite": {
"optional": true
},
"react": {
"optional": true
},
@@ -226,8 +232,20 @@
"react-native": {
"optional": true
},
"react-native-fast-encoder": {
"optional": true
},
"react-native-mmkv": {
"optional": true
},
"react-native-nitro-modules": {
"optional": true
},
"react-native-quick-crypto": {
"optional": true
},
"svelte": {
"optional": true
}
}
}
}

View File

@@ -1,6 +1,6 @@
import { Account } from "jazz-tools";
import { JazzInspectorInternal } from "jazz-tools/inspector";
import { createRoot } from "react-dom/client";
import { JazzInspectorInternal } from "./index.js";
export class JazzInspectorElement extends HTMLElement {
private root: ReturnType<typeof createRoot> | null = null;

View File

@@ -1,7 +1,7 @@
export * from "./provider.js";
export * from "./auth/auth.js";
export * from "./hooks.js";
export * from "./media.js";
export * from "./provider.js";
export * from "./storage/kv-store-context.js";
export { SQLiteDatabaseDriverAsync } from "cojson-storage";

View File

@@ -4,17 +4,14 @@ import { PureJSCrypto } from "cojson/dist/crypto/PureJSCrypto"; // Importing fro
import {
Account,
AccountClass,
AccountSchema,
AgentID,
AnyAccountSchema,
AuthCredentials,
AuthSecretStorage,
CoValue,
CoValueClass,
CoValueFromRaw,
CryptoProvider,
ID,
InstanceOfSchema,
NewAccountProps,
SessionID,
SyncConfig,
@@ -27,7 +24,7 @@ import { SQLiteReactNative } from "./storage/sqlite-react-native.js";
import { SQLiteDatabaseDriverAsync } from "cojson-storage";
import { WebSocketPeerWithReconnection } from "cojson-transport-ws";
import type { RNQuickCrypto } from "./crypto/RNQuickCrypto.js";
import type { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";
export type BaseReactNativeContextOptions = {
sync: SyncConfig;

View File

@@ -9,7 +9,7 @@ import {
} from "jazz-tools";
import { JazzContext, JazzContextManagerContext } from "jazz-tools/react-core";
import React, { useEffect, useRef } from "react";
import { JazzContextManagerProps } from "./ReactNativeContextManager.js";
import type { JazzContextManagerProps } from "./ReactNativeContextManager.js";
import { ReactNativeContextManager } from "./ReactNativeContextManager.js";
import { setupKvStore } from "./platform.js";
@@ -35,10 +35,10 @@ export function JazzProviderCore<
AccountSchema,
defaultProfileName,
onLogOut,
kvStore,
onAnonymousAccountDiscarded,
CryptoProvider,
logOutReplacement,
onAnonymousAccountDiscarded,
kvStore,
CryptoProvider,
}: JazzProviderProps<S>) {
setupKvStore(kvStore);
@@ -46,11 +46,11 @@ export function JazzProviderCore<
() => new ReactNativeContextManager<S>(),
);
const onLogOutRefCallback = useRefCallback(onLogOut);
const logOutReplacementRefCallback = useRefCallback(logOutReplacement);
const onAnonymousAccountDiscardedRefCallback = useRefCallback(
onAnonymousAccountDiscarded,
);
const onLogOutRefCallback = useRefCallback(onLogOut);
const logOutReplacementRefCallback = useRefCallback(logOutReplacement);
const logoutReplacementActiveRef = useRef(false);
logoutReplacementActiveRef.current = Boolean(logOutReplacement);
@@ -71,11 +71,12 @@ export function JazzProviderCore<
: undefined,
onAnonymousAccountDiscarded: onAnonymousAccountDiscardedRefCallback,
CryptoProvider,
};
} satisfies JazzContextManagerProps<S>;
if (contextManager.propsChanged(props)) {
contextManager.createContext(props).catch((error) => {
console.log(error.stack);
console.error("Error creating Jazz context:", error);
console.error("Error creating Jazz React Native context:", error);
});
}

View File

@@ -74,6 +74,7 @@ export function JazzReactProvider<
if (contextManager.propsChanged(props)) {
contextManager.createContext(props).catch((error) => {
console.log(error.stack);
console.error("Error creating Jazz browser context:", error);
});
}

View File

@@ -182,7 +182,9 @@ export class Group extends CoValueBase implements CoValue {
}
}
get members(): Array<{
private getMembersFromKeys(
accountIDs: Iterable<RawAccountID | AgentID>,
): Array<{
id: string;
role: AccountRole;
ref: Ref<Account>;
@@ -195,7 +197,7 @@ export class Group extends CoValueBase implements CoValue {
optional: false,
} satisfies RefEncoded<Account>;
for (const accountID of this._raw.getAllMemberKeysSet()) {
for (const accountID of accountIDs) {
if (!isAccountID(accountID)) continue;
const role = this._raw.roleOf(accountID);
@@ -230,6 +232,30 @@ export class Group extends CoValueBase implements CoValue {
return members;
}
/**
* Returns all members of the group, including inherited members from parent
* groups.
*
* If you need only the direct members of the group, use
* {@link getDirectMembers} instead.
*
* @returns The members of the group.
*/
get members() {
return this.getMembersFromKeys(this._raw.getAllMemberKeysSet());
}
/**
* Returns the direct members of the group.
*
* If you need all members of the group, including inherited members from
* parent groups, use {@link Group.members|members} instead.
* @returns The direct members of the group.
*/
getDirectMembers() {
return this.getMembersFromKeys(this._raw.getMemberKeys());
}
getRoleOf(member: Everyone | ID<Account> | "me") {
if (member === "me") {
return this._raw.roleOf(

View File

@@ -102,6 +102,8 @@ export {
type InstanceOfSchemaCoValuesNullable,
type CoValueOrZodSchema,
type Loaded,
type BaseAccountShape,
type DefaultAccountShape,
type AccountSchema,
type AnyAccountSchema,
type CoListSchema,

View File

@@ -7,22 +7,24 @@ import { z } from "../zodReExport.js";
import { Loaded, ResolveQuery } from "../zodSchema.js";
import { AnyCoMapSchema, CoMapSchema } from "./CoMapSchema.js";
export type BaseProfileShape = {
name: z.core.$ZodString<string>;
inbox?: z.core.$ZodOptional<z.core.$ZodString>;
inboxInvite?: z.core.$ZodOptional<z.core.$ZodString>;
};
export type BaseAccountShape = {
profile: AnyCoMapSchema<BaseProfileShape>;
root: AnyCoMapSchema;
};
export type DefaultAccountShape = {
profile: CoMapSchema<BaseProfileShape>;
root: CoMapSchema<{}>;
};
export type AccountSchema<
Shape extends {
profile: AnyCoMapSchema<{
name: z.core.$ZodString<string>;
inbox?: z.core.$ZodOptional<z.core.$ZodString>;
inboxInvite?: z.core.$ZodOptional<z.core.$ZodString>;
}>;
root: AnyCoMapSchema;
} = {
profile: CoMapSchema<{
name: z.core.$ZodString<string>;
inbox?: z.core.$ZodOptional<z.core.$ZodString>;
inboxInvite?: z.core.$ZodOptional<z.core.$ZodString>;
}>;
root: CoMapSchema<{}>;
},
Shape extends BaseAccountShape = DefaultAccountShape,
> = Omit<CoMapSchema<Shape>, "create" | "load" | "withMigration"> & {
builtin: "Account";

View File

@@ -1,22 +1,23 @@
import {
type Account,
AccountCreationProps,
AccountSchema,
AnyCoMapSchema,
type AccountCreationProps,
type AccountSchema,
type AnyCoMapSchema,
BaseAccountShape,
CoFeed,
CoFeedSchema,
CoListSchema,
CoMapSchema,
type CoFeedSchema,
type CoListSchema,
type CoMapSchema,
CoPlainText,
CoProfileSchema,
CoRecordSchema,
type CoProfileSchema,
type CoRecordSchema,
CoRichText,
DefaultProfileShape,
type DefaultProfileShape,
FileStream,
FileStreamSchema,
type FileStreamSchema,
ImageDefinition,
PlainTextSchema,
Simplify,
type PlainTextSchema,
type Simplify,
zodSchemaToCoSchema,
} from "../../internal.js";
import { RichTextSchema } from "./schemaTypes/RichTextSchema.js";
@@ -82,16 +83,9 @@ export const coMapDefiner = <Shape extends z.core.$ZodLooseShape>(
return enrichCoMapSchema(objectSchema);
};
function enrichAccountSchema<
Shape extends {
profile: AnyCoMapSchema<{
name: z.core.$ZodString<string>;
inbox?: z.core.$ZodOptional<z.core.$ZodString>;
inboxInvite?: z.core.$ZodOptional<z.core.$ZodString>;
}>;
root: AnyCoMapSchema;
},
>(schema: z.ZodObject<Shape, z.core.$strip>) {
function enrichAccountSchema<Shape extends BaseAccountShape>(
schema: z.ZodObject<Shape, z.core.$strip>,
) {
const enrichedSchema = Object.assign(schema, {
collaborative: true,
builtin: "Account",
@@ -142,16 +136,44 @@ function enrichAccountSchema<
return enrichedSchema;
}
export const coAccountDefiner = <
Shape extends {
profile: AnyCoMapSchema<{
name: z.core.$ZodString<string>;
inbox?: z.core.$ZodOptional<z.core.$ZodString>;
inboxInvite?: z.core.$ZodOptional<z.core.$ZodString>;
}>;
root: AnyCoMapSchema;
},
>(
/**
* Defines a collaborative account schema for Jazz applications.
*
* Creates an account schema that represents a user account with profile and root data.
* Accounts are the primary way to identify and manage users in Jazz applications.
*
* @template Shape - The shape of the account schema extending BaseAccountShape
* @param shape - The account schema shape. Defaults to a basic profile with name, inbox, and inboxInvite fields, plus an empty root object.
*
* @example
* ```typescript
* // Basic account with default profile
* const BasicAccount = co.account();
*
* // Custom account with specific profile and root structure
* const JazzAccount = co.account({
* profile: co.profile({
* name: z.string(),
* avatar: z.optional(z.string()),
* }),
* root: co.map({
* organizations: co.list(Organization),
* draftOrganization: DraftOrganization,
* }),
* }).withMigration(async (account) => {
* // Migration logic for existing accounts
* if (account.profile === undefined) {
* const group = Group.create();
* account.profile = co.profile().create(
* { name: getRandomUsername() },
* group
* );
* group.addMember("everyone", "reader");
* }
* });
* ```
*/
export const coAccountDefiner = <Shape extends BaseAccountShape>(
shape: Shape = {
profile: coMapDefiner({
name: z.string(),

View File

@@ -650,3 +650,65 @@ describe("Group.members", () => {
]);
});
});
describe("Group.getDirectMembers", () => {
test("should return only the direct members of the group", async () => {
const parentGroup = Group.create();
const childGroup = Group.create();
const bob = await createJazzTestAccount({});
await bob.waitForAllCoValuesSync();
// Add bob to parent group
parentGroup.addMember(bob, "reader");
// Add parent group to child group
childGroup.addMember(parentGroup);
// Child group should inherit bob through parent, but bob is not a direct member
expect(childGroup.members).toEqual([
expect.objectContaining({
account: expect.objectContaining({
id: co.account().getMe().id,
}),
}),
expect.objectContaining({
account: expect.objectContaining({
id: bob.id,
}),
}),
]);
// directMembers should only show the admin, not the inherited bob
expect(childGroup.getDirectMembers()).toEqual([
expect.objectContaining({
account: expect.objectContaining({
id: co.account().getMe().id,
}),
}),
]);
// Explicitly verify bob is not in directMembers
expect(childGroup.getDirectMembers()).not.toContainEqual(
expect.objectContaining({
account: expect.objectContaining({
id: bob.id,
}),
}),
);
// Parent group's direct members should include both admin and bob
expect(parentGroup.getDirectMembers()).toEqual([
expect.objectContaining({
account: expect.objectContaining({
id: co.account().getMe().id,
}),
}),
expect.objectContaining({
account: expect.objectContaining({
id: bob.id,
}),
}),
]);
});
});

View File

@@ -60,7 +60,7 @@ export default defineConfig([
"register-custom-element": "src/inspector/register-custom-element.ts",
},
// This is a custom element meant to be used on non-react apps
noExternal: ["react", "react-dom"],
noExternal: ["react", "react-dom", "react-dom/client", "react/jsx-runtime"],
outDir: "dist/inspector",
},
{

270
pnpm-lock.yaml generated
View File

@@ -88,9 +88,6 @@ importers:
vitest:
specifier: 'catalog:'
version: 3.1.3(@types/node@22.15.18)(@vitest/browser@3.1.3)(@vitest/ui@3.1.3)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@25.0.1)(lightningcss@1.30.1)(msw@2.7.0(@types/node@22.15.18)(typescript@5.8.3))(terser@5.37.0)(tsx@4.19.3)(yaml@2.6.1)
yalc:
specifier: ^1.0.0-pre.53
version: 1.0.0-pre.53
examples/betterauth:
dependencies:
@@ -1623,7 +1620,7 @@ importers:
specifier: ^11.7.0
version: 11.10.0
cojson:
specifier: workspace:0.15.4
specifier: workspace:0.15.8
version: link:../cojson
cojson-storage:
specifier: workspace:*
@@ -1800,19 +1797,19 @@ importers:
specifier: ^0.25.5
version: 0.25.8(effect@3.11.9)
cojson:
specifier: workspace:0.15.4
specifier: workspace:0.15.8
version: link:../cojson
cojson-storage-sqlite:
specifier: workspace:0.15.4
specifier: workspace:0.15.8
version: link:../cojson-storage-sqlite
cojson-transport-ws:
specifier: workspace:0.15.4
specifier: workspace:0.15.8
version: link:../cojson-transport-ws
effect:
specifier: ^3.6.5
version: 3.11.9
jazz-tools:
specifier: workspace:0.15.4
specifier: workspace:0.15.8
version: link:../jazz-tools
ws:
specifier: ^8.14.2
@@ -2037,6 +2034,9 @@ importers:
'@sveltejs/vite-plugin-svelte':
specifier: ^5.1.0
version: 5.1.0(svelte@5.34.1)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.37.0)(tsx@4.19.3)(yaml@2.6.1))
'@tailwindcss/postcss':
specifier: ^4.1.11
version: 4.1.11
'@types/eslint':
specifier: ^9.6.0
version: 9.6.1
@@ -5684,60 +5684,117 @@ packages:
'@tailwindcss/node@4.1.10':
resolution: {integrity: sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ==}
'@tailwindcss/node@4.1.11':
resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==}
'@tailwindcss/oxide-android-arm64@4.1.10':
resolution: {integrity: sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
'@tailwindcss/oxide-android-arm64@4.1.11':
resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
'@tailwindcss/oxide-darwin-arm64@4.1.10':
resolution: {integrity: sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@tailwindcss/oxide-darwin-arm64@4.1.11':
resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@tailwindcss/oxide-darwin-x64@4.1.10':
resolution: {integrity: sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@tailwindcss/oxide-darwin-x64@4.1.11':
resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@tailwindcss/oxide-freebsd-x64@4.1.10':
resolution: {integrity: sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
'@tailwindcss/oxide-freebsd-x64@4.1.11':
resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
'@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10':
resolution: {integrity: sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
'@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11':
resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
'@tailwindcss/oxide-linux-arm64-gnu@4.1.10':
resolution: {integrity: sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@tailwindcss/oxide-linux-arm64-gnu@4.1.11':
resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@tailwindcss/oxide-linux-arm64-musl@4.1.10':
resolution: {integrity: sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@tailwindcss/oxide-linux-arm64-musl@4.1.11':
resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@tailwindcss/oxide-linux-x64-gnu@4.1.10':
resolution: {integrity: sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@tailwindcss/oxide-linux-x64-gnu@4.1.11':
resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@tailwindcss/oxide-linux-x64-musl@4.1.10':
resolution: {integrity: sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@tailwindcss/oxide-linux-x64-musl@4.1.11':
resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@tailwindcss/oxide-wasm32-wasi@4.1.10':
resolution: {integrity: sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q==}
engines: {node: '>=14.0.0'}
@@ -5750,25 +5807,56 @@ packages:
- '@emnapi/wasi-threads'
- tslib
'@tailwindcss/oxide-wasm32-wasi@4.1.11':
resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
bundledDependencies:
- '@napi-rs/wasm-runtime'
- '@emnapi/core'
- '@emnapi/runtime'
- '@tybys/wasm-util'
- '@emnapi/wasi-threads'
- tslib
'@tailwindcss/oxide-win32-arm64-msvc@4.1.10':
resolution: {integrity: sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@tailwindcss/oxide-win32-arm64-msvc@4.1.11':
resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@tailwindcss/oxide-win32-x64-msvc@4.1.10':
resolution: {integrity: sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
'@tailwindcss/oxide-win32-x64-msvc@4.1.11':
resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
'@tailwindcss/oxide@4.1.10':
resolution: {integrity: sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q==}
engines: {node: '>= 10'}
'@tailwindcss/oxide@4.1.11':
resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==}
engines: {node: '>= 10'}
'@tailwindcss/postcss@4.1.10':
resolution: {integrity: sha512-B+7r7ABZbkXJwpvt2VMnS6ujcDoR2OOcFaqrLIo1xbcdxje4Vf+VgJdBzNNbrAjBj/rLZ66/tlQ1knIGNLKOBQ==}
'@tailwindcss/postcss@4.1.11':
resolution: {integrity: sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==}
'@tailwindcss/typography@0.5.15':
resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==}
peerDependencies:
@@ -7275,9 +7363,6 @@ packages:
cliui@6.0.0:
resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
cliui@7.0.4:
resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
@@ -7386,10 +7471,6 @@ packages:
resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==}
engines: {node: '>= 0.10.0'}
consola@3.3.0:
resolution: {integrity: sha512-kxltocVQCwQNFvw40dlVRYeAkAvtYjMFZYNlOcsF5wExPpGwPxMwgx4IfDJvBRPtBpnQwItd5WkTaR0ZwT/TmQ==}
engines: {node: ^14.18.0 || >=16.10.0}
consola@3.4.2:
resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
engines: {node: ^14.18.0 || >=16.10.0}
@@ -8774,9 +8855,6 @@ packages:
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
ignore-walk@3.0.4:
resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==}
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
@@ -8837,10 +8915,6 @@ packages:
ini@1.3.8:
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
ini@2.0.0:
resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
engines: {node: '>=10'}
ini@4.1.3:
resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -10208,21 +10282,10 @@ packages:
resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==}
engines: {node: '>=14.16'}
npm-bundled@1.1.2:
resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==}
npm-normalize-package-bin@1.0.1:
resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==}
npm-package-arg@11.0.3:
resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==}
engines: {node: ^16.14.0 || >=18.0.0}
npm-packlist@2.2.2:
resolution: {integrity: sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==}
engines: {node: '>=10'}
hasBin: true
npm-run-all@4.1.5:
resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==}
engines: {node: '>= 4'}
@@ -12113,6 +12176,9 @@ packages:
tailwindcss@4.1.10:
resolution: {integrity: sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA==}
tailwindcss@4.1.11:
resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==}
tapable@2.2.1:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
@@ -13107,10 +13173,6 @@ packages:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
yalc@1.0.0-pre.53:
resolution: {integrity: sha512-tpNqBCpTXplnduzw5XC+FF8zNJ9L/UXmvQyyQj7NKrDNavbJtHvzmZplL5ES/RCnjX7JR7W9wz5GVDXVP3dHUQ==}
hasBin: true
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
@@ -13134,10 +13196,6 @@ packages:
resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
engines: {node: '>=6'}
yargs-parser@20.2.9:
resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
engines: {node: '>=10'}
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
@@ -13146,10 +13204,6 @@ packages:
resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
engines: {node: '>=8'}
yargs@16.2.0:
resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
engines: {node: '>=10'}
yargs@17.7.2:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}
@@ -15754,7 +15808,7 @@ snapshots:
'@mapbox/node-pre-gyp@2.0.0-rc.0':
dependencies:
consola: 3.3.0
consola: 3.4.2
detect-libc: 2.0.4
https-proxy-agent: 7.0.6
node-fetch: 2.7.0
@@ -17782,42 +17836,88 @@ snapshots:
source-map-js: 1.2.1
tailwindcss: 4.1.10
'@tailwindcss/node@4.1.11':
dependencies:
'@ampproject/remapping': 2.3.0
enhanced-resolve: 5.18.1
jiti: 2.4.2
lightningcss: 1.30.1
magic-string: 0.30.17
source-map-js: 1.2.1
tailwindcss: 4.1.11
'@tailwindcss/oxide-android-arm64@4.1.10':
optional: true
'@tailwindcss/oxide-android-arm64@4.1.11':
optional: true
'@tailwindcss/oxide-darwin-arm64@4.1.10':
optional: true
'@tailwindcss/oxide-darwin-arm64@4.1.11':
optional: true
'@tailwindcss/oxide-darwin-x64@4.1.10':
optional: true
'@tailwindcss/oxide-darwin-x64@4.1.11':
optional: true
'@tailwindcss/oxide-freebsd-x64@4.1.10':
optional: true
'@tailwindcss/oxide-freebsd-x64@4.1.11':
optional: true
'@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10':
optional: true
'@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11':
optional: true
'@tailwindcss/oxide-linux-arm64-gnu@4.1.10':
optional: true
'@tailwindcss/oxide-linux-arm64-gnu@4.1.11':
optional: true
'@tailwindcss/oxide-linux-arm64-musl@4.1.10':
optional: true
'@tailwindcss/oxide-linux-arm64-musl@4.1.11':
optional: true
'@tailwindcss/oxide-linux-x64-gnu@4.1.10':
optional: true
'@tailwindcss/oxide-linux-x64-gnu@4.1.11':
optional: true
'@tailwindcss/oxide-linux-x64-musl@4.1.10':
optional: true
'@tailwindcss/oxide-linux-x64-musl@4.1.11':
optional: true
'@tailwindcss/oxide-wasm32-wasi@4.1.10':
optional: true
'@tailwindcss/oxide-wasm32-wasi@4.1.11':
optional: true
'@tailwindcss/oxide-win32-arm64-msvc@4.1.10':
optional: true
'@tailwindcss/oxide-win32-arm64-msvc@4.1.11':
optional: true
'@tailwindcss/oxide-win32-x64-msvc@4.1.10':
optional: true
'@tailwindcss/oxide-win32-x64-msvc@4.1.11':
optional: true
'@tailwindcss/oxide@4.1.10':
dependencies:
detect-libc: 2.0.4
@@ -17836,6 +17936,24 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.1.10
'@tailwindcss/oxide-win32-x64-msvc': 4.1.10
'@tailwindcss/oxide@4.1.11':
dependencies:
detect-libc: 2.0.4
tar: 7.4.3
optionalDependencies:
'@tailwindcss/oxide-android-arm64': 4.1.11
'@tailwindcss/oxide-darwin-arm64': 4.1.11
'@tailwindcss/oxide-darwin-x64': 4.1.11
'@tailwindcss/oxide-freebsd-x64': 4.1.11
'@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11
'@tailwindcss/oxide-linux-arm64-gnu': 4.1.11
'@tailwindcss/oxide-linux-arm64-musl': 4.1.11
'@tailwindcss/oxide-linux-x64-gnu': 4.1.11
'@tailwindcss/oxide-linux-x64-musl': 4.1.11
'@tailwindcss/oxide-wasm32-wasi': 4.1.11
'@tailwindcss/oxide-win32-arm64-msvc': 4.1.11
'@tailwindcss/oxide-win32-x64-msvc': 4.1.11
'@tailwindcss/postcss@4.1.10':
dependencies:
'@alloc/quick-lru': 5.2.0
@@ -17844,6 +17962,14 @@ snapshots:
postcss: 8.5.4
tailwindcss: 4.1.10
'@tailwindcss/postcss@4.1.11':
dependencies:
'@alloc/quick-lru': 5.2.0
'@tailwindcss/node': 4.1.11
'@tailwindcss/oxide': 4.1.11
postcss: 8.5.4
tailwindcss: 4.1.11
'@tailwindcss/typography@0.5.15(tailwindcss@4.1.10)':
dependencies:
lodash.castarray: 4.4.0
@@ -19782,12 +19908,6 @@ snapshots:
strip-ansi: 6.0.1
wrap-ansi: 6.2.0
cliui@7.0.4:
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
cliui@8.0.1:
dependencies:
string-width: 4.2.3
@@ -19891,8 +20011,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
consola@3.3.0: {}
consola@3.4.2: {}
content-type@1.0.5: {}
@@ -21523,10 +21641,6 @@ snapshots:
ieee754@1.2.1: {}
ignore-walk@3.0.4:
dependencies:
minimatch: 3.1.2
ignore@5.3.2: {}
ignore@7.0.5: {}
@@ -21577,8 +21691,6 @@ snapshots:
ini@1.3.8: {}
ini@2.0.0: {}
ini@4.1.3: {}
inline-style-prefixer@7.0.1:
@@ -23204,12 +23316,6 @@ snapshots:
normalize-url@8.0.1: {}
npm-bundled@1.1.2:
dependencies:
npm-normalize-package-bin: 1.0.1
npm-normalize-package-bin@1.0.1: {}
npm-package-arg@11.0.3:
dependencies:
hosted-git-info: 7.0.2
@@ -23217,13 +23323,6 @@ snapshots:
semver: 7.7.2
validate-npm-package-name: 5.0.1
npm-packlist@2.2.2:
dependencies:
glob: 7.2.3
ignore-walk: 3.0.4
npm-bundled: 1.1.2
npm-normalize-package-bin: 1.0.1
npm-run-all@4.1.5:
dependencies:
ansi-styles: 3.2.1
@@ -25511,6 +25610,8 @@ snapshots:
tailwindcss@4.1.10: {}
tailwindcss@4.1.11: {}
tapable@2.2.1: {}
tar-fs@2.1.1:
@@ -26618,17 +26719,6 @@ snapshots:
y18n@5.0.8: {}
yalc@1.0.0-pre.53:
dependencies:
chalk: 4.1.2
detect-indent: 6.1.0
fs-extra: 8.1.0
glob: 7.2.3
ignore: 5.3.2
ini: 2.0.0
npm-packlist: 2.2.2
yargs: 16.2.0
yallist@3.1.1: {}
yallist@4.0.0:
@@ -26645,8 +26735,6 @@ snapshots:
camelcase: 5.3.1
decamelize: 1.2.0
yargs-parser@20.2.9: {}
yargs-parser@21.1.1: {}
yargs@15.4.1:
@@ -26663,16 +26751,6 @@ snapshots:
y18n: 4.0.3
yargs-parser: 18.1.3
yargs@16.2.0:
dependencies:
cliui: 7.0.4
escalade: 3.2.0
get-caller-file: 2.0.5
require-directory: 2.1.1
string-width: 4.2.3
y18n: 5.0.8
yargs-parser: 20.2.9
yargs@17.7.2:
dependencies:
cliui: 8.0.1

View File

@@ -1,5 +1,35 @@
# jazz-react-tailwind-starter
## 0.0.128
### Patch Changes
- Updated dependencies [3844666]
- jazz-tools@0.15.8
## 0.0.127
### Patch Changes
- Updated dependencies [c09b636]
- jazz-tools@0.15.7
## 0.0.126
### Patch Changes
- Updated dependencies [a5ceaff]
- jazz-tools@0.15.6
## 0.0.125
### Patch Changes
- Updated dependencies [23bfea5]
- Updated dependencies [e4ba23c]
- Updated dependencies [4b89838]
- jazz-tools@0.15.5
## 0.0.124
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "jazz-react-passkey-auth-starter",
"private": true,
"version": "0.0.124",
"version": "0.0.128",
"type": "module",
"scripts": {
"dev": "vite",

View File

@@ -1,5 +1,35 @@
# svelte-passkey-auth
## 0.0.102
### Patch Changes
- Updated dependencies [3844666]
- jazz-tools@0.15.8
## 0.0.101
### Patch Changes
- Updated dependencies [c09b636]
- jazz-tools@0.15.7
## 0.0.100
### Patch Changes
- Updated dependencies [a5ceaff]
- jazz-tools@0.15.6
## 0.0.99
### Patch Changes
- Updated dependencies [23bfea5]
- Updated dependencies [e4ba23c]
- Updated dependencies [4b89838]
- jazz-tools@0.15.5
## 0.0.98
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "svelte-passkey-auth",
"version": "0.0.98",
"version": "0.0.102",
"type": "module",
"private": true,
"scripts": {
@@ -33,6 +33,7 @@
"svelte": "^5.33.19",
"svelte-check": "^4.0.0",
"tailwindcss": "^4.1.10",
"@tailwindcss/postcss": "^4.1.11",
"typescript": "5.6.2",
"typescript-eslint": "^8.0.0",
"vite": "^6.3.5"

View File

@@ -25,7 +25,22 @@ export const AccountRoot = co.map({
export function getUserAge(root: co.loaded<typeof AccountRoot> | undefined) {
if (!root) return null;
return new Date().getFullYear() - root.dateOfBirth.getFullYear();
const today = new Date();
const birthDate = root.dateOfBirth;
let age = today.getFullYear() - birthDate.getFullYear();
// Check if the birthday hasn't occurred yet this year
const hasBirthdayPassed =
today.getMonth() > birthDate.getMonth() ||
(today.getMonth() === birthDate.getMonth() && today.getDate() > birthDate.getDate());
if (!hasBirthdayPassed) {
age--;
}
return age;
}
export const JazzAccount = co