Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
43ae4cd
feat: adding new multi-tenent profile
xmlking Dec 11, 2024
5a0bac8
fix: updated deps
xmlking Dec 14, 2024
ffcb623
fix(nhost): updated seeds
xmlking Dec 14, 2024
0d6bcf7
fix(console): signup now runs on client-side
xmlking Dec 15, 2024
2693f85
fix(console): password reset route now runs on client-side
xmlking Dec 15, 2024
129269b
fix(console): passwordless and social routes now runs on client-side
xmlking Dec 16, 2024
be50edd
fix(console): passwordless and social routes now runs on client-side
xmlking Dec 16, 2024
337577f
fix: added examples for new hooks features
xmlking Dec 16, 2024
7775cae
fix: updated deps
xmlking Dec 16, 2024
6d1feb4
fix: mount GraphQLErrors component only if there is error
xmlking Dec 17, 2024
982edba
fix(console): removed signout endpoint, auth cookie no more set on se…
xmlking Dec 17, 2024
222332c
fix(console): workaround for fickle hudini session/accessToken managm…
xmlking Dec 18, 2024
857e282
fix: deps updated
xmlking Dec 18, 2024
87d234f
fix(console): set cookie expires
xmlking Dec 18, 2024
959076d
fix: using credentials include for hasura fetch
xmlking Dec 18, 2024
4cf27cd
fix(nhost): added org settings tables
xmlking Dec 19, 2024
d9a4746
fix: deps updated
xmlking Dec 19, 2024
136c894
fix(console): exposing userId orgId defaultRole for use in load funct…
xmlking Dec 19, 2024
618c139
fix(console): replace window.location.href with .url to make it work …
xmlking Dec 19, 2024
9ccd0f7
fix(console): adding cookie debug
xmlking Dec 19, 2024
7b46945
fix: oauth login and houdini client session refresh now works
xmlking Dec 25, 2024
6cc4ddb
fix: add biome turbo root task
xmlking Dec 25, 2024
d64fd2b
fix: lint issues
xmlking Dec 25, 2024
3b00650
fix: add check check:fix turbo tasks
xmlking Dec 25, 2024
0c1c992
docs: updated docs
xmlking Dec 25, 2024
52569b9
fix(console): update org schema and sidnav links W.I.P
xmlking Dec 25, 2024
4300c3a
fix(console): fxing orgs w.i.p
xmlking Dec 26, 2024
16f35fd
fix(console): fxing orgs w.i.p
xmlking Dec 26, 2024
9e6c2db
fix(console): fxing orgs w.i.p
xmlking Dec 27, 2024
f5e02c2
fix(console): fxing policies and rules w.i.p
xmlking Dec 27, 2024
c261fdb
fix(console): w.i.p Organizations
xmlking Dec 27, 2024
f5cb396
fix(console): w.i.p Organizations
xmlking Dec 27, 2024
6db15c0
fix(console): w.i.p Organizations
xmlking Dec 27, 2024
69fdd3f
fix(console): w.i.p Organizations
xmlking Dec 27, 2024
dc1fb7b
fix(nhost): deleted_records trigger
xmlking Dec 28, 2024
27c572a
fix(nhost): deleted_records trigger
xmlking Dec 28, 2024
040fcbd
fix(nhost): deleted_records trigger
xmlking Dec 28, 2024
35a0ae6
fix(nhost): deleted_records trigger
xmlking Dec 28, 2024
c65b062
fix(console): switch org
xmlking Dec 29, 2024
18307e0
fix(console): cleanup
xmlking Dec 29, 2024
3173438
fix(nhost): refactor org schema
xmlking Dec 30, 2024
c2ca0d3
fix(console): add org-switcher component
xmlking Dec 30, 2024
b1ea496
fix(console): orgs metadata
xmlking Dec 30, 2024
8e68182
fix(console): add trigger for org owner change
xmlking Dec 30, 2024
c36d992
fix(console): add trigger for org owner change
xmlking Dec 30, 2024
836f327
fix(console): added maybe-error wrapper comp
xmlking Jan 1, 2025
f998897
fix(console): added org-switcher comp
xmlking Jan 2, 2025
2ab0001
fix(console): using houdini runtimeScalars API to add userId
xmlking Jan 2, 2025
fd82a85
fix(console): add rule houdini session variable
xmlking Jan 3, 2025
15cf904
fix(console): add rule houdini session variable
xmlking Jan 3, 2025
b9ddaa5
fix(console): add rule houdini session variable
xmlking Jan 3, 2025
eb08b29
fix(console): upgrade hasura-auth to 0.37.0-beta0
xmlking Jan 3, 2025
0cc9c8f
fix(console): adding Bot Protection with Cloudflare Turnstile w.i.p
xmlking Jan 4, 2025
b682198
fix(console): attempt to use turnstileResponse for signup w.i.p
xmlking Jan 4, 2025
9aee45d
fix(console): org update w.i.p
xmlking Jan 5, 2025
8e00a93
fix(console): using variant-filled for all buttons
xmlking Jan 5, 2025
e66f75b
fix(console): user profile refine
xmlking Jan 6, 2025
0fdbfbb
fix(console): org CRUD
xmlking Jan 6, 2025
9bd0504
fix(console): memberships, settings w.i.p
xmlking Jan 6, 2025
dfdd0ce
fix(console): now apply FEATURE_SHOW_BOT_PROTECTION
xmlking Jan 6, 2025
1750fb7
fix(console): using env as source for vercel/flags
xmlking Jan 6, 2025
b7ef042
fix(console): turnstile enabled for nhsot auth and sending x-cf-turns…
xmlking Jan 6, 2025
a5e205a
fix(ui): update shadcn-svelte comps
xmlking Jan 7, 2025
8bd90fe
fix(console): add member mockup. thanke to svelte0
xmlking Jan 7, 2025
ea4fc22
fix(console): settings
xmlking Jan 7, 2025
cbe12d9
feat:added membership functions
Jan 9, 2025
680b058
feat(ui): added input-pairs comp
xmlking Jan 10, 2025
828cb37
fix(ui): using InputChipWrapper
xmlking Jan 12, 2025
c300e8f
fix(ui): using InputChipWrapper
xmlking Jan 12, 2025
5e68c2c
fix(ui): improve InputChip comp
xmlking Jan 13, 2025
5d02071
fix(ui): improve InputChip comp
xmlking Jan 13, 2025
80812ef
fix(ui): improve InputChip comp
xmlking Jan 13, 2025
12aa012
style: format
xmlking Jan 14, 2025
714ee80
style: format
xmlking Jan 14, 2025
92b30ae
fix: deps updated
xmlking Jan 14, 2025
48efb17
fix: deps updated
xmlking Jan 14, 2025
b7a206e
Merge branch 'feat/multi-tenancy' into feat/added-membership
xmlking Jan 14, 2025
7c76baa
fix(console): refine
xmlking Jan 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
14 changes: 11 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ PUBLIC_NHOST_FUNCTIONS_URL=${NHOST_FUNCTIONS_URL}
# Hasura
HASURA_GRAPHQL_ENDPOINT=https://${NHOST_SUBDOMAIN}.hasura.${NHOST_REGION}.nhost.run

