diff --git a/apps/studio/CHANGELOG.md b/apps/studio/CHANGELOG.md index 05da9f780d..825b89c1a2 100644 --- a/apps/studio/CHANGELOG.md +++ b/apps/studio/CHANGELOG.md @@ -1,5 +1,17 @@ # @objectstack/studio +## 3.2.8 + +### Minor Changes + +- Switch Vercel deployment from MSW (browser mock) to real server mode + - Add `api/[...path].ts` Vercel serverless catch-all using Hono + `@objectstack/hono` + - Add `api/_kernel.ts` server-side kernel singleton with broker shim + - Extract broker shim to `src/lib/create-broker-shim.ts` (shared by MSW and server modes) + - Update `vercel.json` to set `VITE_RUNTIME_MODE=server` and `VITE_SERVER_URL=""` + - Add `hono` and `@objectstack/hono` dependencies + - Update deployment documentation + ## 3.2.7 ### Patch Changes diff --git a/apps/studio/api/[...path].ts b/apps/studio/api/[...path].ts new file mode 100644 index 0000000000..1264c558ab --- /dev/null +++ b/apps/studio/api/[...path].ts @@ -0,0 +1,30 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Vercel Serverless Catch-All Route + * + * Handles all /api/* requests using the ObjectStack Hono application. + * The Hono app provides discovery, data CRUD, metadata, auth, and more + * endpoints under the /api/v1 prefix. + * + * File name convention: Vercel maps `[...path].ts` to a catch-all route + * that matches /api and any sub-paths (/api/v1/data/task, etc.). + */ + +import { Hono } from 'hono'; +import { handle } from 'hono/vercel'; +import { getApp } from './_kernel'; + +/** + * Outer Hono app — synchronously created so it can be wrapped by handle(). + * Delegates all requests to the lazy-initialized inner app (which boots + * the ObjectStack kernel on first invocation). + */ +const app = new Hono(); + +app.all('/*', async (c) => { + const inner = await getApp(); + return inner.fetch(c.req.raw); +}); + +export default handle(app); diff --git a/apps/studio/api/_kernel.ts b/apps/studio/api/_kernel.ts new file mode 100644 index 0000000000..8d1a41bcb0 --- /dev/null +++ b/apps/studio/api/_kernel.ts @@ -0,0 +1,109 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Server-side Kernel Singleton for Vercel Serverless Functions + * + * Boots an ObjectKernel with ObjectQL + InMemoryDriver, seeds data from + * the Studio configuration, and exposes a Hono app via createHonoApp. + * + * The kernel instance survives across warm invocations of the same + * serverless function container, so boot cost is paid only on cold start. + * + * @module + */ + +import { ObjectKernel, DriverPlugin, AppPlugin } from '@objectstack/runtime'; +import { ObjectQLPlugin } from '@objectstack/objectql'; +import { InMemoryDriver } from '@objectstack/driver-memory'; +import { createHonoApp } from '@objectstack/hono'; +import { Hono } from 'hono'; +import { createBrokerShim } from '../src/lib/create-broker-shim'; +import studioConfig from '../objectstack.config'; + +// --- Singleton state (persists across warm invocations) --- +let _kernel: ObjectKernel | null = null; +let _app: Hono | null = null; + +/** + * Boot the ObjectStack kernel (one-time cold-start cost). + */ +async function bootKernel(): Promise { + if (_kernel) return _kernel; + + console.log('[Vercel] Booting ObjectStack Kernel (server mode)...'); + + const kernel = new ObjectKernel(); + + await kernel.use(new ObjectQLPlugin()); + await kernel.use(new DriverPlugin(new InMemoryDriver(), 'memory')); + await kernel.use(new AppPlugin(studioConfig)); + + // Broker shim — bridges HttpDispatcher → ObjectQL engine + (kernel as any).broker = createBrokerShim(kernel); + + await kernel.bootstrap(); + + // Seed data from config + await seedData(kernel, [studioConfig]); + + _kernel = kernel; + console.log('[Vercel] Kernel ready.'); + return kernel; +} + +/** + * Seed records defined in app configs into the ObjectQL engine. + */ +async function seedData(kernel: ObjectKernel, configs: any[]) { + const ql = (kernel as any).context?.getService('objectql'); + if (!ql) return; + + // Reserved namespaces ('base', 'system') bypass FQN transformation — + // objects in these namespaces keep their short name as-is. + const RESERVED_NS = new Set(['base', 'system']); + const toFQN = (name: string, namespace?: string) => { + if (name.includes('__') || !namespace || RESERVED_NS.has(namespace)) return name; + return `${namespace}__${name}`; + }; + + for (const appConfig of configs) { + const namespace = (appConfig.manifest || appConfig)?.namespace as string | undefined; + + const seedDatasets: any[] = []; + if (Array.isArray(appConfig.data)) { + seedDatasets.push(...appConfig.data); + } + if (appConfig.manifest && Array.isArray(appConfig.manifest.data)) { + seedDatasets.push(...appConfig.manifest.data); + } + + for (const dataset of seedDatasets) { + if (!dataset.records || !dataset.object) continue; + + const objectFQN = toFQN(dataset.object, namespace); + + // Handle PaginatedResult wrapper — InMemoryDriver may return { value: [...] } + let existing = await ql.find(objectFQN); + if (existing && (existing as any).value) existing = (existing as any).value; + + if (!existing || existing.length === 0) { + console.log(`[Vercel] Seeding ${dataset.records.length} records for ${objectFQN}`); + for (const record of dataset.records) { + await ql.insert(objectFQN, record); + } + } + } + } +} + +/** + * Get (or create) the Hono application backed by the ObjectStack kernel. + * The prefix `/api/v1` matches the client SDK's default API path. + */ +export async function getApp(): Promise { + if (_app) return _app; + + const kernel = await bootKernel(); + _app = createHonoApp({ kernel, prefix: '/api/v1' }); + return _app; +} diff --git a/apps/studio/package.json b/apps/studio/package.json index 5f64b1a37b..18470f1714 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -20,6 +20,7 @@ "@objectstack/client": "workspace:*", "@objectstack/client-react": "workspace:*", "@objectstack/driver-memory": "workspace:*", + "@objectstack/hono": "workspace:*", "@objectstack/metadata": "workspace:*", "@objectstack/objectql": "workspace:*", "@objectstack/plugin-msw": "workspace:*", @@ -56,11 +57,12 @@ "@vitejs/plugin-react": "^6.0.1", "autoprefixer": "^10.4.27", "happy-dom": "^20.8.4", + "hono": "^4.12.8", "msw": "^2.12.13", "postcss": "^8.5.8", "tailwindcss": "^4.2.1", "typescript": "^5.0.0", - "vite": "^7.3.1", + "vite": "^8.0.0", "vitest": "^4.1.0" }, "msw": { diff --git a/apps/studio/src/lib/create-broker-shim.ts b/apps/studio/src/lib/create-broker-shim.ts new file mode 100644 index 0000000000..de5fc68ce6 --- /dev/null +++ b/apps/studio/src/lib/create-broker-shim.ts @@ -0,0 +1,271 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Broker Shim Factory + * + * Creates an in-process broker shim that bridges HttpDispatcher calls + * to ObjectQL engine operations. Required by both MSW (browser) and + * Hono (server) modes since the simplified kernel setup does not include + * a full message broker. + * + * @module + */ + +import { SchemaRegistry } from '@objectstack/objectql'; + +/** + * Minimal broker interface expected by HttpDispatcher + */ +export interface BrokerShim { + call(action: string, params: any, opts?: any): Promise; +} + +/** + * Create a broker shim bound to the given kernel instance. + * + * The shim delegates data/metadata/package actions to the ObjectQL engine + * and SchemaRegistry that were registered on the kernel during bootstrap. + */ +export function createBrokerShim(kernel: any): BrokerShim { + return { + call: async (action: string, params: any, _opts: any) => { + const parts = action.split('.'); + const service = parts[0]; + const method = parts[1]; + + // Get Engines + const ql = kernel.context?.getService('objectql'); + + if (service === 'data') { + // Delegate to protocol service when available for proper expand/populate support + const protocol = kernel.context?.getService('protocol'); + // All data responses conform to protocol.zod.ts schemas: + // CreateDataResponse = { object, id, record } + // GetDataResponse = { object, id, record } + // FindDataResponse = { object, records, total?, hasMore? } + // UpdateDataResponse = { object, id, record } + // DeleteDataResponse = { object, id, deleted } + if (method === 'create') { + const res = await ql.insert(params.object, params.data); + const record = { ...params.data, ...res }; + return { object: params.object, id: record.id, record }; + } + if (method === 'get') { + // Delegate to protocol for proper expand/select support + if (protocol) { + return await protocol.getData({ object: params.object, id: params.id, expand: params.expand, select: params.select }); + } + let all = await ql.find(params.object); + if (!all) all = []; + const match = all.find((i: any) => i.id === params.id); + return match ? { object: params.object, id: params.id, record: match } : null; + } + if (method === 'update') { + if (params.id) { + let all = await ql.find(params.object); + + if (all && (all as any).value) all = (all as any).value; + if (!all) all = []; + + const existing = all.find((i: any) => i.id === params.id); + + if (!existing) { + console.warn(`[BrokerShim] Update failed: Record ${params.id} not found.`); + throw new Error('[ObjectStack] Not Found'); + } + + try { + await ql.update(params.object, params.data, { filter: params.id }); + } catch (err: any) { + console.warn(`[BrokerShim] update failed: ${err.message}`); + throw err; + } + + return { object: params.object, id: params.id, record: { ...existing, ...params.data } }; + } + return null; + } + if (method === 'delete') { + try { + await ql.delete(params.object, { filter: params.id }); + return { object: params.object, id: params.id, deleted: true }; + } catch (err: any) { + console.warn(`[BrokerShim] delete failed: ${err.message}`); + throw err; + } + } + if (method === 'find' || method === 'query') { + // Delegate to protocol for proper expand/populate support + if (protocol) { + return await protocol.findData({ object: params.object, query: params.query || params.filters }); + } + let all = await ql.find(params.object); + + // Handle PaginatedResult { value: [...] } vs Array [...] + if (!Array.isArray(all) && all && (all as any).value) { + all = (all as any).value; + } + + if (!all) all = []; + + const filters = params.query || params.filters; + let queryOptions: any = {}; + if (filters && typeof filters === 'object') { + const reserved = ['top', 'skip', 'sort', 'select', 'expand', 'count', 'search']; + reserved.forEach(opt => { + if (filters[opt] !== undefined) { + queryOptions[opt] = filters[opt]; + } + }); + } + + if (filters && typeof filters === 'object' && !Array.isArray(filters)) { + const reserved = ['top', 'skip', 'sort', 'select', 'expand', 'count', 'search']; + const keys = Object.keys(filters).filter(k => !reserved.includes(k)); + + if (keys.length > 0) { + all = all.filter((item: any) => { + return keys.every(k => { + return String(item[k]) == String(filters[k]); + }); + }); + } + } + + // --- Sort --- + if (queryOptions.sort) { + const sortFields = String(queryOptions.sort).split(',').map(s => s.trim()); + all.sort((a: any, b: any) => { + for (const field of sortFields) { + const desc = field.startsWith('-'); + const key = desc ? field.substring(1) : field; + if (a[key] < b[key]) return desc ? 1 : -1; + if (a[key] > b[key]) return desc ? -1 : 1; + } + return 0; + }); + } + + // --- Select --- + if (queryOptions.select) { + const selectFields = Array.isArray(queryOptions.select) + ? queryOptions.select + : String(queryOptions.select).split(',').map((s: string) => s.trim()); + + all = all.map((item: any) => { + const projected: any = { id: item.id }; // Always include ID + selectFields.forEach((f: string) => { + if (item[f] !== undefined) projected[f] = item[f]; + }); + return projected; + }); + } + + // --- Skip/Top --- + const totalCount = all.length; + const skip = parseInt(queryOptions.skip) || 0; + const top = parseInt(queryOptions.top); + + if (skip > 0) { + all = all.slice(skip); + } + if (!isNaN(top)) { + all = all.slice(0, top); + } + + return { object: params.object, records: all, total: totalCount }; + } + } + + if (service === 'metadata') { + if (method === 'types') { + return { types: SchemaRegistry.getRegisteredTypes() }; + } + if (method === 'objects') { + const packageId = params.packageId; + let objs = (ql && typeof ql.getObjects === 'function') ? ql.getObjects() : []; + + if (!objs || objs.length === 0) { + objs = SchemaRegistry.getAllObjects(packageId); + } else if (packageId) { + objs = objs.filter((o: any) => o._packageId === packageId); + } + return { type: 'object', items: objs }; + } + if (method === 'getObject' || method === 'getItem') { + if (!params.objectName && !params.name) { + return SchemaRegistry.getAllObjects(); + } + + const name = params.objectName || params.name; + + let def = SchemaRegistry.getObject(name); + + if (!def && ql && typeof (ql as any).getObject === 'function') { + def = (ql as any).getObject(name); + } + return def || null; + } + // Generic metadata type: metadata. → SchemaRegistry.listItems(type, packageId?) + const packageId = params.packageId; + const items = SchemaRegistry.listItems(method, packageId); + if (items && items.length > 0) { + return { type: method, items }; + } + return { type: method, items: [] }; + } + + // Package Management Actions + if (service === 'package') { + if (method === 'list') { + let packages = SchemaRegistry.getAllPackages(); + if (params.status) { + packages = packages.filter((p: any) => p.status === params.status); + } + if (params.type) { + packages = packages.filter((p: any) => p.manifest?.type === params.type); + } + if (params.enabled !== undefined) { + packages = packages.filter((p: any) => p.enabled === params.enabled); + } + return { packages, total: packages.length }; + } + if (method === 'get') { + const pkg = SchemaRegistry.getPackage(params.id); + if (!pkg) throw new Error(`Package not found: ${params.id}`); + return { package: pkg }; + } + if (method === 'install') { + const manifest = params.manifest; + const id = manifest?.id || manifest?.name; + + if (ql && typeof (ql as any).registerApp === 'function') { + (ql as any).registerApp(manifest); + } else { + SchemaRegistry.installPackage(manifest, params.settings); + } + + const pkg = id ? SchemaRegistry.getPackage(id) : null; + return { package: pkg, message: `Package ${id || 'unknown'} installed successfully` }; + } + if (method === 'uninstall') { + const success = SchemaRegistry.uninstallPackage(params.id); + return { id: params.id, success, message: success ? 'Uninstalled' : 'Not found' }; + } + if (method === 'enable') { + const pkg = SchemaRegistry.enablePackage(params.id); + if (!pkg) throw new Error(`Package not found: ${params.id}`); + return { package: pkg, message: `Package ${params.id} enabled` }; + } + if (method === 'disable') { + const pkg = SchemaRegistry.disablePackage(params.id); + if (!pkg) throw new Error(`Package not found: ${params.id}`); + return { package: pkg, message: `Package ${params.id} disabled` }; + } + } + + console.warn(`[BrokerShim] Action not implemented: ${action}`); + return null; + } + }; +} diff --git a/apps/studio/src/mocks/createKernel.ts b/apps/studio/src/mocks/createKernel.ts index f94b03a9b7..f663273dc2 100644 --- a/apps/studio/src/mocks/createKernel.ts +++ b/apps/studio/src/mocks/createKernel.ts @@ -1,9 +1,10 @@ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. import { ObjectKernel, DriverPlugin, AppPlugin } from '@objectstack/runtime'; -import { ObjectQLPlugin, SchemaRegistry } from '@objectstack/objectql'; +import { ObjectQLPlugin } from '@objectstack/objectql'; import { InMemoryDriver } from '@objectstack/driver-memory'; import { MSWPlugin } from '@objectstack/plugin-msw'; +import { createBrokerShim } from '../lib/create-broker-shim'; // System object definitions — resolved via Vite aliases to plugin source (no runtime deps) import { @@ -82,272 +83,7 @@ export async function createKernel(options: KernelOptions) { // --- BROKER SHIM (MUST be registered BEFORE MSWPlugin) --- // HttpDispatcher requires a broker to function. We inject a shim. - (kernel as any).broker = { - call: async (action: string, params: any, _opts: any) => { - const parts = action.split('.'); - const service = parts[0]; - const method = parts[1]; - - // Get Engines - const ql = (kernel as any).context?.getService('objectql'); - - if (service === 'data') { - // Delegate to protocol service when available for proper expand/populate support - const protocol = (kernel as any).context?.getService('protocol'); - // All data responses conform to protocol.zod.ts schemas: - // CreateDataResponse = { object, id, record } - // GetDataResponse = { object, id, record } - // FindDataResponse = { object, records, total?, hasMore? } - // UpdateDataResponse = { object, id, record } - // DeleteDataResponse = { object, id, deleted } - if (method === 'create') { - const res = await ql.insert(params.object, params.data); - const record = { ...params.data, ...res }; - return { object: params.object, id: record.id, record }; - } - if (method === 'get') { - // Delegate to protocol for proper expand/select support - if (protocol) { - return await protocol.getData({ object: params.object, id: params.id, expand: params.expand, select: params.select }); - } - let all = await ql.find(params.object); - if (!all) all = []; - const match = all.find((i: any) => i.id === params.id); - return match ? { object: params.object, id: params.id, record: match } : null; - } - if (method === 'update') { - if (params.id) { - // Robust check: Manually find the record in memory since ql.find(obj, id) might not be supported by this specific mock driver setup - let all = await ql.find(params.object); - - if (all && (all as any).value) all = (all as any).value; - if (!all) all = []; - - const existing = all.find((i: any) => i.id === params.id); - - if (!existing) { - console.warn(`[BrokerShim] Update failed: Record ${params.id} not found.`); - throw new Error('[ObjectStack] Not Found'); - } - - // Perform update using the ObjectQL Engine signature: update(object, data, options) - // where options.filter can be the ID string - try { - await ql.update(params.object, params.data, { filter: params.id }); - } catch (err: any) { - console.warn(`[BrokerShim] update failed: ${err.message}`); - throw err; - } - - return { object: params.object, id: params.id, record: { ...existing, ...params.data } }; - } - return null; - } - if (method === 'delete') { - try { - // ql.delete(object, options) where options.filter is ID - await ql.delete(params.object, { filter: params.id }); - return { object: params.object, id: params.id, deleted: true }; - } catch (err: any) { - console.warn(`[BrokerShim] delete failed: ${err.message}`); - throw err; - } - } - if (method === 'find' || method === 'query') { - // Delegate to protocol for proper expand/populate support - if (protocol) { - return await protocol.findData({ object: params.object, query: params.query || params.filters }); - } - let all = await ql.find(params.object); - - // DEBUG SHIM - // console.log(`[BrokerShim debug] Incoming Params:`, JSON.stringify(params, null, 2)); - // console.log(`[BrokerShim debug] Raw ql.find result type: ${typeof all}, isArray: ${Array.isArray(all)}, value:`, all); - - // Handle PaginatedResult { value: [...] } vs Array [...] - if (!Array.isArray(all) && all && (all as any).value) { - console.log('[BrokerShim debug] Detected PaginatedResult wrapper, unwrapping .value'); - all = (all as any).value; - } - - if (!all) all = []; - - const filters = params.query || params.filters; - // Extract standard query options possibly passed via filters (due to MSW plugin mapping) - let queryOptions: any = {}; - if (filters && typeof filters === 'object') { - const reserved = ['top', 'skip', 'sort', 'select', 'expand', 'count', 'search']; - reserved.forEach(opt => { - if (filters[opt] !== undefined) { - queryOptions[opt] = filters[opt]; - } - }); - } - - if (filters && typeof filters === 'object' && !Array.isArray(filters)) { - // Filter out reserved query parameters that are NOT field names - const reserved = ['top', 'skip', 'sort', 'select', 'expand', 'count', 'search']; - const keys = Object.keys(filters).filter(k => !reserved.includes(k)); - - if (keys.length > 0) { - // console.log('[BrokerShim debug] Applying filters:', keys); - all = all.filter((item: any) => { - return keys.every(k => { - // Loose equality check - return String(item[k]) == String(filters[k]); - }); - }); - } - } - - // --- Sort --- - if (queryOptions.sort) { - const sortFields = String(queryOptions.sort).split(',').map(s => s.trim()); - all.sort((a: any, b: any) => { - for (const field of sortFields) { - const desc = field.startsWith('-'); - const key = desc ? field.substring(1) : field; - if (a[key] < b[key]) return desc ? 1 : -1; - if (a[key] > b[key]) return desc ? -1 : 1; - } - return 0; - }); - } - - // --- Select --- - if (queryOptions.select) { - const selectFields = Array.isArray(queryOptions.select) - ? queryOptions.select - : String(queryOptions.select).split(',').map((s: string) => s.trim()); - - all = all.map((item: any) => { - const projected: any = { id: item.id }; // Always include ID - selectFields.forEach((f: string) => { - if (item[f] !== undefined) projected[f] = item[f]; - }); - return projected; - }); - } - - // --- Skip/Top --- - const totalCount = all.length; // Capture total BEFORE pagination - const skip = parseInt(queryOptions.skip) || 0; - const top = parseInt(queryOptions.top); // undefined is fine - - if (skip > 0) { - all = all.slice(skip); - } - if (!isNaN(top)) { - all = all.slice(0, top); - } - - console.log(`[BrokerShim] find/query(${params.object}) -> count: ${all.length}, total: ${totalCount}`); - // Spec: FindDataResponse = { object, records, total?, hasMore? } - return { object: params.object, records: all, total: totalCount }; - } - } - - if (service === 'metadata') { - if (method === 'types') { - // Return all registered metadata types - return { types: SchemaRegistry.getRegisteredTypes() }; - } - if (method === 'objects') { - // Return spec-compliant GetMetaItemsResponse - // Support optional packageId filter - const packageId = params.packageId; - let objs = (ql && typeof ql.getObjects === 'function') ? ql.getObjects() : []; - - if (!objs || objs.length === 0) { - objs = SchemaRegistry.getAllObjects(packageId); - } else if (packageId) { - objs = objs.filter((o: any) => o._packageId === packageId); - } - return { type: 'object', items: objs }; - } - if (method === 'getObject' || method === 'getItem') { - // Hack: If no objectName provided, it might be a list request mapped incorrectly - // or a request for the "object" type definition itself? - // For 'object', we usually want the list if no name. - if (!params.objectName && !params.name) { - return SchemaRegistry.getAllObjects(); - } - - const name = params.objectName || params.name; - - // Check registry first (synchronous cache) - let def = SchemaRegistry.getObject(name); - - // If not found, try engine (might be dynamic) - if (!def && ql && typeof (ql as any).getObject === 'function') { - def = (ql as any).getObject(name); - } - return def || null; - } - // Generic metadata type: metadata. → SchemaRegistry.listItems(type, packageId?) - const packageId = params.packageId; - const items = SchemaRegistry.listItems(method, packageId); - if (items && items.length > 0) { - return { type: method, items }; - } - return { type: method, items: [] }; - } - - // Package Management Actions - // Protocol: ListPackagesResponse, GetPackageResponse, InstallPackageResponse, etc. - if (service === 'package') { - if (method === 'list') { - let packages = SchemaRegistry.getAllPackages(); - // Apply optional filters - if (params.status) { - packages = packages.filter((p: any) => p.status === params.status); - } - if (params.type) { - packages = packages.filter((p: any) => p.manifest?.type === params.type); - } - if (params.enabled !== undefined) { - packages = packages.filter((p: any) => p.enabled === params.enabled); - } - return { packages, total: packages.length }; - } - if (method === 'get') { - const pkg = SchemaRegistry.getPackage(params.id); - if (!pkg) throw new Error(`Package not found: ${params.id}`); - return { package: pkg }; - } - if (method === 'install') { - const manifest = params.manifest; - const id = manifest?.id || manifest?.name; - - if (ql && typeof (ql as any).registerApp === 'function') { - (ql as any).registerApp(manifest); - } else { - SchemaRegistry.installPackage(manifest, params.settings); - } - - const pkg = id ? SchemaRegistry.getPackage(id) : null; - return { package: pkg, message: `Package ${id || 'unknown'} installed successfully` }; - } - if (method === 'uninstall') { - const success = SchemaRegistry.uninstallPackage(params.id); - return { id: params.id, success, message: success ? 'Uninstalled' : 'Not found' }; - } - if (method === 'enable') { - const pkg = SchemaRegistry.enablePackage(params.id); - if (!pkg) throw new Error(`Package not found: ${params.id}`); - return { package: pkg, message: `Package ${params.id} enabled` }; - } - if (method === 'disable') { - const pkg = SchemaRegistry.disablePackage(params.id); - if (!pkg) throw new Error(`Package not found: ${params.id}`); - return { package: pkg, message: `Package ${params.id} disabled` }; - } - } - - console.warn(`[BrokerShim] Action not implemented: ${action}`); - return null; - } - }; + (kernel as any).broker = createBrokerShim(kernel); // --- BROKER SHIM END --- // MSW Plugin (AFTER protocol service and broker shim are registered) diff --git a/apps/studio/vercel.json b/apps/studio/vercel.json index 03dd030416..b650627e1c 100644 --- a/apps/studio/vercel.json +++ b/apps/studio/vercel.json @@ -6,10 +6,11 @@ "outputDirectory": "dist", "build": { "env": { - "VITE_RUNTIME_MODE": "msw" + "VITE_RUNTIME_MODE": "server", + "VITE_SERVER_URL": "" } }, "rewrites": [ - { "source": "/(.*)", "destination": "/index.html" } + { "source": "/((?!api/).*)", "destination": "/index.html" } ] } diff --git a/content/docs/guides/deployment-vercel.mdx b/content/docs/guides/deployment-vercel.mdx index 36c5ccabd0..f574775913 100644 --- a/content/docs/guides/deployment-vercel.mdx +++ b/content/docs/guides/deployment-vercel.mdx @@ -1,16 +1,16 @@ --- title: Deploy to Vercel -description: Deploy ObjectStack applications to Vercel — MSW mode for static demos and Server mode for full-stack production +description: Deploy ObjectStack applications to Vercel — Server mode (recommended) for real API endpoints or MSW mode for static demos --- # Deploy to Vercel -ObjectStack supports two deployment modes on Vercel. Choose the mode that fits your use case: +ObjectStack supports two deployment modes on Vercel. **Server mode is recommended** for production and is the default for ObjectStack Studio. | Mode | Runtime | Vercel Feature | Use Case | | :--- | :--- | :--- | :--- | -| **MSW** | Browser (Service Worker) | Static Site | Demos, prototypes, offline-capable apps | -| **Server** | Node.js / Edge | Serverless Functions | Production apps with real database | +| **Server** (default) | Node.js / Edge | Serverless Functions | Production apps, Studio, real database | +| **MSW** | Browser (Service Worker) | Static Site | Offline-only demos, prototypes | --- @@ -264,77 +264,82 @@ export { handler as GET, handler as POST, handler as PATCH, handler as DELETE }; } ``` -### Option B: Hono on Vercel Edge +### Option B: Hono + `@objectstack/hono` (Vite SPA) -Use the `@objectstack/hono` adapter for lightweight Edge Function deployments: +This is what ObjectStack Studio uses. The Vite SPA is served as static assets, and a Hono-based serverless function handles `/api/*` requests. + +**1. Create the kernel singleton** (`api/_kernel.ts` — prefixed with `_` to prevent Vercel from creating a route): ```typescript -// api/[...route].ts (Vercel Edge Function) -import { Hono } from 'hono'; -import { handle } from 'hono/vercel'; -import { ObjectKernel, DriverPlugin, AppPlugin, HttpDispatcher } from '@objectstack/runtime'; +// api/_kernel.ts +import { ObjectKernel, DriverPlugin, AppPlugin } from '@objectstack/runtime'; import { ObjectQLPlugin } from '@objectstack/objectql'; +import { InMemoryDriver } from '@objectstack/driver-memory'; +import { createHonoApp } from '@objectstack/hono'; +import { Hono } from 'hono'; import appConfig from '../objectstack.config'; -export const config = { runtime: 'edge' }; - -const app = new Hono().basePath('/api'); +let _kernel: ObjectKernel | null = null; +let _app: Hono | null = null; + +async function bootKernel(): Promise { + if (_kernel) return _kernel; + _kernel = new ObjectKernel(); + await _kernel.use(new ObjectQLPlugin()); + await _kernel.use(new DriverPlugin(new InMemoryDriver(), 'memory')); + await _kernel.use(new AppPlugin(appConfig)); + await _kernel.bootstrap(); + return _kernel; +} -// Initialize kernel (singleton — survives across warm invocations) -let kernel: ObjectKernel | null = null; -async function getKernel() { - if (kernel) return kernel; - kernel = new ObjectKernel(); - await kernel.use(new ObjectQLPlugin()); - // await kernel.use(new DriverPlugin(yourDriver)); - await kernel.use(new AppPlugin(appConfig)); - await kernel.bootstrap(); - return kernel; +export async function getApp(): Promise { + if (_app) return _app; + const kernel = await bootKernel(); + _app = createHonoApp({ kernel, prefix: '/api/v1' }); + return _app; } +``` -// Catch-all route — delegates to HttpDispatcher -app.all('/*', async (c) => { - const k = await getKernel(); - const dispatcher = new HttpDispatcher(k); - const method = c.req.method; - const url = new URL(c.req.url); - const segments = url.pathname.replace(/^\/api\//, '').split('/').filter(Boolean); - - // Dispatch based on first segment (data, meta, auth, etc.) - const body = ['POST', 'PATCH', 'PUT'].includes(method) - ? await c.req.json().catch(() => ({})) - : {}; - - const subPath = segments.slice(1).join('/'); - let result; - - switch (segments[0]) { - case 'data': - const queryParams: Record = {}; - url.searchParams.forEach((v, k) => (queryParams[k] = v)); - result = await dispatcher.handleData(subPath, method, body, queryParams, {}); - break; - case 'meta': - result = await dispatcher.handleMetadata(subPath, {}, method, body); - break; - default: - return c.json({ error: 'Not Found' }, 404); - } +**2. Create the catch-all serverless function** (`api/[...path].ts`): - if (result.handled && result.response) { - return c.json(result.response.body, result.response.status as any); - } - return c.json({ error: 'Not Found' }, 404); +```typescript +// api/[...path].ts +import { Hono } from 'hono'; +import { handle } from 'hono/vercel'; +import { getApp } from './_kernel'; + +const app = new Hono(); + +app.all('/*', async (c) => { + const inner = await getApp(); + return inner.fetch(c.req.raw); }); -export const GET = handle(app); -export const POST = handle(app); -export const PATCH = handle(app); -export const DELETE = handle(app); +export default handle(app); +``` + +**3. `vercel.json`:** + +```json +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "framework": "vite", + "buildCommand": "vite build", + "outputDirectory": "dist", + "build": { + "env": { + "VITE_RUNTIME_MODE": "server", + "VITE_SERVER_URL": "" + } + }, + "rewrites": [ + { "source": "/((?!api/).*)", "destination": "/index.html" } + ] +} ``` -The Next.js adapter (Option A) is recommended for most Vercel deployments because it handles all protocol endpoints automatically. Use the Hono approach when you need fine-grained control over routing or Edge runtime. +Setting `VITE_SERVER_URL` to empty string tells the client SDK to use same-origin API calls. The `rewrites` rule excludes `/api/` paths so they reach the serverless function, while all other paths serve the SPA. --- @@ -374,20 +379,22 @@ This is controlled by the config module which checks (in priority order): ## Deployment Checklist -### MSW Mode +### Server Mode (Recommended) + +- [ ] `api/[...path].ts` catch-all serverless function exists +- [ ] `api/_kernel.ts` boots the kernel with the correct driver and broker shim +- [ ] `vercel.json` sets `VITE_RUNTIME_MODE=server` and `VITE_SERVER_URL=` (empty) +- [ ] Rewrite rule excludes `/api/` paths: `/((?!api/).*)` +- [ ] `DATABASE_URL` is configured in Vercel environment variables (for production drivers) +- [ ] CORS is configured if frontend and API are on different origins + +### MSW Mode (Static Demo) - [ ] `msw init public --save` has been run (Service Worker in `public/`) - [ ] `vercel.json` specifies `"framework": "vite"` and SPA rewrites - [ ] `VITE_RUNTIME_MODE=msw` is set in build environment - [ ] Seed data is defined in `objectstack.config.ts` (`data` array) -### Server Mode - -- [ ] API route handler is configured (`app/api/[...objectstack]/route.ts`) -- [ ] Kernel singleton initializes the correct database driver -- [ ] `DATABASE_URL` is configured in Vercel environment variables -- [ ] CORS is configured if frontend and API are on different origins - --- ## Comparison diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0b3400cecc..5ad5b24072 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,7 +62,7 @@ importers: version: 16.6.17(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) fumadocs-mdx: specifier: 14.2.10 - version: 14.2.10(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.17(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 14.2.10(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.17(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) fumadocs-ui: specifier: 16.6.17 version: 16.6.17(@types/mdx@2.0.13)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.17(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) @@ -130,6 +130,9 @@ importers: '@objectstack/driver-memory': specifier: workspace:* version: link:../../packages/plugins/driver-memory + '@objectstack/hono': + specifier: workspace:* + version: link:../../packages/adapters/hono '@objectstack/metadata': specifier: workspace:* version: link:../../packages/metadata @@ -226,13 +229,16 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 6.0.1(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) autoprefixer: specifier: ^10.4.27 version: 10.4.27(postcss@8.5.8) happy-dom: specifier: ^20.8.4 version: 20.8.4 + hono: + specifier: ^4.12.8 + version: 4.12.8 msw: specifier: ^2.12.13 version: 2.12.13(@types/node@25.5.0)(typescript@5.9.3) @@ -246,11 +252,11 @@ importers: specifier: ^5.0.0 version: 5.9.3 vite: - specifier: ^7.3.1 - version: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) + specifier: ^8.0.0 + version: 8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0) vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) examples/app-crm: dependencies: @@ -362,7 +368,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/adapters/fastify: devDependencies: @@ -377,7 +383,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/adapters/hono: devDependencies: @@ -392,7 +398,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/adapters/nestjs: devDependencies: @@ -410,7 +416,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/adapters/nextjs: devDependencies: @@ -431,7 +437,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/adapters/nuxt: devDependencies: @@ -446,7 +452,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/adapters/sveltekit: devDependencies: @@ -455,13 +461,13 @@ importers: version: link:../../runtime '@sveltejs/kit': specifier: ^2.55.0 - version: 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.50.3)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)))(svelte@5.50.3)(typescript@5.9.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) typescript: specifier: ^5.0.0 version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/cli: dependencies: @@ -519,7 +525,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/client: dependencies: @@ -559,7 +565,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/client-react: dependencies: @@ -606,7 +612,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/create-objectstack: dependencies: @@ -662,7 +668,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/objectql: dependencies: @@ -681,7 +687,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/plugins/driver-memory: dependencies: @@ -703,7 +709,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/plugins/plugin-audit: dependencies: @@ -719,7 +725,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/plugins/plugin-auth: dependencies: @@ -731,7 +737,7 @@ importers: version: link:../../spec better-auth: specifier: ^1.5.5 - version: 1.5.5(50d99676ab46a03e7c056ea0a02beb02) + version: 1.5.5(92be5426b3f27ad668a918ae19eb09a5) devDependencies: '@objectstack/cli': specifier: workspace:* @@ -744,7 +750,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/plugins/plugin-dev: dependencies: @@ -787,7 +793,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/plugins/plugin-hono-server: dependencies: @@ -812,7 +818,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/plugins/plugin-msw: dependencies: @@ -843,7 +849,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/plugins/plugin-security: dependencies: @@ -862,7 +868,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/rest: dependencies: @@ -881,7 +887,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/runtime: dependencies: @@ -906,7 +912,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/services/service-automation: dependencies: @@ -925,7 +931,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/services/service-cache: dependencies: @@ -944,7 +950,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/services/service-feed: dependencies: @@ -963,7 +969,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/services/service-i18n: dependencies: @@ -982,7 +988,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/services/service-job: dependencies: @@ -1001,7 +1007,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/services/service-queue: dependencies: @@ -1020,7 +1026,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/services/service-realtime: dependencies: @@ -1039,7 +1045,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/services/service-storage: dependencies: @@ -1058,7 +1064,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/spec: dependencies: @@ -1071,7 +1077,7 @@ importers: version: 25.5.0 '@vitest/coverage-v8': specifier: ^4.1.0 - version: 4.1.0(vitest@4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0))) + version: 4.1.0(vitest@4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0))) tsx: specifier: ^4.21.0 version: 4.21.0 @@ -1080,7 +1086,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + version: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) packages/types: dependencies: @@ -1345,9 +1351,15 @@ packages: '@electric-sql/pglite@0.3.15': resolution: {integrity: sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==} + '@emnapi/core@1.9.0': + resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==} + '@emnapi/runtime@1.9.0': resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==} + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@esbuild/aix-ppc64@0.27.2': resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} @@ -2119,6 +2131,9 @@ packages: resolution: {integrity: sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==} engines: {node: '>=18'} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@nestjs/common@11.1.17': resolution: {integrity: sha512-hLODw5Abp8OQgA+mUO4tHou4krKgDtUcM9j5Ihxncst9XeyxYBTt2bwZm4e4EQr5E352S4Fyy6V3iFx9ggxKAg==} peerDependencies: @@ -2255,6 +2270,13 @@ packages: resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==} engines: {node: '>= 20.0.0'} + '@oxc-project/runtime@0.115.0': + resolution: {integrity: sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@oxc-project/types@0.115.0': + resolution: {integrity: sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==} + '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} @@ -2852,9 +2874,107 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + '@rolldown/binding-android-arm64@1.0.0-rc.9': + resolution: {integrity: sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.9': + resolution: {integrity: sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.9': + resolution: {integrity: sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.9': + resolution: {integrity: sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9': + resolution: {integrity: sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9': + resolution: {integrity: sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.9': + resolution: {integrity: sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9': + resolution: {integrity: sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9': + resolution: {integrity: sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.9': + resolution: {integrity: sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.9': + resolution: {integrity: sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.9': + resolution: {integrity: sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.9': + resolution: {integrity: sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9': + resolution: {integrity: sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.9': + resolution: {integrity: sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-rc.7': resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} + '@rolldown/pluginutils@1.0.0-rc.9': + resolution: {integrity: sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==} + '@rollup/rollup-android-arm-eabi@4.55.2': resolution: {integrity: sha512-21J6xzayjy3O6NdnlO6aXi/urvSRjm6nCI6+nF6ra2YofKruGixN9kfT+dt55HVNwfDmpDHJcaS3JuP/boNnlA==} cpu: [arm] @@ -3387,6 +3507,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} @@ -5150,30 +5273,60 @@ packages: cpu: [arm64] os: [android] + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + lightningcss-darwin-arm64@1.31.1: resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.31.1: resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.31.1: resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.31.1: resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.31.1: resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} engines: {node: '>= 12.0.0'} @@ -5181,6 +5334,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + lightningcss-linux-arm64-musl@1.31.1: resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} engines: {node: '>= 12.0.0'} @@ -5188,6 +5348,13 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + lightningcss-linux-x64-gnu@1.31.1: resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} engines: {node: '>= 12.0.0'} @@ -5195,6 +5362,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + lightningcss-linux-x64-musl@1.31.1: resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} engines: {node: '>= 12.0.0'} @@ -5202,22 +5376,45 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + lightningcss-win32-arm64-msvc@1.31.1: resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.31.1: resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.31.1: resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} engines: {node: '>= 12.0.0'} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -6297,6 +6494,11 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rolldown@1.0.0-rc.9: + resolution: {integrity: sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup@4.55.2: resolution: {integrity: sha512-PggGy4dhwx5qaW+CKBilA/98Ql9keyfnb7lh4SR6shQ91QQQi1ORJ1v4UinkdP2i87OBs9AQFooQylcrrRfIcg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -6964,15 +7166,16 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + vite@8.0.0: + resolution: {integrity: sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.0.0-alpha.31 + esbuild: ^0.27.0 jiti: '>=1.21.0' less: ^4.0.0 - lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: '>=0.54.8' @@ -6983,12 +7186,14 @@ packages: peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -7524,11 +7729,22 @@ snapshots: '@electric-sql/pglite@0.3.15': optional: true + '@emnapi/core@1.9.0': + dependencies: + '@emnapi/wasi-threads': 1.2.0 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.9.0': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.0': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.27.2': optional: true @@ -8049,6 +8265,13 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.9.0 + '@emnapi/runtime': 1.9.0 + '@tybys/wasm-util': 0.10.1 + optional: true + '@nestjs/common@11.1.17(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: file-type: 21.3.2 @@ -8171,6 +8394,10 @@ snapshots: '@orama/orama@3.1.18': {} + '@oxc-project/runtime@0.115.0': {} + + '@oxc-project/types@0.115.0': {} + '@pinojs/redact@0.4.0': {} '@polka/url@1.0.0-next.29': {} @@ -8823,8 +9050,57 @@ snapshots: '@radix-ui/rect@1.1.1': {} + '@rolldown/binding-android-arm64@1.0.0-rc.9': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.9': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.9': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.9': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.9': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.9': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.9': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.9': + optional: true + '@rolldown/pluginutils@1.0.0-rc.7': {} + '@rolldown/pluginutils@1.0.0-rc.9': {} + '@rollup/rollup-android-arm-eabi@4.55.2': optional: true @@ -9111,11 +9387,11 @@ snapshots: dependencies: acorn: 8.16.0 - '@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.50.3)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0))': + '@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)))(svelte@5.50.3)(typescript@5.9.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.50.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.50.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) '@types/cookie': 0.6.0 acorn: 8.16.0 cookie: 0.6.0 @@ -9127,26 +9403,26 @@ snapshots: set-cookie-parser: 3.0.1 sirv: 3.0.2 svelte: 5.50.3 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) + vite: 8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0) optionalDependencies: typescript: 5.9.3 - '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.50.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)))(svelte@5.50.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.50.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.50.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) obug: 2.1.1 svelte: 5.50.3 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) + vite: 8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0) - '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0))': + '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.50.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)))(svelte@5.50.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) deepmerge: 4.3.1 magic-string: 0.30.21 obug: 2.1.1 svelte: 5.50.3 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) - vitefu: 1.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + vite: 8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0) + vitefu: 1.1.2(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) '@swc/helpers@0.5.15': dependencies: @@ -9267,6 +9543,11 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 @@ -9389,12 +9670,12 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@6.0.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0))': + '@vitejs/plugin-react@6.0.1(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) + vite: 8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0) - '@vitest/coverage-v8@4.1.0(vitest@4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))': + '@vitest/coverage-v8@4.1.0(vitest@4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.0 @@ -9406,7 +9687,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + vitest: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) '@vitest/expect@4.1.0': dependencies: @@ -9417,14 +9698,14 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.0(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0))': + '@vitest/mocker@4.1.0(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0))': dependencies: '@vitest/spy': 4.1.0 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.13(@types/node@25.5.0)(typescript@5.9.3) - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) + vite: 8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0) '@vitest/pretty-format@4.1.0': dependencies: @@ -9646,7 +9927,7 @@ snapshots: baseline-browser-mapping@2.10.8: {} - better-auth@1.5.5(50d99676ab46a03e7c056ea0a02beb02): + better-auth@1.5.5(92be5426b3f27ad668a918ae19eb09a5): dependencies: '@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0) '@better-auth/drizzle-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.41.0(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(kysely@0.28.12)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))) @@ -9667,7 +9948,7 @@ snapshots: zod: 4.3.6 optionalDependencies: '@prisma/client': 7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) - '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.50.3)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)))(svelte@5.50.3)(typescript@5.9.3)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) drizzle-orm: 0.41.0(@electric-sql/pglite@0.3.15)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(kysely@0.28.12)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) mongodb: 7.1.0 mysql2: 3.15.3 @@ -9676,7 +9957,7 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) svelte: 5.50.3 - vitest: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + vitest: 4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) transitivePeerDependencies: - '@cloudflare/workers-types' @@ -10551,7 +10832,7 @@ snapshots: transitivePeerDependencies: - supports-color - fumadocs-mdx@14.2.10(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.17(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)): + fumadocs-mdx@14.2.10(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.17(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 @@ -10577,7 +10858,7 @@ snapshots: '@types/react': 19.2.14 next: 16.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) + vite: 8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0) transitivePeerDependencies: - supports-color @@ -11129,36 +11410,69 @@ snapshots: lightningcss-android-arm64@1.31.1: optional: true + lightningcss-android-arm64@1.32.0: + optional: true + lightningcss-darwin-arm64@1.31.1: optional: true + lightningcss-darwin-arm64@1.32.0: + optional: true + lightningcss-darwin-x64@1.31.1: optional: true + lightningcss-darwin-x64@1.32.0: + optional: true + lightningcss-freebsd-x64@1.31.1: optional: true + lightningcss-freebsd-x64@1.32.0: + optional: true + lightningcss-linux-arm-gnueabihf@1.31.1: optional: true + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + lightningcss-linux-arm64-gnu@1.31.1: optional: true + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + lightningcss-linux-arm64-musl@1.31.1: optional: true + lightningcss-linux-arm64-musl@1.32.0: + optional: true + lightningcss-linux-x64-gnu@1.31.1: optional: true + lightningcss-linux-x64-gnu@1.32.0: + optional: true + lightningcss-linux-x64-musl@1.31.1: optional: true + lightningcss-linux-x64-musl@1.32.0: + optional: true + lightningcss-win32-arm64-msvc@1.31.1: optional: true + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + lightningcss-win32-x64-msvc@1.31.1: optional: true + lightningcss-win32-x64-msvc@1.32.0: + optional: true + lightningcss@1.31.1: dependencies: detect-libc: 2.1.2 @@ -11175,6 +11489,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.31.1 lightningcss-win32-x64-msvc: 1.31.1 + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + 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 + lilconfig@2.1.0: optional: true @@ -12468,6 +12798,27 @@ snapshots: rfdc@1.4.1: {} + rolldown@1.0.0-rc.9: + dependencies: + '@oxc-project/types': 0.115.0 + '@rolldown/pluginutils': 1.0.0-rc.9 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.9 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.9 + '@rolldown/binding-darwin-x64': 1.0.0-rc.9 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.9 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.9 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.9 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.9 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.9 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.9 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.9 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.9 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.9 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.9 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.9 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.9 + rollup@4.55.2: dependencies: '@types/estree': 1.0.8 @@ -13238,29 +13589,29 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0): + vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0): dependencies: - esbuild: 0.27.2 - fdir: 6.5.0(picomatch@4.0.3) + '@oxc-project/runtime': 0.115.0 + lightningcss: 1.32.0 picomatch: 4.0.3 postcss: 8.5.8 - rollup: 4.57.1 + rolldown: 1.0.0-rc.9 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 25.5.0 + esbuild: 0.27.4 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.31.1 tsx: 4.21.0 - vitefu@1.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)): + vitefu@1.1.2(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)): optionalDependencies: - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) + vite: 8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0) - vitest@4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)): + vitest@4.1.0(@types/node@25.5.0)(happy-dom@20.8.4)(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)): dependencies: '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) + '@vitest/mocker': 4.1.0(msw@2.12.13(@types/node@25.5.0)(typescript@5.9.3))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)) '@vitest/pretty-format': 4.1.0 '@vitest/runner': 4.1.0 '@vitest/snapshot': 4.1.0 @@ -13277,7 +13628,7 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) + vite: 8.0.0(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.5.0