diff --git a/AGENTS.md b/AGENTS.md
index dc0e8f77c..44a98f7c5 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -10,6 +10,11 @@ Main apps:
- `apps/web-dashboard`: React/Vite dashboard
- `packages/common`: shared models, validation, middleware, encryption, DB/model utilities
+SDKs:
+- `sdks/urbackend-sdk`: Core TypeScript/JavaScript SDK (Framework-agnostic)
+- `sdks/urbackend-react`: React SDK (`UrProvider`, `useUrContext`, UI components)
+- `sdks/urbackend-python`: Official Python SDK (Requests-based)
+
Workspace scripts are defined in [package.json](/package.json).
## Important project rules
@@ -69,6 +74,7 @@ Behavior:
## Redis key patterns
- Refresh session: `project:auth:refresh:session:{tokenId}`
- OAuth state: `project:auth:oauth:state:{state}` (10min TTL)
+- Social Refresh Exchange: `project:social-auth:refresh-exchange:{rtCode}` (Uses atomic `GETDEL` for concurrency safety)
- Mail count: `project:mail:count:{projectId}:{YYYY-MM}` (TTL = end of month)
- Do NOT change these patterns — existing sessions will break
@@ -144,11 +150,26 @@ cd apps/web-dashboard
npm run build
```
+Run SDK tests:
+```bash
+# JS Core SDK
+npm run test --workspace=@urbackend/sdk
+
+# React SDK (Vitest)
+npm run test --workspace=@urbackend/react
+
+# Python SDK (pytest)
+cd sdks/urbackend-python
+pytest
+```
+
## Testing expectations
Before shipping auth, RLS, or schema changes:
- run `apps/public-api` tests
- run `apps/dashboard-api` tests
+- run `@urbackend/sdk` tests
+- run `@urbackend/react` tests
- run `apps/web-dashboard` lint
- run `apps/web-dashboard` build when frontend changed
diff --git a/apps/consumer/package.json b/apps/consumer/package.json
index e574af61b..e54797974 100644
--- a/apps/consumer/package.json
+++ b/apps/consumer/package.json
@@ -1,6 +1,6 @@
{
"name": "consumer",
- "version": "1.0.0",
+ "version": "0.1.0",
"description": "",
"main": "src/app.js",
"scripts": {
diff --git a/apps/dashboard-api/package.json b/apps/dashboard-api/package.json
index 508a9ff2d..1b8f6e5cc 100644
--- a/apps/dashboard-api/package.json
+++ b/apps/dashboard-api/package.json
@@ -1,6 +1,6 @@
{
"name": "dashboard-api",
- "version": "0.10.0",
+ "version": "0.10.1",
"private": true,
"license": "AGPL-3.0-only",
"main": "src/app.js",
diff --git a/apps/public-api/package.json b/apps/public-api/package.json
index 32db25082..98cfb1d84 100644
--- a/apps/public-api/package.json
+++ b/apps/public-api/package.json
@@ -1,6 +1,6 @@
{
"name": "public-api",
- "version": "0.10.0",
+ "version": "0.10.1",
"private": true,
"license": "AGPL-3.0-only",
"main": "src/app.js",
diff --git a/apps/public-api/src/__tests__/userAuth.social.test.js b/apps/public-api/src/__tests__/userAuth.social.test.js
index 02775a1a0..37845a29a 100644
--- a/apps/public-api/src/__tests__/userAuth.social.test.js
+++ b/apps/public-api/src/__tests__/userAuth.social.test.js
@@ -51,6 +51,7 @@ jest.mock('@urbackend/common', () => {
redis: {
set: jest.fn().mockResolvedValue('OK'),
get: jest.fn(),
+ getdel: jest.fn(),
del: jest.fn().mockResolvedValue(1),
},
Project: {
@@ -441,7 +442,7 @@ describe('public userAuth social auth', () => {
});
test('exchangeSocialRefreshToken returns refresh token and deletes exchange code', async () => {
- redis.get.mockResolvedValueOnce(JSON.stringify({
+ redis.getdel.mockResolvedValueOnce(JSON.stringify({
token: 'issued_access_token',
refreshToken: 'issued_refresh_token',
}));
@@ -455,8 +456,7 @@ describe('public userAuth social auth', () => {
await controller.exchangeSocialRefreshToken(req, res);
- expect(redis.get).toHaveBeenCalledWith('project:social-auth:refresh-exchange:code_123');
- expect(redis.del).toHaveBeenCalledWith('project:social-auth:refresh-exchange:code_123');
+ expect(redis.getdel).toHaveBeenCalledWith('project:social-auth:refresh-exchange:code_123');
expect(res.status).toHaveBeenCalledWith(200);
expect(res.json).toHaveBeenCalledWith({
success: true,
@@ -468,7 +468,7 @@ describe('public userAuth social auth', () => {
});
test('exchangeSocialRefreshToken rejects invalid or expired code', async () => {
- redis.get.mockResolvedValueOnce(null);
+ redis.getdel.mockResolvedValueOnce(null);
const req = makeReq();
req.body = {
@@ -487,7 +487,7 @@ describe('public userAuth social auth', () => {
});
test('exchangeSocialRefreshToken rejects mismatched token and deletes exchange code', async () => {
- redis.get.mockResolvedValueOnce(JSON.stringify({
+ redis.getdel.mockResolvedValueOnce(JSON.stringify({
token: 'expected_access_token',
refreshToken: 'issued_refresh_token',
}));
@@ -500,8 +500,6 @@ describe('public userAuth social auth', () => {
const res = makeRes();
await controller.exchangeSocialRefreshToken(req, res);
-
- expect(redis.del).toHaveBeenCalledWith('project:social-auth:refresh-exchange:code_456');
expect(res.status).toHaveBeenCalledWith(403);
expect(res.json).toHaveBeenCalledWith({
success: false,
diff --git a/apps/public-api/src/controllers/userAuth.controller.js b/apps/public-api/src/controllers/userAuth.controller.js
index 5ad409568..705847965 100644
--- a/apps/public-api/src/controllers/userAuth.controller.js
+++ b/apps/public-api/src/controllers/userAuth.controller.js
@@ -23,6 +23,16 @@ const {
shouldExposeRefreshToken
} = require('../utils/refreshToken');
+const checkUserSoftDeleted = (user) => {
+ if (user && user.isDeleted) {
+ const dateStr = user.deletedAt
+ ? new Date(new Date(user.deletedAt).getTime() + 30 * 24 * 60 * 60 * 1000).toDateString()
+ : 'soon';
+ return `Your account is scheduled for deletion on ${dateStr}. Please contact the administrator to recover it.`;
+ }
+ return null;
+};
+
const SOCIAL_PROVIDER_KEYS = ['github', 'google'];
const SOCIAL_STATE_TTL_SECONDS = 600;
const SOCIAL_REFRESH_EXCHANGE_TTL_SECONDS = 60;
@@ -514,6 +524,12 @@ const findOrCreateSocialUser = async ({ project, usersColConfig, Model, provider
let user = await Model.findOne({ [providerIdField]: profile.providerUserId });
if (user) {
+ const deletedMsg = checkUserSoftDeleted(user);
+ if (deletedMsg) {
+ const err = new Error(deletedMsg);
+ err.statusCode = 403;
+ throw err;
+ }
return { user, isNewUser: false, linkedByEmail: false };
}
@@ -525,6 +541,12 @@ const findOrCreateSocialUser = async ({ project, usersColConfig, Model, provider
user = await Model.findOne({ email: profile.email });
if (user) {
+ const deletedMsg = checkUserSoftDeleted(user);
+ if (deletedMsg) {
+ const err = new Error(deletedMsg);
+ err.statusCode = 403;
+ throw err;
+ }
// P1: Only link if provider email is verified; reject if unverified to prevent account takeover
if (!profile.emailVerified) {
const err = new Error(`Cannot link ${providerName} account: the provider email is not verified. Please verify your email with ${providerName} first.`);
@@ -891,7 +913,7 @@ module.exports.exchangeSocialRefreshToken = async (req, res) => {
}
const exchangeKey = getSocialRefreshExchangeKey(rtCode);
- const rawExchange = await redis.get(exchangeKey);
+ const rawExchange = await redis.getdel(exchangeKey);
if (!rawExchange) {
return res.status(400).json({
success: false,
@@ -903,7 +925,6 @@ module.exports.exchangeSocialRefreshToken = async (req, res) => {
try {
parsedExchange = JSON.parse(rawExchange);
} catch (err) {
- await redis.del(exchangeKey);
return res.status(400).json({
success: false,
message: 'Invalid or expired refresh token exchange code',
@@ -911,14 +932,12 @@ module.exports.exchangeSocialRefreshToken = async (req, res) => {
}
if (parsedExchange.token !== token || !parsedExchange.refreshToken) {
- await redis.del(exchangeKey);
return res.status(403).json({
success: false,
message: 'Invalid refresh token exchange payload',
});
}
- await redis.del(exchangeKey);
return res.status(200).json({
success: true,
data: {
@@ -957,6 +976,9 @@ module.exports.signup = async (req, res) => {
const existingUser = await Model.findOne({ email: normalizedEmail });
if (existingUser) {
+ const deletedMsg = checkUserSoftDeleted(existingUser);
+ if (deletedMsg) return res.status(403).json({ error: deletedMsg });
+
// Check if user is unverified. If so, we can trigger a resend instead of a hard error.
const verificationField = getVerificationField(usersColConfig);
const isVerified = verificationField ? !!existingUser[verificationField] : true;
@@ -1092,6 +1114,10 @@ module.exports.login = async (req, res, next) => {
const user = await Model.findOne({ email: normalizedEmail }).select('+password');
+ if (user && user.isDeleted) {
+ return sendAuthError(403, checkUserSoftDeleted(user));
+ }
+
if (!user) {
let failedStatus = { locked: false, retryAfterSeconds: 0, attempts: 0 };
try {
@@ -1207,6 +1233,9 @@ module.exports.publicProfile = async (req, res) => {
const user = await Model.findOne({ username }, { password: 0 }).lean();
if (!user) return res.status(404).json({ error: "User not found" });
+ const deletedMsg = checkUserSoftDeleted(user);
+ if (deletedMsg) return res.status(403).json({ error: deletedMsg });
+
const profile = sanitizePublicProfile(user, usersColConfig);
return res.json(profile);
} catch (err) {
@@ -1409,7 +1438,8 @@ module.exports.requestPasswordReset = async (req, res) => {
}
const user = await Model.findOne({ email: normalizedEmail });
- if (!user) {
+
+ if (!user || (user && user.isDeleted)) {
await setPublicOtpCooldown(project._id, normalizedEmail, 'reset');
return res.json({ message: "If that email exists, a reset code has been sent." });
}
diff --git a/apps/web-dashboard/package.json b/apps/web-dashboard/package.json
index feba4a218..7fd053eb8 100644
--- a/apps/web-dashboard/package.json
+++ b/apps/web-dashboard/package.json
@@ -1,7 +1,7 @@
{
"name": "web-dashboard",
"private": true,
- "version": "0.10.0",
+ "version": "0.10.1",
"license": "AGPL-3.0-only",
"type": "module",
"scripts": {
diff --git a/apps/web-dashboard/src/index.css b/apps/web-dashboard/src/index.css
index 2cce8fb7f..d0189f4e5 100644
--- a/apps/web-dashboard/src/index.css
+++ b/apps/web-dashboard/src/index.css
@@ -75,10 +75,10 @@
--header-height: 48px; /* Slimmer header */
--border-radius: 4px;
- /* Glassmorphism - Darker & Smoother */
+ /* Glassmorphism - Premium & Smoother */
--glass-bg: rgba(10, 10, 10, 0.7);
- --glass-border: rgba(255, 255, 255, 0.05);
- --glass-backdrop: blur(12px);
+ --glass-border: rgba(255, 255, 255, 0.08);
+ --glass-backdrop: blur(16px);
}
.light-mode {
@@ -191,11 +191,17 @@ a {
}
/* Glassmorphism Panel */
-.glass-panel {
- background: var(--glass-bg);
+.glass-card {
+ background: var(--color-glass-card-bg);
backdrop-filter: var(--glass-backdrop);
- border: 1px solid var(--glass-border);
- box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
+ border: 1px solid var(--color-glass-card-border);
+ box-shadow: 0 4px 24px -8px rgba(0, 0, 0, 0.5);
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.glass-card:hover {
+ border-color: rgba(255, 255, 255, 0.12);
+ box-shadow: 0 12px 32px -12px rgba(0, 0, 0, 0.6);
}
/* Premium Card */
@@ -215,8 +221,16 @@ a {
/* --- PREMIUM DESIGN SYSTEM EXTENSIONS --- */
.glass-card {
background: var(--color-glass-card-bg);
- backdrop-filter: blur(12px);
+ backdrop-filter: var(--glass-backdrop);
border: 1px solid var(--color-glass-card-border);
+ box-shadow: 0 4px 24px -8px rgba(0, 0, 0, 0.5);
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.glass-card:hover {
+ border-color: rgba(255, 255, 255, 0.12);
+ box-shadow: 0 12px 32px -12px rgba(0, 0, 0, 0.6);
+ transform: translateY(-2px);
}
.gradient-text {
@@ -341,7 +355,7 @@ a {
}
.btn:active {
- transform: scale(0.98);
+ transform: scale(0.96);
}
.btn-primary {
@@ -637,7 +651,7 @@ a {
/* --- PROJECT NAVIGATION BAR --- */
.project-navbar {
- background: var(--color-bg-card);
+ background: rgba(10, 10, 10, 0.75);
border-bottom: 1px solid var(--color-border);
padding: 0 2rem;
display: flex;
@@ -647,7 +661,8 @@ a {
position: sticky;
top: 0;
z-index: 110;
- backdrop-filter: blur(10px);
+ backdrop-filter: blur(16px);
+ box-shadow: 0 4px 20px -8px rgba(0, 0, 0, 0.5);
}
.nav-left {
@@ -719,6 +734,7 @@ a {
height: 2px;
background: var(--color-primary);
border-radius: 2px 2px 0 0;
+ box-shadow: 0 -2px 10px rgba(62, 207, 142, 0.4);
}
/* Responsive Navigation */
diff --git a/apps/web-dashboard/src/pages/ProjectDetails.jsx b/apps/web-dashboard/src/pages/ProjectDetails.jsx
index 46c6cfd57..5ff89391e 100644
--- a/apps/web-dashboard/src/pages/ProjectDetails.jsx
+++ b/apps/web-dashboard/src/pages/ProjectDetails.jsx
@@ -91,7 +91,19 @@ function ProjectDetails() {
New {newKey.type} Key
Copy this now. It won't be shown again.
- {newKey.key}
+
+ {newKey.key}
+
+
diff --git a/examples/react-sdk-demo/.gitignore b/examples/react-sdk-demo/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/examples/react-sdk-demo/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/examples/react-sdk-demo/README.md b/examples/react-sdk-demo/README.md
new file mode 100644
index 000000000..7dbf7ebf3
--- /dev/null
+++ b/examples/react-sdk-demo/README.md
@@ -0,0 +1,73 @@
+# React + TypeScript + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)
+
+## React Compiler
+
+The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
+
+## Expanding the ESLint configuration
+
+If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
+
+```js
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ // Other configs...
+
+ // Remove tseslint.configs.recommended and replace with this
+ tseslint.configs.recommendedTypeChecked,
+ // Alternatively, use this for stricter rules
+ tseslint.configs.strictTypeChecked,
+ // Optionally, add this for stylistic rules
+ tseslint.configs.stylisticTypeChecked,
+
+ // Other configs...
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ // other options...
+ },
+ },
+])
+```
+
+You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
+
+```js
+// eslint.config.js
+import reactX from 'eslint-plugin-react-x'
+import reactDom from 'eslint-plugin-react-dom'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ // Other configs...
+ // Enable lint rules for React
+ reactX.configs['recommended-typescript'],
+ // Enable lint rules for React DOM
+ reactDom.configs.recommended,
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ // other options...
+ },
+ },
+])
+```
diff --git a/examples/react-sdk-demo/eslint.config.js b/examples/react-sdk-demo/eslint.config.js
new file mode 100644
index 000000000..ef614d25c
--- /dev/null
+++ b/examples/react-sdk-demo/eslint.config.js
@@ -0,0 +1,22 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import tseslint from 'typescript-eslint'
+import { defineConfig, globalIgnores } from 'eslint/config'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ js.configs.recommended,
+ tseslint.configs.recommended,
+ reactHooks.configs.flat.recommended,
+ reactRefresh.configs.vite,
+ ],
+ languageOptions: {
+ globals: globals.browser,
+ },
+ },
+])
diff --git a/examples/react-sdk-demo/index.html b/examples/react-sdk-demo/index.html
new file mode 100644
index 000000000..92a5b2ce0
--- /dev/null
+++ b/examples/react-sdk-demo/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ react-sdk-demo
+
+
+
+
+
+
diff --git a/examples/react-sdk-demo/package-lock.json b/examples/react-sdk-demo/package-lock.json
new file mode 100644
index 000000000..6becd4222
--- /dev/null
+++ b/examples/react-sdk-demo/package-lock.json
@@ -0,0 +1,2783 @@
+{
+ "name": "react-sdk-demo",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "react-sdk-demo",
+ "version": "0.0.0",
+ "dependencies": {
+ "@urbackend/react": "file:../../sdks/urbackend-react",
+ "@urbackend/sdk": "file:../../sdks/urbackend-sdk",
+ "react": "^19.2.6",
+ "react-dom": "^19.2.6"
+ },
+ "devDependencies": {
+ "@eslint/js": "^10.0.1",
+ "@types/node": "^24.12.3",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^6.0.1",
+ "eslint": "^10.3.0",
+ "eslint-plugin-react-hooks": "^7.1.1",
+ "eslint-plugin-react-refresh": "^0.5.2",
+ "globals": "^17.6.0",
+ "typescript": "~6.0.2",
+ "typescript-eslint": "^8.59.2",
+ "vite": "^8.0.12"
+ }
+ },
+ "../../sdks/urbackend-react": {
+ "name": "@urbackend/react",
+ "version": "1.0.0",
+ "dependencies": {
+ "@urbackend/sdk": "file:../urbackend-sdk"
+ },
+ "devDependencies": {
+ "@types/react": "^18.2.0",
+ "@types/react-dom": "^18.2.0",
+ "tsup": "^8.0.0",
+ "typescript": "^5.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=17.0.0",
+ "react-dom": ">=17.0.0"
+ }
+ },
+ "../../sdks/urbackend-sdk": {
+ "name": "@urbackend/sdk",
+ "version": "0.4.1",
+ "license": "MIT",
+ "devDependencies": {
+ "@eslint/js": "^10.0.1",
+ "@types/node": "^25.5.0",
+ "@typescript-eslint/eslint-plugin": "^8.57.2",
+ "@typescript-eslint/parser": "^8.57.2",
+ "@vitest/coverage-v8": "^4.1.2",
+ "eslint": "^10.1.0",
+ "prettier": "^3.8.1",
+ "tsup": "^8.5.1",
+ "typescript": "^5.9.3",
+ "typescript-eslint": "^8.57.2",
+ "vitest": "^4.1.2"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
+ "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
+ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helpers": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/template": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz",
+ "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
+ "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.29.7",
+ "@babel/helper-validator-option": "^7.29.7",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
+ "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
+ "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
+ "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
+ "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
+ "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz",
+ "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.7"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
+ "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz",
+ "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.7",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz",
+ "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
+ "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.1",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
+ "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
+ "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.23.5",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
+ "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^3.0.5",
+ "debug": "^4.3.1",
+ "minimatch": "^10.2.4"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz",
+ "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
+ "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz",
+ "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "eslint": "^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
+ "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz",
+ "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/types": "^0.15.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.2",
+ "@humanfs/types": "^0.15.0",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/types": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
+ "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tybys/wasm-util": "^0.10.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.132.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.132.0.tgz",
+ "integrity": "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.2.tgz",
+ "integrity": "sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.2.tgz",
+ "integrity": "sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.2.tgz",
+ "integrity": "sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.2.tgz",
+ "integrity": "sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.2.tgz",
+ "integrity": "sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.2.tgz",
+ "integrity": "sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.2.tgz",
+ "integrity": "sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.2.tgz",
+ "integrity": "sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.2.tgz",
+ "integrity": "sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.2.tgz",
+ "integrity": "sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.2.tgz",
+ "integrity": "sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.2.tgz",
+ "integrity": "sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.2.tgz",
+ "integrity": "sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "1.10.0",
+ "@emnapi/runtime": "1.10.0",
+ "@napi-rs/wasm-runtime": "^1.1.4"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.2.tgz",
+ "integrity": "sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.2.tgz",
+ "integrity": "sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
+ "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/esrecurse": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
+ "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "24.12.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.4.tgz",
+ "integrity": "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.15",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz",
+ "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.2.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz",
+ "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.60.0",
+ "@typescript-eslint/type-utils": "8.60.0",
+ "@typescript-eslint/utils": "8.60.0",
+ "@typescript-eslint/visitor-keys": "8.60.0",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.60.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz",
+ "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.60.0",
+ "@typescript-eslint/types": "8.60.0",
+ "@typescript-eslint/typescript-estree": "8.60.0",
+ "@typescript-eslint/visitor-keys": "8.60.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz",
+ "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.60.0",
+ "@typescript-eslint/types": "^8.60.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz",
+ "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.60.0",
+ "@typescript-eslint/visitor-keys": "8.60.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz",
+ "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz",
+ "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.60.0",
+ "@typescript-eslint/typescript-estree": "8.60.0",
+ "@typescript-eslint/utils": "8.60.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz",
+ "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz",
+ "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.60.0",
+ "@typescript-eslint/tsconfig-utils": "8.60.0",
+ "@typescript-eslint/types": "8.60.0",
+ "@typescript-eslint/visitor-keys": "8.60.0",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz",
+ "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz",
+ "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.60.0",
+ "@typescript-eslint/types": "8.60.0",
+ "@typescript-eslint/typescript-estree": "8.60.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz",
+ "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.60.0",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@urbackend/react": {
+ "resolved": "../../sdks/urbackend-react",
+ "link": true
+ },
+ "node_modules/@urbackend/sdk": {
+ "resolved": "../../sdks/urbackend-sdk",
+ "link": true
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz",
+ "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rolldown/pluginutils": "^1.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0",
+ "babel-plugin-react-compiler": "^1.0.0",
+ "vite": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rolldown/plugin-babel": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.33",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz",
+ "integrity": "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
+ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.10.12",
+ "caniuse-lite": "^1.0.30001782",
+ "electron-to-chromium": "^1.5.328",
+ "node-releases": "^2.0.36",
+ "update-browserslist-db": "^1.2.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001793",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz",
+ "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.364",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.364.tgz",
+ "integrity": "sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "10.4.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.1.tgz",
+ "integrity": "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.2",
+ "@eslint/config-array": "^0.23.5",
+ "@eslint/config-helpers": "^0.6.0",
+ "@eslint/core": "^1.2.1",
+ "@eslint/plugin-kit": "^0.7.2",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^9.1.2",
+ "eslint-visitor-keys": "^5.0.1",
+ "espree": "^11.2.0",
+ "esquery": "^1.7.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "minimatch": "^10.2.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz",
+ "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.24.4",
+ "@babel/parser": "^7.24.4",
+ "hermes-parser": "^0.25.1",
+ "zod": "^3.25.0 || ^4.0.0",
+ "zod-validation-error": "^3.5.0 || ^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz",
+ "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": "^9 || ^10"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
+ "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@types/esrecurse": "^4.3.1",
+ "@types/estree": "^1.0.8",
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^5.0.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "17.6.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz",
+ "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/hermes-estree": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
+ "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/hermes-parser": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
+ "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.25.1"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.12",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
+ "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.46",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.46.tgz",
+ "integrity": "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.15",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
+ "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.12",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz",
+ "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz",
+ "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.6"
+ }
+ },
+ "node_modules/rolldown": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.2.tgz",
+ "integrity": "sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.132.0",
+ "@rolldown/pluginutils": "^1.0.0"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.0.2",
+ "@rolldown/binding-darwin-arm64": "1.0.2",
+ "@rolldown/binding-darwin-x64": "1.0.2",
+ "@rolldown/binding-freebsd-x64": "1.0.2",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.2",
+ "@rolldown/binding-linux-arm64-gnu": "1.0.2",
+ "@rolldown/binding-linux-arm64-musl": "1.0.2",
+ "@rolldown/binding-linux-ppc64-gnu": "1.0.2",
+ "@rolldown/binding-linux-s390x-gnu": "1.0.2",
+ "@rolldown/binding-linux-x64-gnu": "1.0.2",
+ "@rolldown/binding-linux-x64-musl": "1.0.2",
+ "@rolldown/binding-openharmony-arm64": "1.0.2",
+ "@rolldown/binding-wasm32-wasi": "1.0.2",
+ "@rolldown/binding-win32-arm64-msvc": "1.0.2",
+ "@rolldown/binding-win32-x64-msvc": "1.0.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD",
+ "optional": true
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
+ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.60.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.0.tgz",
+ "integrity": "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.60.0",
+ "@typescript-eslint/parser": "8.60.0",
+ "@typescript-eslint/typescript-estree": "8.60.0",
+ "@typescript-eslint/utils": "8.60.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "8.0.14",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.14.tgz",
+ "integrity": "sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lightningcss": "^1.32.0",
+ "picomatch": "^4.0.4",
+ "postcss": "^8.5.15",
+ "rolldown": "1.0.2",
+ "tinyglobby": "^0.2.16"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.1.18",
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
+ "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-validation-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
+ }
+ }
+ }
+}
diff --git a/examples/react-sdk-demo/package.json b/examples/react-sdk-demo/package.json
new file mode 100644
index 000000000..d1ac9bf00
--- /dev/null
+++ b/examples/react-sdk-demo/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "react-sdk-demo",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@urbackend/react": "file:../../sdks/urbackend-react",
+ "@urbackend/sdk": "file:../../sdks/urbackend-sdk",
+ "react": "^19.2.6",
+ "react-dom": "^19.2.6"
+ },
+ "devDependencies": {
+ "@eslint/js": "^10.0.1",
+ "@types/node": "^24.12.3",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^6.0.1",
+ "eslint": "^10.3.0",
+ "eslint-plugin-react-hooks": "^7.1.1",
+ "eslint-plugin-react-refresh": "^0.5.2",
+ "globals": "^17.6.0",
+ "typescript": "~6.0.2",
+ "typescript-eslint": "^8.59.2",
+ "vite": "^8.0.12"
+ }
+}
diff --git a/examples/react-sdk-demo/public/favicon.svg b/examples/react-sdk-demo/public/favicon.svg
new file mode 100644
index 000000000..6893eb132
--- /dev/null
+++ b/examples/react-sdk-demo/public/favicon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/examples/react-sdk-demo/public/icons.svg b/examples/react-sdk-demo/public/icons.svg
new file mode 100644
index 000000000..e9522193d
--- /dev/null
+++ b/examples/react-sdk-demo/public/icons.svg
@@ -0,0 +1,24 @@
+
diff --git a/examples/react-sdk-demo/src/App.css b/examples/react-sdk-demo/src/App.css
new file mode 100644
index 000000000..242101ef9
--- /dev/null
+++ b/examples/react-sdk-demo/src/App.css
@@ -0,0 +1 @@
+/* Cleared default App.css */
diff --git a/examples/react-sdk-demo/src/App.tsx b/examples/react-sdk-demo/src/App.tsx
new file mode 100644
index 000000000..e665164e4
--- /dev/null
+++ b/examples/react-sdk-demo/src/App.tsx
@@ -0,0 +1,91 @@
+import { UrAuth, useAuth } from '@urbackend/react';
+import './App.css';
+
+function App() {
+ const { user, isAuthenticated, isInitializing, logout } = useAuth();
+
+ if (isInitializing) {
+ return Loading urBackend...
;
+ }
+
+ if (!isAuthenticated) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+ {user?.avatarUrl ? (
+

+ ) : (
+
+ {user?.name?.[0]?.toUpperCase() || user?.email?.[0]?.toUpperCase()}
+
+ )}
+
+
Welcome back{user?.name ? `, ${user.name.split(' ')[0]}` : ''}
+
You are successfully authenticated
+
+
+
+
+
Your Profile
+
+
+ Email
+ {user?.email}
+
+
+
+ Name
+ {user?.name || 'Not provided'}
+
+
+
+ User ID
+ {user?._id}
+
+
+
+
+
+
+ );
+}
+
+export default App;
diff --git a/examples/react-sdk-demo/src/assets/hero.png b/examples/react-sdk-demo/src/assets/hero.png
new file mode 100644
index 000000000..02251f4b9
Binary files /dev/null and b/examples/react-sdk-demo/src/assets/hero.png differ
diff --git a/examples/react-sdk-demo/src/assets/react.svg b/examples/react-sdk-demo/src/assets/react.svg
new file mode 100644
index 000000000..6c87de9bb
--- /dev/null
+++ b/examples/react-sdk-demo/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/examples/react-sdk-demo/src/assets/vite.svg b/examples/react-sdk-demo/src/assets/vite.svg
new file mode 100644
index 000000000..5101b674d
--- /dev/null
+++ b/examples/react-sdk-demo/src/assets/vite.svg
@@ -0,0 +1 @@
+
diff --git a/examples/react-sdk-demo/src/index.css b/examples/react-sdk-demo/src/index.css
new file mode 100644
index 000000000..321c97629
--- /dev/null
+++ b/examples/react-sdk-demo/src/index.css
@@ -0,0 +1,12 @@
+body {
+ margin: 0;
+ padding: 0;
+ font-family: system-ui, -apple-system, sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+#root {
+ width: 100%;
+ min-height: 100vh;
+}
diff --git a/examples/react-sdk-demo/src/main.tsx b/examples/react-sdk-demo/src/main.tsx
new file mode 100644
index 000000000..19ffb10b7
--- /dev/null
+++ b/examples/react-sdk-demo/src/main.tsx
@@ -0,0 +1,16 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import App from './App.tsx'
+import './index.css'
+import { UrProvider } from '@urbackend/react'
+
+ReactDOM.createRoot(document.getElementById('root')!).render(
+
+
+
+
+ ,
+)
diff --git a/examples/react-sdk-demo/tsconfig.app.json b/examples/react-sdk-demo/tsconfig.app.json
new file mode 100644
index 000000000..7f42e5f7c
--- /dev/null
+++ b/examples/react-sdk-demo/tsconfig.app.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "es2023",
+ "lib": ["ES2023", "DOM"],
+ "module": "esnext",
+ "types": ["vite/client"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"]
+}
diff --git a/examples/react-sdk-demo/tsconfig.json b/examples/react-sdk-demo/tsconfig.json
new file mode 100644
index 000000000..1ffef600d
--- /dev/null
+++ b/examples/react-sdk-demo/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
+}
diff --git a/examples/react-sdk-demo/tsconfig.node.json b/examples/react-sdk-demo/tsconfig.node.json
new file mode 100644
index 000000000..d3c52ea64
--- /dev/null
+++ b/examples/react-sdk-demo/tsconfig.node.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "es2023",
+ "lib": ["ES2023"],
+ "module": "esnext",
+ "types": ["node"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/examples/react-sdk-demo/vite.config.ts b/examples/react-sdk-demo/vite.config.ts
new file mode 100644
index 000000000..8b0f57b91
--- /dev/null
+++ b/examples/react-sdk-demo/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})
diff --git a/package-lock.json b/package-lock.json
index 277a525fc..b308ac6c4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "urbackend-monorepo",
- "version": "0.10.0",
+ "version": "0.10.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "urbackend-monorepo",
- "version": "0.10.0",
+ "version": "0.10.1",
"license": "AGPL-3.0-only",
"workspaces": [
"apps/*",
@@ -25,11 +25,32 @@
}
},
"apps/consumer": {
- "version": "1.0.0",
- "license": "ISC"
+ "version": "0.1.0",
+ "license": "AGPL-3.0-only",
+ "dependencies": {
+ "@aws-sdk/client-s3": "^3.1020.0",
+ "@aws-sdk/s3-request-presigner": "^3.1034.0",
+ "@kiroo/sdk": "^0.1.2",
+ "@supabase/supabase-js": "^2.84.0",
+ "@urbackend/common": "file:../../packages/common",
+ "bcryptjs": "^3.0.2",
+ "bullmq": "^5.70.1",
+ "cors": "^2.8.5",
+ "dotenv": "^17.2.3",
+ "express": "^5.1.0",
+ "express-rate-limit": "^8.2.1",
+ "ioredis": "^5.10.0",
+ "jsonwebtoken": "^9.0.2",
+ "marked": "^17.0.5",
+ "mongoose": "^8.19.2",
+ "multer": "^2.0.2",
+ "resend": "^6.6.0",
+ "uuid": "^9.0.1",
+ "zod": "^4.1.13"
+ }
},
"apps/dashboard-api": {
- "version": "0.10.0",
+ "version": "0.10.1",
"license": "AGPL-3.0-only",
"dependencies": {
"@bull-board/api": "^7.1.5",
@@ -60,7 +81,7 @@
}
},
"apps/public-api": {
- "version": "0.10.0",
+ "version": "0.10.1",
"license": "AGPL-3.0-only",
"dependencies": {
"@kiroo/sdk": "^0.1.2",
@@ -97,7 +118,7 @@
}
},
"apps/web-dashboard": {
- "version": "0.10.0",
+ "version": "0.10.1",
"license": "AGPL-3.0-only",
"dependencies": {
"@dnd-kit/core": "^6.3.1",
@@ -139,6 +160,34 @@
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
+ "node_modules/@adobe/css-tools": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz",
+ "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@asamuzakjp/css-color": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz",
+ "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.3",
+ "@csstools/css-color-parser": "^3.0.9",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "lru-cache": "^10.4.3"
+ }
+ },
+ "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/@aws-crypto/crc32": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz",
@@ -1297,6 +1346,16 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/runtime": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
+ "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/template": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
@@ -1388,6 +1447,121 @@
"@bull-board/api": "7.1.5"
}
},
+ "node_modules/@csstools/color-helpers": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz",
+ "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@csstools/css-calc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz",
+ "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/css-color-parser": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz",
+ "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/color-helpers": "^5.1.0",
+ "@csstools/css-calc": "^2.1.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/css-parser-algorithms": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz",
+ "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/css-tokenizer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
+ "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@dnd-kit/accessibility": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz",
@@ -4031,6 +4205,127 @@
"url": "https://github.com/sponsors/tannerlinsley"
}
},
+ "node_modules/@testing-library/dom": {
+ "version": "9.3.4",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz",
+ "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "5.1.3",
+ "chalk": "^4.1.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.5.0",
+ "pretty-format": "^27.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@testing-library/dom/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@testing-library/dom/node_modules/aria-query": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
+ "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
+ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@testing-library/dom/node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@testing-library/dom/node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@testing-library/jest-dom": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz",
+ "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@adobe/css-tools": "^4.4.0",
+ "aria-query": "^5.0.0",
+ "css.escape": "^1.5.1",
+ "dom-accessibility-api": "^0.6.3",
+ "picocolors": "^1.1.1",
+ "redent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/@testing-library/react": {
+ "version": "14.3.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz",
+ "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@testing-library/dom": "^9.0.0",
+ "@types/react-dom": "^18.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
+ "node_modules/@testing-library/react/node_modules/@types/react-dom": {
+ "version": "18.3.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
"node_modules/@tybys/wasm-util": {
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
@@ -4041,6 +4336,13 @@
"tslib": "^2.4.0"
}
},
+ "node_modules/@types/aria-query": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
+ "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/babel__core": {
"version": "7.20.5",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@@ -4258,6 +4560,13 @@
"undici-types": "~7.19.0"
}
},
+ "node_modules/@types/prop-types": {
+ "version": "15.7.15",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
+ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/react": {
"version": "19.2.14",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
@@ -4849,6 +5158,10 @@
"resolved": "packages/common",
"link": true
},
+ "node_modules/@urbackend/react": {
+ "resolved": "sdks/urbackend-react",
+ "link": true
+ },
"node_modules/@urbackend/sdk": {
"resolved": "sdks/urbackend-sdk",
"link": true
@@ -5054,6 +5367,29 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
+ "node_modules/acorn-walk": {
+ "version": "8.3.5",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
+ "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/ajv": {
"version": "6.15.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
@@ -5160,6 +5496,33 @@
"dev": true,
"license": "Python-2.0"
},
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
@@ -5202,6 +5565,22 @@
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"license": "MIT"
},
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/axios": {
"version": "1.16.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz",
@@ -5596,6 +5975,25 @@
"node": ">=8"
}
},
+ "node_modules/call-bind": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
+ "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "get-intrinsic": "^1.3.0",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
@@ -5766,6 +6164,19 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/check-error": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-func-name": "^2.0.2"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/chokidar": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
@@ -6187,6 +6598,34 @@
"node": ">= 0.8"
}
},
+ "node_modules/css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cssstyle": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz",
+ "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@asamuzakjp/css-color": "^3.2.0",
+ "rrweb-cssom": "^0.8.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cssstyle/node_modules/rrweb-cssom": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz",
+ "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/csstype": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
@@ -6343,6 +6782,20 @@
"resolved": "apps/dashboard-api",
"link": true
},
+ "node_modules/data-urls": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
+ "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-mimetype": "^4.0.0",
+ "whatwg-url": "^14.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -6360,6 +6813,13 @@
}
}
},
+ "node_modules/decimal.js": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/decimal.js-light": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
@@ -6394,6 +6854,52 @@
}
}
},
+ "node_modules/deep-eql": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
+ "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-equal": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
+ "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.5",
+ "es-get-iterator": "^1.1.3",
+ "get-intrinsic": "^1.2.2",
+ "is-arguments": "^1.1.1",
+ "is-array-buffer": "^3.0.2",
+ "is-date-object": "^1.0.5",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "isarray": "^2.0.5",
+ "object-is": "^1.1.5",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.1",
+ "side-channel": "^1.0.4",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -6411,6 +6917,42 @@
"node": ">=0.10.0"
}
},
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -6490,6 +7032,23 @@
"wrappy": "1"
}
},
+ "node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/dom-accessibility-api": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
+ "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/dotenv": {
"version": "17.4.2",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz",
@@ -6599,6 +7158,19 @@
"node": ">=10.13.0"
}
},
+ "node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/environment": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
@@ -6640,6 +7212,27 @@
"node": ">= 0.4"
}
},
+ "node_modules/es-get-iterator": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
+ "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "is-arguments": "^1.1.1",
+ "is-map": "^2.0.2",
+ "is-set": "^2.0.2",
+ "is-string": "^1.0.7",
+ "isarray": "^2.0.5",
+ "stop-iteration-iterator": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/es-module-lexer": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz",
@@ -7452,6 +8045,22 @@
}
}
},
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/foreground-child": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
@@ -7599,6 +8208,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -7632,6 +8251,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -7800,6 +8429,19 @@
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"license": "ISC"
},
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -7810,6 +8452,19 @@
"node": ">=8"
}
},
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
@@ -7906,6 +8561,19 @@
"hermes-estree": "0.25.1"
}
},
+ "node_modules/html-encoding-sniffer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
+ "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-encoding": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -7963,6 +8631,34 @@
"node": ">= 0.6"
}
},
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
@@ -8101,6 +8797,16 @@
"node": ">=0.8.19"
}
},
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -8125,6 +8831,21 @@
"integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
"license": "MIT"
},
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/internmap": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
@@ -8200,6 +8921,41 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/is-arguments": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz",
+ "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -8207,43 +8963,106 @@
"dev": true,
"license": "MIT"
},
- "node_modules/is-decimal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
- "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-generator-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
"dev": true,
"license": "MIT",
- "engines": {
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
"node": ">=6"
}
},
@@ -8270,6 +9089,36 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-plain-obj": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
@@ -8282,12 +9131,67 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/is-promise": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
"integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
"license": "MIT"
},
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
@@ -8301,6 +9205,78 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -9010,6 +9986,47 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/jsdom": {
+ "version": "24.1.3",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.3.tgz",
+ "integrity": "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssstyle": "^4.0.1",
+ "data-urls": "^5.0.0",
+ "decimal.js": "^10.4.3",
+ "form-data": "^4.0.0",
+ "html-encoding-sniffer": "^4.0.0",
+ "http-proxy-agent": "^7.0.2",
+ "https-proxy-agent": "^7.0.5",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.12",
+ "parse5": "^7.1.2",
+ "rrweb-cssom": "^0.7.1",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.1.4",
+ "w3c-xmlserializer": "^5.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^3.1.1",
+ "whatwg-mimetype": "^4.0.0",
+ "whatwg-url": "^14.0.0",
+ "ws": "^8.18.0",
+ "xml-name-validator": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "canvas": "^2.11.2"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
"node_modules/jsesc": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
@@ -9558,6 +10575,23 @@
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
+ "node_modules/local-pkg": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz",
+ "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mlly": "^1.7.3",
+ "pkg-types": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -9805,6 +10839,16 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/loupe": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
+ "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-func-name": "^2.0.1"
+ }
+ },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -9824,6 +10868,16 @@
"node": ">=12"
}
},
+ "node_modules/lz-string": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
+ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "lz-string": "bin/bin.js"
+ }
+ },
"node_modules/magic-string": {
"version": "0.30.21",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
@@ -10852,6 +11906,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/minimatch": {
"version": "10.2.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
@@ -11224,6 +12288,13 @@
"node": ">=8"
}
},
+ "node_modules/nwsapi": {
+ "version": "2.2.23",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz",
+ "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -11245,6 +12316,54 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/object-is": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
+ "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/obug": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
@@ -11417,6 +12536,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -11522,6 +12654,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -11631,12 +12773,22 @@
"pathe": "^2.0.1"
}
},
- "node_modules/postal-mime": {
- "version": "2.7.4",
- "resolved": "https://registry.npmjs.org/postal-mime/-/postal-mime-2.7.4.tgz",
- "integrity": "sha512-0WdnFQYUrPGGTFu1uOqD2s7omwua8xaeYGdO6rb88oD5yJ/4pPHDA4sdWqfD8wQVfCny563n/HQS7zTFft+f/g==",
- "license": "MIT-0"
- },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postal-mime": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/postal-mime/-/postal-mime-2.7.4.tgz",
+ "integrity": "sha512-0WdnFQYUrPGGTFu1uOqD2s7omwua8xaeYGdO6rb88oD5yJ/4pPHDA4sdWqfD8wQVfCny563n/HQS7zTFft+f/g==",
+ "license": "MIT-0"
+ },
"node_modules/postcss": {
"version": "8.5.13",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.13.tgz",
@@ -11810,6 +12962,19 @@
"node": ">=10"
}
},
+ "node_modules/psl": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/lupomontero"
+ }
+ },
"node_modules/public-api": {
"resolved": "apps/public-api",
"link": true
@@ -11855,6 +13020,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/random-bytes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
@@ -11976,13 +13148,6 @@
"react-dom": ">=16"
}
},
- "node_modules/react-is": {
- "version": "19.2.5",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.5.tgz",
- "integrity": "sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ==",
- "license": "MIT",
- "peer": true
- },
"node_modules/react-markdown": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz",
@@ -12152,6 +13317,20 @@
"react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
+ "node_modules/redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/redis-errors": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
@@ -12197,6 +13376,27 @@
"redux": "^5.0.0"
}
},
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/remark-gfm": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
@@ -12273,6 +13473,13 @@
"node": ">=0.10.0"
}
},
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/reselect": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
@@ -12455,6 +13662,13 @@
"node": ">= 18"
}
},
+ "node_modules/rrweb-cssom": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz",
+ "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/rxjs": {
"version": "7.8.2",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
@@ -12485,12 +13699,43 @@
],
"license": "MIT"
},
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"license": "MIT"
},
+ "node_modules/saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=v12.22.7"
+ }
+ },
"node_modules/scheduler": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
@@ -12601,6 +13846,40 @@
"integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
"license": "MIT"
},
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
@@ -12915,6 +14194,20 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/stream-browserify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
@@ -13064,6 +14357,19 @@
"node": ">=6"
}
},
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -13077,6 +14383,26 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/strip-literal": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz",
+ "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^9.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/strip-literal/node_modules/js-tokens": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/strnum": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz",
@@ -13216,6 +14542,13 @@
"uuid": "dist/bin/uuid"
}
},
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/synckit": {
"version": "0.11.12",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz",
@@ -13378,6 +14711,16 @@
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
+ "node_modules/tinypool": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz",
+ "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/tinyrainbow": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz",
@@ -13388,6 +14731,16 @@
"node": ">=14.0.0"
}
},
+ "node_modules/tinyspy": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz",
+ "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@@ -13404,6 +14757,22 @@
"node": ">=0.6"
}
},
+ "node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/tr46": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
@@ -13760,6 +15129,16 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -13845,6 +15224,17 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
"node_modules/use-sync-external-store": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
@@ -14034,413 +15424,2001 @@
}
}
},
- "node_modules/vitest": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz",
- "integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==",
+ "node_modules/vite-node": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz",
+ "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/expect": "4.1.5",
- "@vitest/mocker": "4.1.5",
- "@vitest/pretty-format": "4.1.5",
- "@vitest/runner": "4.1.5",
- "@vitest/snapshot": "4.1.5",
- "@vitest/spy": "4.1.5",
- "@vitest/utils": "4.1.5",
- "es-module-lexer": "^2.0.0",
- "expect-type": "^1.3.0",
- "magic-string": "^0.30.21",
- "obug": "^2.1.1",
- "pathe": "^2.0.3",
- "picomatch": "^4.0.3",
- "std-env": "^4.0.0-rc.1",
- "tinybench": "^2.9.0",
- "tinyexec": "^1.0.2",
- "tinyglobby": "^0.2.15",
- "tinyrainbow": "^3.1.0",
- "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
- "why-is-node-running": "^2.3.0"
+ "cac": "^6.7.14",
+ "debug": "^4.3.4",
+ "pathe": "^1.1.1",
+ "picocolors": "^1.0.0",
+ "vite": "^5.0.0"
},
"bin": {
- "vitest": "vitest.mjs"
+ "vite-node": "vite-node.mjs"
},
"engines": {
- "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
+ "node": "^18.0.0 || >=20.0.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
- },
- "peerDependencies": {
- "@edge-runtime/vm": "*",
- "@opentelemetry/api": "^1.9.0",
- "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
- "@vitest/browser-playwright": "4.1.5",
- "@vitest/browser-preview": "4.1.5",
- "@vitest/browser-webdriverio": "4.1.5",
- "@vitest/coverage-istanbul": "4.1.5",
- "@vitest/coverage-v8": "4.1.5",
- "@vitest/ui": "4.1.5",
- "happy-dom": "*",
- "jsdom": "*",
- "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "@edge-runtime/vm": {
- "optional": true
- },
- "@opentelemetry/api": {
- "optional": true
- },
- "@types/node": {
- "optional": true
- },
- "@vitest/browser-playwright": {
- "optional": true
- },
- "@vitest/browser-preview": {
- "optional": true
- },
- "@vitest/browser-webdriverio": {
- "optional": true
- },
- "@vitest/coverage-istanbul": {
- "optional": true
- },
- "@vitest/coverage-v8": {
- "optional": true
- },
- "@vitest/ui": {
- "optional": true
- },
- "happy-dom": {
- "optional": true
- },
- "jsdom": {
- "optional": true
- },
- "vite": {
- "optional": false
- }
}
},
- "node_modules/vitest/node_modules/tinyexec": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz",
- "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==",
+ "node_modules/vite-node/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
"license": "MIT",
- "engines": {
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-node/node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/vite-node/node_modules/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vite-node/node_modules/vite": {
+ "version": "5.4.21",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz",
+ "integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/expect": "4.1.5",
+ "@vitest/mocker": "4.1.5",
+ "@vitest/pretty-format": "4.1.5",
+ "@vitest/runner": "4.1.5",
+ "@vitest/snapshot": "4.1.5",
+ "@vitest/spy": "4.1.5",
+ "@vitest/utils": "4.1.5",
+ "es-module-lexer": "^2.0.0",
+ "expect-type": "^1.3.0",
+ "magic-string": "^0.30.21",
+ "obug": "^2.1.1",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3",
+ "std-env": "^4.0.0-rc.1",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^1.0.2",
+ "tinyglobby": "^0.2.15",
+ "tinyrainbow": "^3.1.0",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@opentelemetry/api": "^1.9.0",
+ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
+ "@vitest/browser-playwright": "4.1.5",
+ "@vitest/browser-preview": "4.1.5",
+ "@vitest/browser-webdriverio": "4.1.5",
+ "@vitest/coverage-istanbul": "4.1.5",
+ "@vitest/coverage-v8": "4.1.5",
+ "@vitest/ui": "4.1.5",
+ "happy-dom": "*",
+ "jsdom": "*",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser-playwright": {
+ "optional": true
+ },
+ "@vitest/browser-preview": {
+ "optional": true
+ },
+ "@vitest/browser-webdriverio": {
+ "optional": true
+ },
+ "@vitest/coverage-istanbul": {
+ "optional": true
+ },
+ "@vitest/coverage-v8": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ },
+ "vite": {
+ "optional": false
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/tinyexec": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz",
+ "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
+ "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xml-name-validator": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/web-dashboard": {
+ "resolved": "apps/web-dashboard",
+ "link": true
+ },
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+ "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
+ "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "^5.1.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.21",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.21.tgz",
+ "integrity": "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
+ "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
+ "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
"node": ">=18"
}
},
- "node_modules/walker": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
- "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "node_modules/xml-naming": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz",
+ "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
+ "license": "ISC",
+ "optional": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.2.tgz",
+ "integrity": "sha512-IynmDyxsEsb9RKzO3J9+4SxXnl2FTFSzNBaKKaMV6tsSk0rw9gYw9gs+JFCq/qk2LCZ78KDwyj+Z289TijSkUw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-validation-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "packages/common": {
+ "name": "@urbackend/common",
+ "version": "0.10.1",
+ "license": "AGPL-3.0-only",
+ "dependencies": {
+ "@aws-sdk/client-s3": "^3.1020.0",
+ "@aws-sdk/s3-request-presigner": "^3.1034.0",
+ "@kiroo/sdk": "^0.1.2",
+ "@supabase/supabase-js": "^2.84.0",
+ "bcryptjs": "^3.0.2",
+ "bullmq": "^5.70.1",
+ "cors": "^2.8.5",
+ "dotenv": "^17.2.3",
+ "express": "^5.1.0",
+ "express-rate-limit": "^8.2.1",
+ "ioredis": "^5.10.0",
+ "jsonwebtoken": "^9.0.2",
+ "marked": "^17.0.5",
+ "mongoose": "^8.19.2",
+ "multer": "^2.0.2",
+ "resend": "^6.6.0",
+ "uuid": "^9.0.1",
+ "zod": "^4.1.13"
+ }
+ },
+ "sdks/urbackend-react": {
+ "name": "@urbackend/react",
+ "version": "0.1.0",
+ "dependencies": {
+ "@urbackend/sdk": "file:../urbackend-sdk"
+ },
+ "devDependencies": {
+ "@testing-library/jest-dom": "^6.0.0",
+ "@testing-library/react": "^14.0.0",
+ "@types/react": "^18.2.0",
+ "@types/react-dom": "^18.2.0",
+ "jsdom": "^24.0.0",
+ "tsup": "^8.0.0",
+ "typescript": "^5.0.0",
+ "vitest": "^4.1.5"
+ },
+ "peerDependencies": {
+ "react": ">=17.0.0",
+ "react-dom": ">=17.0.0"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "makeerror": "1.0.12"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/web-dashboard": {
- "resolved": "apps/web-dashboard",
- "link": true
+ "sdks/urbackend-react/node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
},
- "node_modules/webidl-conversions": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
- "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
- "license": "BSD-2-Clause",
+ "sdks/urbackend-react/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
"engines": {
"node": ">=12"
}
},
- "node_modules/whatwg-url": {
- "version": "14.2.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
- "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
+ "sdks/urbackend-react/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "tr46": "^5.1.0",
- "webidl-conversions": "^7.0.0"
+ "@sinclair/typebox": "^0.27.8"
},
"engines": {
- "node": ">=18"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "sdks/urbackend-react/node_modules/@sinclair/typebox": {
+ "version": "0.27.10",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz",
+ "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==",
"dev": true,
- "license": "ISC",
+ "license": "MIT"
+ },
+ "sdks/urbackend-react/node_modules/@types/react": {
+ "version": "18.3.29",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.29.tgz",
+ "integrity": "sha512-ch0qJdr2JY0r04NXSprbK6TXOgnaJ1Tz23fm5W+z0/CBah6BSBc3n96h7K9GOtwh0HrilNWHIBzE1Ko4Dcw/Wg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
+ "@types/prop-types": "*",
+ "csstype": "^3.2.2"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@types/react-dom": {
+ "version": "18.3.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@vitest/expect": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz",
+ "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "1.6.1",
+ "@vitest/utils": "1.6.1",
+ "chai": "^4.3.10"
},
- "engines": {
- "node": ">= 8"
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/why-is-node-running": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
- "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "sdks/urbackend-react/node_modules/@vitest/runner": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz",
+ "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "siginfo": "^2.0.0",
- "stackback": "0.0.2"
+ "@vitest/utils": "1.6.1",
+ "p-limit": "^5.0.0",
+ "pathe": "^1.1.1"
},
- "bin": {
- "why-is-node-running": "cli.js"
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "sdks/urbackend-react/node_modules/@vitest/snapshot": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz",
+ "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "magic-string": "^0.30.5",
+ "pathe": "^1.1.1",
+ "pretty-format": "^29.7.0"
},
- "engines": {
- "node": ">=8"
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "sdks/urbackend-react/node_modules/@vitest/spy": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz",
+ "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=0.10.0"
+ "dependencies": {
+ "tinyspy": "^2.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "sdks/urbackend-react/node_modules/@vitest/utils": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz",
+ "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
+ "diff-sequences": "^29.6.3",
+ "estree-walker": "^3.0.3",
+ "loupe": "^2.3.7",
+ "pretty-format": "^29.7.0"
},
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "sdks/urbackend-react/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/wrap-ansi-cjs": {
- "name": "wrap-ansi",
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "sdks/urbackend-react/node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "sdks/urbackend-react/node_modules/chai": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
+ "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.3",
+ "deep-eql": "^4.1.3",
+ "get-func-name": "^2.0.2",
+ "loupe": "^2.3.6",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.1.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=4"
+ }
+ },
+ "sdks/urbackend-react/node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "sdks/urbackend-react/node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
},
"funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "license": "ISC"
- },
- "node_modules/write-file-atomic": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
- "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+ "sdks/urbackend-react/node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^4.0.1"
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
},
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "sdks/urbackend-react/node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": ">=16.17.0"
}
},
- "node_modules/ws": {
- "version": "8.20.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
- "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
+ "sdks/urbackend-react/node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/xml-naming": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz",
- "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
+ "sdks/urbackend-react/node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">=16.0.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "sdks/urbackend-react/node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
"engines": {
- "node": ">=10"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "sdks/urbackend-react/node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
"dev": true,
- "license": "ISC"
- },
- "node_modules/yaml": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
- "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
- "license": "ISC",
- "optional": true,
- "bin": {
- "yaml": "bin.mjs"
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
},
"engines": {
- "node": ">= 14.6"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/eemeli"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "sdks/urbackend-react/node_modules/p-limit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
+ "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
+ "yocto-queue": "^1.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "sdks/urbackend-react/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"engines": {
"node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "sdks/urbackend-react/node_modules/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "sdks/urbackend-react/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
"engines": {
- "node": ">=10"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "sdks/urbackend-react/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "sdks/urbackend-react/node_modules/std-env": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
+ "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "sdks/urbackend-react/node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/zod": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.2.tgz",
- "integrity": "sha512-IynmDyxsEsb9RKzO3J9+4SxXnl2FTFSzNBaKKaMV6tsSk0rw9gYw9gs+JFCq/qk2LCZ78KDwyj+Z289TijSkUw==",
+ "sdks/urbackend-react/node_modules/type-detect": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz",
+ "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==",
+ "dev": true,
"license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/zod-validation-error": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
- "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
+ "sdks/urbackend-react/node_modules/vite": {
+ "version": "5.4.21",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
"engines": {
- "node": ">=18.0.0"
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
},
"peerDependencies": {
- "zod": "^3.25.0 || ^4.0.0"
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
}
},
- "node_modules/zwitch": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
- "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "sdks/urbackend-react/node_modules/vitest": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz",
+ "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "@vitest/expect": "1.6.1",
+ "@vitest/runner": "1.6.1",
+ "@vitest/snapshot": "1.6.1",
+ "@vitest/spy": "1.6.1",
+ "@vitest/utils": "1.6.1",
+ "acorn-walk": "^8.3.2",
+ "chai": "^4.3.10",
+ "debug": "^4.3.4",
+ "execa": "^8.0.1",
+ "local-pkg": "^0.5.0",
+ "magic-string": "^0.30.5",
+ "pathe": "^1.1.1",
+ "picocolors": "^1.0.0",
+ "std-env": "^3.5.0",
+ "strip-literal": "^2.0.0",
+ "tinybench": "^2.5.1",
+ "tinypool": "^0.8.3",
+ "vite": "^5.0.0",
+ "vite-node": "1.6.1",
+ "why-is-node-running": "^2.2.2"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "@vitest/browser": "1.6.1",
+ "@vitest/ui": "1.6.1",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
}
},
- "packages/common": {
- "name": "@urbackend/common",
- "version": "0.10.0",
- "license": "AGPL-3.0-only",
- "dependencies": {
- "@aws-sdk/client-s3": "^3.1020.0",
- "@aws-sdk/s3-request-presigner": "^3.1034.0",
- "@kiroo/sdk": "^0.1.2",
- "@supabase/supabase-js": "^2.84.0",
- "bcryptjs": "^3.0.2",
- "bullmq": "^5.70.1",
- "cors": "^2.8.5",
- "dotenv": "^17.2.3",
- "express": "^5.1.0",
- "express-rate-limit": "^8.2.1",
- "ioredis": "^5.10.0",
- "jsonwebtoken": "^9.0.2",
- "marked": "^17.0.5",
- "mongoose": "^8.19.2",
- "multer": "^2.0.2",
- "resend": "^6.6.0",
- "uuid": "^9.0.1",
- "zod": "^4.1.13"
+ "sdks/urbackend-react/node_modules/yocto-queue": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
+ "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"sdks/urbackend-sdk": {
"name": "@urbackend/sdk",
- "version": "0.4.1",
+ "version": "0.4.2",
"license": "MIT",
"devDependencies": {
"@eslint/js": "^10.0.1",
diff --git a/package.json b/package.json
index d5113fa64..ff0348609 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "urbackend-monorepo",
- "version": "0.10.0",
+ "version": "0.10.1",
"private": true,
"license": "AGPL-3.0-only",
"workspaces": [
@@ -16,7 +16,7 @@
},
"lint-staged": {
"apps/web-dashboard/**/*.{js,jsx}": [
- "npm exec --workspace=web-dashboard eslint"
+ "npm exec --workspace=web-dashboard eslint"
]
},
"devDependencies": {
diff --git a/packages/common/package.json b/packages/common/package.json
index 2affd6e10..392710b89 100644
--- a/packages/common/package.json
+++ b/packages/common/package.json
@@ -1,6 +1,6 @@
{
"name": "@urbackend/common",
- "version": "0.10.0",
+ "version": "0.10.1",
"private": true,
"license": "AGPL-3.0-only",
"main": "src/index.js",
diff --git a/sdks/urbackend-python/README.md b/sdks/urbackend-python/README.md
index 5102752af..3224ed4eb 100644
--- a/sdks/urbackend-python/README.md
+++ b/sdks/urbackend-python/README.md
@@ -145,10 +145,11 @@ server_client.mail.send(
url = client.auth.social_start_url("github") # or "google"
# In Django: return redirect(url)
-# 2. After the user returns to /auth/callback?rtCode=...&token=...
+# 2. After the user returns to /auth/callback?rtCode=...#token=...
# exchange BOTH the rtCode and the one-time token (backend requires both)
rt_code = request.GET.get("rtCode")
-token = request.GET.get("token")
+# Token must be parsed from the URL fragment (#token=...), not query string
+token = parse_fragment(request).get("token")
session = client.auth.social_exchange(rt_code, token)
# 3. Use the returned refreshToken to get an accessToken
diff --git a/sdks/urbackend-python/pyproject.toml b/sdks/urbackend-python/pyproject.toml
index dfdd52233..a99866016 100644
--- a/sdks/urbackend-python/pyproject.toml
+++ b/sdks/urbackend-python/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "urbackend"
-version = "0.1.0"
+version = "0.1.1"
description = "Official Python SDK for urBackend — the instant Backend-as-a-Service for MongoDB."
readme = "README.md"
license = { text = "MIT" }
diff --git a/sdks/urbackend-python/src/urbackend/auth.py b/sdks/urbackend-python/src/urbackend/auth.py
index cca1784df..cb3308d31 100644
--- a/sdks/urbackend-python/src/urbackend/auth.py
+++ b/sdks/urbackend-python/src/urbackend/auth.py
@@ -402,12 +402,12 @@ def social_start_url(self, provider: str) -> str:
def social_exchange(self, rt_code: str, token: str) -> Dict[str, Any]:
"""Exchange an OAuth ``rtCode`` + one-time ``token`` for a urBackend refresh token.
- Both ``rtCode`` and ``token`` are returned as query parameters on the
- OAuth callback URL (``/auth/callback?rtCode=...&token=...``).
+ The ``rtCode`` is returned as a query parameter and ``token`` is returned in the URL fragment
+ on the OAuth callback URL (``/auth/callback?rtCode=...#token=...``).
Args:
rt_code: The ``rtCode`` query parameter from the OAuth callback URL.
- token: The one-time security ``token`` query parameter from the callback URL.
+ token: The one-time security ``token`` fragment parameter from the callback URL.
Returns:
Dict with ``refreshToken`` that can be used with :meth:`refresh_token`.
diff --git a/sdks/urbackend-react/dist/index.d.mts b/sdks/urbackend-react/dist/index.d.mts
new file mode 100644
index 000000000..c9d7f7d48
--- /dev/null
+++ b/sdks/urbackend-react/dist/index.d.mts
@@ -0,0 +1,62 @@
+import React from 'react';
+import * as _urbackend_sdk from '@urbackend/sdk';
+import { UrBackendClient, AuthModule, DatabaseModule, StorageModule, AuthUser, LoginPayload, SignUpPayload, VerifyEmailPayload, ChangePasswordPayload, RequestPasswordResetPayload, ResetPasswordPayload } from '@urbackend/sdk';
+export * from '@urbackend/sdk';
+
+interface UrContextValue {
+ client: UrBackendClient | null;
+ auth: AuthModule | null;
+ db: DatabaseModule | null;
+ storage: StorageModule | null;
+ user: AuthUser | null;
+ setUser: React.Dispatch>;
+ isInitializing: boolean;
+ isLoading: boolean;
+ setIsLoading: React.Dispatch>;
+ error: string | null;
+ setError: React.Dispatch>;
+}
+interface UrProviderProps {
+ apiKey: string;
+ baseUrl?: string;
+ children: React.ReactNode;
+}
+declare const UrProvider: React.FC;
+declare const useUrContext: () => UrContextValue;
+
+declare const useAuth: () => {
+ user: _urbackend_sdk.AuthUser | null;
+ isInitializing: boolean;
+ isLoading: boolean;
+ error: string | null;
+ isAuthenticated: boolean;
+ login: (payload: LoginPayload) => Promise;
+ signUp: (payload: SignUpPayload) => Promise<_urbackend_sdk.AuthUser>;
+ logout: () => Promise;
+ socialLogin: (provider: "google" | "github") => void;
+ verifyEmail: (payload: VerifyEmailPayload) => Promise<{
+ message: string;
+ }>;
+ changePassword: (payload: ChangePasswordPayload) => Promise<{
+ message: string;
+ }>;
+ requestPasswordReset: (payload: RequestPasswordResetPayload) => Promise<{
+ message: string;
+ }>;
+ resetPassword: (payload: ResetPasswordPayload) => Promise<{
+ message: string;
+ }>;
+ clearError: () => void;
+ authApi: _urbackend_sdk.AuthModule;
+};
+declare const useDb: () => _urbackend_sdk.DatabaseModule;
+declare const useStorage: () => _urbackend_sdk.StorageModule;
+
+interface UrAuthProps {
+ providers?: ('google' | 'github' | 'apple')[];
+ theme?: 'light' | 'dark';
+ onSuccess?: () => void;
+}
+declare const UrAuth: React.FC;
+
+export { UrAuth, type UrAuthProps, UrProvider, type UrProviderProps, useAuth, useDb, useStorage, useUrContext };
diff --git a/sdks/urbackend-react/dist/index.d.ts b/sdks/urbackend-react/dist/index.d.ts
new file mode 100644
index 000000000..c9d7f7d48
--- /dev/null
+++ b/sdks/urbackend-react/dist/index.d.ts
@@ -0,0 +1,62 @@
+import React from 'react';
+import * as _urbackend_sdk from '@urbackend/sdk';
+import { UrBackendClient, AuthModule, DatabaseModule, StorageModule, AuthUser, LoginPayload, SignUpPayload, VerifyEmailPayload, ChangePasswordPayload, RequestPasswordResetPayload, ResetPasswordPayload } from '@urbackend/sdk';
+export * from '@urbackend/sdk';
+
+interface UrContextValue {
+ client: UrBackendClient | null;
+ auth: AuthModule | null;
+ db: DatabaseModule | null;
+ storage: StorageModule | null;
+ user: AuthUser | null;
+ setUser: React.Dispatch>;
+ isInitializing: boolean;
+ isLoading: boolean;
+ setIsLoading: React.Dispatch>;
+ error: string | null;
+ setError: React.Dispatch>;
+}
+interface UrProviderProps {
+ apiKey: string;
+ baseUrl?: string;
+ children: React.ReactNode;
+}
+declare const UrProvider: React.FC;
+declare const useUrContext: () => UrContextValue;
+
+declare const useAuth: () => {
+ user: _urbackend_sdk.AuthUser | null;
+ isInitializing: boolean;
+ isLoading: boolean;
+ error: string | null;
+ isAuthenticated: boolean;
+ login: (payload: LoginPayload) => Promise;
+ signUp: (payload: SignUpPayload) => Promise<_urbackend_sdk.AuthUser>;
+ logout: () => Promise;
+ socialLogin: (provider: "google" | "github") => void;
+ verifyEmail: (payload: VerifyEmailPayload) => Promise<{
+ message: string;
+ }>;
+ changePassword: (payload: ChangePasswordPayload) => Promise<{
+ message: string;
+ }>;
+ requestPasswordReset: (payload: RequestPasswordResetPayload) => Promise<{
+ message: string;
+ }>;
+ resetPassword: (payload: ResetPasswordPayload) => Promise<{
+ message: string;
+ }>;
+ clearError: () => void;
+ authApi: _urbackend_sdk.AuthModule;
+};
+declare const useDb: () => _urbackend_sdk.DatabaseModule;
+declare const useStorage: () => _urbackend_sdk.StorageModule;
+
+interface UrAuthProps {
+ providers?: ('google' | 'github' | 'apple')[];
+ theme?: 'light' | 'dark';
+ onSuccess?: () => void;
+}
+declare const UrAuth: React.FC;
+
+export { UrAuth, type UrAuthProps, UrProvider, type UrProviderProps, useAuth, useDb, useStorage, useUrContext };
diff --git a/sdks/urbackend-react/dist/index.js b/sdks/urbackend-react/dist/index.js
new file mode 100644
index 000000000..e33ecb5fa
--- /dev/null
+++ b/sdks/urbackend-react/dist/index.js
@@ -0,0 +1,706 @@
+"use strict";
+var __defProp = Object.defineProperty;
+var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+var __getOwnPropNames = Object.getOwnPropertyNames;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __export = (target, all) => {
+ for (var name in all)
+ __defProp(target, name, { get: all[name], enumerable: true });
+};
+var __copyProps = (to, from, except, desc) => {
+ if (from && typeof from === "object" || typeof from === "function") {
+ for (let key of __getOwnPropNames(from))
+ if (!__hasOwnProp.call(to, key) && key !== except)
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
+ }
+ return to;
+};
+var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
+var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
+
+// src/index.ts
+var index_exports = {};
+__export(index_exports, {
+ UrAuth: () => UrAuth,
+ UrProvider: () => UrProvider,
+ useAuth: () => useAuth,
+ useDb: () => useDb,
+ useStorage: () => useStorage,
+ useUrContext: () => useUrContext
+});
+module.exports = __toCommonJS(index_exports);
+
+// src/context.tsx
+var import_react = require("react");
+var import_sdk = require("@urbackend/sdk");
+var import_jsx_runtime = require("react/jsx-runtime");
+var UrContext = (0, import_react.createContext)(void 0);
+var UrProvider = ({ apiKey, baseUrl, children }) => {
+ const [user, setUser] = (0, import_react.useState)(null);
+ const [isInitializing, setIsInitializing] = (0, import_react.useState)(true);
+ const [isLoading, setIsLoading] = (0, import_react.useState)(false);
+ const [error, setError] = (0, import_react.useState)(null);
+ const { client, auth, db, storage } = (0, import_react.useMemo)(() => {
+ const _client = new import_sdk.UrBackendClient({ apiKey, baseUrl });
+ return {
+ client: _client,
+ auth: new import_sdk.AuthModule(_client),
+ db: new import_sdk.DatabaseModule(_client),
+ storage: new import_sdk.StorageModule(_client)
+ };
+ }, [apiKey, baseUrl]);
+ (0, import_react.useEffect)(() => {
+ let mounted = true;
+ const initAuth = async () => {
+ try {
+ const urlParams = new URLSearchParams(window.location.search);
+ const hashParams = new URLSearchParams(window.location.hash.substring(1));
+ const token = hashParams.get("token");
+ const error2 = urlParams.get("error");
+ if (error2) {
+ console.error("Social Auth Error:", error2);
+ if (mounted) setError(error2);
+ window.history.replaceState({}, document.title, window.location.pathname);
+ } else if (token) {
+ auth.setToken(token);
+ window.history.replaceState({}, document.title, window.location.pathname);
+ } else {
+ try {
+ await auth.refreshToken();
+ } catch (e) {
+ }
+ }
+ const currentUser = await auth.me();
+ if (mounted) {
+ setUser(currentUser);
+ }
+ } catch (error2) {
+ if (mounted) {
+ setUser(null);
+ }
+ } finally {
+ if (mounted) {
+ setIsInitializing(false);
+ }
+ }
+ };
+ initAuth();
+ return () => {
+ mounted = false;
+ };
+ }, [auth]);
+ const value = {
+ client,
+ auth,
+ db,
+ storage,
+ user,
+ setUser,
+ isInitializing,
+ isLoading,
+ setIsLoading,
+ error,
+ setError
+ };
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(UrContext.Provider, { value, children });
+};
+var useUrContext = () => {
+ const context = (0, import_react.useContext)(UrContext);
+ if (!context) {
+ throw new Error("useUrContext must be used within an UrProvider");
+ }
+ return context;
+};
+
+// src/hooks.ts
+var import_react2 = require("react");
+var useAuth = () => {
+ const { auth, user, setUser, isInitializing, isLoading, setIsLoading, error, setError } = useUrContext();
+ if (!auth) {
+ throw new Error("Auth module not initialized. Make sure you are inside UrProvider.");
+ }
+ const login = (0, import_react2.useCallback)(async (payload) => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ await auth.login(payload);
+ const currentUser = await auth.me();
+ setUser(currentUser);
+ } catch (err) {
+ setError(err.message || "Login failed");
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setUser, setIsLoading, setError]);
+ const signUp = (0, import_react2.useCallback)(async (payload) => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ const newUser = await auth.signUp(payload);
+ return newUser;
+ } catch (err) {
+ setError(err.message || "Sign up failed");
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setIsLoading, setError]);
+ const logout = (0, import_react2.useCallback)(async () => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ await auth.logout();
+ setUser(null);
+ } catch (err) {
+ setError(err.message || "Logout failed");
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setUser, setIsLoading, setError]);
+ const socialLogin = (0, import_react2.useCallback)((provider) => {
+ setError(null);
+ const url = auth.socialStart(provider);
+ window.location.href = url;
+ }, [auth, setError]);
+ const verifyEmail = (0, import_react2.useCallback)(async (payload) => {
+ try {
+ setError(null);
+ return await auth.verifyEmail(payload);
+ } catch (err) {
+ setError(err.message || "Email verification failed");
+ throw err;
+ }
+ }, [auth, setError]);
+ const changePassword = (0, import_react2.useCallback)(async (payload) => {
+ try {
+ setError(null);
+ return await auth.changePassword(payload);
+ } catch (err) {
+ setError(err.message || "Failed to change password");
+ throw err;
+ }
+ }, [auth, setError]);
+ const requestPasswordReset = (0, import_react2.useCallback)(async (payload) => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ return await auth.requestPasswordReset(payload);
+ } catch (err) {
+ setError(err.message || "Failed to request password reset");
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setError, setIsLoading]);
+ const resetPassword = (0, import_react2.useCallback)(async (payload) => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ return await auth.resetPassword(payload);
+ } catch (err) {
+ setError(err.message || "Failed to reset password");
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setError, setIsLoading]);
+ const clearError = (0, import_react2.useCallback)(() => setError(null), [setError]);
+ return {
+ user,
+ isInitializing,
+ isLoading,
+ error,
+ isAuthenticated: !!user,
+ login,
+ signUp,
+ logout,
+ socialLogin,
+ verifyEmail,
+ changePassword,
+ requestPasswordReset,
+ resetPassword,
+ clearError,
+ authApi: auth
+ // Escape hatch to underlying SDK
+ };
+};
+var useDb = () => {
+ const { db } = useUrContext();
+ if (!db) {
+ throw new Error("Database module not initialized.");
+ }
+ return db;
+};
+var useStorage = () => {
+ const { storage } = useUrContext();
+ if (!storage) {
+ throw new Error("Storage module not initialized.");
+ }
+ return storage;
+};
+
+// src/components/UrAuth.tsx
+var import_react4 = require("react");
+
+// src/components/Toast.tsx
+var import_react3 = require("react");
+var import_jsx_runtime2 = require("react/jsx-runtime");
+var Toast = ({ message, type, onClose, isDark = false }) => {
+ const [isVisible, setIsVisible] = (0, import_react3.useState)(false);
+ const [isLeaving, setIsLeaving] = (0, import_react3.useState)(false);
+ (0, import_react3.useEffect)(() => {
+ requestAnimationFrame(() => {
+ setIsVisible(true);
+ });
+ const timer = setTimeout(() => {
+ setIsLeaving(true);
+ setTimeout(onClose, 300);
+ }, 4e3);
+ return () => clearTimeout(timer);
+ }, [onClose]);
+ const bgColor = isDark ? "rgba(30, 30, 30, 0.9)" : "rgba(255, 255, 255, 0.9)";
+ const borderColor = type === "success" ? "rgba(34, 197, 94, 0.5)" : "rgba(239, 68, 68, 0.5)";
+ const iconColor = type === "success" ? "#22c55e" : "#ef4444";
+ const textColor = isDark ? "#fff" : "#000";
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("style", { children: `
+ @keyframes slideIn {
+ from { transform: translateY(-20px) scale(0.95); opacity: 0; }
+ to { transform: translateY(0) scale(1); opacity: 1; }
+ }
+ @keyframes slideOut {
+ from { transform: translateY(0) scale(1); opacity: 1; }
+ to { transform: translateY(-20px) scale(0.95); opacity: 0; }
+ }
+ ` }),
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
+ "div",
+ {
+ style: {
+ position: "fixed",
+ top: "24px",
+ left: "50%",
+ transform: "translateX(-50%)",
+ zIndex: 9999,
+ display: "flex",
+ alignItems: "center",
+ gap: "12px",
+ padding: "12px 20px",
+ borderRadius: "12px",
+ background: bgColor,
+ backdropFilter: "blur(16px)",
+ WebkitBackdropFilter: "blur(16px)",
+ border: `1px solid ${borderColor}`,
+ boxShadow: "0 8px 32px rgba(0,0,0,0.12)",
+ color: textColor,
+ fontFamily: "system-ui, -apple-system, sans-serif",
+ fontSize: "14px",
+ fontWeight: 500,
+ animation: isLeaving ? "slideOut 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards" : "slideIn 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards"
+ },
+ children: [
+ type === "success" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: iconColor, strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("path", { d: "M22 11.08V12a10 10 0 1 1-5.93-9.14" }),
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("polyline", { points: "22 4 12 14.01 9 11.01" })
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: iconColor, strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
+ ] }),
+ message
+ ]
+ }
+ )
+ ] });
+};
+
+// src/components/UrAuth.tsx
+var import_jsx_runtime3 = require("react/jsx-runtime");
+var UrAuth = ({
+ providers = ["google", "apple", "github"],
+ theme = "light",
+ onSuccess
+}) => {
+ const { login, signUp, socialLogin, requestPasswordReset, resetPassword, isLoading, error, clearError } = useAuth();
+ const [mode, setMode] = (0, import_react4.useState)("signin");
+ const [email, setEmail] = (0, import_react4.useState)("");
+ const [password, setPassword] = (0, import_react4.useState)("");
+ const [otp, setOtp] = (0, import_react4.useState)("");
+ const [name, setName] = (0, import_react4.useState)("");
+ const [toast, setToast] = (0, import_react4.useState)(null);
+ (0, import_react4.useEffect)(() => {
+ if (error) {
+ setToast({ message: error, type: "error" });
+ }
+ }, [error]);
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ try {
+ if (mode === "signin") {
+ await login({ email, password });
+ setToast({ message: "Welcome back!", type: "success" });
+ if (onSuccess) onSuccess();
+ } else if (mode === "signup") {
+ await signUp({ email, password, name });
+ await login({ email, password });
+ setToast({ message: "Account created successfully!", type: "success" });
+ if (onSuccess) onSuccess();
+ } else if (mode === "forgot") {
+ await requestPasswordReset({ email });
+ setToast({ message: "Reset code sent to your email", type: "success" });
+ setMode("reset");
+ } else if (mode === "reset") {
+ await resetPassword({ email, otp, newPassword: password });
+ setToast({ message: "Password reset successfully", type: "success" });
+ setMode("signin");
+ setPassword("");
+ setOtp("");
+ }
+ } catch (err) {
+ }
+ };
+ const isDark = theme === "dark";
+ const bg = isDark ? "#1a1a1a" : "#ffffff";
+ const text = isDark ? "#ffffff" : "#0f172a";
+ const textMuted = isDark ? "#a1a1aa" : "#64748b";
+ const border = isDark ? "#333" : "#e2e8f0";
+ const inputBg = isDark ? "#2a2a2a" : "#ffffff";
+ const styles = {
+ wrapper: {
+ width: "100%",
+ maxWidth: "420px",
+ margin: "0 auto",
+ borderRadius: "24px",
+ background: bg,
+ boxShadow: isDark ? "0 20px 40px rgba(0,0,0,0.5)" : "0 20px 40px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.05)",
+ border: `1px solid ${border}`,
+ overflow: "hidden",
+ fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
+ color: text
+ },
+ body: {
+ padding: "32px 32px 24px 32px"
+ },
+ switcherContainer: {
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ marginBottom: "32px"
+ },
+ switcher: {
+ display: "inline-flex",
+ background: isDark ? "#2a2a2a" : "#f1f5f9",
+ padding: "4px",
+ borderRadius: "100px"
+ },
+ switchBtn: (active) => ({
+ display: "flex",
+ alignItems: "center",
+ gap: "6px",
+ padding: "8px 20px",
+ borderRadius: "100px",
+ fontSize: "13px",
+ fontWeight: 600,
+ cursor: "pointer",
+ color: active ? text : textMuted,
+ background: active ? isDark ? "#444" : "#ffffff" : "transparent",
+ boxShadow: active ? isDark ? "0 2px 4px rgba(0,0,0,0.2)" : "0 2px 8px rgba(0,0,0,0.05)" : "none",
+ border: "none",
+ transition: "all 0.2s ease"
+ }),
+ field: {
+ marginBottom: "20px"
+ },
+ labelRow: {
+ display: "flex",
+ justifyContent: "space-between",
+ alignItems: "center",
+ marginBottom: "8px"
+ },
+ label: {
+ fontSize: "13px",
+ fontWeight: 600,
+ color: isDark ? "#ddd" : "#334155"
+ },
+ forgotLink: {
+ fontSize: "12px",
+ fontWeight: 600,
+ color: text,
+ cursor: "pointer",
+ textDecoration: "none"
+ },
+ input: {
+ width: "100%",
+ padding: "12px 16px",
+ borderRadius: "12px",
+ border: `1px solid ${border}`,
+ background: inputBg,
+ color: text,
+ fontSize: "14px",
+ boxSizing: "border-box",
+ outline: "none",
+ transition: "border-color 0.2s ease"
+ },
+ primaryBtn: {
+ width: "100%",
+ padding: "14px",
+ borderRadius: "12px",
+ background: "linear-gradient(180deg, #2a2a2a 0%, #111111 100%)",
+ color: "#ffffff",
+ fontSize: "15px",
+ fontWeight: 600,
+ border: "none",
+ boxShadow: "0 4px 12px rgba(0,0,0,0.15)",
+ cursor: "pointer",
+ marginTop: "8px",
+ transition: "transform 0.1s ease"
+ },
+ divider: {
+ display: "flex",
+ alignItems: "center",
+ margin: "24px 0",
+ color: "#94a3b8",
+ fontSize: "11px",
+ fontWeight: 600,
+ letterSpacing: "1px"
+ },
+ dividerLine: {
+ flex: 1,
+ height: "1px",
+ background: border
+ },
+ dividerText: {
+ padding: "0 12px"
+ },
+ socialBtn: {
+ width: "100%",
+ padding: "12px",
+ borderRadius: "12px",
+ border: `1px solid ${border}`,
+ background: isDark ? "#2a2a2a" : "#ffffff",
+ color: text,
+ fontSize: "14px",
+ fontWeight: 600,
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ gap: "10px",
+ marginBottom: "12px",
+ cursor: "pointer",
+ boxShadow: isDark ? "none" : "0 1px 2px rgba(0,0,0,0.02)",
+ transition: "background 0.2s ease"
+ },
+ footer: {
+ background: isDark ? "#222" : "#f8fafc",
+ padding: "24px",
+ textAlign: "center",
+ borderTop: `1px solid ${border}`,
+ fontSize: "13px",
+ color: textMuted
+ },
+ footerLink: {
+ color: text,
+ fontWeight: 600,
+ textDecoration: "underline",
+ cursor: "pointer",
+ marginLeft: "4px"
+ }
+ };
+ const GoogleIcon = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z", fill: "#4285F4" }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z", fill: "#34A853" }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z", fill: "#FBBC05" }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z", fill: "#EA4335" })
+ ] });
+ const AppleIcon = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: isDark ? "#fff" : "#000", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M17.05 13.9c-.02-3.16 2.59-4.68 2.71-4.75-1.47-2.14-3.75-2.44-4.57-2.47-1.93-.19-3.78 1.14-4.76 1.14-1.01 0-2.54-1.1-4.14-1.07-2.07.03-3.98 1.2-5.06 3.08-2.16 3.76-.55 9.3 1.57 12.35 1.03 1.49 2.22 3.16 3.84 3.1 1.56-.06 2.14-1 4.02-1 1.85 0 2.39 1 4.02.97 1.67-.03 2.7-1.52 3.72-3.02 1.18-1.72 1.67-3.39 1.69-3.48-.04-.02-3.02-1.16-3.04-4.85zM14.9 5.25c.86-1.04 1.44-2.5 1.28-3.95-1.25.05-2.8.83-3.69 1.9-.79.95-1.45 2.44-1.26 3.86 1.4.11 2.81-.76 3.67-1.81z" }) });
+ const GithubIcon = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: isDark ? "#fff" : "#000", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" }) });
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: styles.wrapper, children: [
+ toast && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
+ Toast,
+ {
+ message: toast.message,
+ type: toast.type,
+ isDark,
+ onClose: () => {
+ setToast(null);
+ if (toast.type === "error") clearError();
+ }
+ }
+ ),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: styles.body, children: [
+ (mode === "signin" || mode === "signup") && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: styles.switcherContainer, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: styles.switcher, children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
+ "button",
+ {
+ type: "button",
+ style: styles.switchBtn(mode === "signin"),
+ onClick: () => {
+ setMode("signin");
+ clearError();
+ },
+ children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4" }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("polyline", { points: "10 17 15 12 10 7" }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "15", y1: "12", x2: "3", y2: "12" })
+ ] }),
+ "Login"
+ ]
+ }
+ ),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
+ "button",
+ {
+ type: "button",
+ style: styles.switchBtn(mode === "signup"),
+ onClick: () => {
+ setMode("signup");
+ clearError();
+ },
+ children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "9", cy: "7", r: "4" }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "19", y1: "8", x2: "19", y2: "14" }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "22", y1: "11", x2: "16", y2: "11" })
+ ] }),
+ "Sign Up"
+ ]
+ }
+ )
+ ] }) }),
+ (mode === "forgot" || mode === "reset") && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { marginBottom: "24px", textAlign: "center" }, children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h2", { style: { margin: "0 0 8px", fontSize: "20px", fontWeight: 700, color: text }, children: mode === "forgot" ? "Reset Password" : "Enter Reset Code" }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { style: { margin: 0, fontSize: "14px", color: textMuted }, children: mode === "forgot" ? "Enter your email and we'll send a code" : `Enter the code sent to ${email}` })
+ ] }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("form", { onSubmit: handleSubmit, children: [
+ mode === "signup" && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: styles.field, children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: styles.labelRow, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("label", { style: styles.label, children: "Full Name" }) }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
+ "input",
+ {
+ style: styles.input,
+ type: "text",
+ placeholder: "Enter your name",
+ value: name,
+ onChange: (e) => setName(e.target.value),
+ required: true
+ }
+ )
+ ] }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: styles.field, children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: styles.labelRow, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("label", { style: styles.label, children: "Email address" }) }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
+ "input",
+ {
+ style: styles.input,
+ type: "email",
+ placeholder: "Enter your email address",
+ value: email,
+ onChange: (e) => setEmail(e.target.value),
+ required: true,
+ readOnly: mode === "reset"
+ }
+ )
+ ] }),
+ mode === "reset" && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: styles.field, children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: styles.labelRow, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("label", { style: styles.label, children: "6-digit OTP Code" }) }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
+ "input",
+ {
+ style: styles.input,
+ type: "text",
+ placeholder: "Enter reset code",
+ value: otp,
+ onChange: (e) => setOtp(e.target.value),
+ required: true
+ }
+ )
+ ] }),
+ (mode === "signin" || mode === "signup" || mode === "reset") && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: styles.field, children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: styles.labelRow, children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("label", { style: styles.label, children: mode === "reset" ? "New Password" : "Password" }),
+ mode === "signin" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: styles.forgotLink, onClick: () => {
+ setMode("forgot");
+ clearError();
+ }, children: "Forgot password?" })
+ ] }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
+ "input",
+ {
+ style: styles.input,
+ type: "password",
+ placeholder: mode === "reset" ? "Enter new password" : "Enter your password",
+ value: password,
+ onChange: (e) => setPassword(e.target.value),
+ required: true
+ }
+ )
+ ] }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
+ "button",
+ {
+ style: styles.primaryBtn,
+ type: "submit",
+ disabled: isLoading,
+ onMouseDown: (e) => e.currentTarget.style.transform = "scale(0.98)",
+ onMouseUp: (e) => e.currentTarget.style.transform = "scale(1)",
+ onMouseLeave: (e) => e.currentTarget.style.transform = "scale(1)",
+ children: isLoading ? "Processing..." : mode === "signin" ? "Log In" : mode === "signup" ? "Create Account" : mode === "forgot" ? "Send Reset Code" : "Reset Password"
+ }
+ )
+ ] }),
+ (mode === "signin" || mode === "signup") && providers && providers.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: styles.divider, children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: styles.dividerLine }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: styles.dividerText, children: "OR" }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: styles.dividerLine })
+ ] }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
+ providers.includes("google") && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("button", { style: styles.socialBtn, onClick: () => socialLogin("google"), type: "button", children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(GoogleIcon, {}),
+ "Continue with Google"
+ ] }),
+ providers.includes("apple") && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("button", { style: styles.socialBtn, onClick: () => alert("Apple login not implemented in demo"), type: "button", children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(AppleIcon, {}),
+ "Continue with Apple"
+ ] }),
+ providers.includes("github") && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("button", { style: styles.socialBtn, onClick: () => socialLogin("github"), type: "button", children: [
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(GithubIcon, {}),
+ "Continue with GitHub"
+ ] })
+ ] })
+ ] })
+ ] }),
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: styles.footer, children: [
+ mode === "signin" ? "Don't have an account yet?" : mode === "signup" ? "Already have an account?" : "Remember your password?",
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
+ "span",
+ {
+ style: styles.footerLink,
+ onClick: () => {
+ setMode(mode === "signin" ? "signup" : "signin");
+ clearError();
+ },
+ children: mode === "signin" ? "Sign up" : "Log in"
+ }
+ )
+ ] })
+ ] });
+};
+
+// src/index.ts
+__reExport(index_exports, require("@urbackend/sdk"), module.exports);
+// Annotate the CommonJS export names for ESM import in node:
+0 && (module.exports = {
+ UrAuth,
+ UrProvider,
+ useAuth,
+ useDb,
+ useStorage,
+ useUrContext,
+ ...require("@urbackend/sdk")
+});
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/sdks/urbackend-react/dist/index.js.map b/sdks/urbackend-react/dist/index.js.map
new file mode 100644
index 000000000..677e16545
--- /dev/null
+++ b/sdks/urbackend-react/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/index.ts","../src/context.tsx","../src/hooks.ts","../src/components/UrAuth.tsx","../src/components/Toast.tsx"],"sourcesContent":["export { UrProvider, useUrContext } from './context';\nexport type { UrProviderProps } from './context';\n\nexport { useAuth, useDb, useStorage } from './hooks';\nexport { UrAuth } from './components/UrAuth';\nexport type { UrAuthProps } from './components/UrAuth';\n\nexport * from '@urbackend/sdk'; // re-export types so users don't need to import from sdk directly\n","import React, { createContext, useContext, useEffect, useState, useMemo } from 'react';\nimport { UrBackendClient, AuthModule, DatabaseModule, StorageModule } from '@urbackend/sdk';\nimport type { AuthUser } from '@urbackend/sdk';\n\ninterface UrContextValue {\n client: UrBackendClient | null;\n auth: AuthModule | null;\n db: DatabaseModule | null;\n storage: StorageModule | null;\n user: AuthUser | null;\n setUser: React.Dispatch>;\n isInitializing: boolean;\n isLoading: boolean;\n setIsLoading: React.Dispatch>;\n error: string | null;\n setError: React.Dispatch>;\n}\n\nconst UrContext = createContext(undefined);\n\nexport interface UrProviderProps {\n apiKey: string;\n baseUrl?: string;\n children: React.ReactNode;\n}\n\nexport const UrProvider: React.FC = ({ apiKey, baseUrl, children }) => {\n const [user, setUser] = useState(null);\n const [isInitializing, setIsInitializing] = useState(true);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState(null);\n\n const { client, auth, db, storage } = useMemo(() => {\n const _client = new UrBackendClient({ apiKey, baseUrl });\n return {\n client: _client,\n auth: new AuthModule(_client),\n db: new DatabaseModule(_client),\n storage: new StorageModule(_client),\n };\n }, [apiKey, baseUrl]);\n\n useEffect(() => {\n let mounted = true;\n\n const initAuth = async () => {\n try {\n // Check for social auth callback params\n const urlParams = new URLSearchParams(window.location.search);\n const hashParams = new URLSearchParams(window.location.hash.substring(1));\n const token = hashParams.get('token');\n const error = urlParams.get('error');\n\n if (error) {\n console.error('Social Auth Error:', error);\n if (mounted) setError(error);\n window.history.replaceState({}, document.title, window.location.pathname);\n } else if (token) {\n // Social auth succeeded, establish session immediately\n auth.setToken(token);\n window.history.replaceState({}, document.title, window.location.pathname);\n } else {\n // Attempt to silently refresh session using the HTTP-only cookie\n try {\n await auth.refreshToken();\n } catch (e) {\n // If refresh fails, me() will catch it\n }\n }\n \n const currentUser = await auth.me();\n if (mounted) {\n setUser(currentUser);\n }\n } catch (error: any) {\n if (mounted) {\n setUser(null);\n // Don't set global error for initial me() check failure (usually just means not logged in)\n }\n } finally {\n if (mounted) {\n setIsInitializing(false);\n }\n }\n };\n\n initAuth();\n\n return () => {\n mounted = false;\n };\n }, [auth]);\n\n const value: UrContextValue = {\n client,\n auth,\n db,\n storage,\n user,\n setUser,\n isInitializing,\n isLoading,\n setIsLoading,\n error,\n setError,\n };\n\n return {children};\n};\n\nexport const useUrContext = () => {\n const context = useContext(UrContext);\n if (!context) {\n throw new Error('useUrContext must be used within an UrProvider');\n }\n return context;\n};\n","import { useCallback } from 'react';\nimport { useUrContext } from './context';\nimport type { \n LoginPayload, \n SignUpPayload, \n ChangePasswordPayload,\n VerifyEmailPayload,\n RequestPasswordResetPayload,\n ResetPasswordPayload\n} from '@urbackend/sdk';\n\nexport const useAuth = () => {\n const { auth, user, setUser, isInitializing, isLoading, setIsLoading, error, setError } = useUrContext();\n\n if (!auth) {\n throw new Error('Auth module not initialized. Make sure you are inside UrProvider.');\n }\n\n const login = useCallback(async (payload: LoginPayload) => {\n try {\n setError(null);\n setIsLoading(true);\n await auth.login(payload);\n const currentUser = await auth.me();\n setUser(currentUser);\n } catch (err: any) {\n setError(err.message || 'Login failed');\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [auth, setUser, setIsLoading, setError]);\n\n const signUp = useCallback(async (payload: SignUpPayload) => {\n try {\n setError(null);\n setIsLoading(true);\n const newUser = await auth.signUp(payload);\n return newUser;\n } catch (err: any) {\n setError(err.message || 'Sign up failed');\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [auth, setIsLoading, setError]);\n\n const logout = useCallback(async () => {\n try {\n setError(null);\n setIsLoading(true);\n await auth.logout();\n setUser(null);\n } catch (err: any) {\n setError(err.message || 'Logout failed');\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [auth, setUser, setIsLoading, setError]);\n\n const socialLogin = useCallback((provider: 'google' | 'github') => {\n setError(null);\n const url = auth.socialStart(provider);\n window.location.href = url;\n }, [auth, setError]);\n \n const verifyEmail = useCallback(async (payload: VerifyEmailPayload) => {\n try {\n setError(null);\n return await auth.verifyEmail(payload);\n } catch (err: any) {\n setError(err.message || 'Email verification failed');\n throw err;\n }\n }, [auth, setError]);\n\n const changePassword = useCallback(async (payload: ChangePasswordPayload) => {\n try {\n setError(null);\n return await auth.changePassword(payload);\n } catch (err: any) {\n setError(err.message || 'Failed to change password');\n throw err;\n }\n }, [auth, setError]);\n\n const requestPasswordReset = useCallback(async (payload: RequestPasswordResetPayload) => {\n try {\n setError(null);\n setIsLoading(true);\n return await auth.requestPasswordReset(payload);\n } catch (err: any) {\n setError(err.message || 'Failed to request password reset');\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [auth, setError, setIsLoading]);\n\n const resetPassword = useCallback(async (payload: ResetPasswordPayload) => {\n try {\n setError(null);\n setIsLoading(true);\n return await auth.resetPassword(payload);\n } catch (err: any) {\n setError(err.message || 'Failed to reset password');\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [auth, setError, setIsLoading]);\n\n const clearError = useCallback(() => setError(null), [setError]);\n\n return {\n user,\n isInitializing,\n isLoading,\n error,\n isAuthenticated: !!user,\n login,\n signUp,\n logout,\n socialLogin,\n verifyEmail,\n changePassword,\n requestPasswordReset,\n resetPassword,\n clearError,\n authApi: auth // Escape hatch to underlying SDK\n };\n};\n\nexport const useDb = () => {\n const { db } = useUrContext();\n if (!db) {\n throw new Error('Database module not initialized.');\n }\n return db;\n};\n\nexport const useStorage = () => {\n const { storage } = useUrContext();\n if (!storage) {\n throw new Error('Storage module not initialized.');\n }\n return storage;\n};\n","import React, { useState, useEffect } from 'react';\nimport { useAuth } from '../hooks';\nimport { Toast } from './Toast';\n\nexport interface UrAuthProps {\n providers?: ('google' | 'github' | 'apple')[];\n theme?: 'light' | 'dark'; // Dark mode not perfectly matched to image, but kept for API compat\n onSuccess?: () => void;\n}\n\nexport const UrAuth: React.FC = ({ \n providers = ['google', 'apple', 'github'], \n theme = 'light',\n onSuccess\n}) => {\n const { login, signUp, socialLogin, requestPasswordReset, resetPassword, isLoading, error, clearError } = useAuth();\n const [mode, setMode] = useState<'signin' | 'signup' | 'forgot' | 'reset'>('signin');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [otp, setOtp] = useState('');\n const [name, setName] = useState('');\n const [toast, setToast] = useState<{message: string, type: 'success' | 'error'} | null>(null);\n\n useEffect(() => {\n if (error) {\n setToast({ message: error, type: 'error' });\n }\n }, [error]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n try {\n if (mode === 'signin') {\n await login({ email, password });\n setToast({ message: 'Welcome back!', type: 'success' });\n if (onSuccess) onSuccess();\n } else if (mode === 'signup') {\n await signUp({ email, password, name });\n // Auto-login after signup for convenience\n await login({ email, password });\n setToast({ message: 'Account created successfully!', type: 'success' });\n if (onSuccess) onSuccess();\n } else if (mode === 'forgot') {\n await requestPasswordReset({ email });\n setToast({ message: 'Reset code sent to your email', type: 'success' });\n setMode('reset');\n } else if (mode === 'reset') {\n await resetPassword({ email, otp, newPassword: password });\n setToast({ message: 'Password reset successfully', type: 'success' });\n setMode('signin');\n setPassword('');\n setOtp('');\n }\n } catch (err: any) {\n // Error is now handled and stored globally by useAuth hook, which triggers the useEffect toast\n }\n };\n\n const isDark = theme === 'dark';\n const bg = isDark ? '#1a1a1a' : '#ffffff';\n const text = isDark ? '#ffffff' : '#0f172a';\n const textMuted = isDark ? '#a1a1aa' : '#64748b';\n const border = isDark ? '#333' : '#e2e8f0';\n const inputBg = isDark ? '#2a2a2a' : '#ffffff';\n \n const styles = {\n wrapper: {\n width: '100%',\n maxWidth: '420px',\n margin: '0 auto',\n borderRadius: '24px',\n background: bg,\n boxShadow: isDark ? '0 20px 40px rgba(0,0,0,0.5)' : '0 20px 40px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.05)',\n border: `1px solid ${border}`,\n overflow: 'hidden',\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n color: text,\n },\n body: {\n padding: '32px 32px 24px 32px',\n },\n switcherContainer: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: '32px'\n },\n switcher: {\n display: 'inline-flex',\n background: isDark ? '#2a2a2a' : '#f1f5f9',\n padding: '4px',\n borderRadius: '100px',\n },\n switchBtn: (active: boolean) => ({\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '8px 20px',\n borderRadius: '100px',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer',\n color: active ? text : textMuted,\n background: active ? (isDark ? '#444' : '#ffffff') : 'transparent',\n boxShadow: active ? (isDark ? '0 2px 4px rgba(0,0,0,0.2)' : '0 2px 8px rgba(0,0,0,0.05)') : 'none',\n border: 'none',\n transition: 'all 0.2s ease',\n }),\n field: {\n marginBottom: '20px',\n },\n labelRow: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: '8px',\n },\n label: {\n fontSize: '13px',\n fontWeight: 600,\n color: isDark ? '#ddd' : '#334155',\n },\n forgotLink: {\n fontSize: '12px',\n fontWeight: 600,\n color: text,\n cursor: 'pointer',\n textDecoration: 'none',\n },\n input: {\n width: '100%',\n padding: '12px 16px',\n borderRadius: '12px',\n border: `1px solid ${border}`,\n background: inputBg,\n color: text,\n fontSize: '14px',\n boxSizing: 'border-box' as const,\n outline: 'none',\n transition: 'border-color 0.2s ease',\n },\n primaryBtn: {\n width: '100%',\n padding: '14px',\n borderRadius: '12px',\n background: 'linear-gradient(180deg, #2a2a2a 0%, #111111 100%)',\n color: '#ffffff',\n fontSize: '15px',\n fontWeight: 600,\n border: 'none',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n cursor: 'pointer',\n marginTop: '8px',\n transition: 'transform 0.1s ease',\n },\n divider: {\n display: 'flex',\n alignItems: 'center',\n margin: '24px 0',\n color: '#94a3b8',\n fontSize: '11px',\n fontWeight: 600,\n letterSpacing: '1px',\n },\n dividerLine: {\n flex: 1,\n height: '1px',\n background: border,\n },\n dividerText: {\n padding: '0 12px',\n },\n socialBtn: {\n width: '100%',\n padding: '12px',\n borderRadius: '12px',\n border: `1px solid ${border}`,\n background: isDark ? '#2a2a2a' : '#ffffff',\n color: text,\n fontSize: '14px',\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '10px',\n marginBottom: '12px',\n cursor: 'pointer',\n boxShadow: isDark ? 'none' : '0 1px 2px rgba(0,0,0,0.02)',\n transition: 'background 0.2s ease',\n },\n footer: {\n background: isDark ? '#222' : '#f8fafc',\n padding: '24px',\n textAlign: 'center' as const,\n borderTop: `1px solid ${border}`,\n fontSize: '13px',\n color: textMuted,\n },\n footerLink: {\n color: text,\n fontWeight: 600,\n textDecoration: 'underline',\n cursor: 'pointer',\n marginLeft: '4px',\n }\n };\n\n const GoogleIcon = () => (\n \n );\n\n const AppleIcon = () => (\n \n );\n\n const GithubIcon = () => (\n \n );\n\n return (\n \n {toast && (\n
{\n setToast(null);\n if (toast.type === 'error') clearError();\n }} \n />\n )}\n \n \n {(mode === 'signin' || mode === 'signup') && (\n
\n
\n
\n
\n
\n
\n )}\n\n {(mode === 'forgot' || mode === 'reset') && (\n
\n
\n {mode === 'forgot' ? 'Reset Password' : 'Enter Reset Code'}\n
\n
\n {mode === 'forgot' ? \"Enter your email and we'll send a code\" : `Enter the code sent to ${email}`}\n
\n
\n )}\n\n
\n\n {(mode === 'signin' || mode === 'signup') && providers && providers.length > 0 && (\n <>\n
\n\n
\n {providers.includes('google') && (\n
\n )}\n {providers.includes('apple') && (\n
\n )}\n {providers.includes('github') && (\n
\n )}\n
\n >\n )}\n
\n\n \n {mode === 'signin' ? \"Don't have an account yet?\" \n : mode === 'signup' ? \"Already have an account?\"\n : \"Remember your password?\"}\n {\n setMode(mode === 'signin' ? 'signup' : 'signin');\n clearError();\n }}\n >\n {mode === 'signin' ? 'Sign up' : 'Log in'}\n \n
\n \n );\n};\n","import React, { useEffect, useState } from 'react';\n\ninterface ToastProps {\n message: string;\n type: 'success' | 'error';\n onClose: () => void;\n isDark?: boolean;\n}\n\nexport const Toast: React.FC = ({ message, type, onClose, isDark = false }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isLeaving, setIsLeaving] = useState(false);\n\n useEffect(() => {\n // Trigger enter animation on mount\n requestAnimationFrame(() => {\n setIsVisible(true);\n });\n\n const timer = setTimeout(() => {\n setIsLeaving(true);\n setTimeout(onClose, 300); // Wait for exit animation\n }, 4000);\n\n return () => clearTimeout(timer);\n }, [onClose]);\n\n const bgColor = isDark ? 'rgba(30, 30, 30, 0.9)' : 'rgba(255, 255, 255, 0.9)';\n const borderColor = type === 'success' ? 'rgba(34, 197, 94, 0.5)' : 'rgba(239, 68, 68, 0.5)';\n const iconColor = type === 'success' ? '#22c55e' : '#ef4444';\n const textColor = isDark ? '#fff' : '#000';\n\n return (\n <>\n \n \n {type === 'success' ? (\n
\n ) : (\n
\n )}\n {message}\n
\n >\n );\n};\n"],"mappings":"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","names":["error","import_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime"]}
\ No newline at end of file
diff --git a/sdks/urbackend-react/dist/index.mjs b/sdks/urbackend-react/dist/index.mjs
new file mode 100644
index 000000000..ee3b3c6c7
--- /dev/null
+++ b/sdks/urbackend-react/dist/index.mjs
@@ -0,0 +1,672 @@
+// src/context.tsx
+import { createContext, useContext, useEffect, useState, useMemo } from "react";
+import { UrBackendClient, AuthModule, DatabaseModule, StorageModule } from "@urbackend/sdk";
+import { jsx } from "react/jsx-runtime";
+var UrContext = createContext(void 0);
+var UrProvider = ({ apiKey, baseUrl, children }) => {
+ const [user, setUser] = useState(null);
+ const [isInitializing, setIsInitializing] = useState(true);
+ const [isLoading, setIsLoading] = useState(false);
+ const [error, setError] = useState(null);
+ const { client, auth, db, storage } = useMemo(() => {
+ const _client = new UrBackendClient({ apiKey, baseUrl });
+ return {
+ client: _client,
+ auth: new AuthModule(_client),
+ db: new DatabaseModule(_client),
+ storage: new StorageModule(_client)
+ };
+ }, [apiKey, baseUrl]);
+ useEffect(() => {
+ let mounted = true;
+ const initAuth = async () => {
+ try {
+ const urlParams = new URLSearchParams(window.location.search);
+ const hashParams = new URLSearchParams(window.location.hash.substring(1));
+ const token = hashParams.get("token");
+ const error2 = urlParams.get("error");
+ if (error2) {
+ console.error("Social Auth Error:", error2);
+ if (mounted) setError(error2);
+ window.history.replaceState({}, document.title, window.location.pathname);
+ } else if (token) {
+ auth.setToken(token);
+ window.history.replaceState({}, document.title, window.location.pathname);
+ } else {
+ try {
+ await auth.refreshToken();
+ } catch (e) {
+ }
+ }
+ const currentUser = await auth.me();
+ if (mounted) {
+ setUser(currentUser);
+ }
+ } catch (error2) {
+ if (mounted) {
+ setUser(null);
+ }
+ } finally {
+ if (mounted) {
+ setIsInitializing(false);
+ }
+ }
+ };
+ initAuth();
+ return () => {
+ mounted = false;
+ };
+ }, [auth]);
+ const value = {
+ client,
+ auth,
+ db,
+ storage,
+ user,
+ setUser,
+ isInitializing,
+ isLoading,
+ setIsLoading,
+ error,
+ setError
+ };
+ return /* @__PURE__ */ jsx(UrContext.Provider, { value, children });
+};
+var useUrContext = () => {
+ const context = useContext(UrContext);
+ if (!context) {
+ throw new Error("useUrContext must be used within an UrProvider");
+ }
+ return context;
+};
+
+// src/hooks.ts
+import { useCallback } from "react";
+var useAuth = () => {
+ const { auth, user, setUser, isInitializing, isLoading, setIsLoading, error, setError } = useUrContext();
+ if (!auth) {
+ throw new Error("Auth module not initialized. Make sure you are inside UrProvider.");
+ }
+ const login = useCallback(async (payload) => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ await auth.login(payload);
+ const currentUser = await auth.me();
+ setUser(currentUser);
+ } catch (err) {
+ setError(err.message || "Login failed");
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setUser, setIsLoading, setError]);
+ const signUp = useCallback(async (payload) => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ const newUser = await auth.signUp(payload);
+ return newUser;
+ } catch (err) {
+ setError(err.message || "Sign up failed");
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setIsLoading, setError]);
+ const logout = useCallback(async () => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ await auth.logout();
+ setUser(null);
+ } catch (err) {
+ setError(err.message || "Logout failed");
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setUser, setIsLoading, setError]);
+ const socialLogin = useCallback((provider) => {
+ setError(null);
+ const url = auth.socialStart(provider);
+ window.location.href = url;
+ }, [auth, setError]);
+ const verifyEmail = useCallback(async (payload) => {
+ try {
+ setError(null);
+ return await auth.verifyEmail(payload);
+ } catch (err) {
+ setError(err.message || "Email verification failed");
+ throw err;
+ }
+ }, [auth, setError]);
+ const changePassword = useCallback(async (payload) => {
+ try {
+ setError(null);
+ return await auth.changePassword(payload);
+ } catch (err) {
+ setError(err.message || "Failed to change password");
+ throw err;
+ }
+ }, [auth, setError]);
+ const requestPasswordReset = useCallback(async (payload) => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ return await auth.requestPasswordReset(payload);
+ } catch (err) {
+ setError(err.message || "Failed to request password reset");
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setError, setIsLoading]);
+ const resetPassword = useCallback(async (payload) => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ return await auth.resetPassword(payload);
+ } catch (err) {
+ setError(err.message || "Failed to reset password");
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setError, setIsLoading]);
+ const clearError = useCallback(() => setError(null), [setError]);
+ return {
+ user,
+ isInitializing,
+ isLoading,
+ error,
+ isAuthenticated: !!user,
+ login,
+ signUp,
+ logout,
+ socialLogin,
+ verifyEmail,
+ changePassword,
+ requestPasswordReset,
+ resetPassword,
+ clearError,
+ authApi: auth
+ // Escape hatch to underlying SDK
+ };
+};
+var useDb = () => {
+ const { db } = useUrContext();
+ if (!db) {
+ throw new Error("Database module not initialized.");
+ }
+ return db;
+};
+var useStorage = () => {
+ const { storage } = useUrContext();
+ if (!storage) {
+ throw new Error("Storage module not initialized.");
+ }
+ return storage;
+};
+
+// src/components/UrAuth.tsx
+import { useState as useState3, useEffect as useEffect3 } from "react";
+
+// src/components/Toast.tsx
+import { useEffect as useEffect2, useState as useState2 } from "react";
+import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
+var Toast = ({ message, type, onClose, isDark = false }) => {
+ const [isVisible, setIsVisible] = useState2(false);
+ const [isLeaving, setIsLeaving] = useState2(false);
+ useEffect2(() => {
+ requestAnimationFrame(() => {
+ setIsVisible(true);
+ });
+ const timer = setTimeout(() => {
+ setIsLeaving(true);
+ setTimeout(onClose, 300);
+ }, 4e3);
+ return () => clearTimeout(timer);
+ }, [onClose]);
+ const bgColor = isDark ? "rgba(30, 30, 30, 0.9)" : "rgba(255, 255, 255, 0.9)";
+ const borderColor = type === "success" ? "rgba(34, 197, 94, 0.5)" : "rgba(239, 68, 68, 0.5)";
+ const iconColor = type === "success" ? "#22c55e" : "#ef4444";
+ const textColor = isDark ? "#fff" : "#000";
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
+ /* @__PURE__ */ jsx2("style", { children: `
+ @keyframes slideIn {
+ from { transform: translateY(-20px) scale(0.95); opacity: 0; }
+ to { transform: translateY(0) scale(1); opacity: 1; }
+ }
+ @keyframes slideOut {
+ from { transform: translateY(0) scale(1); opacity: 1; }
+ to { transform: translateY(-20px) scale(0.95); opacity: 0; }
+ }
+ ` }),
+ /* @__PURE__ */ jsxs(
+ "div",
+ {
+ style: {
+ position: "fixed",
+ top: "24px",
+ left: "50%",
+ transform: "translateX(-50%)",
+ zIndex: 9999,
+ display: "flex",
+ alignItems: "center",
+ gap: "12px",
+ padding: "12px 20px",
+ borderRadius: "12px",
+ background: bgColor,
+ backdropFilter: "blur(16px)",
+ WebkitBackdropFilter: "blur(16px)",
+ border: `1px solid ${borderColor}`,
+ boxShadow: "0 8px 32px rgba(0,0,0,0.12)",
+ color: textColor,
+ fontFamily: "system-ui, -apple-system, sans-serif",
+ fontSize: "14px",
+ fontWeight: 500,
+ animation: isLeaving ? "slideOut 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards" : "slideIn 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards"
+ },
+ children: [
+ type === "success" ? /* @__PURE__ */ jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: iconColor, strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
+ /* @__PURE__ */ jsx2("path", { d: "M22 11.08V12a10 10 0 1 1-5.93-9.14" }),
+ /* @__PURE__ */ jsx2("polyline", { points: "22 4 12 14.01 9 11.01" })
+ ] }) : /* @__PURE__ */ jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: iconColor, strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
+ /* @__PURE__ */ jsx2("circle", { cx: "12", cy: "12", r: "10" }),
+ /* @__PURE__ */ jsx2("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
+ /* @__PURE__ */ jsx2("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
+ ] }),
+ message
+ ]
+ }
+ )
+ ] });
+};
+
+// src/components/UrAuth.tsx
+import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
+var UrAuth = ({
+ providers = ["google", "apple", "github"],
+ theme = "light",
+ onSuccess
+}) => {
+ const { login, signUp, socialLogin, requestPasswordReset, resetPassword, isLoading, error, clearError } = useAuth();
+ const [mode, setMode] = useState3("signin");
+ const [email, setEmail] = useState3("");
+ const [password, setPassword] = useState3("");
+ const [otp, setOtp] = useState3("");
+ const [name, setName] = useState3("");
+ const [toast, setToast] = useState3(null);
+ useEffect3(() => {
+ if (error) {
+ setToast({ message: error, type: "error" });
+ }
+ }, [error]);
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ try {
+ if (mode === "signin") {
+ await login({ email, password });
+ setToast({ message: "Welcome back!", type: "success" });
+ if (onSuccess) onSuccess();
+ } else if (mode === "signup") {
+ await signUp({ email, password, name });
+ await login({ email, password });
+ setToast({ message: "Account created successfully!", type: "success" });
+ if (onSuccess) onSuccess();
+ } else if (mode === "forgot") {
+ await requestPasswordReset({ email });
+ setToast({ message: "Reset code sent to your email", type: "success" });
+ setMode("reset");
+ } else if (mode === "reset") {
+ await resetPassword({ email, otp, newPassword: password });
+ setToast({ message: "Password reset successfully", type: "success" });
+ setMode("signin");
+ setPassword("");
+ setOtp("");
+ }
+ } catch (err) {
+ }
+ };
+ const isDark = theme === "dark";
+ const bg = isDark ? "#1a1a1a" : "#ffffff";
+ const text = isDark ? "#ffffff" : "#0f172a";
+ const textMuted = isDark ? "#a1a1aa" : "#64748b";
+ const border = isDark ? "#333" : "#e2e8f0";
+ const inputBg = isDark ? "#2a2a2a" : "#ffffff";
+ const styles = {
+ wrapper: {
+ width: "100%",
+ maxWidth: "420px",
+ margin: "0 auto",
+ borderRadius: "24px",
+ background: bg,
+ boxShadow: isDark ? "0 20px 40px rgba(0,0,0,0.5)" : "0 20px 40px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.05)",
+ border: `1px solid ${border}`,
+ overflow: "hidden",
+ fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
+ color: text
+ },
+ body: {
+ padding: "32px 32px 24px 32px"
+ },
+ switcherContainer: {
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ marginBottom: "32px"
+ },
+ switcher: {
+ display: "inline-flex",
+ background: isDark ? "#2a2a2a" : "#f1f5f9",
+ padding: "4px",
+ borderRadius: "100px"
+ },
+ switchBtn: (active) => ({
+ display: "flex",
+ alignItems: "center",
+ gap: "6px",
+ padding: "8px 20px",
+ borderRadius: "100px",
+ fontSize: "13px",
+ fontWeight: 600,
+ cursor: "pointer",
+ color: active ? text : textMuted,
+ background: active ? isDark ? "#444" : "#ffffff" : "transparent",
+ boxShadow: active ? isDark ? "0 2px 4px rgba(0,0,0,0.2)" : "0 2px 8px rgba(0,0,0,0.05)" : "none",
+ border: "none",
+ transition: "all 0.2s ease"
+ }),
+ field: {
+ marginBottom: "20px"
+ },
+ labelRow: {
+ display: "flex",
+ justifyContent: "space-between",
+ alignItems: "center",
+ marginBottom: "8px"
+ },
+ label: {
+ fontSize: "13px",
+ fontWeight: 600,
+ color: isDark ? "#ddd" : "#334155"
+ },
+ forgotLink: {
+ fontSize: "12px",
+ fontWeight: 600,
+ color: text,
+ cursor: "pointer",
+ textDecoration: "none"
+ },
+ input: {
+ width: "100%",
+ padding: "12px 16px",
+ borderRadius: "12px",
+ border: `1px solid ${border}`,
+ background: inputBg,
+ color: text,
+ fontSize: "14px",
+ boxSizing: "border-box",
+ outline: "none",
+ transition: "border-color 0.2s ease"
+ },
+ primaryBtn: {
+ width: "100%",
+ padding: "14px",
+ borderRadius: "12px",
+ background: "linear-gradient(180deg, #2a2a2a 0%, #111111 100%)",
+ color: "#ffffff",
+ fontSize: "15px",
+ fontWeight: 600,
+ border: "none",
+ boxShadow: "0 4px 12px rgba(0,0,0,0.15)",
+ cursor: "pointer",
+ marginTop: "8px",
+ transition: "transform 0.1s ease"
+ },
+ divider: {
+ display: "flex",
+ alignItems: "center",
+ margin: "24px 0",
+ color: "#94a3b8",
+ fontSize: "11px",
+ fontWeight: 600,
+ letterSpacing: "1px"
+ },
+ dividerLine: {
+ flex: 1,
+ height: "1px",
+ background: border
+ },
+ dividerText: {
+ padding: "0 12px"
+ },
+ socialBtn: {
+ width: "100%",
+ padding: "12px",
+ borderRadius: "12px",
+ border: `1px solid ${border}`,
+ background: isDark ? "#2a2a2a" : "#ffffff",
+ color: text,
+ fontSize: "14px",
+ fontWeight: 600,
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ gap: "10px",
+ marginBottom: "12px",
+ cursor: "pointer",
+ boxShadow: isDark ? "none" : "0 1px 2px rgba(0,0,0,0.02)",
+ transition: "background 0.2s ease"
+ },
+ footer: {
+ background: isDark ? "#222" : "#f8fafc",
+ padding: "24px",
+ textAlign: "center",
+ borderTop: `1px solid ${border}`,
+ fontSize: "13px",
+ color: textMuted
+ },
+ footerLink: {
+ color: text,
+ fontWeight: 600,
+ textDecoration: "underline",
+ cursor: "pointer",
+ marginLeft: "4px"
+ }
+ };
+ const GoogleIcon = () => /* @__PURE__ */ jsxs2("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", children: [
+ /* @__PURE__ */ jsx3("path", { d: "M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z", fill: "#4285F4" }),
+ /* @__PURE__ */ jsx3("path", { d: "M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z", fill: "#34A853" }),
+ /* @__PURE__ */ jsx3("path", { d: "M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z", fill: "#FBBC05" }),
+ /* @__PURE__ */ jsx3("path", { d: "M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z", fill: "#EA4335" })
+ ] });
+ const AppleIcon = () => /* @__PURE__ */ jsx3("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: isDark ? "#fff" : "#000", children: /* @__PURE__ */ jsx3("path", { d: "M17.05 13.9c-.02-3.16 2.59-4.68 2.71-4.75-1.47-2.14-3.75-2.44-4.57-2.47-1.93-.19-3.78 1.14-4.76 1.14-1.01 0-2.54-1.1-4.14-1.07-2.07.03-3.98 1.2-5.06 3.08-2.16 3.76-.55 9.3 1.57 12.35 1.03 1.49 2.22 3.16 3.84 3.1 1.56-.06 2.14-1 4.02-1 1.85 0 2.39 1 4.02.97 1.67-.03 2.7-1.52 3.72-3.02 1.18-1.72 1.67-3.39 1.69-3.48-.04-.02-3.02-1.16-3.04-4.85zM14.9 5.25c.86-1.04 1.44-2.5 1.28-3.95-1.25.05-2.8.83-3.69 1.9-.79.95-1.45 2.44-1.26 3.86 1.4.11 2.81-.76 3.67-1.81z" }) });
+ const GithubIcon = () => /* @__PURE__ */ jsx3("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: isDark ? "#fff" : "#000", children: /* @__PURE__ */ jsx3("path", { d: "M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" }) });
+ return /* @__PURE__ */ jsxs2("div", { style: styles.wrapper, children: [
+ toast && /* @__PURE__ */ jsx3(
+ Toast,
+ {
+ message: toast.message,
+ type: toast.type,
+ isDark,
+ onClose: () => {
+ setToast(null);
+ if (toast.type === "error") clearError();
+ }
+ }
+ ),
+ /* @__PURE__ */ jsxs2("div", { style: styles.body, children: [
+ (mode === "signin" || mode === "signup") && /* @__PURE__ */ jsx3("div", { style: styles.switcherContainer, children: /* @__PURE__ */ jsxs2("div", { style: styles.switcher, children: [
+ /* @__PURE__ */ jsxs2(
+ "button",
+ {
+ type: "button",
+ style: styles.switchBtn(mode === "signin"),
+ onClick: () => {
+ setMode("signin");
+ clearError();
+ },
+ children: [
+ /* @__PURE__ */ jsxs2("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
+ /* @__PURE__ */ jsx3("path", { d: "M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4" }),
+ /* @__PURE__ */ jsx3("polyline", { points: "10 17 15 12 10 7" }),
+ /* @__PURE__ */ jsx3("line", { x1: "15", y1: "12", x2: "3", y2: "12" })
+ ] }),
+ "Login"
+ ]
+ }
+ ),
+ /* @__PURE__ */ jsxs2(
+ "button",
+ {
+ type: "button",
+ style: styles.switchBtn(mode === "signup"),
+ onClick: () => {
+ setMode("signup");
+ clearError();
+ },
+ children: [
+ /* @__PURE__ */ jsxs2("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
+ /* @__PURE__ */ jsx3("path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" }),
+ /* @__PURE__ */ jsx3("circle", { cx: "9", cy: "7", r: "4" }),
+ /* @__PURE__ */ jsx3("line", { x1: "19", y1: "8", x2: "19", y2: "14" }),
+ /* @__PURE__ */ jsx3("line", { x1: "22", y1: "11", x2: "16", y2: "11" })
+ ] }),
+ "Sign Up"
+ ]
+ }
+ )
+ ] }) }),
+ (mode === "forgot" || mode === "reset") && /* @__PURE__ */ jsxs2("div", { style: { marginBottom: "24px", textAlign: "center" }, children: [
+ /* @__PURE__ */ jsx3("h2", { style: { margin: "0 0 8px", fontSize: "20px", fontWeight: 700, color: text }, children: mode === "forgot" ? "Reset Password" : "Enter Reset Code" }),
+ /* @__PURE__ */ jsx3("p", { style: { margin: 0, fontSize: "14px", color: textMuted }, children: mode === "forgot" ? "Enter your email and we'll send a code" : `Enter the code sent to ${email}` })
+ ] }),
+ /* @__PURE__ */ jsxs2("form", { onSubmit: handleSubmit, children: [
+ mode === "signup" && /* @__PURE__ */ jsxs2("div", { style: styles.field, children: [
+ /* @__PURE__ */ jsx3("div", { style: styles.labelRow, children: /* @__PURE__ */ jsx3("label", { style: styles.label, children: "Full Name" }) }),
+ /* @__PURE__ */ jsx3(
+ "input",
+ {
+ style: styles.input,
+ type: "text",
+ placeholder: "Enter your name",
+ value: name,
+ onChange: (e) => setName(e.target.value),
+ required: true
+ }
+ )
+ ] }),
+ /* @__PURE__ */ jsxs2("div", { style: styles.field, children: [
+ /* @__PURE__ */ jsx3("div", { style: styles.labelRow, children: /* @__PURE__ */ jsx3("label", { style: styles.label, children: "Email address" }) }),
+ /* @__PURE__ */ jsx3(
+ "input",
+ {
+ style: styles.input,
+ type: "email",
+ placeholder: "Enter your email address",
+ value: email,
+ onChange: (e) => setEmail(e.target.value),
+ required: true,
+ readOnly: mode === "reset"
+ }
+ )
+ ] }),
+ mode === "reset" && /* @__PURE__ */ jsxs2("div", { style: styles.field, children: [
+ /* @__PURE__ */ jsx3("div", { style: styles.labelRow, children: /* @__PURE__ */ jsx3("label", { style: styles.label, children: "6-digit OTP Code" }) }),
+ /* @__PURE__ */ jsx3(
+ "input",
+ {
+ style: styles.input,
+ type: "text",
+ placeholder: "Enter reset code",
+ value: otp,
+ onChange: (e) => setOtp(e.target.value),
+ required: true
+ }
+ )
+ ] }),
+ (mode === "signin" || mode === "signup" || mode === "reset") && /* @__PURE__ */ jsxs2("div", { style: styles.field, children: [
+ /* @__PURE__ */ jsxs2("div", { style: styles.labelRow, children: [
+ /* @__PURE__ */ jsx3("label", { style: styles.label, children: mode === "reset" ? "New Password" : "Password" }),
+ mode === "signin" && /* @__PURE__ */ jsx3("span", { style: styles.forgotLink, onClick: () => {
+ setMode("forgot");
+ clearError();
+ }, children: "Forgot password?" })
+ ] }),
+ /* @__PURE__ */ jsx3(
+ "input",
+ {
+ style: styles.input,
+ type: "password",
+ placeholder: mode === "reset" ? "Enter new password" : "Enter your password",
+ value: password,
+ onChange: (e) => setPassword(e.target.value),
+ required: true
+ }
+ )
+ ] }),
+ /* @__PURE__ */ jsx3(
+ "button",
+ {
+ style: styles.primaryBtn,
+ type: "submit",
+ disabled: isLoading,
+ onMouseDown: (e) => e.currentTarget.style.transform = "scale(0.98)",
+ onMouseUp: (e) => e.currentTarget.style.transform = "scale(1)",
+ onMouseLeave: (e) => e.currentTarget.style.transform = "scale(1)",
+ children: isLoading ? "Processing..." : mode === "signin" ? "Log In" : mode === "signup" ? "Create Account" : mode === "forgot" ? "Send Reset Code" : "Reset Password"
+ }
+ )
+ ] }),
+ (mode === "signin" || mode === "signup") && providers && providers.length > 0 && /* @__PURE__ */ jsxs2(Fragment2, { children: [
+ /* @__PURE__ */ jsxs2("div", { style: styles.divider, children: [
+ /* @__PURE__ */ jsx3("div", { style: styles.dividerLine }),
+ /* @__PURE__ */ jsx3("span", { style: styles.dividerText, children: "OR" }),
+ /* @__PURE__ */ jsx3("div", { style: styles.dividerLine })
+ ] }),
+ /* @__PURE__ */ jsxs2("div", { children: [
+ providers.includes("google") && /* @__PURE__ */ jsxs2("button", { style: styles.socialBtn, onClick: () => socialLogin("google"), type: "button", children: [
+ /* @__PURE__ */ jsx3(GoogleIcon, {}),
+ "Continue with Google"
+ ] }),
+ providers.includes("apple") && /* @__PURE__ */ jsxs2("button", { style: styles.socialBtn, onClick: () => alert("Apple login not implemented in demo"), type: "button", children: [
+ /* @__PURE__ */ jsx3(AppleIcon, {}),
+ "Continue with Apple"
+ ] }),
+ providers.includes("github") && /* @__PURE__ */ jsxs2("button", { style: styles.socialBtn, onClick: () => socialLogin("github"), type: "button", children: [
+ /* @__PURE__ */ jsx3(GithubIcon, {}),
+ "Continue with GitHub"
+ ] })
+ ] })
+ ] })
+ ] }),
+ /* @__PURE__ */ jsxs2("div", { style: styles.footer, children: [
+ mode === "signin" ? "Don't have an account yet?" : mode === "signup" ? "Already have an account?" : "Remember your password?",
+ /* @__PURE__ */ jsx3(
+ "span",
+ {
+ style: styles.footerLink,
+ onClick: () => {
+ setMode(mode === "signin" ? "signup" : "signin");
+ clearError();
+ },
+ children: mode === "signin" ? "Sign up" : "Log in"
+ }
+ )
+ ] })
+ ] });
+};
+
+// src/index.ts
+export * from "@urbackend/sdk";
+export {
+ UrAuth,
+ UrProvider,
+ useAuth,
+ useDb,
+ useStorage,
+ useUrContext
+};
+//# sourceMappingURL=index.mjs.map
\ No newline at end of file
diff --git a/sdks/urbackend-react/dist/index.mjs.map b/sdks/urbackend-react/dist/index.mjs.map
new file mode 100644
index 000000000..2f37bdd41
--- /dev/null
+++ b/sdks/urbackend-react/dist/index.mjs.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/context.tsx","../src/hooks.ts","../src/components/UrAuth.tsx","../src/components/Toast.tsx","../src/index.ts"],"sourcesContent":["import React, { createContext, useContext, useEffect, useState, useMemo } from 'react';\nimport { UrBackendClient, AuthModule, DatabaseModule, StorageModule } from '@urbackend/sdk';\nimport type { AuthUser } from '@urbackend/sdk';\n\ninterface UrContextValue {\n client: UrBackendClient | null;\n auth: AuthModule | null;\n db: DatabaseModule | null;\n storage: StorageModule | null;\n user: AuthUser | null;\n setUser: React.Dispatch>;\n isInitializing: boolean;\n isLoading: boolean;\n setIsLoading: React.Dispatch>;\n error: string | null;\n setError: React.Dispatch>;\n}\n\nconst UrContext = createContext(undefined);\n\nexport interface UrProviderProps {\n apiKey: string;\n baseUrl?: string;\n children: React.ReactNode;\n}\n\nexport const UrProvider: React.FC = ({ apiKey, baseUrl, children }) => {\n const [user, setUser] = useState(null);\n const [isInitializing, setIsInitializing] = useState(true);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState(null);\n\n const { client, auth, db, storage } = useMemo(() => {\n const _client = new UrBackendClient({ apiKey, baseUrl });\n return {\n client: _client,\n auth: new AuthModule(_client),\n db: new DatabaseModule(_client),\n storage: new StorageModule(_client),\n };\n }, [apiKey, baseUrl]);\n\n useEffect(() => {\n let mounted = true;\n\n const initAuth = async () => {\n try {\n // Check for social auth callback params\n const urlParams = new URLSearchParams(window.location.search);\n const hashParams = new URLSearchParams(window.location.hash.substring(1));\n const token = hashParams.get('token');\n const error = urlParams.get('error');\n\n if (error) {\n console.error('Social Auth Error:', error);\n if (mounted) setError(error);\n window.history.replaceState({}, document.title, window.location.pathname);\n } else if (token) {\n // Social auth succeeded, establish session immediately\n auth.setToken(token);\n window.history.replaceState({}, document.title, window.location.pathname);\n } else {\n // Attempt to silently refresh session using the HTTP-only cookie\n try {\n await auth.refreshToken();\n } catch (e) {\n // If refresh fails, me() will catch it\n }\n }\n \n const currentUser = await auth.me();\n if (mounted) {\n setUser(currentUser);\n }\n } catch (error: any) {\n if (mounted) {\n setUser(null);\n // Don't set global error for initial me() check failure (usually just means not logged in)\n }\n } finally {\n if (mounted) {\n setIsInitializing(false);\n }\n }\n };\n\n initAuth();\n\n return () => {\n mounted = false;\n };\n }, [auth]);\n\n const value: UrContextValue = {\n client,\n auth,\n db,\n storage,\n user,\n setUser,\n isInitializing,\n isLoading,\n setIsLoading,\n error,\n setError,\n };\n\n return {children};\n};\n\nexport const useUrContext = () => {\n const context = useContext(UrContext);\n if (!context) {\n throw new Error('useUrContext must be used within an UrProvider');\n }\n return context;\n};\n","import { useCallback } from 'react';\nimport { useUrContext } from './context';\nimport type { \n LoginPayload, \n SignUpPayload, \n ChangePasswordPayload,\n VerifyEmailPayload,\n RequestPasswordResetPayload,\n ResetPasswordPayload\n} from '@urbackend/sdk';\n\nexport const useAuth = () => {\n const { auth, user, setUser, isInitializing, isLoading, setIsLoading, error, setError } = useUrContext();\n\n if (!auth) {\n throw new Error('Auth module not initialized. Make sure you are inside UrProvider.');\n }\n\n const login = useCallback(async (payload: LoginPayload) => {\n try {\n setError(null);\n setIsLoading(true);\n await auth.login(payload);\n const currentUser = await auth.me();\n setUser(currentUser);\n } catch (err: any) {\n setError(err.message || 'Login failed');\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [auth, setUser, setIsLoading, setError]);\n\n const signUp = useCallback(async (payload: SignUpPayload) => {\n try {\n setError(null);\n setIsLoading(true);\n const newUser = await auth.signUp(payload);\n return newUser;\n } catch (err: any) {\n setError(err.message || 'Sign up failed');\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [auth, setIsLoading, setError]);\n\n const logout = useCallback(async () => {\n try {\n setError(null);\n setIsLoading(true);\n await auth.logout();\n setUser(null);\n } catch (err: any) {\n setError(err.message || 'Logout failed');\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [auth, setUser, setIsLoading, setError]);\n\n const socialLogin = useCallback((provider: 'google' | 'github') => {\n setError(null);\n const url = auth.socialStart(provider);\n window.location.href = url;\n }, [auth, setError]);\n \n const verifyEmail = useCallback(async (payload: VerifyEmailPayload) => {\n try {\n setError(null);\n return await auth.verifyEmail(payload);\n } catch (err: any) {\n setError(err.message || 'Email verification failed');\n throw err;\n }\n }, [auth, setError]);\n\n const changePassword = useCallback(async (payload: ChangePasswordPayload) => {\n try {\n setError(null);\n return await auth.changePassword(payload);\n } catch (err: any) {\n setError(err.message || 'Failed to change password');\n throw err;\n }\n }, [auth, setError]);\n\n const requestPasswordReset = useCallback(async (payload: RequestPasswordResetPayload) => {\n try {\n setError(null);\n setIsLoading(true);\n return await auth.requestPasswordReset(payload);\n } catch (err: any) {\n setError(err.message || 'Failed to request password reset');\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [auth, setError, setIsLoading]);\n\n const resetPassword = useCallback(async (payload: ResetPasswordPayload) => {\n try {\n setError(null);\n setIsLoading(true);\n return await auth.resetPassword(payload);\n } catch (err: any) {\n setError(err.message || 'Failed to reset password');\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [auth, setError, setIsLoading]);\n\n const clearError = useCallback(() => setError(null), [setError]);\n\n return {\n user,\n isInitializing,\n isLoading,\n error,\n isAuthenticated: !!user,\n login,\n signUp,\n logout,\n socialLogin,\n verifyEmail,\n changePassword,\n requestPasswordReset,\n resetPassword,\n clearError,\n authApi: auth // Escape hatch to underlying SDK\n };\n};\n\nexport const useDb = () => {\n const { db } = useUrContext();\n if (!db) {\n throw new Error('Database module not initialized.');\n }\n return db;\n};\n\nexport const useStorage = () => {\n const { storage } = useUrContext();\n if (!storage) {\n throw new Error('Storage module not initialized.');\n }\n return storage;\n};\n","import React, { useState, useEffect } from 'react';\nimport { useAuth } from '../hooks';\nimport { Toast } from './Toast';\n\nexport interface UrAuthProps {\n providers?: ('google' | 'github' | 'apple')[];\n theme?: 'light' | 'dark'; // Dark mode not perfectly matched to image, but kept for API compat\n onSuccess?: () => void;\n}\n\nexport const UrAuth: React.FC = ({ \n providers = ['google', 'apple', 'github'], \n theme = 'light',\n onSuccess\n}) => {\n const { login, signUp, socialLogin, requestPasswordReset, resetPassword, isLoading, error, clearError } = useAuth();\n const [mode, setMode] = useState<'signin' | 'signup' | 'forgot' | 'reset'>('signin');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [otp, setOtp] = useState('');\n const [name, setName] = useState('');\n const [toast, setToast] = useState<{message: string, type: 'success' | 'error'} | null>(null);\n\n useEffect(() => {\n if (error) {\n setToast({ message: error, type: 'error' });\n }\n }, [error]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n try {\n if (mode === 'signin') {\n await login({ email, password });\n setToast({ message: 'Welcome back!', type: 'success' });\n if (onSuccess) onSuccess();\n } else if (mode === 'signup') {\n await signUp({ email, password, name });\n // Auto-login after signup for convenience\n await login({ email, password });\n setToast({ message: 'Account created successfully!', type: 'success' });\n if (onSuccess) onSuccess();\n } else if (mode === 'forgot') {\n await requestPasswordReset({ email });\n setToast({ message: 'Reset code sent to your email', type: 'success' });\n setMode('reset');\n } else if (mode === 'reset') {\n await resetPassword({ email, otp, newPassword: password });\n setToast({ message: 'Password reset successfully', type: 'success' });\n setMode('signin');\n setPassword('');\n setOtp('');\n }\n } catch (err: any) {\n // Error is now handled and stored globally by useAuth hook, which triggers the useEffect toast\n }\n };\n\n const isDark = theme === 'dark';\n const bg = isDark ? '#1a1a1a' : '#ffffff';\n const text = isDark ? '#ffffff' : '#0f172a';\n const textMuted = isDark ? '#a1a1aa' : '#64748b';\n const border = isDark ? '#333' : '#e2e8f0';\n const inputBg = isDark ? '#2a2a2a' : '#ffffff';\n \n const styles = {\n wrapper: {\n width: '100%',\n maxWidth: '420px',\n margin: '0 auto',\n borderRadius: '24px',\n background: bg,\n boxShadow: isDark ? '0 20px 40px rgba(0,0,0,0.5)' : '0 20px 40px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.05)',\n border: `1px solid ${border}`,\n overflow: 'hidden',\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n color: text,\n },\n body: {\n padding: '32px 32px 24px 32px',\n },\n switcherContainer: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: '32px'\n },\n switcher: {\n display: 'inline-flex',\n background: isDark ? '#2a2a2a' : '#f1f5f9',\n padding: '4px',\n borderRadius: '100px',\n },\n switchBtn: (active: boolean) => ({\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '8px 20px',\n borderRadius: '100px',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer',\n color: active ? text : textMuted,\n background: active ? (isDark ? '#444' : '#ffffff') : 'transparent',\n boxShadow: active ? (isDark ? '0 2px 4px rgba(0,0,0,0.2)' : '0 2px 8px rgba(0,0,0,0.05)') : 'none',\n border: 'none',\n transition: 'all 0.2s ease',\n }),\n field: {\n marginBottom: '20px',\n },\n labelRow: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: '8px',\n },\n label: {\n fontSize: '13px',\n fontWeight: 600,\n color: isDark ? '#ddd' : '#334155',\n },\n forgotLink: {\n fontSize: '12px',\n fontWeight: 600,\n color: text,\n cursor: 'pointer',\n textDecoration: 'none',\n },\n input: {\n width: '100%',\n padding: '12px 16px',\n borderRadius: '12px',\n border: `1px solid ${border}`,\n background: inputBg,\n color: text,\n fontSize: '14px',\n boxSizing: 'border-box' as const,\n outline: 'none',\n transition: 'border-color 0.2s ease',\n },\n primaryBtn: {\n width: '100%',\n padding: '14px',\n borderRadius: '12px',\n background: 'linear-gradient(180deg, #2a2a2a 0%, #111111 100%)',\n color: '#ffffff',\n fontSize: '15px',\n fontWeight: 600,\n border: 'none',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n cursor: 'pointer',\n marginTop: '8px',\n transition: 'transform 0.1s ease',\n },\n divider: {\n display: 'flex',\n alignItems: 'center',\n margin: '24px 0',\n color: '#94a3b8',\n fontSize: '11px',\n fontWeight: 600,\n letterSpacing: '1px',\n },\n dividerLine: {\n flex: 1,\n height: '1px',\n background: border,\n },\n dividerText: {\n padding: '0 12px',\n },\n socialBtn: {\n width: '100%',\n padding: '12px',\n borderRadius: '12px',\n border: `1px solid ${border}`,\n background: isDark ? '#2a2a2a' : '#ffffff',\n color: text,\n fontSize: '14px',\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '10px',\n marginBottom: '12px',\n cursor: 'pointer',\n boxShadow: isDark ? 'none' : '0 1px 2px rgba(0,0,0,0.02)',\n transition: 'background 0.2s ease',\n },\n footer: {\n background: isDark ? '#222' : '#f8fafc',\n padding: '24px',\n textAlign: 'center' as const,\n borderTop: `1px solid ${border}`,\n fontSize: '13px',\n color: textMuted,\n },\n footerLink: {\n color: text,\n fontWeight: 600,\n textDecoration: 'underline',\n cursor: 'pointer',\n marginLeft: '4px',\n }\n };\n\n const GoogleIcon = () => (\n \n );\n\n const AppleIcon = () => (\n \n );\n\n const GithubIcon = () => (\n \n );\n\n return (\n \n {toast && (\n
{\n setToast(null);\n if (toast.type === 'error') clearError();\n }} \n />\n )}\n \n \n {(mode === 'signin' || mode === 'signup') && (\n
\n
\n
\n
\n
\n
\n )}\n\n {(mode === 'forgot' || mode === 'reset') && (\n
\n
\n {mode === 'forgot' ? 'Reset Password' : 'Enter Reset Code'}\n
\n
\n {mode === 'forgot' ? \"Enter your email and we'll send a code\" : `Enter the code sent to ${email}`}\n
\n
\n )}\n\n
\n\n {(mode === 'signin' || mode === 'signup') && providers && providers.length > 0 && (\n <>\n
\n\n
\n {providers.includes('google') && (\n
\n )}\n {providers.includes('apple') && (\n
\n )}\n {providers.includes('github') && (\n
\n )}\n
\n >\n )}\n
\n\n \n {mode === 'signin' ? \"Don't have an account yet?\" \n : mode === 'signup' ? \"Already have an account?\"\n : \"Remember your password?\"}\n {\n setMode(mode === 'signin' ? 'signup' : 'signin');\n clearError();\n }}\n >\n {mode === 'signin' ? 'Sign up' : 'Log in'}\n \n
\n \n );\n};\n","import React, { useEffect, useState } from 'react';\n\ninterface ToastProps {\n message: string;\n type: 'success' | 'error';\n onClose: () => void;\n isDark?: boolean;\n}\n\nexport const Toast: React.FC = ({ message, type, onClose, isDark = false }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isLeaving, setIsLeaving] = useState(false);\n\n useEffect(() => {\n // Trigger enter animation on mount\n requestAnimationFrame(() => {\n setIsVisible(true);\n });\n\n const timer = setTimeout(() => {\n setIsLeaving(true);\n setTimeout(onClose, 300); // Wait for exit animation\n }, 4000);\n\n return () => clearTimeout(timer);\n }, [onClose]);\n\n const bgColor = isDark ? 'rgba(30, 30, 30, 0.9)' : 'rgba(255, 255, 255, 0.9)';\n const borderColor = type === 'success' ? 'rgba(34, 197, 94, 0.5)' : 'rgba(239, 68, 68, 0.5)';\n const iconColor = type === 'success' ? '#22c55e' : '#ef4444';\n const textColor = isDark ? '#fff' : '#000';\n\n return (\n <>\n \n \n {type === 'success' ? (\n
\n ) : (\n
\n )}\n {message}\n
\n >\n );\n};\n","export { UrProvider, useUrContext } from './context';\nexport type { UrProviderProps } from './context';\n\nexport { useAuth, useDb, useStorage } from './hooks';\nexport { UrAuth } from './components/UrAuth';\nexport type { UrAuthProps } from './components/UrAuth';\n\nexport * from '@urbackend/sdk'; // re-export types so users don't need to import from sdk directly\n"],"mappings":"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","names":["error","useState","useEffect","useEffect","useState","jsx","Fragment","jsx","jsxs","useState","useEffect"]}
\ No newline at end of file
diff --git a/sdks/urbackend-react/package.json b/sdks/urbackend-react/package.json
new file mode 100644
index 000000000..8ae3659f2
--- /dev/null
+++ b/sdks/urbackend-react/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "@urbackend/react",
+ "version": "0.1.0",
+ "description": "React SDK for urBackend",
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "scripts": {
+ "build": "tsup",
+ "dev": "tsup --watch",
+ "lint": "eslint src/",
+ "test": "vitest run",
+ "test:watch": "vitest"
+ },
+ "dependencies": {
+ "@urbackend/sdk": "file:../urbackend-sdk"
+ },
+ "peerDependencies": {
+ "react": ">=17.0.0",
+ "react-dom": ">=17.0.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.2.0",
+ "@types/react-dom": "^18.2.0",
+ "tsup": "^8.0.0",
+ "typescript": "^5.0.0",
+ "vitest": "^4.1.5",
+ "jsdom": "^24.0.0",
+ "@testing-library/react": "^14.0.0",
+ "@testing-library/jest-dom": "^6.0.0"
+ }
+}
diff --git a/sdks/urbackend-react/src/components/Toast.tsx b/sdks/urbackend-react/src/components/Toast.tsx
new file mode 100644
index 000000000..2d1f018ca
--- /dev/null
+++ b/sdks/urbackend-react/src/components/Toast.tsx
@@ -0,0 +1,87 @@
+import React, { useEffect, useState } from 'react';
+
+interface ToastProps {
+ message: string;
+ type: 'success' | 'error';
+ onClose: () => void;
+ isDark?: boolean;
+}
+
+export const Toast: React.FC = ({ message, type, onClose, isDark = false }) => {
+ const [isVisible, setIsVisible] = useState(false);
+ const [isLeaving, setIsLeaving] = useState(false);
+
+ useEffect(() => {
+ // Trigger enter animation on mount
+ requestAnimationFrame(() => {
+ setIsVisible(true);
+ });
+
+ const timer = setTimeout(() => {
+ setIsLeaving(true);
+ setTimeout(onClose, 300); // Wait for exit animation
+ }, 4000);
+
+ return () => clearTimeout(timer);
+ }, [onClose]);
+
+ const bgColor = isDark ? 'rgba(30, 30, 30, 0.9)' : 'rgba(255, 255, 255, 0.9)';
+ const borderColor = type === 'success' ? 'rgba(34, 197, 94, 0.5)' : 'rgba(239, 68, 68, 0.5)';
+ const iconColor = type === 'success' ? '#22c55e' : '#ef4444';
+ const textColor = isDark ? '#fff' : '#000';
+
+ return (
+ <>
+
+
+ {type === 'success' ? (
+
+ ) : (
+
+ )}
+ {message}
+
+ >
+ );
+};
diff --git a/sdks/urbackend-react/src/components/UrAuth.tsx b/sdks/urbackend-react/src/components/UrAuth.tsx
new file mode 100644
index 000000000..c166e52f3
--- /dev/null
+++ b/sdks/urbackend-react/src/components/UrAuth.tsx
@@ -0,0 +1,410 @@
+import React, { useState, useEffect } from 'react';
+import { useAuth } from '../hooks';
+import { Toast } from './Toast';
+
+export interface UrAuthProps {
+ providers?: ('google' | 'github' | 'apple')[];
+ theme?: 'light' | 'dark'; // Dark mode not perfectly matched to image, but kept for API compat
+ onSuccess?: () => void;
+}
+
+export const UrAuth: React.FC = ({
+ providers = ['google', 'apple', 'github'],
+ theme = 'light',
+ onSuccess
+}) => {
+ const { login, signUp, socialLogin, requestPasswordReset, resetPassword, isLoading, error, clearError } = useAuth();
+ const [mode, setMode] = useState<'signin' | 'signup' | 'forgot' | 'reset'>('signin');
+ const [email, setEmail] = useState('');
+ const [password, setPassword] = useState('');
+ const [otp, setOtp] = useState('');
+ const [name, setName] = useState('');
+ const [toast, setToast] = useState<{message: string, type: 'success' | 'error'} | null>(null);
+
+ useEffect(() => {
+ if (error) {
+ setToast({ message: error, type: 'error' });
+ }
+ }, [error]);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+ try {
+ if (mode === 'signin') {
+ await login({ email, password });
+ setToast({ message: 'Welcome back!', type: 'success' });
+ if (onSuccess) onSuccess();
+ } else if (mode === 'signup') {
+ await signUp({ email, password, name });
+ // Auto-login after signup for convenience
+ await login({ email, password });
+ setToast({ message: 'Account created successfully!', type: 'success' });
+ if (onSuccess) onSuccess();
+ } else if (mode === 'forgot') {
+ await requestPasswordReset({ email });
+ setToast({ message: 'Reset code sent to your email', type: 'success' });
+ setMode('reset');
+ } else if (mode === 'reset') {
+ await resetPassword({ email, otp, newPassword: password });
+ setToast({ message: 'Password reset successfully', type: 'success' });
+ setMode('signin');
+ setPassword('');
+ setOtp('');
+ }
+ } catch (err: any) {
+ // Error is now handled and stored globally by useAuth hook, which triggers the useEffect toast
+ }
+ };
+
+ const isDark = theme === 'dark';
+ const bg = isDark ? '#1a1a1a' : '#ffffff';
+ const text = isDark ? '#ffffff' : '#0f172a';
+ const textMuted = isDark ? '#a1a1aa' : '#64748b';
+ const border = isDark ? '#333' : '#e2e8f0';
+ const inputBg = isDark ? '#2a2a2a' : '#ffffff';
+
+ const styles = {
+ wrapper: {
+ width: '100%',
+ maxWidth: '420px',
+ margin: '0 auto',
+ borderRadius: '24px',
+ background: bg,
+ boxShadow: isDark ? '0 20px 40px rgba(0,0,0,0.5)' : '0 20px 40px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.05)',
+ border: `1px solid ${border}`,
+ overflow: 'hidden',
+ fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
+ color: text,
+ },
+ body: {
+ padding: '32px 32px 24px 32px',
+ },
+ switcherContainer: {
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ marginBottom: '32px'
+ },
+ switcher: {
+ display: 'inline-flex',
+ background: isDark ? '#2a2a2a' : '#f1f5f9',
+ padding: '4px',
+ borderRadius: '100px',
+ },
+ switchBtn: (active: boolean) => ({
+ display: 'flex',
+ alignItems: 'center',
+ gap: '6px',
+ padding: '8px 20px',
+ borderRadius: '100px',
+ fontSize: '13px',
+ fontWeight: 600,
+ cursor: 'pointer',
+ color: active ? text : textMuted,
+ background: active ? (isDark ? '#444' : '#ffffff') : 'transparent',
+ boxShadow: active ? (isDark ? '0 2px 4px rgba(0,0,0,0.2)' : '0 2px 8px rgba(0,0,0,0.05)') : 'none',
+ border: 'none',
+ transition: 'all 0.2s ease',
+ }),
+ field: {
+ marginBottom: '20px',
+ },
+ labelRow: {
+ display: 'flex',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ marginBottom: '8px',
+ },
+ label: {
+ fontSize: '13px',
+ fontWeight: 600,
+ color: isDark ? '#ddd' : '#334155',
+ },
+ forgotLink: {
+ fontSize: '12px',
+ fontWeight: 600,
+ color: text,
+ cursor: 'pointer',
+ textDecoration: 'none',
+ },
+ input: {
+ width: '100%',
+ padding: '12px 16px',
+ borderRadius: '12px',
+ border: `1px solid ${border}`,
+ background: inputBg,
+ color: text,
+ fontSize: '14px',
+ boxSizing: 'border-box' as const,
+ outline: 'none',
+ transition: 'border-color 0.2s ease',
+ },
+ primaryBtn: {
+ width: '100%',
+ padding: '14px',
+ borderRadius: '12px',
+ background: 'linear-gradient(180deg, #2a2a2a 0%, #111111 100%)',
+ color: '#ffffff',
+ fontSize: '15px',
+ fontWeight: 600,
+ border: 'none',
+ boxShadow: '0 4px 12px rgba(0,0,0,0.15)',
+ cursor: 'pointer',
+ marginTop: '8px',
+ transition: 'transform 0.1s ease',
+ },
+ divider: {
+ display: 'flex',
+ alignItems: 'center',
+ margin: '24px 0',
+ color: '#94a3b8',
+ fontSize: '11px',
+ fontWeight: 600,
+ letterSpacing: '1px',
+ },
+ dividerLine: {
+ flex: 1,
+ height: '1px',
+ background: border,
+ },
+ dividerText: {
+ padding: '0 12px',
+ },
+ socialBtn: {
+ width: '100%',
+ padding: '12px',
+ borderRadius: '12px',
+ border: `1px solid ${border}`,
+ background: isDark ? '#2a2a2a' : '#ffffff',
+ color: text,
+ fontSize: '14px',
+ fontWeight: 600,
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ gap: '10px',
+ marginBottom: '12px',
+ cursor: 'pointer',
+ boxShadow: isDark ? 'none' : '0 1px 2px rgba(0,0,0,0.02)',
+ transition: 'background 0.2s ease',
+ },
+ footer: {
+ background: isDark ? '#222' : '#f8fafc',
+ padding: '24px',
+ textAlign: 'center' as const,
+ borderTop: `1px solid ${border}`,
+ fontSize: '13px',
+ color: textMuted,
+ },
+ footerLink: {
+ color: text,
+ fontWeight: 600,
+ textDecoration: 'underline',
+ cursor: 'pointer',
+ marginLeft: '4px',
+ }
+ };
+
+ const GoogleIcon = () => (
+
+ );
+
+ const AppleIcon = () => (
+
+ );
+
+ const GithubIcon = () => (
+
+ );
+
+ return (
+
+ {toast && (
+
{
+ setToast(null);
+ if (toast.type === 'error') clearError();
+ }}
+ />
+ )}
+
+
+ {(mode === 'signin' || mode === 'signup') && (
+
+
+
+
+
+
+ )}
+
+ {(mode === 'forgot' || mode === 'reset') && (
+
+
+ {mode === 'forgot' ? 'Reset Password' : 'Enter Reset Code'}
+
+
+ {mode === 'forgot' ? "Enter your email and we'll send a code" : `Enter the code sent to ${email}`}
+
+
+ )}
+
+
+
+ {(mode === 'signin' || mode === 'signup') && providers && providers.length > 0 && (
+ <>
+
+
+
+ {providers.includes('google') && (
+
+ )}
+ {providers.includes('apple') && (
+
+ )}
+ {providers.includes('github') && (
+
+ )}
+
+ >
+ )}
+
+
+
+ {mode === 'signin' ? "Don't have an account yet?"
+ : mode === 'signup' ? "Already have an account?"
+ : "Remember your password?"}
+ {
+ setMode(mode === 'signin' ? 'signup' : 'signin');
+ clearError();
+ }}
+ >
+ {mode === 'signin' ? 'Sign up' : 'Log in'}
+
+
+
+ );
+};
diff --git a/sdks/urbackend-react/src/context.tsx b/sdks/urbackend-react/src/context.tsx
new file mode 100644
index 000000000..4f2922f12
--- /dev/null
+++ b/sdks/urbackend-react/src/context.tsx
@@ -0,0 +1,127 @@
+import React, { createContext, useContext, useEffect, useState, useMemo } from 'react';
+import { UrBackendClient, AuthModule, DatabaseModule, StorageModule } from '@urbackend/sdk';
+import type { AuthUser } from '@urbackend/sdk';
+
+interface UrContextValue {
+ client: UrBackendClient | null;
+ auth: AuthModule | null;
+ db: DatabaseModule | null;
+ storage: StorageModule | null;
+ user: AuthUser | null;
+ setUser: React.Dispatch>;
+ isInitializing: boolean;
+ isLoading: boolean;
+ setIsLoading: React.Dispatch>;
+ error: string | null;
+ setError: React.Dispatch>;
+}
+
+const UrContext = createContext(undefined);
+
+export interface UrProviderProps {
+ apiKey: string;
+ baseUrl?: string;
+ children: React.ReactNode;
+}
+
+export const UrProvider: React.FC = ({ apiKey, baseUrl, children }) => {
+ const [user, setUser] = useState(null);
+ const [isInitializing, setIsInitializing] = useState(true);
+ const [isLoading, setIsLoading] = useState(false);
+ const [error, setError] = useState(null);
+
+ const { client, auth, db, storage } = useMemo(() => {
+ const _client = new UrBackendClient({ apiKey, baseUrl });
+ return {
+ client: _client,
+ auth: new AuthModule(_client),
+ db: new DatabaseModule(_client),
+ storage: new StorageModule(_client),
+ };
+ }, [apiKey, baseUrl]);
+
+ useEffect(() => {
+ let mounted = true;
+
+ const initAuth = async () => {
+ try {
+ // Check for social auth callback params
+ const urlParams = new URLSearchParams(window.location.search);
+ const hashParams = new URLSearchParams(window.location.hash.substring(1));
+ const token = hashParams.get('token');
+ const rtCode = urlParams.get('rtCode');
+ const error = urlParams.get('error');
+
+ if (error) {
+ console.error('Social Auth Error:', error);
+ if (mounted) setError(error);
+ window.history.replaceState({}, document.title, window.location.pathname);
+ } else if (token) {
+ // Social auth succeeded, establish session immediately
+ auth.setToken(token);
+
+ if (rtCode) {
+ // Exchange for long-lived refresh token
+ try {
+ await auth.socialExchange({ token, rtCode });
+ } catch (err) {
+ console.error('Failed to exchange refresh token', err);
+ }
+ }
+ window.history.replaceState({}, document.title, window.location.pathname);
+ } else {
+ // Attempt to silently refresh session using the HTTP-only cookie
+ try {
+ await auth.refreshToken();
+ } catch (e) {
+ // If refresh fails, me() will catch it
+ }
+ }
+
+ const currentUser = await auth.me();
+ if (mounted) {
+ setUser(currentUser);
+ }
+ } catch (error: any) {
+ if (mounted) {
+ setUser(null);
+ // Don't set global error for initial me() check failure (usually just means not logged in)
+ }
+ } finally {
+ if (mounted) {
+ setIsInitializing(false);
+ }
+ }
+ };
+
+ initAuth();
+
+ return () => {
+ mounted = false;
+ };
+ }, [auth]);
+
+ const value: UrContextValue = {
+ client,
+ auth,
+ db,
+ storage,
+ user,
+ setUser,
+ isInitializing,
+ isLoading,
+ setIsLoading,
+ error,
+ setError,
+ };
+
+ return {children};
+};
+
+export const useUrContext = () => {
+ const context = useContext(UrContext);
+ if (!context) {
+ throw new Error('useUrContext must be used within an UrProvider');
+ }
+ return context;
+};
diff --git a/sdks/urbackend-react/src/hooks.ts b/sdks/urbackend-react/src/hooks.ts
new file mode 100644
index 000000000..18ed4dcfc
--- /dev/null
+++ b/sdks/urbackend-react/src/hooks.ts
@@ -0,0 +1,149 @@
+import { useCallback } from 'react';
+import { useUrContext } from './context';
+import type {
+ LoginPayload,
+ SignUpPayload,
+ ChangePasswordPayload,
+ VerifyEmailPayload,
+ RequestPasswordResetPayload,
+ ResetPasswordPayload
+} from '@urbackend/sdk';
+
+export const useAuth = () => {
+ const { auth, user, setUser, isInitializing, isLoading, setIsLoading, error, setError } = useUrContext();
+
+ if (!auth) {
+ throw new Error('Auth module not initialized. Make sure you are inside UrProvider.');
+ }
+
+ const login = useCallback(async (payload: LoginPayload) => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ await auth.login(payload);
+ const currentUser = await auth.me();
+ setUser(currentUser);
+ } catch (err: any) {
+ setError(err.message || 'Login failed');
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setUser, setIsLoading, setError]);
+
+ const signUp = useCallback(async (payload: SignUpPayload) => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ const newUser = await auth.signUp(payload);
+ return newUser;
+ } catch (err: any) {
+ setError(err.message || 'Sign up failed');
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setIsLoading, setError]);
+
+ const logout = useCallback(async () => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ await auth.logout();
+ setUser(null);
+ } catch (err: any) {
+ setError(err.message || 'Logout failed');
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setUser, setIsLoading, setError]);
+
+ const socialLogin = useCallback((provider: 'google' | 'github') => {
+ setError(null);
+ const url = auth.socialStart(provider);
+ window.location.href = url;
+ }, [auth, setError]);
+
+ const verifyEmail = useCallback(async (payload: VerifyEmailPayload) => {
+ try {
+ setError(null);
+ return await auth.verifyEmail(payload);
+ } catch (err: any) {
+ setError(err.message || 'Email verification failed');
+ throw err;
+ }
+ }, [auth, setError]);
+
+ const changePassword = useCallback(async (payload: ChangePasswordPayload) => {
+ try {
+ setError(null);
+ return await auth.changePassword(payload);
+ } catch (err: any) {
+ setError(err.message || 'Failed to change password');
+ throw err;
+ }
+ }, [auth, setError]);
+
+ const requestPasswordReset = useCallback(async (payload: RequestPasswordResetPayload) => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ return await auth.requestPasswordReset(payload);
+ } catch (err: any) {
+ setError(err.message || 'Failed to request password reset');
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setError, setIsLoading]);
+
+ const resetPassword = useCallback(async (payload: ResetPasswordPayload) => {
+ try {
+ setError(null);
+ setIsLoading(true);
+ return await auth.resetPassword(payload);
+ } catch (err: any) {
+ setError(err.message || 'Failed to reset password');
+ throw err;
+ } finally {
+ setIsLoading(false);
+ }
+ }, [auth, setError, setIsLoading]);
+
+ const clearError = useCallback(() => setError(null), [setError]);
+
+ return {
+ user,
+ isInitializing,
+ isLoading,
+ error,
+ isAuthenticated: !!user,
+ login,
+ signUp,
+ logout,
+ socialLogin,
+ verifyEmail,
+ changePassword,
+ requestPasswordReset,
+ resetPassword,
+ clearError,
+ authApi: auth // Escape hatch to underlying SDK
+ };
+};
+
+export const useDb = () => {
+ const { db } = useUrContext();
+ if (!db) {
+ throw new Error('Database module not initialized.');
+ }
+ return db;
+};
+
+export const useStorage = () => {
+ const { storage } = useUrContext();
+ if (!storage) {
+ throw new Error('Storage module not initialized.');
+ }
+ return storage;
+};
diff --git a/sdks/urbackend-react/src/index.ts b/sdks/urbackend-react/src/index.ts
new file mode 100644
index 000000000..01e87f42f
--- /dev/null
+++ b/sdks/urbackend-react/src/index.ts
@@ -0,0 +1,8 @@
+export { UrProvider, useUrContext } from './context';
+export type { UrProviderProps } from './context';
+
+export { useAuth, useDb, useStorage } from './hooks';
+export { UrAuth } from './components/UrAuth';
+export type { UrAuthProps } from './components/UrAuth';
+
+export * from '@urbackend/sdk'; // re-export types so users don't need to import from sdk directly
diff --git a/sdks/urbackend-react/tests/UrAuth.test.tsx b/sdks/urbackend-react/tests/UrAuth.test.tsx
new file mode 100644
index 000000000..a4a2116c5
--- /dev/null
+++ b/sdks/urbackend-react/tests/UrAuth.test.tsx
@@ -0,0 +1,90 @@
+import React from 'react';
+import { render, screen, fireEvent, waitFor } from '@testing-library/react';
+import { describe, it, expect, vi, beforeEach } from 'vitest';
+import { UrAuth } from '../src/components/UrAuth';
+
+// Mock the hooks module
+const mockLogin = vi.fn();
+const mockSignUp = vi.fn();
+const mockSocialLogin = vi.fn();
+const mockRequestPasswordReset = vi.fn();
+const mockResetPassword = vi.fn();
+const mockClearError = vi.fn();
+
+vi.mock('../src/hooks', () => ({
+ useAuth: () => ({
+ login: mockLogin,
+ signUp: mockSignUp,
+ socialLogin: mockSocialLogin,
+ requestPasswordReset: mockRequestPasswordReset,
+ resetPassword: mockResetPassword,
+ isLoading: false,
+ error: null,
+ clearError: mockClearError,
+ }),
+}));
+
+describe('UrAuth Component', () => {
+ beforeEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('renders login form by default', () => {
+ render();
+
+ expect(screen.getByPlaceholderText('Enter your email address')).toBeInTheDocument();
+ expect(screen.getByPlaceholderText('Enter your password')).toBeInTheDocument();
+ expect(screen.getByRole('button', { name: 'Log In' })).toBeInTheDocument();
+ });
+
+ it('switches to signup form', () => {
+ render();
+
+ const signupToggle = screen.getAllByText('Sign Up')[0]; // Top switcher
+ fireEvent.click(signupToggle);
+
+ expect(screen.getByPlaceholderText('Enter your name')).toBeInTheDocument();
+ expect(screen.getByRole('button', { name: 'Create Account' })).toBeInTheDocument();
+ });
+
+ it('calls login on submit', async () => {
+ mockLogin.mockResolvedValueOnce(undefined);
+ render( {}} />);
+
+ fireEvent.change(screen.getByPlaceholderText('Enter your email address'), { target: { value: 'test@example.com' } });
+ fireEvent.change(screen.getByPlaceholderText('Enter your password'), { target: { value: 'password123' } });
+
+ fireEvent.click(screen.getByRole('button', { name: 'Log In' }));
+
+ await waitFor(() => {
+ expect(mockLogin).toHaveBeenCalledWith({ email: 'test@example.com', password: 'password123' });
+ });
+ });
+
+ it('calls socialLogin when a provider button is clicked', () => {
+ render();
+
+ fireEvent.click(screen.getByText('Continue with Google'));
+ expect(mockSocialLogin).toHaveBeenCalledWith('google');
+
+ fireEvent.click(screen.getByText('Continue with GitHub'));
+ expect(mockSocialLogin).toHaveBeenCalledWith('github');
+ });
+
+ it('switches to forgot password flow', async () => {
+ render();
+
+ fireEvent.click(screen.getByText('Forgot password?'));
+
+ expect(screen.getByText('Reset Password')).toBeInTheDocument();
+ expect(screen.getByRole('button', { name: 'Send Reset Code' })).toBeInTheDocument();
+
+ mockRequestPasswordReset.mockResolvedValueOnce(undefined);
+ fireEvent.change(screen.getByPlaceholderText('Enter your email address'), { target: { value: 'test@example.com' } });
+ fireEvent.click(screen.getByRole('button', { name: 'Send Reset Code' }));
+
+ await waitFor(() => {
+ expect(mockRequestPasswordReset).toHaveBeenCalledWith({ email: 'test@example.com' });
+ });
+ });
+});
diff --git a/sdks/urbackend-react/tests/context.test.tsx b/sdks/urbackend-react/tests/context.test.tsx
new file mode 100644
index 000000000..5be9b8aea
--- /dev/null
+++ b/sdks/urbackend-react/tests/context.test.tsx
@@ -0,0 +1,105 @@
+import React from 'react';
+import { render, screen, waitFor } from '@testing-library/react';
+import { describe, it, expect, vi, beforeEach } from 'vitest';
+import { UrProvider, useUrContext } from '../src/context';
+import { AuthModule } from '@urbackend/sdk';
+
+// Mock the SDK modules
+vi.mock('@urbackend/sdk', () => {
+ const MockAuthModule = vi.fn().mockImplementation(() => ({
+ setToken: vi.fn(),
+ refreshToken: vi.fn().mockResolvedValue(undefined),
+ me: vi.fn().mockResolvedValue({ id: 'user123', email: 'test@example.com' }),
+ socialExchange: vi.fn().mockResolvedValue({ refreshToken: 'fake-rt' }),
+ }));
+
+ return {
+ UrBackendClient: vi.fn(),
+ AuthModule: MockAuthModule,
+ DatabaseModule: vi.fn(),
+ StorageModule: vi.fn(),
+ };
+});
+
+describe('UrProvider & useUrContext', () => {
+ beforeEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('throws an error if useUrContext is used outside UrProvider', () => {
+ const TestComponent = () => {
+ useUrContext();
+ return Test
;
+ };
+
+ // React Error Boundary catch
+ const consoleError = vi.spyOn(console, 'error').mockImplementation(() => {});
+
+ expect(() => render()).toThrow('useUrContext must be used within an UrProvider');
+
+ consoleError.mockRestore();
+ });
+
+ it('initializes context and fetches user', async () => {
+ const TestComponent = () => {
+ const { user, isInitializing } = useUrContext();
+ if (isInitializing) return Loading...
;
+ return User: {user?.email}
;
+ };
+
+ render(
+
+
+
+ );
+
+ expect(screen.getByText('Loading...')).toBeInTheDocument();
+
+ await waitFor(() => {
+ expect(screen.getByText('User: test@example.com')).toBeInTheDocument();
+ });
+ });
+
+ it('exchanges social token and rtCode if present in URL', async () => {
+ // Mock window.location
+ const originalLocation = window.location;
+ // @ts-ignore
+ delete window.location;
+ window.location = {
+ ...originalLocation,
+ search: '?rtCode=test-rt-code',
+ hash: '#token=test-temp-token',
+ pathname: '/auth/callback',
+ replaceState: vi.fn(),
+ } as any;
+
+ const TestComponent = () => {
+ const { isInitializing } = useUrContext();
+ if (isInitializing) return Loading...
;
+ return Ready
;
+ };
+
+ render(
+
+
+
+ );
+
+ await waitFor(() => {
+ expect(screen.getByText('Ready')).toBeInTheDocument();
+ });
+
+ // We can't access the specific instance directly, but we can check if the methods on the mock prototype were called
+ // Since AuthModule is mocked to return the object above, we can check its methods.
+ // However, vitest module mocking returns the factory. Let's just verify it using a spy on a global or check the logic.
+ // Actually, since we redefined AuthModule mock above, we need to inspect the instances.
+ const mockAuthInstance = vi.mocked(AuthModule).mock.results[0]?.value;
+ if (mockAuthInstance) {
+ expect(mockAuthInstance.setToken).toHaveBeenCalledWith('test-temp-token');
+ expect(mockAuthInstance.socialExchange).toHaveBeenCalledWith({ token: 'test-temp-token', rtCode: 'test-rt-code' });
+ }
+
+ // Restore window.location
+ window.location = originalLocation;
+ });
+});
diff --git a/sdks/urbackend-react/tests/setupTests.ts b/sdks/urbackend-react/tests/setupTests.ts
new file mode 100644
index 000000000..7b0828bfa
--- /dev/null
+++ b/sdks/urbackend-react/tests/setupTests.ts
@@ -0,0 +1 @@
+import '@testing-library/jest-dom';
diff --git a/sdks/urbackend-react/tsconfig.json b/sdks/urbackend-react/tsconfig.json
new file mode 100644
index 000000000..6d545f543
--- /dev/null
+++ b/sdks/urbackend-react/tsconfig.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"]
+}
diff --git a/sdks/urbackend-react/tsup.config.ts b/sdks/urbackend-react/tsup.config.ts
new file mode 100644
index 000000000..622a1f085
--- /dev/null
+++ b/sdks/urbackend-react/tsup.config.ts
@@ -0,0 +1,11 @@
+import { defineConfig } from 'tsup';
+
+export default defineConfig({
+ entry: ['src/index.ts'],
+ format: ['cjs', 'esm'],
+ dts: true,
+ splitting: false,
+ sourcemap: true,
+ clean: true,
+ external: ['react', 'react-dom'],
+});
diff --git a/sdks/urbackend-react/vitest.config.ts b/sdks/urbackend-react/vitest.config.ts
new file mode 100644
index 000000000..fe82c1db0
--- /dev/null
+++ b/sdks/urbackend-react/vitest.config.ts
@@ -0,0 +1,9 @@
+import { defineConfig } from 'vitest/config';
+
+export default defineConfig({
+ test: {
+ environment: 'jsdom',
+ globals: true,
+ setupFiles: ['./tests/setupTests.ts'],
+ },
+});
diff --git a/sdks/urbackend-sdk/package-lock.json b/sdks/urbackend-sdk/package-lock.json
index da28a4b23..bd45a655f 100644
--- a/sdks/urbackend-sdk/package-lock.json
+++ b/sdks/urbackend-sdk/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@urbackend/sdk",
- "version": "0.4.1",
+ "version": "0.4.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@urbackend/sdk",
- "version": "0.4.1",
+ "version": "0.4.2",
"license": "MIT",
"dependencies": {
"client": "file:../../examples/sdk-kanban/client"
diff --git a/sdks/urbackend-sdk/package.json b/sdks/urbackend-sdk/package.json
index 8dfdfaf00..a051104cf 100644
--- a/sdks/urbackend-sdk/package.json
+++ b/sdks/urbackend-sdk/package.json
@@ -1,6 +1,6 @@
{
"name": "@urbackend/sdk",
- "version": "0.4.1",
+ "version": "0.4.2",
"description": "Official TypeScript SDK for urBackend BaaS",
"type": "module",
"files": [
diff --git a/sdks/urbackend-sdk/src/errors.ts b/sdks/urbackend-sdk/src/errors.ts
index 4e3680fba..09edd284b 100644
--- a/sdks/urbackend-sdk/src/errors.ts
+++ b/sdks/urbackend-sdk/src/errors.ts
@@ -54,8 +54,22 @@ export async function parseApiError(response: Response): Promise
try {
data = await response.json();
- if (typeof data === 'object' && data !== null && 'message' in data) {
- message = (data as { message: string }).message || message;
+ if (typeof data === 'object' && data !== null) {
+ if ('error' in data) {
+ if (typeof (data as any).error === 'string') {
+ message = (data as any).error;
+ } else if (Array.isArray((data as any).error) && (data as any).error.length > 0) {
+ message = (data as any).error.map((e: any) => e.message || String(e)).join(', ');
+ } else {
+ message = JSON.stringify((data as any).error);
+ }
+ } else if ('message' in data) {
+ if (typeof (data as any).message === 'string') {
+ message = (data as any).message;
+ } else {
+ message = JSON.stringify((data as any).message);
+ }
+ }
}
} catch {
// If not JSON, use status text
diff --git a/sdks/urbackend-sdk/src/modules/auth.ts b/sdks/urbackend-sdk/src/modules/auth.ts
index abbaaae08..0344058f6 100644
--- a/sdks/urbackend-sdk/src/modules/auth.ts
+++ b/sdks/urbackend-sdk/src/modules/auth.ts
@@ -494,8 +494,8 @@ export class AuthModule {
* Exchanges social authentication rtCode for a refresh token
*
* @param {SocialExchangePayload} payload - Social exchange data
+ * @param {string} payload.token - Access token fragment from social provider
* @param {string} payload.rtCode - Return code from social provider
- * @param {string} payload.provider - Social provider ('github' or 'google')
* @returns {Promise} Promise resolving to authentication response
*
* @throws {AuthError} If rtCode is invalid or expired
@@ -503,12 +503,12 @@ export class AuthModule {
*
* @example
* // After user returns from social login
- * const rtCode = new URLSearchParams(window.location.search).get('rtCode');
- * if (rtCode) {
- * const response = await auth.socialExchange({
- * rtCode: rtCode,
- * provider: 'github'
- * });
+ * const urlParams = new URLSearchParams(window.location.search);
+ * const hashParams = new URLSearchParams(window.location.hash.substring(1));
+ * const rtCode = urlParams.get('rtCode');
+ * const token = hashParams.get('token');
+ * if (rtCode && token) {
+ * const response = await auth.socialExchange({ token, rtCode });
* console.log('Social login successful:', response.accessToken);
* }
*/