# Cloudflare Turnstile
## https://developers.cloudflare.com/turnstile/troubleshooting/testing/
PUBLIC_CLOUDFLARE_TURNSTILE_CHALLENGE_URL=https://challenges.cloudflare.com/turnstile/v0/siteverify
PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY=0x4AAAAAAA4jAyA4ZpiXqCVy
PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY_ALWAYS_PASSES=1x00000000000000000000AA
PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY_ALWAYS_BLOCKS=2x00000000000000000000AB

# Runtime
APP_NAME=Spectacular
APP_DESCRIPTION=Spectacular Console App
Expand All @@ -45,9 +52,10 @@ PUBLIC_TERMS_PRIVACY_COUNTRY='United States'

## feature flags (to enable, uncomment the variable).
## if variable present, it is considered as `true` no matter what the actual value is.
FEATURE_SIMULATE_LOADING_STATE=false
FEATURE_SHOW_MAGIC_LINK_LOGIN=true
FEATURE_SHOW_SOCIAL_LOGIN=true
FEATURE_SIMULATE_LOADING_STATE=false
FEATURE_SHOW_BOT_PROTECTION=true

###########################################################################
# Application Properties (Web)
Expand All @@ -62,5 +70,5 @@ API_VERSION=v1
###########################################################################
# Application Properties (Docs)
###########################################################################
GH_SITE_URL=
GH_BASE_PATH=
GH_SITE_URL=https://xmlking.github.io
GH_BASE_PATH=/spectacular
10 changes: 9 additions & 1 deletion .env.production.example
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ PUBLIC_NHOST_FUNCTIONS_URL=${NHOST_FUNCTIONS_URL}
# Hasura
HASURA_GRAPHQL_ENDPOINT=https://${NHOST_SUBDOMAIN}.hasura.${NHOST_REGION}.nhost.run

# Cloudflare Turnstile
## https://developers.cloudflare.com/turnstile/troubleshooting/testing/
PUBLIC_CLOUDFLARE_TURNSTILE_CHALLENGE_URL=https://challenges.cloudflare.com/turnstile/v0/siteverify
PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY=0x4AAAAAAA4jAyA4ZpiXqCVy
PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY_ALWAYS_PASSES=1x00000000000000000000AA
PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY_ALWAYS_BLOCKS=2x00000000000000000000AB

# Runtime
APP_NAME=Spectacular
APP_DESCRIPTION=Spectacular Console App
Expand All @@ -44,9 +51,10 @@ PUBLIC_TERMS_PRIVACY_COUNTRY='United States'

## feature flags (to enable, uncomment the variable).
## if variable present, it is considered as `true` no matter what the actual value is.
FEATURE_SIMULATE_LOADING_STATE=false
FEATURE_SHOW_MAGIC_LINK_LOGIN=true
FEATURE_SHOW_SOCIAL_LOGIN=true
FEATURE_SIMULATE_LOADING_STATE=false
FEATURE_SHOW_BOT_PROTECTION=true

###########################################################################
# Application Properties (Web)
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ env:
IMAGE_NAME: ${{ github.repository }}/${{ inputs.app || 'console' }}
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
TURBO_REMOTE_ONLY: true
## app build time environment variables
VERCEL_ENV: ${{ vars.VERCEL_ENV }}
PUBLIC_TERMS_PRIVACY_COMPANY: ${{ vars.PUBLIC_TERMS_PRIVACY_COMPANY }}
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -122,3 +122,4 @@ $houdini
# traefik.me certs
apps/console/config/certs/traefik.me.crt
apps/console/config/certs/traefik.me.key
kubernetes
6 changes: 6 additions & 0 deletions .secrets.example
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ AUTH_PROVIDER_GOOGLE_CLIENT_SECRET = 'FIXME'
AUTH_PROVIDER_GITHUB_CLIENT_ID = 'FIXME'
AUTH_PROVIDER_GITHUB_CLIENT_SECRET = 'FIXME'

# CLOUDFLARE TURNSTILE
## https://developers.cloudflare.com/turnstile/troubleshooting/testing/
CLOUDFLARE_TURNSTILE_SECRET_KEY = 'FIXME'
CLOUDFLARE_TURNSTILE_SECRET_KEY_ALWAYS_PASSES = '1x0000000000000000000000000000000AA'
CLOUDFLARE_TURNSTILE_SECRET_KEY_ALWAYS_FAILS = '2x0000000000000000000000000000000AA'

## SMTP
AUTH_SMTP_AUTH_METHOD = 'PLAIN'
AUTH_SMTP_HOST = 'mailhog'
Expand Down
6 changes: 6 additions & 0 deletions .secrets.production.example
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ AUTH_PROVIDER_GOOGLE_CLIENT_SECRET = 'FIXME'
AUTH_PROVIDER_GITHUB_CLIENT_ID = 'FIXME'
AUTH_PROVIDER_GITHUB_CLIENT_SECRET = 'FIXME'

# CLOUDFLARE TURNSTILE
## https://developers.cloudflare.com/turnstile/troubleshooting/testing/
CLOUDFLARE_TURNSTILE_SECRET_KEY = 'FIXME'
CLOUDFLARE_TURNSTILE_SECRET_KEY_ALWAYS_PASSES = '1x0000000000000000000000000000000AA'
CLOUDFLARE_TURNSTILE_SECRET_KEY_ALWAYS_FAILS = '2x0000000000000000000000000000000AA'

## SMTP
AUTH_SMTP_AUTH_METHOD = 'PLAIN'
AUTH_SMTP_HOST = 'smtp.gmail.com'
Expand Down
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
// To make tailwindcss-intellisense work in .svelte files
"editor.quickSuggestions": {
"comments": false,
"strings": "on"
"strings": "on"
},
////////// Search //////////
"search.followSymlinks": false,
Expand Down
8 changes: 6 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ ENV SCOPE=${SCOPE}
#https://github.com/vercel/turbo/tree/main/examples/with-docker

# Install pnpm
# RUN corepack enable pnpm
ENV PNPM_HOME="/root/.local/share/pnpm"
ENV PATH="${PATH}:${PNPM_HOME}"
SHELL ["/bin/bash", "-c"]
Expand Down Expand Up @@ -70,8 +71,11 @@ COPY turbo.json turbo.json
ARG TURBO_TEAM
ENV TURBO_TEAM=$TURBO_TEAM

ARG TURBO_TOKEN
ENV TURBO_TOKEN=$TURBO_TOKEN
ARG TURBO_TEAM
ENV TURBO_TEAM=$TURBO_TEAM

ARG TURBO_REMOTE_ONLY=true
ENV TURBO_REMOTE_ONLY=$TURBO_REMOTE_ONLY

ENV NODE_OPTIONS="--max-old-space-size=4096"
RUN pnpm turbo run build --filter=${SCOPE}...
Expand Down
12 changes: 0 additions & 12 deletions apps/console/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,3 @@ You can preview the production build with `turbo preview`.
```shell
gcloud run deploy --allow-unauthenticated
```

To reset deleted (soft) `policies` and `rules`

```sql
UPDATE public.rules SET deleted_at = null WHERE deleted_at is not null;
UPDATE public.policies SET deleted_at = null WHERE deleted_at is not null;
```

## TODO

- After user record created for first-time (i.e., after user login), have admins assign `organization` and `groups` via Web UI:
- use [lcl.host](https://anchor.dev/docs/lcl-host/why-lcl)
53 changes: 28 additions & 25 deletions apps/console/houdini.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,27 @@ const config = {
// HINT: we need to generate scheam for highest role level that app support.
headers: {
'X-Hasura-Admin-Secret': (env) => env.HASURA_GRAPHQL_ADMIN_SECRET,
'x-hasura-allowed-roles': 'user me supervisor manager',
'x-hasura-role': 'manager',
'x-hasura-allowed-roles': 'user me sys:admin org:member org:admin org:billing org:owner',
'x-hasura-role': 'org:owner',
},
},
types: {
memberships: {
keys: ['userId', 'orgId'],
},
},
features: {
runtimeScalars: {
UserIdFromSession: {
type: 'uuid',
resolve: ({ session }) => session?.userId,
},
OrgIdFromSession: {
type: 'uuid',
resolve: ({ session }) => session?.orgId,
},
},
},
// types: {
// user: {
// keys: ['id'],
// },
// },
// features: {
// runtimeScalars: {
// UserId: {
// type: 'uuid',
// resolve: ({ session }) => session?.userId,
// },
// },
// },
plugins: {
// 'houdini-plugin-svelte-global-stores': {
// generate: 'all'
Expand All @@ -58,9 +62,8 @@ const config = {
return date?.toISOString();
},
},

Decimal: {
type: 'number',
type: 'Number',
unmarshal(val) {
return new Number(val);
},
Expand All @@ -69,14 +72,18 @@ const config = {
},
},
smallint: {
type: 'number',
type: 'Number',
unmarshal(val) {
return new Number(val);
},
marshal(number) {
return number.toString();
},
},
bigint: {
type: 'Number',
...defaultMarshall,
},
URL: {
type: 'URL',
unmarshal(val) {
Expand Down Expand Up @@ -120,7 +127,7 @@ const config = {
...defaultMarshall,
},
jsonb: {
type: 'object',
type: 'Object',
...defaultMarshall,
},
timestamp: {
Expand All @@ -139,18 +146,14 @@ const config = {
// const server = new Date(val);
// const offset = server.getTimezoneOffset();
// return new Date(server.getTime() + offset * 60000);
return new Date(val);
return val ? new Date(val) : null;
},
marshal(date) {
return date?.toISOString();
},
},
bigint: {
type: 'number',
...defaultMarshall,
},
bytea: {
type: 'binary',
type: 'Binary',
...defaultMarshall,
},
},
Expand Down
84 changes: 43 additions & 41 deletions apps/console/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
"scripts": {
"build": "dotenv-run -f .env -f .secrets -v -- vite build",
"build:production": "NODE_ENV=production dotenv-run -f .env -f .secrets -v -- vite build",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"sv:check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"sv:check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"check": "biome check .",
"check:fix": "biome check . --write",
"clean": "git clean -xdf -e .vercel -e config",
"dev": "dotenv-run -f .env -f .secrets -v -- vite dev",
"dev:debug": "DEBUG=* dotenv-run -f .env -f .secrets -v '.*' -u -- vite dev",
Expand All @@ -31,17 +33,16 @@
"test:unit:ui": "dotenv-run -f .env -f .secrets -v -- vitest --ui"
},
"devDependencies": {
"@ai-sdk/azure": "1.0.7",
"@ai-sdk/openai": "1.0.5",
"@ai-sdk/svelte": "1.0.3",
"@aibrow/dom-types": "1.2.1",
"@floating-ui/dom": "1.6.12",
"@fontsource-variable/inter": "5.1.0",
"@ai-sdk/azure": "1.0.20",
"@ai-sdk/openai": "1.0.18",
"@ai-sdk/svelte": "1.0.10",
"@aibrow/dom-types": "1.3.5",
"@floating-ui/dom": "1.6.13",
"@fontsource-variable/inter": "5.1.1",
"@inlang/cli": "2.18.1",
"@inlang/paraglide-js": "1.11.3",
"@inlang/paraglide-js-adapter-sveltekit": "0.6.7",
"@nhost/nhost-js": "3.2.1",
"@skeletonlabs/skeleton": "2.10.3",
"@inlang/paraglide-sveltekit": "0.14.0",
"@nhost/nhost-js": "3.2.3",
"@skeletonlabs/skeleton": "2.10.4",
"@skeletonlabs/tw-plugin": "0.4.0",
"@spectacular/biome-config": "workspace:*",
"@spectacular/role-houdini": "workspace:*",
Expand All @@ -51,71 +52,72 @@
"@spectacular/utils": "workspace:*",
"@svelte-plugins/datepicker": "1.0.9",
"@sveltejs/adapter-auto": "3.3.1",
"@sveltejs/adapter-node": "5.2.9",
"@sveltejs/adapter-vercel": "5.5.0",
"@sveltejs/adapter-node": "5.2.11",
"@sveltejs/adapter-vercel": "5.5.2",
"@sveltejs/enhanced-img": "0.3.10",
"@sveltejs/kit": "2.8.5",
"@sveltejs/kit": "2.15.2",
"@sveltejs/vite-plugin-svelte": "3.1.2",
"@tailwindcss/container-queries": "0.1.1",
"@tailwindcss/forms": "0.5.9",
"@tailwindcss/typography": "0.5.15",
"@tailwindcss/forms": "0.5.10",
"@tailwindcss/typography": "0.5.16",
"@testing-library/jest-dom": "6.6.3",
"@testing-library/svelte": "5.2.6",
"@types/d3-scale": "4.0.8",
"@types/dom-chromium-ai": "0.0.4",
"@types/js-cookie": "3.0.6",
"@types/node": "22.10.1",
"@unovis/svelte": "1.5.0-beta.3",
"@unovis/ts": "1.5.0-beta.3",
"@types/node": "22.10.6",
"@unovis/svelte": "1.5.0",
"@unovis/ts": "1.5.0",
"@vercel/analytics": "1.4.1",
"@vercel/flags": "2.6.3",
"@vercel/speed-insights": "1.1.0",
"@vercel/toolbar": "0.1.27",
"@vincjo/datatables": "1.14.10",
"@vercel/toolbar": "0.1.30",
"@vincjo/datatables": "2.2.0",
"@vitest/coverage-v8": "2.1.8",
"@xyflow/svelte": "0.1.24",
"ai": "4.0.10",
"@xyflow/svelte": "0.1.26",
"ai": "4.0.34",
"autoprefixer": "10.4.20",
"chrome-ai": "1.11.1",
"date-fns": "4.1.0",
"formsnap": "1.0.1",
"graphql": "16.9.0",
"graphql-ws": "5.16.0",
"houdini": "1.3.1",
"houdini-svelte": "2.0.1",
"graphql": "16.10.0",
"graphql-ws": "5.16.2",
"houdini": "1.4.0",
"houdini-svelte": "2.1.0",
"js-cookie": "3.0.5",
"jsdom": "25.0.1",
"lucide-svelte": "0.462.0",
"jsdom": "26.0.0",
"lucide-svelte": "0.471.0",
"neverthrow": "8.1.1",
"ollama-ai-provider": "1.0.0",
"ollama-ai-provider": "1.1.0",
"openai-zod-to-json-schema": "1.0.3",
"paneforge": "0.0.6",
"postcss": "8.4.49",
"postcss": "8.5.0",
"svelte": "4.2.19",
"svelte-adapter-bun": "0.5.2",
"svelte-check": "4.1.0",
"svelte-check": "4.1.4",
"svelte-meta-tags": "3.1.4",
"svelte-persisted-store": "0.12.0",
"svelte-select": "5.8.3",
"sveltekit-flash-message": "2.4.4",
"svelte-turnstile": "0.10.0",
"sveltekit-flash-message": "2.4.5",
"sveltekit-rate-limiter": "0.6.1",
"sveltekit-search-params": "3.0.0",
"sveltekit-superforms": "2.21.0",
"sveltekit-superforms": "2.22.1",
"sveltekit-view-transition": "0.5.3",
"swapy": "0.4.2",
"tailwind-merge": "2.5.5",
"swapy": "1.0.3",
"tailwind-merge": "2.6.0",
"tailwind-variants": "0.3.0",
"tailwindcss": "3.4.15",
"tailwindcss": "3.4.17",
"tailwindcss-animate": "1.0.7",
"tslib": "2.8.1",
"typescript": "5.7.2",
"typescript": "5.7.3",
"vite": "5.4.11",
"vitest": "2.1.8",
"xstate": "4.38.3",
"zod": "3.23.8"
"zod": "3.24.1"
},
"optionalDependencies": {
"@playwright/test": "1.49.0",
"@playwright/test": "1.49.1",
"@vitest/ui": "2.1.8"
}
}
Loading
Loading