diff --git a/.context/global/organization.md b/.context/global/organization.md index 4f95d8f..3e32257 100644 --- a/.context/global/organization.md +++ b/.context/global/organization.md @@ -8,7 +8,7 @@ created: 2026-05-06 Nesalia Inc. ## Description -Une entreprise qui développe le futur de l'excellence informatique, education et software de demain avec DeesseJS comme framework principal. Comme Vercel pour l'éducation informatique. +A company developing the future of computer science excellence, education, and software with DeesseJS as the primary framework. Like Vercel for computer science education. ## Size Small (2-10) diff --git a/.context/project/rules/conventions/imports.md b/.context/project/rules/conventions/imports.md index f7e3b74..8db1872 100644 --- a/.context/project/rules/conventions/imports.md +++ b/.context/project/rules/conventions/imports.md @@ -26,7 +26,7 @@ import { Hono } from 'hono'; import { createRouter } from './router'; ``` -## Why +## Rationale Clear separation makes dependencies explicit and helps identify what belongs where. ## Enforcement diff --git a/.context/project/rules/conventions/typescript.md b/.context/project/rules/conventions/typescript.md new file mode 100644 index 0000000..a8fc348 --- /dev/null +++ b/.context/project/rules/conventions/typescript.md @@ -0,0 +1,158 @@ +--- +created: 2026-05-07 +type: convention +domain: code +--- + +# Convention: Use `type` Instead of `interface` + +## Rule + +Prefer `type` aliases over `interface` declarations for defining object shapes and type aliases. + +## Details + +Using `type` provides better consistency with the codebase's functional approach. It also allows for union types, intersections, and utility types without requiring augmentation. Type aliases are more lightweight and align with TypeScript's recommendation for most use cases. + +## Examples + +### ✅ Correct + +```typescript +type User = { + id: string; + name: string; +}; + +type Id = string | number; +type Response = { data: T; error: null } | { data: null; error: Error }; +``` + +### ❌ Incorrect + +```typescript +interface User { + id: string; + name: string; +} + +interface Response { + data: T; + error: null; +} +``` + +## Enforcement + +ESLint rule `typescript-eslint/consistent-type-definitions` set to `"type"`. + +--- + +# Convention: No `any` — Use Generics + +## Rule + +Never use `any`. Use generics, `unknown`, or type guards instead. + +## Details + +Using `any` bypasses TypeScript's type safety, making code harder to maintain and refactor. Generics provide flexible, type-safe abstractions without sacrificing safety. Use `unknown` when the type is truly indeterminate and narrow it with type guards or type assertions. + +## Examples + +### ✅ Correct + +```typescript +function parse(input: string): T { + return JSON.parse(input) as T; +} + +function process(items: T[]): T[] { + return items.map((item) => item); +} + +function identity(value: T): T { + return value; +} + +function safeStringify(value: unknown): string { + if (typeof value === 'string') return value; + return JSON.stringify(value); +} +``` + +### ❌ Incorrect + +```typescript +function parse(input: string): any { + return JSON.parse(input); +} + +function process(items: any[]): any[] { + return items.map((item) => item); +} + +function identity(value: any): any { + return value; +} +``` + +## Enforcement + +ESLint rules: +- `@typescript-eslint/no-explicit-any` +- `@typescript-eslint/no-explicit-any` (error-level) +- `@typescript-eslint/consistent-type-assertions` (for `as any` violations) + +--- + +# Convention: No `function` Declarations — Use `const` with Arrow Functions + +## Rule + +Do not use the `function` keyword. Use `const` with arrow functions instead. + +## Details + +Arrow functions provide a consistent style across the codebase. They are more concise, lexically bind `this`, and align with the functional-first approach. Using `const` with arrow functions also makes it clearer that the value is not reassigned. + +## Examples + +### ✅ Correct + +```typescript +const parse = (input: string): T => { + return JSON.parse(input) as T; +}; + +const process = (items: T[]): T[] => { + return items.map((item) => item); +}; + +const identity = (value: T): T => value; + +const safeStringify = (value: unknown): string => { + if (typeof value === 'string') return value; + return JSON.stringify(value); +}; +``` + +### ❌ Incorrect + +```typescript +function parse(input: string): T { + return JSON.parse(input) as T; +} + +function process(items: T[]): T[] { + return items.map((item) => item); +} + +function identity(value: T): T { + return value; +} +``` + +## Enforcement + +ESLint rule `@typescript-eslint/func-style` set to `arrow-expression`. \ No newline at end of file diff --git a/docs/rfc/server/DEP-0008-api-factory.md b/docs/rfc/server/DEP-0008-api-factory.md deleted file mode 100644 index 6f9274b..0000000 --- a/docs/rfc/server/DEP-0008-api-factory.md +++ /dev/null @@ -1,487 +0,0 @@ -# RFC 08: API Factory — `createAPI` and `createPublicAPI` - -## Summary - -`createAPI()` creates a typed local API instance from a router. `createPublicAPI()` creates a filtered view that excludes internal procedures. The `createAPI` function is returned by `initDRPC()` along with the `QueryBuilder` (`d`), and has context/plugins already bound. - ---- - -## Overview - -### What Is an API Instance? - -An API instance is a **typed proxy** that provides direct procedure calls without any network transport: - -```typescript -const { d, createAPI } = initDRPC(); - -const router = d.router({ - hello: d.query({ handler: async () => ok('Hello!') }), -}); - -const api = createAPI({ router }); - -// Direct call — same process, no network -const result = await api.hello(); -``` - -**Key characteristics:** -- Server-only — no HTTP, no network involved -- Fully typed — TypeScript infers argument and return types from Zod schemas -- Internal procedures accessible — all procedures including `internalQuery` and `internalMutation` are callable -- Context initialized once at creation time - -### Why Two Creation Functions? - -| Function | Purpose | Use Case | -|----------|---------|----------| -| `createAPI()` | Full API with all procedures | Server-to-server communication, testing, internal services | -| `createPublicAPI()` | Filtered view excluding internal procedures | Exposing a safe subset to external clients or HTTP adapters | - ---- - -## createAPI() - -### Signature - -The `createAPI` function is returned by `initDRPC()` with context and plugins already bound: - -```typescript -function createAPI(config: { - readonly router: TRoutes; - readonly middleware?: readonly Middleware[]; -}): TypedAPIInstance -``` - -### Parameters - -| Parameter | Type | Description | -|-----------|------|-------------| -| `router` | `TRoutes` | The router to expose | -| `middleware` | `Middleware[]` | Global middleware applied to all procedures | - -Context, plugins, and events are bound at `initDRPC()` time and used automatically. - -### Basic Usage - -```typescript -import { initDRPC, ok } from '@deessejs/server'; - -const { d, createAPI } = initDRPC() - .context({ db: myDb }); - -const listUsers = d.query({ - handler: async (ctx) => ok(await ctx.db.listUsers()), -}); - -const router = d.router({ - users: { list: listUsers }, -}); - -const api = createAPI({ router }); - -// Call directly -const result = await api.users.list(); -``` - -### With Middleware - -```typescript -const { d, createAPI } = initDRPC() - .context({ db: myDb }) - .use(auditPlugin()); - -const loggingMiddleware = d.middleware((opts) => { - console.log(`Calling ${opts.path}`); - return opts.next(); -}); - -const router = d.router({ - users: { list: d.query({ handler: async (ctx) => ok(ctx.db.listUsers()) }) }, -}); - -const api = createAPI({ router, middleware: [loggingMiddleware] }); -``` - ---- - -## createPublicAPI() - -### Signature - -```typescript -function createPublicAPI>( - api: TypedAPIInstance -): TypedAPIInstance> -``` - -### What It Does - -`createPublicAPI()` creates a **new API instance** with a filtered router that excludes: -- `internalQuery` procedures -- `internalMutation` procedures - -Only `query` and `mutation` procedures are exposed. - -### Why Filter Internal Procedures? - -Internal procedures are designed for **server-to-server communication** within the same process. They should not be exposed to external clients: - -```typescript -const { d, createAPI } = initDRPC().context({ db: myDb }); - -const healthCheck = d.internalQuery({ - handler: async (ctx) => ok({ status: ctx.db.health }), -}); - -const syncData = d.internalMutation({ - handler: async (ctx, args) => ok({ synced: true }), -}); - -const router = d.router({ - publicData: d.query({ ... }), - healthCheck: healthCheck, // Internal — not exposed via createPublicAPI - syncData: syncData, // Internal — not exposed via createPublicAPI -}); - -// Full API — all procedures accessible -const fullApi = createAPI({ router }); -await fullApi.healthCheck(); // Works - -// Public API — internal procedures filtered out -const publicApi = createPublicAPI(fullApi); -publicApi.healthCheck; // TypeScript error: healthCheck not in PublicRouter -``` - -### Usage - -```typescript -const { d, createAPI } = initDRPC() - .context({ db: myDb }); - -const router = d.router({ - users: { ... }, - health: d.internalQuery({ ... }), -}); - -const fullApi = createAPI({ router }); -const publicApi = createPublicAPI(fullApi); - -// publicApi only has public procedures -// Internal procedures are not accessible -``` - ---- - -## TypedAPIInstance - -The return type of `createAPI()` and `createPublicAPI()`: - -```typescript -type TypedAPIInstance> = - DecoratedRouter & { - readonly [apiInternalSymbol]: { - router: TRoutes; - ctx: Ctx; - plugins: readonly Plugin[]; - eventEmitter?: EventEmitterAny; - }; - }; -``` - -**Properties accessible on the API instance:** - -| Property | Type | Description | -|----------|------|-------------| -| `router` | `TRoutes` | The underlying router | -| `ctx` | `Ctx` | The context object | -| `plugins` | `Plugin[]` | Registered plugins | -| `globalMiddleware` | `Middleware[]` | Global middleware | -| `eventEmitter` | `EventEmitterAny` | Event emitter (if configured) | -| `getEvents()` | `() => EventPayload[]` | Get event log | - -**Access internal properties via symbol:** - -```typescript -const internal = api[apiInternalSymbol]; -console.log(internal.router); -console.log(internal.plugins); -``` - ---- - -## PublicRouter Type - -The type used by `createPublicAPI()` to filter procedures: - -```typescript -export type PublicRouter> = { - readonly [K in keyof TRoutes as [TRoutes[K]] extends [Procedure] - ? [TRoutes[K]] extends [{ type: "query" | "mutation" }] - ? K - : never - : K]: [TRoutes[K]] extends [Router] - ? PublicRouter - : TRoutes[K]; -}; -``` - -**Behavior:** -- If a key's value is a `query` or `mutation` procedure → kept -- If a key's value is `internalQuery` or `internalMutation` → filtered out -- If a key's value is a nested `Router` → recursively filtered -- All other keys → kept as-is - ---- - -## Usage Examples - -### Basic Query and Mutation - -```typescript -import { initDRPC, ok } from '@deessejs/server'; -import { z } from 'zod'; - -interface Context { - db: { users: Array<{ id: string; name: string }> }; -} - -const { d, createAPI } = initDRPC(); - -const listUsers = d.query({ - handler: async (ctx) => ok(ctx.db.users), -}); - -const getUser = d.query({ - args: z.object({ id: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.users.find((u) => u.id === args.id); - return ok(user ?? null); - }, -}); - -const createUser = d.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - const newUser = { id: String(ctx.db.users.length + 1), name: args.name }; - ctx.db.users.push(newUser); - return ok(newUser); - }, -}); - -const router = d.router({ - users: { list: listUsers, get: getUser, create: createUser }, -}); - -const api = createAPI({ - router, - context: { db: { users: [{ id: "1", name: "Alice" }] } }, -}); - -// Fully typed calls -const users = await api.users.list(); -const user = await api.users.get({ id: "1" }); -const created = await api.users.create({ name: "Bob" }); -``` - -### With Internal Procedures - -```typescript -import { initDRPC, createPublicAPI, ok } from '@deessejs/server'; -import { z } from 'zod'; - -const { d, createAPI } = initDRPC<{ db: { health: string } }>(); - -// Public procedure -const listUsers = d.query({ - handler: async () => ok([{ id: "1", name: "Alice" }]), -}); - -// Internal procedure (not exposed publicly) -const healthCheck = d.internalQuery({ - handler: async (ctx) => ok({ status: ctx.db.health }), -}); - -const syncData = d.internalMutation({ - args: z.object({ source: z.string() }), - handler: async (ctx, args) => { - console.log(`Syncing from ${args.source}`); - return ok({ synced: true }); - }, -}); - -const router = d.router({ - users: { - list: listUsers, - _health: healthCheck, - _sync: syncData, - }, -}); - -const fullApi = createAPI({ router }); -const publicApi = createPublicAPI(fullApi); - -// Full API — all procedures accessible -const health = await fullApi.users._health(); -const sync = await fullApi.users._sync({ source: "external" }); - -// Public API — only public procedures -const users = await publicApi.users.list(); -// publicApi.users._health; // TypeScript error -``` - -### With Middleware - -```typescript -const { d, createAPI } = initDRPC().context({ db: myDb }); - -const loggingMiddleware = d.middleware({ - handler: async (opts) => { - console.log(`Calling ${opts.path}`); - return opts.next(); - }, -}); - -const tracingPlugin = { - name: 'tracing', - extend: (ctx) => ({ ...ctx, traceId: generateTraceId() }), -}; - -const router = d.router({ - users: { list: d.query({ handler: async (ctx) => ok(ctx.db.listUsers()) }) }, -}); - -const api = createAPI({ - router, - middleware: [loggingMiddleware], -}); -``` - ---- - -## API Reference - -### createAPI() - -```typescript -function createAPI(config: { - router: TRoutes; - middleware?: Middleware[]; -}): TypedAPIInstance -``` - -The `createAPI` function is returned by `initDRPC()` with context and plugins already bound. Only `router` is required; `middleware` can be added at API creation time. - -### createPublicAPI() - -```typescript -function createPublicAPI>( - api: TypedAPIInstance -): TypedAPIInstance> -``` - -### filterPublicRouter() - -```typescript -function filterPublicRouter, Ctx>( - router: TRoutes -): PublicRouter -``` - -Filters a router object at runtime (used internally by `createPublicAPI()`). - -### TypedAPIInstance Properties - -```typescript -interface TypedAPIInstance { - // Access router - readonly router: TRoutes; - - // Access context - readonly ctx: Ctx; - - // Access plugins - readonly plugins: readonly Plugin[]; - - // Access global middleware - readonly globalMiddleware: readonly Middleware[]; - - // Access event emitter - readonly eventEmitter?: EventEmitterAny; - - // Get event log - getEvents(): EventPayload[]; -} -``` - ---- - -## Implementation Notes - -### Initialization Order - -1. `initDRPC()` is called with configuration (context, plugins, events) -2. `createAPI()` is called with router and optional middleware -3. Context and plugins from `initDRPC()` are applied -4. Router proxy is created for procedure access - -### Event Queue - -Both `createAPI()` and `createPublicAPI()` share the same event queue for efficiency: - -```typescript -const queue = createPendingEventQueue(); -``` - -Events emitted during procedure execution are queued and flushed on success, or discarded on error. - -### Proxy-Based Access - -The API instance uses JavaScript Proxy for property access: - -```typescript -const handler: ProxyHandler> = { - get(target, prop) { - if (prop === 'router') return target.router; - if (prop === 'ctx') return target.ctx; - // ... other properties - // For route access (e.g., api.users.list), delegate to router proxy - return routerProxy[prop]; - }, -}; - -return new Proxy(state, handler) as TypedAPIInstance; -``` - -### Symbol-Based Internal Access - -Internal properties are accessed via `apiInternalSymbol`: - -```typescript -export const apiInternalSymbol = Symbol.for("deesse.api.internal"); - -const internal = api[apiInternalSymbol]; -// { router, ctx, plugins, eventEmitter } -``` - -This prevents internal properties from appearing in normal property enumeration. - -### PublicRouter Filtering - -The `PublicRouter` type uses conditional types to filter at the type level: - -```typescript -[K in keyof TRoutes as [TRoutes[K]] extends [Procedure] - ? [TRoutes[K]] extends [{ type: "query" | "mutation" }] - ? K - : never - : K] -``` - -At runtime, `filterPublicRouter()` recursively walks the router tree and only includes procedures where `type === "query" || type === "mutation"`. - ---- - -## Status - -**Implemented** — `createAPI()`, `createPublicAPI()`, and `filterPublicRouter()` are fully functional in `@deessejs/server`. \ No newline at end of file diff --git a/packages/server/coverage/base.css b/packages/server/coverage/base.css deleted file mode 100644 index f418035..0000000 --- a/packages/server/coverage/base.css +++ /dev/null @@ -1,224 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* yellow */ -.cbranch-no { background: yellow !important; color: #111; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -.highlighted, -.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ - background: #C21F39 !important; -} -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } -/* dark yellow (gold) */ -.status-line.medium, .medium .cover-fill { background: #f9cd0b; } -.medium .chart { border:1px solid #f9cd0b; } -/* light yellow */ -.medium { background: #fff4c2; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } - -.coverage-summary td.empty { - opacity: .5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/packages/server/coverage/block-navigation.js b/packages/server/coverage/block-navigation.js deleted file mode 100644 index 530d1ed..0000000 --- a/packages/server/coverage/block-navigation.js +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; - - // Elements to highlight in the file listing view - var fileListingElements = ['td.pct.low']; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` - - // Selector that finds elements on the page to which we can jump - var selector = - fileListingElements.join(', ') + - ', ' + - notSelector + - missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements - .item(currentIndex) - .classList.remove('highlighted'); - missingCoverageElements.item(index).classList.add('highlighted'); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: 'smooth', - block: 'center', - inline: 'center' - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== 'number' || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === 'number' && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - if ( - document.getElementById('fileSearch') === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener('keydown', jumpToCode); diff --git a/packages/server/coverage/clover.xml b/packages/server/coverage/clover.xml deleted file mode 100644 index 87f781c..0000000 --- a/packages/server/coverage/clover.xml +++ /dev/null @@ -1,2271 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/server/coverage/coverage-final.json b/packages/server/coverage/coverage-final.json deleted file mode 100644 index 629a2a5..0000000 --- a/packages/server/coverage/coverage-final.json +++ /dev/null @@ -1,75 +0,0 @@ -{"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\types.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\types.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\api\\types\\api.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\api\\types\\api.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\api\\types\\index.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\api\\types\\index.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\api\\types\\internal.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\api\\types\\internal.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\api\\types\\proxy.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\api\\types\\proxy.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\context\\types.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\context\\types.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\errors\\types.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\errors\\types.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\events\\types.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\events\\types.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\hooks\\types.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\hooks\\types.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\internal-mutation\\types.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\internal-mutation\\types.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\internal-query\\types.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\internal-query\\types.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\middleware\\types.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\middleware\\types.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\mutation\\types.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\mutation\\types.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\query\\types.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\query\\types.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\router\\types.js": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\dist_test\\router\\types.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"locations":[{"start":{"line":1,"column":10},"end":{"line":1,"column":10}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":10}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\01-basic.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\01-basic.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":58}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":59}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":34}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":40}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":27}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":27}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":28}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":25}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":37}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":33}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":60}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":16}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":22}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":20}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":4}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":31}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":39}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":33}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":77}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":31}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":23}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":4}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":25}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":10}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":20}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":17}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":23}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":3}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":23}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":9}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":12}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":9}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":14}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":35}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":33}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":8}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":6}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":4}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":23}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":39}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":31}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":48}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":31}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":62}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":35}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":1}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":7}}},"s":{"0":0,"10":0,"11":0,"12":0,"13":0,"27":0,"34":0,"35":0,"36":0,"37":0,"38":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"90":0,"92":0,"93":0,"96":0,"97":0,"100":0,"101":0,"102":0,"104":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":2740},"end":{"line":105,"column":7}},"locations":[{"start":{"line":1,"column":2740},"end":{"line":105,"column":7}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":2740},"end":{"line":105,"column":7}},"loc":{"start":{"line":1,"column":2740},"end":{"line":105,"column":7}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\02-nested-routers.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\02-nested-routers.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":76}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":59}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":34}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":40}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":30}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":49}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":16}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":39}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":66}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":5}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":22}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":41}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":65}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":5}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":30}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":49}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":16}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":39}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":67}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":27}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":21}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":21}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":25}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":17}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":5}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":23}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":9}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":29}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":3}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":23}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":46}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":34}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":55}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":29}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":37}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":37}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":49}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":47}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":39}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":86}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":1}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":7}}},"s":{"0":0,"9":0,"10":0,"11":0,"12":0,"22":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"51":0,"52":0,"53":0,"54":0,"57":0,"58":0,"59":0,"60":0,"61":0,"67":0,"68":0,"69":0,"70":0,"76":0,"78":0,"79":0,"82":0,"83":0,"94":0,"95":0,"96":0,"99":0,"100":0,"101":0,"102":0,"104":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":2940},"end":{"line":105,"column":7}},"locations":[{"start":{"line":1,"column":2940},"end":{"line":105,"column":7}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":2940},"end":{"line":105,"column":7}},"loc":{"start":{"line":1,"column":2940},"end":{"line":105,"column":7}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\03-hooks.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\03-hooks.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":44}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":59}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":39}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":40}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":25}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":37}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":33}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":53}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":45}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":4}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":7}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":32}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":62}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":57}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":4}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":39}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":76}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":80}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":4}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":35}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":65}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":53}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":4}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":34}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":49}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":60}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":31}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":39}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":33}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":32}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":70}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":5}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":44}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":4}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":10}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":32}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":47}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":4}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":35}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":59}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":34}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":53}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":73}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":23}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":9}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":48}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":3}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":23}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":44}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":50}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":45}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":41}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":45}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":63}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":49}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":1}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":7}}},"s":{"0":0,"10":0,"11":0,"12":0,"13":0,"20":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"82":0,"84":0,"85":0,"86":0,"87":0,"93":0,"94":0,"95":0,"96":0,"97":0,"99":0,"100":0,"101":0,"102":0,"104":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3139},"end":{"line":105,"column":7}},"locations":[{"start":{"line":1,"column":3139},"end":{"line":105,"column":7}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3139},"end":{"line":105,"column":7}},"loc":{"start":{"line":1,"column":3139},"end":{"line":105,"column":7}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\04-middleware.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\04-middleware.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":44}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":59}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":64}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":39}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":41}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":15}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":33}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":56}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":23}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":4}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":42}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":16}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":33}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":37}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":65}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":23}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":4}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":44}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":18}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":33}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":59}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":37}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":60}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":18}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":4}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":40}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":32}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":27}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":44}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":42}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":4}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":35}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":27}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":57}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":44}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":4}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":23}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":31}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":27}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":43}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":31}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":44}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":32}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":27}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":32}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":4}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":26}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":25}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":25}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":31}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":23}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":25}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":3}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":23}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":9}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":57}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":15}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":22}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":28}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":37}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":41}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":27}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":8}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":7}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":4}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":23}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":51}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":42}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":45}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":64}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":48}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":48}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":68}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":40}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":44}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":24}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":45}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":3}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":1}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":7}}},"s":{"0":0,"9":0,"10":0,"11":0,"12":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"61":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"88":0,"89":0,"90":0,"91":0,"92":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"124":0,"125":0,"126":0,"127":0,"129":0,"130":0,"131":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"141":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3887},"end":{"line":142,"column":7}},"locations":[{"start":{"line":1,"column":3887},"end":{"line":142,"column":7}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3887},"end":{"line":142,"column":7}},"loc":{"start":{"line":1,"column":3887},"end":{"line":142,"column":7}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\05-events.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\05-events.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":79}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":59}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":34}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":29}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":9}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":78}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":77}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":4}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":9}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":80}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":4}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":3}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":55}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":31}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":48}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":33}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":55}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":65}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":20}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":4}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":31}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":55}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":63}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":72}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":48}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":46}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":74}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":15}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":32}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":3}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":33}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":14}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":43}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":55}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":5}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":37}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":71}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":5}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":32}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":63}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":5}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":1}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":23}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":39}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":71}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":36}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":41}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":76}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":42}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":37}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":31}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":1}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":7}}},"s":{"0":0,"11":0,"12":0,"13":0,"14":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"34":0,"40":0,"41":0,"42":0,"43":0,"45":0,"46":0,"47":0,"48":0,"50":0,"51":0,"52":0,"54":0,"55":0,"56":0,"57":0,"58":0,"64":0,"66":0,"67":0,"68":0,"69":0,"70":0,"77":0,"78":0,"80":0,"81":0,"82":0,"85":0,"86":0,"87":0,"90":0,"91":0,"92":0,"93":0,"99":0,"100":0,"101":0,"102":0,"104":0,"105":0,"106":0,"108":0,"109":0,"110":0,"112":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3366},"end":{"line":113,"column":7}},"locations":[{"start":{"line":1,"column":3366},"end":{"line":113,"column":7}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3366},"end":{"line":113,"column":7}},"loc":{"start":{"line":1,"column":3366},"end":{"line":113,"column":7}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\06-internal.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\06-internal.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":61}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":59}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":34}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":40}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":27}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":24}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":44}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":4}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":37}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":27}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":64}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":4}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":37}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":60}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":33}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":59}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":42}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":3}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":41}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":24}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":48}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":25}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":10}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":20}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":25}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":20}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":32}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":27}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":9}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":36}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":3}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":43}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":51}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":43}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":39}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":47}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":43}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":75}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":39}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":58}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":53}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":48}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":54}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":1}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":7}}},"s":{"0":0,"10":0,"11":0,"12":0,"13":0,"19":0,"25":0,"26":0,"27":0,"28":0,"29":0,"37":0,"38":0,"39":0,"40":0,"41":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"54":0,"55":0,"56":0,"57":0,"58":0,"65":0,"66":0,"67":0,"69":0,"70":0,"71":0,"72":0,"73":0,"79":0,"80":0,"81":0,"82":0,"86":0,"92":0,"93":0,"94":0,"95":0,"98":0,"99":0,"101":0,"102":0,"104":0,"106":0,"109":0,"110":0,"116":0,"118":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3591},"end":{"line":119,"column":7}},"locations":[{"start":{"line":1,"column":3591},"end":{"line":119,"column":7}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3591},"end":{"line":119,"column":7}},"loc":{"start":{"line":1,"column":3591},"end":{"line":119,"column":7}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\07-plugins.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\examples\\07-plugins.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":63}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":34}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":24}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":68}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":16}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":26}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":33}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":5}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":47}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":17}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":26}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":26}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":5}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":84}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":21}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":22}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":11}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":25}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":10}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":19}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":59}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":7}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":24}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":43}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":37}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":57}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":48}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":8}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":7}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":3}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":34}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":9}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":68}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":3}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":23}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":59}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":39}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":33}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":60}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":38}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":50}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":35}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":45}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":1}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":7}}},"s":{"0":0,"9":0,"11":0,"12":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"43":0,"44":0,"45":0,"46":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"74":0,"75":0,"76":0,"77":0,"83":0,"84":0,"86":0,"87":0,"89":0,"90":0,"92":0,"93":0,"94":0,"95":0,"97":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":2651},"end":{"line":98,"column":7}},"locations":[{"start":{"line":1,"column":2651},"end":{"line":98,"column":7}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":2651},"end":{"line":98,"column":7}},"loc":{"start":{"line":1,"column":2651},"end":{"line":98,"column":7}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\index.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":47}}},"s":{"0":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\types.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":5423},"end":{"line":160,"column":2}},"locations":[{"start":{"line":1,"column":5423},"end":{"line":160,"column":2}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":5423},"end":{"line":160,"column":2}},"loc":{"start":{"line":1,"column":5423},"end":{"line":160,"column":2}},"line":1}},"f":{"0":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\errors.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\errors.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":42}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":41}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":29}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":42}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":54}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":3}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":38}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":26}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":20}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":22}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":73}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":5}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":20}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":97}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":38}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":26}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":67}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":78}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":36}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":44}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":55}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":34}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":22}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":62}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":54}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":3}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":101}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":37}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":33}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":16}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":33}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":6}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":21}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":12}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":37}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":31}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":27}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":10}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":6}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":4}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":98}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":34}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":28}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":15}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":17}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":38}}},"s":{"0":1,"7":1,"8":1,"9":1,"10":1,"11":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":0,"24":1,"29":1,"30":1,"31":1,"32":1,"33":1,"38":1,"39":1,"40":1,"41":1,"42":1,"47":1,"48":1,"49":1,"50":1,"51":1,"56":1,"58":0,"63":1,"64":0,"65":0,"67":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"81":1,"83":4,"88":1,"89":6,"90":6,"93":6},"branchMap":{"0":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":11},"end":{"line":42,"column":55}},"locations":[{"start":{"line":42,"column":11},"end":{"line":42,"column":55}}]},"1":{"type":"branch","line":51,"loc":{"start":{"line":51,"column":11},"end":{"line":51,"column":54}},"locations":[{"start":{"line":51,"column":11},"end":{"line":51,"column":54}}]},"2":{"type":"branch","line":82,"loc":{"start":{"line":82,"column":29},"end":{"line":84,"column":34}},"locations":[{"start":{"line":82,"column":29},"end":{"line":84,"column":34}}]},"3":{"type":"branch","line":89,"loc":{"start":{"line":89,"column":27},"end":{"line":94,"column":38}},"locations":[{"start":{"line":89,"column":27},"end":{"line":94,"column":38}}]}},"b":{"0":[4],"1":[6],"2":[4],"3":[6]},"fnMap":{"0":{"name":"message","decl":{"start":{"line":11,"column":11},"end":{"line":11,"column":54}},"loc":{"start":{"line":11,"column":11},"end":{"line":11,"column":54}},"line":11},"1":{"name":"message","decl":{"start":{"line":23,"column":11},"end":{"line":24,"column":97}},"loc":{"start":{"line":23,"column":11},"end":{"line":24,"column":97}},"line":23},"2":{"name":"message","decl":{"start":{"line":33,"column":11},"end":{"line":33,"column":78}},"loc":{"start":{"line":33,"column":11},"end":{"line":33,"column":78}},"line":33},"3":{"name":"message","decl":{"start":{"line":42,"column":11},"end":{"line":42,"column":55}},"loc":{"start":{"line":42,"column":11},"end":{"line":42,"column":55}},"line":42},"4":{"name":"message","decl":{"start":{"line":51,"column":11},"end":{"line":51,"column":54}},"loc":{"start":{"line":51,"column":11},"end":{"line":51,"column":54}},"line":51},"5":{"name":"routeNotFound","decl":{"start":{"line":57,"column":29},"end":{"line":59,"column":37}},"loc":{"start":{"line":57,"column":29},"end":{"line":59,"column":37}},"line":57},"6":{"name":"validationFailed","decl":{"start":{"line":64,"column":32},"end":{"line":77,"column":4}},"loc":{"start":{"line":64,"column":32},"end":{"line":77,"column":4}},"line":64},"7":{"name":"internalError","decl":{"start":{"line":82,"column":29},"end":{"line":84,"column":34}},"loc":{"start":{"line":82,"column":29},"end":{"line":84,"column":34}},"line":82},"8":{"name":"serverError","decl":{"start":{"line":89,"column":27},"end":{"line":94,"column":38}},"loc":{"start":{"line":89,"column":27},"end":{"line":94,"column":38}},"line":89}},"f":{"0":0,"1":0,"2":0,"3":4,"4":6,"5":0,"6":0,"7":4,"8":6}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\index.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":74}}},"s":{"0":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\api.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\api.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":64}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":60}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":39}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":49}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":2}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":69}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":29}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":41}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":29}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":55}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":57}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":26}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":33}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":49}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":45}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":31}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":7}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":5}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":41}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":2}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":60}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":11}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":38}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":9}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":11}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":12}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":18}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":17}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":20}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":17}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":13}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":42}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":24}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":70}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":38}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":49}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":11}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":20}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":12}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":33}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":17}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":4}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":45}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":25}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":19}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":45}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":29}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":17}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":10}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":27}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":4}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":50}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":65}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":23}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":37}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":41}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":18}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":34}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":28}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":36}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":46}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":12}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":9}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":25}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":7}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":21}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":22}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":31}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":19}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":28}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":23}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":32}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":32}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":41}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":28}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":37}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":25}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":64}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":7}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":40}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":6}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":4}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":80}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":2}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":66}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":32}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":52}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":54}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":20}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":36}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":21}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":29}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":25}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":37}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":35}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":5}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":2}}},"s":{"0":1,"12":1,"14":8,"15":8,"16":8,"22":1,"23":15,"24":15,"26":15,"28":15,"30":42,"33":42,"35":4,"36":42,"38":8,"40":8,"41":2,"42":2,"43":8,"45":42,"47":15,"48":15,"54":1,"55":70,"63":70,"64":70,"65":70,"66":70,"67":70,"68":70,"69":70,"70":70,"71":70,"73":70,"77":70,"78":70,"79":70,"81":70,"82":70,"83":70,"84":70,"85":70,"86":70,"87":70,"89":70,"90":70,"91":70,"92":70,"93":70,"94":70,"95":70,"96":70,"97":70,"99":70,"102":70,"103":70,"105":90,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"118":90,"119":90,"120":8,"121":90,"122":8,"123":90,"124":10,"125":90,"126":4,"127":90,"128":4,"129":90,"130":5,"131":90,"135":51,"136":90,"137":70,"139":70,"140":70,"146":1,"147":4,"148":4,"149":4,"153":4,"154":4,"155":4,"156":4,"157":4,"158":4,"159":4,"160":4,"161":4},"branchMap":{"0":{"type":"branch","line":13,"loc":{"start":{"line":13,"column":26},"end":{"line":17,"column":2}},"locations":[{"start":{"line":13,"column":26},"end":{"line":17,"column":2}}]},"1":{"type":"branch","line":16,"loc":{"start":{"line":16,"column":18},"end":{"line":16,"column":49}},"locations":[{"start":{"line":16,"column":18},"end":{"line":16,"column":49}}]},"2":{"type":"branch","line":23,"loc":{"start":{"line":23,"column":34},"end":{"line":49,"column":2}},"locations":[{"start":{"line":23,"column":34},"end":{"line":49,"column":2}}]},"3":{"type":"branch","line":29,"loc":{"start":{"line":29,"column":28},"end":{"line":46,"column":3}},"locations":[{"start":{"line":29,"column":28},"end":{"line":46,"column":3}}]},"4":{"type":"branch","line":34,"loc":{"start":{"line":34,"column":25},"end":{"line":34,"column":56}},"locations":[{"start":{"line":34,"column":25},"end":{"line":34,"column":56}}]},"5":{"type":"branch","line":34,"loc":{"start":{"line":34,"column":56},"end":{"line":37,"column":15}},"locations":[{"start":{"line":34,"column":56},"end":{"line":37,"column":15}}]},"6":{"type":"branch","line":37,"loc":{"start":{"line":37,"column":4},"end":{"line":44,"column":5}},"locations":[{"start":{"line":37,"column":4},"end":{"line":44,"column":5}}]},"7":{"type":"branch","line":37,"loc":{"start":{"line":37,"column":32},"end":{"line":44,"column":5}},"locations":[{"start":{"line":37,"column":32},"end":{"line":44,"column":5}}]},"8":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":44},"end":{"line":43,"column":7}},"locations":[{"start":{"line":41,"column":44},"end":{"line":43,"column":7}}]},"9":{"type":"branch","line":55,"loc":{"start":{"line":55,"column":25},"end":{"line":141,"column":2}},"locations":[{"start":{"line":55,"column":25},"end":{"line":141,"column":2}}]},"10":{"type":"branch","line":79,"loc":{"start":{"line":79,"column":22},"end":{"line":79,"column":70}},"locations":[{"start":{"line":79,"column":22},"end":{"line":79,"column":70}}]},"11":{"type":"branch","line":104,"loc":{"start":{"line":104,"column":4},"end":{"line":137,"column":6}},"locations":[{"start":{"line":104,"column":4},"end":{"line":137,"column":6}}]},"12":{"type":"branch","line":106,"loc":{"start":{"line":106,"column":36},"end":{"line":116,"column":7}},"locations":[{"start":{"line":106,"column":36},"end":{"line":116,"column":7}}]},"13":{"type":"branch","line":120,"loc":{"start":{"line":120,"column":8},"end":{"line":121,"column":31}},"locations":[{"start":{"line":120,"column":8},"end":{"line":121,"column":31}}]},"14":{"type":"branch","line":122,"loc":{"start":{"line":122,"column":8},"end":{"line":123,"column":28}},"locations":[{"start":{"line":122,"column":8},"end":{"line":123,"column":28}}]},"15":{"type":"branch","line":124,"loc":{"start":{"line":124,"column":8},"end":{"line":125,"column":32}},"locations":[{"start":{"line":124,"column":8},"end":{"line":125,"column":32}}]},"16":{"type":"branch","line":126,"loc":{"start":{"line":126,"column":8},"end":{"line":127,"column":41}},"locations":[{"start":{"line":126,"column":8},"end":{"line":127,"column":41}}]},"17":{"type":"branch","line":128,"loc":{"start":{"line":128,"column":8},"end":{"line":129,"column":37}},"locations":[{"start":{"line":128,"column":8},"end":{"line":129,"column":37}}]},"18":{"type":"branch","line":130,"loc":{"start":{"line":130,"column":8},"end":{"line":131,"column":64}},"locations":[{"start":{"line":130,"column":8},"end":{"line":131,"column":64}}]},"19":{"type":"branch","line":132,"loc":{"start":{"line":132,"column":6},"end":{"line":136,"column":40}},"locations":[{"start":{"line":132,"column":6},"end":{"line":136,"column":40}}]},"20":{"type":"branch","line":131,"loc":{"start":{"line":131,"column":17},"end":{"line":131,"column":64}},"locations":[{"start":{"line":131,"column":17},"end":{"line":131,"column":64}}]},"21":{"type":"branch","line":131,"loc":{"start":{"line":131,"column":56},"end":{"line":131,"column":64}},"locations":[{"start":{"line":131,"column":56},"end":{"line":131,"column":64}}]},"22":{"type":"branch","line":147,"loc":{"start":{"line":147,"column":31},"end":{"line":162,"column":2}},"locations":[{"start":{"line":147,"column":31},"end":{"line":162,"column":2}}]}},"b":{"0":[8],"1":[4],"2":[15],"3":[42],"4":[8],"5":[4],"6":[38],"7":[8],"8":[2],"9":[70],"10":[70],"11":[90],"12":[0],"13":[8],"14":[8],"15":[10],"16":[4],"17":[4],"18":[5],"19":[51],"20":[5],"21":[0],"22":[4]},"fnMap":{"0":{"name":"isQueryOrMutation","decl":{"start":{"line":13,"column":26},"end":{"line":17,"column":2}},"loc":{"start":{"line":13,"column":26},"end":{"line":17,"column":2}},"line":13},"1":{"name":"filterPublicRouter","decl":{"start":{"line":23,"column":34},"end":{"line":49,"column":2}},"loc":{"start":{"line":23,"column":34},"end":{"line":49,"column":2}},"line":23},"2":{"name":"createAPI","decl":{"start":{"line":55,"column":25},"end":{"line":141,"column":2}},"loc":{"start":{"line":55,"column":25},"end":{"line":141,"column":2}},"line":55},"3":{"name":"contextFactory","decl":{"start":{"line":79,"column":22},"end":{"line":79,"column":70}},"loc":{"start":{"line":79,"column":22},"end":{"line":79,"column":70}},"line":79},"4":{"name":"get","decl":{"start":{"line":104,"column":4},"end":{"line":137,"column":6}},"loc":{"start":{"line":104,"column":4},"end":{"line":137,"column":6}},"line":104},"5":{"name":"createPublicAPI","decl":{"start":{"line":147,"column":31},"end":{"line":162,"column":2}},"loc":{"start":{"line":147,"column":31},"end":{"line":162,"column":2}},"line":147}},"f":{"0":8,"1":15,"2":70,"3":70,"4":90,"5":4}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\errors.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\errors.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":91}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":38}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":5}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":43}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":12}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":79}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":10}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":7}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":4}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":40}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":15}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":15}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":42}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":5}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":34}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":83}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":4}}},"s":{"0":1,"8":1,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"16":4,"17":4,"19":1,"20":6,"21":6,"22":6,"24":6,"25":6,"26":6,"27":6,"28":6},"branchMap":{"0":{"type":"branch","line":9,"loc":{"start":{"line":9,"column":41},"end":{"line":18,"column":4}},"locations":[{"start":{"line":9,"column":41},"end":{"line":18,"column":4}}]},"1":{"type":"branch","line":10,"loc":{"start":{"line":10,"column":32},"end":{"line":17,"column":7}},"locations":[{"start":{"line":10,"column":32},"end":{"line":17,"column":7}}]},"2":{"type":"branch","line":14,"loc":{"start":{"line":14,"column":51},"end":{"line":14,"column":75}},"locations":[{"start":{"line":14,"column":51},"end":{"line":14,"column":75}}]},"3":{"type":"branch","line":20,"loc":{"start":{"line":20,"column":39},"end":{"line":29,"column":4}},"locations":[{"start":{"line":20,"column":39},"end":{"line":29,"column":4}}]},"4":{"type":"branch","line":25,"loc":{"start":{"line":25,"column":36},"end":{"line":28,"column":83}},"locations":[{"start":{"line":25,"column":36},"end":{"line":28,"column":83}}]},"5":{"type":"branch","line":28,"loc":{"start":{"line":28,"column":43},"end":{"line":28,"column":67}},"locations":[{"start":{"line":28,"column":43},"end":{"line":28,"column":67}}]}},"b":{"0":[4],"1":[4],"2":[4],"3":[6],"4":[6],"5":[6]},"fnMap":{"0":{"name":"createInternalErrorResult","decl":{"start":{"line":9,"column":41},"end":{"line":18,"column":4}},"loc":{"start":{"line":9,"column":41},"end":{"line":18,"column":4}},"line":9},"1":{"name":"message","decl":{"start":{"line":14,"column":51},"end":{"line":14,"column":75}},"loc":{"start":{"line":14,"column":51},"end":{"line":14,"column":75}},"line":14},"2":{"name":"createServerErrorResult","decl":{"start":{"line":20,"column":39},"end":{"line":29,"column":4}},"loc":{"start":{"line":20,"column":39},"end":{"line":29,"column":4}},"line":20},"3":{"name":"message","decl":{"start":{"line":28,"column":43},"end":{"line":28,"column":67}},"loc":{"start":{"line":28,"column":43},"end":{"line":28,"column":67}},"line":28}},"f":{"0":4,"1":4,"2":6,"3":6}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\index.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":61}}},"s":{"0":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\plugins.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\plugins.ts","all":false,"statementMap":{"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":86}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":39}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":79}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":53}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":69}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":2}}},"s":{"6":1,"7":55,"10":5,"13":6,"14":6,"15":6,"16":6,"18":5,"19":5},"branchMap":{"0":{"type":"branch","line":7,"loc":{"start":{"line":7,"column":28},"end":{"line":20,"column":2}},"locations":[{"start":{"line":7,"column":28},"end":{"line":20,"column":2}}]},"1":{"type":"branch","line":8,"loc":{"start":{"line":8,"column":28},"end":{"line":8,"column":39}},"locations":[{"start":{"line":8,"column":28},"end":{"line":8,"column":39}}]},"2":{"type":"branch","line":8,"loc":{"start":{"line":8,"column":35},"end":{"line":20,"column":2}},"locations":[{"start":{"line":8,"column":35},"end":{"line":20,"column":2}}]},"3":{"type":"branch","line":8,"loc":{"start":{"line":8,"column":35},"end":{"line":14,"column":43}},"locations":[{"start":{"line":8,"column":35},"end":{"line":14,"column":43}}]},"4":{"type":"branch","line":17,"loc":{"start":{"line":17,"column":2},"end":{"line":20,"column":2}},"locations":[{"start":{"line":17,"column":2},"end":{"line":20,"column":2}}]}},"b":{"0":[55],"1":[50],"2":[6],"3":[5],"4":[5]},"fnMap":{"0":{"name":"applyPlugins","decl":{"start":{"line":7,"column":28},"end":{"line":20,"column":2}},"loc":{"start":{"line":7,"column":28},"end":{"line":20,"column":2}},"line":7}},"f":{"0":55}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\procedure.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\procedure.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":60}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":42}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":52}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":42}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":43}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":31}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":40}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":51}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":7}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":54}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":41}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":60}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":5}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":20}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":41}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":66}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":7}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":38}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":12}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":39}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":64}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":7}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":18}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":37}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":55}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":37}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":61}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":11}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":6}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":2}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":47}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":44}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":49}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":13}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":44}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":39}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":17}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":87}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":32}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":29}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":101}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":5}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":22}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":89}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":40}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":27}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":5}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":36}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":35}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":78}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":11}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":15}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":45}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":4}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":14}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":2}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":58}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":49}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":31}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":102}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":72}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":83}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":30}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":62}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":31}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":76}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":59}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":8}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":5}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":3}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":87}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":92}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":52}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":30}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":17}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":11}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":17}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":16}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":12}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":12}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":18}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":6}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":84}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":7}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":28}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":28}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":18}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":43}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":71}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":5}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":82}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":65}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":3}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":2}}},"s":{"0":1,"15":1,"16":48,"17":48,"18":48,"19":48,"20":48,"21":48,"22":48,"23":48,"25":48,"26":5,"27":5,"29":48,"30":48,"33":48,"34":4,"35":4,"37":48,"39":41,"40":3,"41":3,"43":41,"44":48,"46":5,"47":3,"48":3,"49":5,"51":46,"52":48,"54":2,"55":1,"56":1,"57":2,"58":2,"59":2,"60":2,"61":2,"62":48,"68":1,"69":49,"70":49,"71":49,"72":49,"73":49,"74":49,"76":49,"78":59,"79":59,"80":0,"81":0,"82":59,"84":59,"86":59,"87":48,"88":48,"90":11,"91":11,"92":11,"93":11,"94":11,"95":11,"96":59,"98":49,"99":49,"105":1,"106":49,"107":49,"108":49,"109":49,"110":49,"113":49,"114":45,"115":45,"116":0,"117":0,"118":0,"119":0,"120":45,"122":49,"123":49,"126":49,"127":48,"128":48,"129":48,"130":48,"131":48,"132":48,"133":48,"134":48,"135":48,"138":49,"140":49,"141":49,"142":49,"143":0,"145":0,"146":0,"147":0,"149":0,"150":0,"151":0,"152":49},"branchMap":{"0":{"type":"branch","line":16,"loc":{"start":{"line":16,"column":34},"end":{"line":63,"column":2}},"locations":[{"start":{"line":16,"column":34},"end":{"line":63,"column":2}}]},"1":{"type":"branch","line":26,"loc":{"start":{"line":26,"column":39},"end":{"line":28,"column":3}},"locations":[{"start":{"line":26,"column":39},"end":{"line":28,"column":3}}]},"2":{"type":"branch","line":31,"loc":{"start":{"line":31,"column":52},"end":{"line":34,"column":40}},"locations":[{"start":{"line":31,"column":52},"end":{"line":34,"column":40}}]},"3":{"type":"branch","line":34,"loc":{"start":{"line":34,"column":40},"end":{"line":36,"column":5}},"locations":[{"start":{"line":34,"column":40},"end":{"line":36,"column":5}}]},"4":{"type":"branch","line":36,"loc":{"start":{"line":36,"column":4},"end":{"line":38,"column":19}},"locations":[{"start":{"line":36,"column":4},"end":{"line":38,"column":19}}]},"5":{"type":"branch","line":38,"loc":{"start":{"line":38,"column":19},"end":{"line":45,"column":11}},"locations":[{"start":{"line":38,"column":19},"end":{"line":45,"column":11}}]},"6":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":40},"end":{"line":42,"column":7}},"locations":[{"start":{"line":40,"column":40},"end":{"line":42,"column":7}}]},"7":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":50,"column":5}},"locations":[{"start":{"line":45,"column":4},"end":{"line":50,"column":5}}]},"8":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":38},"end":{"line":49,"column":7}},"locations":[{"start":{"line":47,"column":38},"end":{"line":49,"column":7}}]},"9":{"type":"branch","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":53,"column":11}},"locations":[{"start":{"line":50,"column":4},"end":{"line":53,"column":11}}]},"10":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":2},"end":{"line":62,"column":3}},"locations":[{"start":{"line":53,"column":2},"end":{"line":62,"column":3}}]},"11":{"type":"branch","line":55,"loc":{"start":{"line":55,"column":36},"end":{"line":57,"column":5}},"locations":[{"start":{"line":55,"column":36},"end":{"line":57,"column":5}}]},"12":{"type":"branch","line":59,"loc":{"start":{"line":59,"column":37},"end":{"line":59,"column":61}},"locations":[{"start":{"line":59,"column":37},"end":{"line":59,"column":61}}]},"13":{"type":"branch","line":69,"loc":{"start":{"line":69,"column":27},"end":{"line":100,"column":2}},"locations":[{"start":{"line":69,"column":27},"end":{"line":100,"column":2}}]},"14":{"type":"branch","line":77,"loc":{"start":{"line":77,"column":15},"end":{"line":97,"column":4}},"locations":[{"start":{"line":77,"column":15},"end":{"line":97,"column":4}}]},"15":{"type":"branch","line":80,"loc":{"start":{"line":80,"column":28},"end":{"line":82,"column":5}},"locations":[{"start":{"line":80,"column":28},"end":{"line":82,"column":5}}]},"16":{"type":"branch","line":85,"loc":{"start":{"line":85,"column":23},"end":{"line":85,"column":40}},"locations":[{"start":{"line":85,"column":23},"end":{"line":85,"column":40}}]},"17":{"type":"branch","line":85,"loc":{"start":{"line":85,"column":34},"end":{"line":85,"column":78}},"locations":[{"start":{"line":85,"column":34},"end":{"line":85,"column":78}}]},"18":{"type":"branch","line":87,"loc":{"start":{"line":87,"column":39},"end":{"line":89,"column":5}},"locations":[{"start":{"line":87,"column":39},"end":{"line":89,"column":5}}]},"19":{"type":"branch","line":89,"loc":{"start":{"line":89,"column":4},"end":{"line":96,"column":45}},"locations":[{"start":{"line":89,"column":4},"end":{"line":96,"column":45}}]},"20":{"type":"branch","line":93,"loc":{"start":{"line":93,"column":12},"end":{"line":93,"column":78}},"locations":[{"start":{"line":93,"column":12},"end":{"line":93,"column":78}}]},"21":{"type":"branch","line":106,"loc":{"start":{"line":106,"column":32},"end":{"line":153,"column":2}},"locations":[{"start":{"line":106,"column":32},"end":{"line":153,"column":2}}]},"22":{"type":"branch","line":114,"loc":{"start":{"line":114,"column":29},"end":{"line":121,"column":3}},"locations":[{"start":{"line":114,"column":29},"end":{"line":121,"column":3}}]},"23":{"type":"branch","line":116,"loc":{"start":{"line":116,"column":30},"end":{"line":120,"column":5}},"locations":[{"start":{"line":116,"column":30},"end":{"line":120,"column":5}}]},"24":{"type":"branch","line":123,"loc":{"start":{"line":123,"column":69},"end":{"line":123,"column":87}},"locations":[{"start":{"line":123,"column":69},"end":{"line":123,"column":87}}]},"25":{"type":"branch","line":143,"loc":{"start":{"line":143,"column":2},"end":{"line":152,"column":3}},"locations":[{"start":{"line":143,"column":2},"end":{"line":152,"column":3}}]},"26":{"type":"branch","line":127,"loc":{"start":{"line":127,"column":22},"end":{"line":136,"column":6}},"locations":[{"start":{"line":127,"column":22},"end":{"line":136,"column":6}}]}},"b":{"0":[48],"1":[5],"2":[46],"3":[4],"4":[46],"5":[41],"6":[3],"7":[5],"8":[3],"9":[46],"10":[2],"11":[1],"12":[0],"13":[49],"14":[59],"15":[0],"16":[0],"17":[0],"18":[48],"19":[11],"20":[10],"21":[49],"22":[45],"23":[0],"24":[0],"25":[0],"26":[48]},"fnMap":{"0":{"name":"executeProcedureWithHooks","decl":{"start":{"line":16,"column":34},"end":{"line":63,"column":2}},"loc":{"start":{"line":16,"column":34},"end":{"line":63,"column":2}},"line":16},"1":{"name":"runMiddlewareChain","decl":{"start":{"line":69,"column":27},"end":{"line":100,"column":2}},"loc":{"start":{"line":69,"column":27},"end":{"line":100,"column":2}},"line":69},"2":{"name":"next","decl":{"start":{"line":77,"column":15},"end":{"line":97,"column":4}},"loc":{"start":{"line":77,"column":15},"end":{"line":97,"column":4}},"line":77},"3":{"name":"next","decl":{"start":{"line":93,"column":12},"end":{"line":93,"column":78}},"loc":{"start":{"line":93,"column":12},"end":{"line":93,"column":78}},"line":93},"4":{"name":"executeProcedure","decl":{"start":{"line":106,"column":32},"end":{"line":153,"column":2}},"loc":{"start":{"line":106,"column":32},"end":{"line":153,"column":2}},"line":106},"5":{"name":"finalInvoke","decl":{"start":{"line":127,"column":22},"end":{"line":136,"column":6}},"loc":{"start":{"line":127,"column":22},"end":{"line":136,"column":6}},"line":127}},"f":{"0":48,"1":49,"2":59,"3":10,"4":49,"5":48}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\proxy.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\proxy.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":36}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":39}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":36}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":30}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":11}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":95}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":52}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":19}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":7}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":5}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":60}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":30}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":33}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":9}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":35}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":27}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":9}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":39}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":24}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":9}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":64}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":34}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":24}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":9}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":28}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":33}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":53}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":54}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":31}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":16}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":29}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":25}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":18}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":20}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":12}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":41}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":71}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":18}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":79}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":11}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":65}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":37}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":58}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":27}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":12}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":16}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":26}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":9}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":32}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":22}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":8}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":5}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":2}}},"s":{"0":1,"11":1,"12":115,"13":115,"15":115,"16":115,"19":115,"21":115,"22":115,"24":115,"25":115,"26":100,"27":7,"28":7,"30":100,"31":0,"32":0,"34":100,"35":0,"36":0,"38":93,"39":100,"40":2,"41":2,"43":91,"45":100,"46":46,"49":46,"50":46,"51":46,"52":46,"53":46,"54":46,"55":46,"56":46,"58":46,"59":4,"60":45,"61":42,"62":42,"63":90,"65":45,"66":45,"67":45,"68":45,"69":45,"70":0,"71":0,"74":91,"75":91,"76":100,"77":115,"78":115,"79":115},"branchMap":{"0":{"type":"branch","line":12,"loc":{"start":{"line":12,"column":33},"end":{"line":80,"column":2}},"locations":[{"start":{"line":12,"column":33},"end":{"line":80,"column":2}}]},"1":{"type":"branch","line":26,"loc":{"start":{"line":26,"column":6},"end":{"line":77,"column":8}},"locations":[{"start":{"line":26,"column":6},"end":{"line":77,"column":8}}]},"2":{"type":"branch","line":27,"loc":{"start":{"line":27,"column":29},"end":{"line":29,"column":9}},"locations":[{"start":{"line":27,"column":29},"end":{"line":29,"column":9}}]},"3":{"type":"branch","line":29,"loc":{"start":{"line":29,"column":8},"end":{"line":31,"column":34}},"locations":[{"start":{"line":29,"column":8},"end":{"line":31,"column":34}}]},"4":{"type":"branch","line":31,"loc":{"start":{"line":31,"column":34},"end":{"line":33,"column":9}},"locations":[{"start":{"line":31,"column":34},"end":{"line":33,"column":9}}]},"5":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":8},"end":{"line":35,"column":38}},"locations":[{"start":{"line":33,"column":8},"end":{"line":35,"column":38}}]},"6":{"type":"branch","line":35,"loc":{"start":{"line":35,"column":38},"end":{"line":37,"column":9}},"locations":[{"start":{"line":35,"column":38},"end":{"line":37,"column":9}}]},"7":{"type":"branch","line":37,"loc":{"start":{"line":37,"column":8},"end":{"line":40,"column":33}},"locations":[{"start":{"line":37,"column":8},"end":{"line":40,"column":33}}]},"8":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":33},"end":{"line":42,"column":9}},"locations":[{"start":{"line":40,"column":33},"end":{"line":42,"column":9}}]},"9":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":8},"end":{"line":46,"column":32}},"locations":[{"start":{"line":42,"column":8},"end":{"line":46,"column":32}}]},"10":{"type":"branch","line":46,"loc":{"start":{"line":46,"column":32},"end":{"line":72,"column":9}},"locations":[{"start":{"line":46,"column":32},"end":{"line":72,"column":9}}]},"11":{"type":"branch","line":46,"loc":{"start":{"line":46,"column":32},"end":{"line":64,"column":19}},"locations":[{"start":{"line":46,"column":32},"end":{"line":64,"column":19}}]},"12":{"type":"branch","line":59,"loc":{"start":{"line":59,"column":40},"end":{"line":63,"column":11}},"locations":[{"start":{"line":59,"column":40},"end":{"line":63,"column":11}}]},"13":{"type":"branch","line":59,"loc":{"start":{"line":59,"column":40},"end":{"line":61,"column":17}},"locations":[{"start":{"line":59,"column":40},"end":{"line":61,"column":17}}]},"14":{"type":"branch","line":61,"loc":{"start":{"line":61,"column":10},"end":{"line":63,"column":11}},"locations":[{"start":{"line":61,"column":10},"end":{"line":63,"column":11}}]},"15":{"type":"branch","line":64,"loc":{"start":{"line":64,"column":8},"end":{"line":72,"column":9}},"locations":[{"start":{"line":64,"column":8},"end":{"line":72,"column":9}}]},"16":{"type":"branch","line":70,"loc":{"start":{"line":70,"column":8},"end":{"line":72,"column":9}},"locations":[{"start":{"line":70,"column":8},"end":{"line":72,"column":9}}]},"17":{"type":"branch","line":72,"loc":{"start":{"line":72,"column":8},"end":{"line":76,"column":22}},"locations":[{"start":{"line":72,"column":8},"end":{"line":76,"column":22}}]},"18":{"type":"branch","line":60,"loc":{"start":{"line":60,"column":21},"end":{"line":60,"column":71}},"locations":[{"start":{"line":60,"column":21},"end":{"line":60,"column":71}}]},"19":{"type":"branch","line":62,"loc":{"start":{"line":62,"column":21},"end":{"line":62,"column":79}},"locations":[{"start":{"line":62,"column":21},"end":{"line":62,"column":79}}]}},"b":{"0":[115],"1":[100],"2":[7],"3":[93],"4":[0],"5":[93],"6":[0],"7":[93],"8":[2],"9":[91],"10":[90],"11":[46],"12":[45],"13":[4],"14":[42],"15":[45],"16":[0],"17":[91],"18":[4],"19":[45]},"fnMap":{"0":{"name":"createRouterProxy","decl":{"start":{"line":12,"column":33},"end":{"line":80,"column":2}},"loc":{"start":{"line":12,"column":33},"end":{"line":80,"column":2}},"line":12},"1":{"name":"get","decl":{"start":{"line":26,"column":6},"end":{"line":77,"column":8}},"loc":{"start":{"line":26,"column":6},"end":{"line":77,"column":8}},"line":26},"2":{"name":"result","decl":{"start":{"line":60,"column":21},"end":{"line":60,"column":71}},"loc":{"start":{"line":60,"column":21},"end":{"line":60,"column":71}},"line":60},"3":{"name":"result","decl":{"start":{"line":62,"column":21},"end":{"line":62,"column":79}},"loc":{"start":{"line":62,"column":21},"end":{"line":62,"column":79}},"line":62}},"f":{"0":115,"1":100,"2":4,"3":45}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\route.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\route.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":43}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":40}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":36}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":32}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":95}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":54}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":19}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":38}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":44}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":56}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":20}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":40}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":5}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":19}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":32}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":72}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":14}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":8}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":9}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":33}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":17}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":10}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":10}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":12}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":40}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":2}}},"s":{"0":1,"11":1,"12":49,"13":49,"14":49,"15":49,"16":49,"20":49,"21":49,"22":0,"23":0,"26":49,"27":49,"28":49,"30":49,"32":49,"33":49,"34":49,"36":49,"37":0,"38":0,"41":49,"42":49,"43":49,"44":49,"45":49,"46":49,"47":49,"48":49,"49":49,"50":49,"52":49,"53":49},"branchMap":{"0":{"type":"branch","line":12,"loc":{"start":{"line":12,"column":28},"end":{"line":54,"column":2}},"locations":[{"start":{"line":12,"column":28},"end":{"line":54,"column":2}}]},"1":{"type":"branch","line":22,"loc":{"start":{"line":22,"column":18},"end":{"line":24,"column":3}},"locations":[{"start":{"line":22,"column":18},"end":{"line":24,"column":3}}]},"2":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":6},"end":{"line":33,"column":22}},"locations":[{"start":{"line":33,"column":6},"end":{"line":33,"column":22}}]},"3":{"type":"branch","line":37,"loc":{"start":{"line":37,"column":18},"end":{"line":39,"column":3}},"locations":[{"start":{"line":37,"column":18},"end":{"line":39,"column":3}}]}},"b":{"0":[49],"1":[0],"2":[0],"3":[0]},"fnMap":{"0":{"name":"executeRoute","decl":{"start":{"line":12,"column":28},"end":{"line":54,"column":2}},"loc":{"start":{"line":12,"column":28},"end":{"line":54,"column":2}},"line":12}},"f":{"0":49}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\send.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\send.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":105}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":45}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":59}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":19}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":27}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":12}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":28}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":25}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":14}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":27}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":11}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":42}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":57}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":14}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":7}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":4}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":72}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":11}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":20}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":33}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":35}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":43}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":49}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":87}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":2}}},"s":{"0":1,"8":1,"14":1,"15":49,"17":49,"18":14,"19":14,"20":14,"21":14,"22":14,"23":14,"24":14,"25":14,"26":14,"27":14,"28":14,"29":14,"31":1,"32":49,"33":49,"34":49,"35":49,"36":49,"37":49,"40":49,"41":49},"branchMap":{"0":{"type":"branch","line":15,"loc":{"start":{"line":15,"column":28},"end":{"line":30,"column":4}},"locations":[{"start":{"line":15,"column":28},"end":{"line":30,"column":4}}]},"1":{"type":"branch","line":18,"loc":{"start":{"line":18,"column":2},"end":{"line":30,"column":4}},"locations":[{"start":{"line":18,"column":2},"end":{"line":30,"column":4}}]},"2":{"type":"branch","line":27,"loc":{"start":{"line":27,"column":17},"end":{"line":27,"column":39}},"locations":[{"start":{"line":27,"column":17},"end":{"line":27,"column":39}}]},"3":{"type":"branch","line":27,"loc":{"start":{"line":27,"column":26},"end":{"line":27,"column":57}},"locations":[{"start":{"line":27,"column":26},"end":{"line":27,"column":57}}]},"4":{"type":"branch","line":32,"loc":{"start":{"line":32,"column":36},"end":{"line":42,"column":2}},"locations":[{"start":{"line":32,"column":36},"end":{"line":42,"column":2}}]}},"b":{"0":[49],"1":[14],"2":[1],"3":[13],"4":[49]},"fnMap":{"0":{"name":"createSendFn","decl":{"start":{"line":15,"column":28},"end":{"line":30,"column":4}},"loc":{"start":{"line":15,"column":28},"end":{"line":30,"column":4}},"line":15},"1":{"name":"createHandlerContext","decl":{"start":{"line":32,"column":36},"end":{"line":42,"column":2}},"loc":{"start":{"line":32,"column":36},"end":{"line":42,"column":2}},"line":32}},"f":{"0":49,"1":49}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\utils.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\factory\\utils.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":57}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":85}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":37}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":26}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":30}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":56}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":55}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":50}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":43}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":19}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":5}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":3}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":47}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":49}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":25}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":21}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":3}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":19}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":2}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":33}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":21}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":18}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":21}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":66}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":44}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":36}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":2}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":71}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":16}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":2}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":81}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":35}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":2}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":67}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":40}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":2}}},"s":{"0":1,"9":1,"12":1,"13":49,"14":49,"15":49,"17":49,"18":49,"20":49,"21":49,"22":0,"23":0,"24":49,"25":49,"26":49,"27":49,"29":0,"30":0,"31":49,"32":49,"35":1,"36":1,"37":1,"38":1,"39":1,"41":1,"43":93,"45":0,"46":0,"48":1,"50":0,"51":0,"53":1,"54":46,"55":46,"57":1,"59":46,"60":46},"branchMap":{"0":{"type":"branch","line":10,"loc":{"start":{"line":10,"column":30},"end":{"line":10,"column":85}},"locations":[{"start":{"line":10,"column":30},"end":{"line":10,"column":85}}]},"1":{"type":"branch","line":13,"loc":{"start":{"line":13,"column":36},"end":{"line":33,"column":2}},"locations":[{"start":{"line":13,"column":36},"end":{"line":33,"column":2}}]},"2":{"type":"branch","line":22,"loc":{"start":{"line":22,"column":18},"end":{"line":24,"column":5}},"locations":[{"start":{"line":22,"column":18},"end":{"line":24,"column":5}}]},"3":{"type":"branch","line":28,"loc":{"start":{"line":28,"column":24},"end":{"line":31,"column":3}},"locations":[{"start":{"line":28,"column":24},"end":{"line":31,"column":3}}]},"4":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":29},"end":{"line":47,"column":2}},"locations":[{"start":{"line":42,"column":29},"end":{"line":47,"column":2}}]},"5":{"type":"branch","line":44,"loc":{"start":{"line":44,"column":39},"end":{"line":47,"column":2}},"locations":[{"start":{"line":44,"column":39},"end":{"line":47,"column":2}}]},"6":{"type":"branch","line":54,"loc":{"start":{"line":54,"column":29},"end":{"line":56,"column":2}},"locations":[{"start":{"line":54,"column":29},"end":{"line":56,"column":2}}]},"7":{"type":"branch","line":58,"loc":{"start":{"line":58,"column":33},"end":{"line":61,"column":2}},"locations":[{"start":{"line":58,"column":33},"end":{"line":61,"column":2}}]}},"b":{"0":[49],"1":[49],"2":[0],"3":[0],"4":[93],"5":[0],"6":[46],"7":[46]},"fnMap":{"0":{"name":"splitRoutePath","decl":{"start":{"line":10,"column":30},"end":{"line":10,"column":85}},"loc":{"start":{"line":10,"column":30},"end":{"line":10,"column":85}},"line":10},"1":{"name":"getProcedureFromPath","decl":{"start":{"line":13,"column":36},"end":{"line":33,"column":2}},"loc":{"start":{"line":13,"column":36},"end":{"line":33,"column":2}},"line":13},"2":{"name":"isValidSymbol","decl":{"start":{"line":42,"column":29},"end":{"line":47,"column":2}},"loc":{"start":{"line":42,"column":29},"end":{"line":47,"column":2}},"line":42},"3":{"name":"getSymbolProperty","decl":{"start":{"line":49,"column":33},"end":{"line":52,"column":2}},"loc":{"start":{"line":49,"column":33},"end":{"line":52,"column":2}},"line":49},"4":{"name":"buildFullPath","decl":{"start":{"line":54,"column":29},"end":{"line":56,"column":2}},"loc":{"start":{"line":54,"column":29},"end":{"line":56,"column":2}},"line":54},"5":{"name":"isNoArgsProcedure","decl":{"start":{"line":58,"column":33},"end":{"line":61,"column":2}},"loc":{"start":{"line":58,"column":33},"end":{"line":61,"column":2}},"line":58}},"f":{"0":49,"1":49,"2":93,"3":0,"4":46,"5":46}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\types\\api.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\types\\api.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":1129},"end":{"line":35,"column":3}},"locations":[{"start":{"line":1,"column":1129},"end":{"line":35,"column":3}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":1129},"end":{"line":35,"column":3}},"loc":{"start":{"line":1,"column":1129},"end":{"line":35,"column":3}},"line":1}},"f":{"0":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\types\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\types\\index.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":485},"end":{"line":14,"column":23}},"locations":[{"start":{"line":1,"column":485},"end":{"line":14,"column":23}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":485},"end":{"line":14,"column":23}},"loc":{"start":{"line":1,"column":485},"end":{"line":14,"column":23}},"line":1}},"f":{"0":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\types\\internal.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\types\\internal.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":2651},"end":{"line":62,"column":3}},"locations":[{"start":{"line":1,"column":2651},"end":{"line":62,"column":3}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":2651},"end":{"line":62,"column":3}},"loc":{"start":{"line":1,"column":2651},"end":{"line":62,"column":3}},"line":1}},"f":{"0":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\types\\proxy.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\api\\types\\proxy.ts","all":false,"statementMap":{"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":67}}},"s":{"10":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\context\\builder.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\context\\builder.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":115}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":28}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":3}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":24}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":117}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":27}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":14}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":111}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":33}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":19}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":5}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":27}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":39}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":27}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":25}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":3}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":111}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":68}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":19}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":25}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":59}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":17}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":6}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":107}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":55}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":25}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":19}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":12}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":6}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":3}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":12}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":5}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":89}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":84}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":95}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":40}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":30}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":47}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":58}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":30}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":39}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":11}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":43}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":72}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":63}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":11}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":9}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":7}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":5}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":112}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":24}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":33}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":53}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":47}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":41}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":21}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":9}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":6}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":41}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":3}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":1}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":66}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":35}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":1}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":30}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":42}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":3}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":66}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":77}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":67}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":86}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":95}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":22}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":31}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":14}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":20}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":14}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":39}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":19}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":7}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":4}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":39}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":1}}},"s":{"0":1,"11":1,"16":1,"17":31,"18":31,"19":31,"20":31,"22":31,"23":31,"24":31,"26":31,"27":31,"28":31,"29":31,"30":31,"31":31,"32":31,"33":31,"40":31,"41":14,"42":14,"43":14,"44":14,"45":14,"46":14,"47":14,"52":31,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"65":31,"68":9,"69":9,"70":9,"73":9,"77":9,"78":10,"79":5,"80":5,"81":5,"82":5,"83":5,"84":5,"85":5,"86":7,"87":7,"88":5,"89":5,"90":10,"93":9,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"103":9,"104":9,"105":31,"111":1,"112":15,"113":15,"119":1,"123":65,"127":65,"128":65,"130":65,"132":65,"135":65,"138":65,"139":55,"140":55,"141":55,"142":55,"143":55,"144":55,"145":55,"146":55,"147":55,"149":65,"150":65},"branchMap":{"0":{"type":"branch","line":17,"loc":{"start":{"line":17,"column":2},"end":{"line":106,"column":1}},"locations":[{"start":{"line":17,"column":2},"end":{"line":106,"column":1}}]},"1":{"type":"branch","line":23,"loc":{"start":{"line":23,"column":2},"end":{"line":34,"column":3}},"locations":[{"start":{"line":23,"column":2},"end":{"line":34,"column":3}}]},"2":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":2},"end":{"line":48,"column":3}},"locations":[{"start":{"line":41,"column":2},"end":{"line":48,"column":3}}]},"3":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":2},"end":{"line":60,"column":3}},"locations":[{"start":{"line":53,"column":2},"end":{"line":60,"column":3}}]},"4":{"type":"branch","line":66,"loc":{"start":{"line":66,"column":2},"end":{"line":105,"column":3}},"locations":[{"start":{"line":66,"column":2},"end":{"line":105,"column":3}}]},"5":{"type":"branch","line":70,"loc":{"start":{"line":70,"column":30},"end":{"line":70,"column":79}},"locations":[{"start":{"line":70,"column":30},"end":{"line":70,"column":79}}]},"6":{"type":"branch","line":71,"loc":{"start":{"line":71,"column":32},"end":{"line":71,"column":71}},"locations":[{"start":{"line":71,"column":32},"end":{"line":71,"column":71}}]},"7":{"type":"branch","line":78,"loc":{"start":{"line":78,"column":39},"end":{"line":91,"column":5}},"locations":[{"start":{"line":78,"column":39},"end":{"line":91,"column":5}}]},"8":{"type":"branch","line":79,"loc":{"start":{"line":79,"column":29},"end":{"line":90,"column":7}},"locations":[{"start":{"line":79,"column":29},"end":{"line":90,"column":7}}]},"9":{"type":"branch","line":86,"loc":{"start":{"line":86,"column":71},"end":{"line":88,"column":11}},"locations":[{"start":{"line":86,"column":71},"end":{"line":88,"column":11}}]},"10":{"type":"branch","line":94,"loc":{"start":{"line":94,"column":24},"end":{"line":102,"column":6}},"locations":[{"start":{"line":94,"column":24},"end":{"line":102,"column":6}}]},"11":{"type":"branch","line":112,"loc":{"start":{"line":112,"column":7},"end":{"line":114,"column":1}},"locations":[{"start":{"line":112,"column":7},"end":{"line":114,"column":1}}]},"12":{"type":"branch","line":120,"loc":{"start":{"line":120,"column":7},"end":{"line":151,"column":1}},"locations":[{"start":{"line":120,"column":7},"end":{"line":151,"column":1}}]},"13":{"type":"branch","line":131,"loc":{"start":{"line":131,"column":23},"end":{"line":131,"column":67}},"locations":[{"start":{"line":131,"column":23},"end":{"line":131,"column":67}}]},"14":{"type":"branch","line":131,"loc":{"start":{"line":131,"column":63},"end":{"line":131,"column":77}},"locations":[{"start":{"line":131,"column":63},"end":{"line":131,"column":77}}]},"15":{"type":"branch","line":133,"loc":{"start":{"line":133,"column":25},"end":{"line":133,"column":59}},"locations":[{"start":{"line":133,"column":25},"end":{"line":133,"column":59}}]},"16":{"type":"branch","line":133,"loc":{"start":{"line":133,"column":55},"end":{"line":133,"column":67}},"locations":[{"start":{"line":133,"column":55},"end":{"line":133,"column":67}}]},"17":{"type":"branch","line":139,"loc":{"start":{"line":139,"column":22},"end":{"line":148,"column":4}},"locations":[{"start":{"line":139,"column":22},"end":{"line":148,"column":4}}]}},"b":{"0":[31],"1":[31],"2":[14],"3":[2],"4":[9],"5":[0],"6":[0],"7":[10],"8":[5],"9":[7],"10":[2],"11":[15],"12":[65],"13":[18],"14":[47],"15":[1],"16":[64],"17":[55]},"fnMap":{"0":{"name":"","decl":{"start":{"line":17,"column":2},"end":{"line":106,"column":1}},"loc":{"start":{"line":17,"column":2},"end":{"line":106,"column":1}},"line":17},"1":{"name":"ContextBuilder","decl":{"start":{"line":23,"column":2},"end":{"line":34,"column":3}},"loc":{"start":{"line":23,"column":2},"end":{"line":34,"column":3}},"line":23},"2":{"name":"use","decl":{"start":{"line":41,"column":2},"end":{"line":48,"column":3}},"loc":{"start":{"line":41,"column":2},"end":{"line":48,"column":3}},"line":41},"3":{"name":"withEvents","decl":{"start":{"line":53,"column":2},"end":{"line":60,"column":3}},"loc":{"start":{"line":53,"column":2},"end":{"line":60,"column":3}},"line":53},"4":{"name":"build","decl":{"start":{"line":66,"column":2},"end":{"line":105,"column":3}},"loc":{"start":{"line":66,"column":2},"end":{"line":105,"column":3}},"line":66},"5":{"name":"createAPIFn","decl":{"start":{"line":94,"column":24},"end":{"line":102,"column":6}},"loc":{"start":{"line":94,"column":24},"end":{"line":102,"column":6}},"line":94},"6":{"name":"createContextBuilder","decl":{"start":{"line":112,"column":7},"end":{"line":114,"column":1}},"loc":{"start":{"line":112,"column":7},"end":{"line":114,"column":1}},"line":112},"7":{"name":"defineContext","decl":{"start":{"line":120,"column":7},"end":{"line":151,"column":1}},"loc":{"start":{"line":120,"column":7},"end":{"line":151,"column":1}},"line":120},"8":{"name":"createAPIFn","decl":{"start":{"line":139,"column":22},"end":{"line":148,"column":4}},"loc":{"start":{"line":139,"column":22},"end":{"line":148,"column":4}},"line":139}},"f":{"0":31,"1":31,"2":14,"3":2,"4":9,"5":2,"6":15,"7":65,"8":55}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\context\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\context\\index.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":54}}},"s":{"0":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\context\\types.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\context\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":613},"end":{"line":15,"column":1}},"locations":[{"start":{"line":1,"column":613},"end":{"line":15,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":613},"end":{"line":15,"column":1}},"loc":{"start":{"line":1,"column":613},"end":{"line":15,"column":1}},"line":1}},"f":{"0":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\errors\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\errors\\index.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}}},"s":{"0":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\errors\\server-error.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\errors\\server-error.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":62}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":44}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":31}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":37}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":86}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":96}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":112}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":19}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":34}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":21}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":33}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":31}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":31}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":94}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":3}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":1}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":56}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":47}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":37}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":36}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":1}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":60}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":41}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":40}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":40}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":58}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":32}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":44}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":38}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":1}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":27}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":25}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":31}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":39}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":25}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":23}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":35}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":37}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":31}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":11}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":24}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":22}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":22}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":57}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":22}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":22}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":57}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":21}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":21}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":57}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":5}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":27}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":27}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":57}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":28}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":28}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":57}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":5}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":29}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":29}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":57}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":5}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":11}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":102}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":70}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":16}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":34}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":3}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":90}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":1}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":113}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":106}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":20}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":1}}},"s":{"0":1,"6":1,"7":0,"8":0,"9":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"23":1,"24":1,"25":0,"26":0,"27":0,"28":1,"30":1,"31":1,"32":0,"33":0,"34":0,"35":1,"37":1,"38":1,"39":0,"40":0,"41":0,"42":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"99":1,"100":0,"101":0,"102":0},"branchMap":{},"b":{},"fnMap":{"0":{"name":"","decl":{"start":{"line":7,"column":43},"end":{"line":22,"column":1}},"loc":{"start":{"line":7,"column":43},"end":{"line":22,"column":1}},"line":7},"1":{"name":"NotFoundException","decl":{"start":{"line":25,"column":2},"end":{"line":28,"column":3}},"loc":{"start":{"line":25,"column":2},"end":{"line":28,"column":3}},"line":25},"2":{"name":"UnauthorizedException","decl":{"start":{"line":32,"column":2},"end":{"line":35,"column":3}},"loc":{"start":{"line":32,"column":2},"end":{"line":35,"column":3}},"line":32},"3":{"name":"ValidationException","decl":{"start":{"line":39,"column":2},"end":{"line":42,"column":3}},"loc":{"start":{"line":39,"column":2},"end":{"line":42,"column":3}},"line":39},"4":{"name":"message","decl":{"start":{"line":67,"column":13},"end":{"line":67,"column":57}},"loc":{"start":{"line":67,"column":13},"end":{"line":67,"column":57}},"line":67},"5":{"name":"message","decl":{"start":{"line":71,"column":13},"end":{"line":71,"column":57}},"loc":{"start":{"line":71,"column":13},"end":{"line":71,"column":57}},"line":71},"6":{"name":"message","decl":{"start":{"line":75,"column":13},"end":{"line":75,"column":57}},"loc":{"start":{"line":75,"column":13},"end":{"line":75,"column":57}},"line":75},"7":{"name":"message","decl":{"start":{"line":79,"column":13},"end":{"line":79,"column":57}},"loc":{"start":{"line":79,"column":13},"end":{"line":79,"column":57}},"line":79},"8":{"name":"message","decl":{"start":{"line":83,"column":13},"end":{"line":83,"column":57}},"loc":{"start":{"line":83,"column":13},"end":{"line":83,"column":57}},"line":83},"9":{"name":"message","decl":{"start":{"line":87,"column":13},"end":{"line":87,"column":57}},"loc":{"start":{"line":87,"column":13},"end":{"line":87,"column":57}},"line":87},"10":{"name":"createError","decl":{"start":{"line":91,"column":0},"end":{"line":97,"column":1}},"loc":{"start":{"line":91,"column":0},"end":{"line":97,"column":1}},"line":91},"11":{"name":"createErrorResult","decl":{"start":{"line":100,"column":7},"end":{"line":103,"column":1}},"loc":{"start":{"line":100,"column":7},"end":{"line":103,"column":1}},"line":100}},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\errors\\types.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\errors\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":105},"end":{"line":5,"column":1}},"locations":[{"start":{"line":1,"column":105},"end":{"line":5,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":105},"end":{"line":5,"column":1}},"loc":{"start":{"line":1,"column":105},"end":{"line":5,"column":1}},"line":1}},"f":{"0":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\events\\dsl.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\events\\dsl.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":71}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":52}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":1}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":31}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":37}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":11}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":23}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":1}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":46}}},"s":{"0":1,"26":1,"27":6,"28":6,"54":1,"58":1,"59":1,"61":1,"62":1,"67":1},"branchMap":{"0":{"type":"branch","line":27,"loc":{"start":{"line":27,"column":7},"end":{"line":29,"column":1}},"locations":[{"start":{"line":27,"column":7},"end":{"line":29,"column":1}}]},"1":{"type":"branch","line":55,"loc":{"start":{"line":55,"column":7},"end":{"line":63,"column":1}},"locations":[{"start":{"line":55,"column":7},"end":{"line":63,"column":1}}]}},"b":{"0":[6],"1":[1]},"fnMap":{"0":{"name":"event","decl":{"start":{"line":27,"column":7},"end":{"line":29,"column":1}},"loc":{"start":{"line":27,"column":7},"end":{"line":29,"column":1}},"line":27},"1":{"name":"eventNamespace","decl":{"start":{"line":55,"column":7},"end":{"line":63,"column":1}},"loc":{"start":{"line":55,"column":7},"end":{"line":63,"column":1}},"line":55}},"f":{"0":6,"1":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\events\\emitter.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\events\\emitter.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":68}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":32}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":63}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":100}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":52}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":17}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":36}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":16}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":58}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":16}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":15}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":73}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":99}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":40}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":60}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":33}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":37}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":21}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":87}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":17}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":37}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":40}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":46}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":36}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":52}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":51}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":52}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":58}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":11}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":60}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":9}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":7}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":5}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":54}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":18}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":31}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":6}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":3}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":38}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":21}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":87}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":11}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":37}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":50}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":19}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":38}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":32}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":40}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":46}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":7}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":5}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":3}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":58}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":41}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":48}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":54}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":57}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":27}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":31}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":31}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":44}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":5}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":3}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":13}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":33}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":18}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":22}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":28}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":38}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":51}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":65}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":85}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":19}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":39}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":33}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":7}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":5}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":45}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":31}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":5}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":35}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":22}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":11}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":42}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":40}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":6}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":32}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":52}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":28}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":5}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":48}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":40}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":11}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":40}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":40}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":23}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":9}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":24}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":81}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":110}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":26}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":7}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":5}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":20}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":3}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":33}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":30}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":3}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":25}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":23}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":3}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":104}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":80}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":45}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":58}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":20}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":3}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":107}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":51}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":25}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":45}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":30}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":7}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":5}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":3}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":128}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":44}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":34}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":13}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":5}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":39}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":65}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":29}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":13}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":5}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":46}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":53}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":61}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":31}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":51}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":34}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":11}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":9}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":7}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":5}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":3}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":72}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":37}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":43}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":44}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":33}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":64}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":5}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":35}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":60}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":5}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":17}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":3}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":70}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":42}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":61}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":50}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":57}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":5}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":16}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":3}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":70}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":42}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":61}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":58}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":50}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":66}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":5}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":16}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":3}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":1}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":78}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":38}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":1}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":60}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":17}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":21}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":18}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":35}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":42}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":54}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":41}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":35}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":30}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":52}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":76}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":5}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":3}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":16}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":1}}},"s":{"0":1,"3":1,"10":1,"26":1,"27":10,"28":0,"29":0,"32":10,"33":6,"34":6,"38":10,"39":0,"40":0,"42":4,"43":4,"45":1,"46":54,"47":54,"50":54,"52":54,"53":54,"55":54,"56":47,"57":47,"58":47,"59":47,"60":47,"61":40,"63":40,"64":3,"65":3,"66":3,"67":3,"68":3,"69":3,"70":3,"71":3,"72":40,"74":47,"78":47,"79":5,"80":5,"81":47,"83":54,"84":7,"85":7,"86":7,"87":7,"88":7,"89":7,"91":7,"95":7,"96":4,"97":4,"98":4,"99":7,"100":7,"102":54,"103":4,"105":0,"106":4,"108":0,"109":0,"111":0,"112":0,"113":0,"114":0,"115":4,"122":54,"123":60,"124":60,"125":60,"126":60,"127":60,"128":60,"129":60,"132":60,"133":60,"134":39,"135":46,"136":46,"137":39,"138":60,"139":11,"140":11,"143":60,"144":60,"145":60,"146":60,"147":60,"148":60,"150":60,"151":60,"152":0,"153":0,"156":60,"158":54,"159":56,"160":56,"161":56,"162":2,"163":2,"164":56,"165":3,"166":3,"167":3,"168":3,"169":56,"171":46,"172":60,"174":54,"175":13,"176":13,"178":54,"179":1,"180":1,"182":54,"183":60,"185":60,"186":60,"188":60,"189":60,"191":54,"192":60,"193":60,"194":5,"195":5,"196":5,"197":5,"198":60,"200":54,"201":60,"202":60,"203":0,"204":0,"206":60,"207":60,"208":60,"209":54,"210":54,"212":6,"213":6,"214":6,"215":6,"216":6,"217":6,"218":6,"219":6,"220":6,"221":6,"222":60,"224":54,"225":6,"226":6,"228":6,"231":6,"232":6,"233":6,"236":0,"237":0,"238":0,"240":0,"241":6,"243":54,"244":6,"245":6,"247":6,"248":6,"249":6,"250":6,"251":6,"253":54,"254":0,"255":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":54,"265":1,"267":3,"268":3,"280":1,"281":7,"282":7,"283":7,"284":7,"285":7,"286":10,"287":10,"289":10,"290":6,"291":10,"293":4,"294":4,"295":10,"296":7,"297":7},"branchMap":{"0":{"type":"branch","line":27,"loc":{"start":{"line":27,"column":7},"end":{"line":44,"column":1}},"locations":[{"start":{"line":27,"column":7},"end":{"line":44,"column":1}}]},"1":{"type":"branch","line":28,"loc":{"start":{"line":28,"column":51},"end":{"line":30,"column":3}},"locations":[{"start":{"line":28,"column":51},"end":{"line":30,"column":3}}]},"2":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":35},"end":{"line":35,"column":3}},"locations":[{"start":{"line":33,"column":35},"end":{"line":35,"column":3}}]},"3":{"type":"branch","line":35,"loc":{"start":{"line":35,"column":2},"end":{"line":39,"column":25}},"locations":[{"start":{"line":35,"column":2},"end":{"line":39,"column":25}}]},"4":{"type":"branch","line":39,"loc":{"start":{"line":39,"column":16},"end":{"line":39,"column":57}},"locations":[{"start":{"line":39,"column":16},"end":{"line":39,"column":57}}]},"5":{"type":"branch","line":39,"loc":{"start":{"line":39,"column":57},"end":{"line":41,"column":3}},"locations":[{"start":{"line":39,"column":57},"end":{"line":41,"column":3}}]},"6":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":2},"end":{"line":44,"column":1}},"locations":[{"start":{"line":41,"column":2},"end":{"line":44,"column":1}}]},"7":{"type":"branch","line":46,"loc":{"start":{"line":46,"column":72},"end":{"line":264,"column":1}},"locations":[{"start":{"line":46,"column":72},"end":{"line":264,"column":1}}]},"8":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":2},"end":{"line":54,"column":3}},"locations":[{"start":{"line":53,"column":2},"end":{"line":54,"column":3}}]},"9":{"type":"branch","line":56,"loc":{"start":{"line":56,"column":2},"end":{"line":82,"column":3}},"locations":[{"start":{"line":56,"column":2},"end":{"line":82,"column":3}}]},"10":{"type":"branch","line":61,"loc":{"start":{"line":61,"column":39},"end":{"line":73,"column":5}},"locations":[{"start":{"line":61,"column":39},"end":{"line":73,"column":5}}]},"11":{"type":"branch","line":64,"loc":{"start":{"line":64,"column":35},"end":{"line":72,"column":7}},"locations":[{"start":{"line":64,"column":35},"end":{"line":72,"column":7}}]},"12":{"type":"branch","line":79,"loc":{"start":{"line":79,"column":11},"end":{"line":81,"column":6}},"locations":[{"start":{"line":79,"column":11},"end":{"line":81,"column":6}}]},"13":{"type":"branch","line":84,"loc":{"start":{"line":84,"column":2},"end":{"line":101,"column":3}},"locations":[{"start":{"line":84,"column":2},"end":{"line":101,"column":3}}]},"14":{"type":"branch","line":96,"loc":{"start":{"line":96,"column":31},"end":{"line":99,"column":7}},"locations":[{"start":{"line":96,"column":31},"end":{"line":99,"column":7}}]},"15":{"type":"branch","line":103,"loc":{"start":{"line":103,"column":10},"end":{"line":116,"column":3}},"locations":[{"start":{"line":103,"column":10},"end":{"line":116,"column":3}}]},"16":{"type":"branch","line":104,"loc":{"start":{"line":104,"column":34},"end":{"line":107,"column":47}},"locations":[{"start":{"line":104,"column":34},"end":{"line":107,"column":47}}]},"17":{"type":"branch","line":107,"loc":{"start":{"line":107,"column":47},"end":{"line":115,"column":5}},"locations":[{"start":{"line":107,"column":47},"end":{"line":115,"column":5}}]},"18":{"type":"branch","line":123,"loc":{"start":{"line":123,"column":2},"end":{"line":173,"column":3}},"locations":[{"start":{"line":123,"column":2},"end":{"line":173,"column":3}}]},"19":{"type":"branch","line":134,"loc":{"start":{"line":134,"column":18},"end":{"line":138,"column":5}},"locations":[{"start":{"line":134,"column":18},"end":{"line":138,"column":5}}]},"20":{"type":"branch","line":135,"loc":{"start":{"line":135,"column":38},"end":{"line":137,"column":7}},"locations":[{"start":{"line":135,"column":38},"end":{"line":137,"column":7}}]},"21":{"type":"branch","line":139,"loc":{"start":{"line":139,"column":44},"end":{"line":141,"column":5}},"locations":[{"start":{"line":139,"column":44},"end":{"line":141,"column":5}}]},"22":{"type":"branch","line":148,"loc":{"start":{"line":148,"column":17},"end":{"line":148,"column":40}},"locations":[{"start":{"line":148,"column":17},"end":{"line":148,"column":40}}]},"23":{"type":"branch","line":152,"loc":{"start":{"line":152,"column":51},"end":{"line":154,"column":5}},"locations":[{"start":{"line":152,"column":51},"end":{"line":154,"column":5}}]},"24":{"type":"branch","line":157,"loc":{"start":{"line":157,"column":32},"end":{"line":170,"column":5}},"locations":[{"start":{"line":157,"column":32},"end":{"line":170,"column":5}}]},"25":{"type":"branch","line":157,"loc":{"start":{"line":157,"column":32},"end":{"line":157,"column":48}},"locations":[{"start":{"line":157,"column":32},"end":{"line":157,"column":48}}]},"26":{"type":"branch","line":157,"loc":{"start":{"line":157,"column":46},"end":{"line":159,"column":39}},"locations":[{"start":{"line":157,"column":46},"end":{"line":159,"column":39}}]},"27":{"type":"branch","line":159,"loc":{"start":{"line":159,"column":39},"end":{"line":170,"column":5}},"locations":[{"start":{"line":159,"column":39},"end":{"line":170,"column":5}}]},"28":{"type":"branch","line":162,"loc":{"start":{"line":162,"column":39},"end":{"line":164,"column":9}},"locations":[{"start":{"line":162,"column":39},"end":{"line":164,"column":9}}]},"29":{"type":"branch","line":165,"loc":{"start":{"line":165,"column":6},"end":{"line":169,"column":7}},"locations":[{"start":{"line":165,"column":6},"end":{"line":169,"column":7}}]},"30":{"type":"branch","line":166,"loc":{"start":{"line":166,"column":56},"end":{"line":166,"column":81}},"locations":[{"start":{"line":166,"column":56},"end":{"line":166,"column":81}}]},"31":{"type":"branch","line":170,"loc":{"start":{"line":170,"column":4},"end":{"line":172,"column":20}},"locations":[{"start":{"line":170,"column":4},"end":{"line":172,"column":20}}]},"32":{"type":"branch","line":167,"loc":{"start":{"line":167,"column":63},"end":{"line":167,"column":86}},"locations":[{"start":{"line":167,"column":63},"end":{"line":167,"column":86}}]},"33":{"type":"branch","line":175,"loc":{"start":{"line":175,"column":2},"end":{"line":177,"column":3}},"locations":[{"start":{"line":175,"column":2},"end":{"line":177,"column":3}}]},"34":{"type":"branch","line":179,"loc":{"start":{"line":179,"column":2},"end":{"line":181,"column":3}},"locations":[{"start":{"line":179,"column":2},"end":{"line":181,"column":3}}]},"35":{"type":"branch","line":183,"loc":{"start":{"line":183,"column":10},"end":{"line":190,"column":3}},"locations":[{"start":{"line":183,"column":10},"end":{"line":190,"column":3}}]},"36":{"type":"branch","line":192,"loc":{"start":{"line":192,"column":10},"end":{"line":199,"column":3}},"locations":[{"start":{"line":192,"column":10},"end":{"line":199,"column":3}}]},"37":{"type":"branch","line":194,"loc":{"start":{"line":194,"column":24},"end":{"line":198,"column":5}},"locations":[{"start":{"line":194,"column":24},"end":{"line":198,"column":5}}]},"38":{"type":"branch","line":201,"loc":{"start":{"line":201,"column":10},"end":{"line":223,"column":3}},"locations":[{"start":{"line":201,"column":10},"end":{"line":223,"column":3}}]},"39":{"type":"branch","line":203,"loc":{"start":{"line":203,"column":33},"end":{"line":205,"column":5}},"locations":[{"start":{"line":203,"column":33},"end":{"line":205,"column":5}}]},"40":{"type":"branch","line":209,"loc":{"start":{"line":209,"column":28},"end":{"line":211,"column":5}},"locations":[{"start":{"line":209,"column":28},"end":{"line":211,"column":5}}]},"41":{"type":"branch","line":211,"loc":{"start":{"line":211,"column":4},"end":{"line":222,"column":5}},"locations":[{"start":{"line":211,"column":4},"end":{"line":222,"column":5}}]},"42":{"type":"branch","line":225,"loc":{"start":{"line":225,"column":10},"end":{"line":242,"column":3}},"locations":[{"start":{"line":225,"column":10},"end":{"line":242,"column":3}}]},"43":{"type":"branch","line":226,"loc":{"start":{"line":226,"column":25},"end":{"line":226,"column":37}},"locations":[{"start":{"line":226,"column":25},"end":{"line":226,"column":37}}]},"44":{"type":"branch","line":227,"loc":{"start":{"line":227,"column":31},"end":{"line":227,"column":43}},"locations":[{"start":{"line":227,"column":31},"end":{"line":227,"column":43}}]},"45":{"type":"branch","line":234,"loc":{"start":{"line":234,"column":4},"end":{"line":241,"column":17}},"locations":[{"start":{"line":234,"column":4},"end":{"line":241,"column":17}}]},"46":{"type":"branch","line":244,"loc":{"start":{"line":244,"column":10},"end":{"line":252,"column":3}},"locations":[{"start":{"line":244,"column":10},"end":{"line":252,"column":3}}]},"47":{"type":"branch","line":246,"loc":{"start":{"line":246,"column":48},"end":{"line":246,"column":61}},"locations":[{"start":{"line":246,"column":48},"end":{"line":246,"column":61}}]},"48":{"type":"branch","line":249,"loc":{"start":{"line":249,"column":44},"end":{"line":249,"column":57}},"locations":[{"start":{"line":249,"column":44},"end":{"line":249,"column":57}}]},"49":{"type":"branch","line":266,"loc":{"start":{"line":266,"column":7},"end":{"line":269,"column":1}},"locations":[{"start":{"line":266,"column":7},"end":{"line":269,"column":1}}]},"50":{"type":"branch","line":281,"loc":{"start":{"line":281,"column":7},"end":{"line":298,"column":1}},"locations":[{"start":{"line":281,"column":7},"end":{"line":298,"column":1}}]},"51":{"type":"branch","line":286,"loc":{"start":{"line":286,"column":41},"end":{"line":296,"column":3}},"locations":[{"start":{"line":286,"column":41},"end":{"line":296,"column":3}}]},"52":{"type":"branch","line":287,"loc":{"start":{"line":287,"column":20},"end":{"line":287,"column":50}},"locations":[{"start":{"line":287,"column":20},"end":{"line":287,"column":50}}]},"53":{"type":"branch","line":287,"loc":{"start":{"line":287,"column":45},"end":{"line":287,"column":54}},"locations":[{"start":{"line":287,"column":45},"end":{"line":287,"column":54}}]},"54":{"type":"branch","line":290,"loc":{"start":{"line":290,"column":34},"end":{"line":292,"column":15}},"locations":[{"start":{"line":290,"column":34},"end":{"line":292,"column":15}}]},"55":{"type":"branch","line":292,"loc":{"start":{"line":292,"column":4},"end":{"line":295,"column":5}},"locations":[{"start":{"line":292,"column":4},"end":{"line":295,"column":5}}]}},"b":{"0":[10],"1":[0],"2":[6],"3":[4],"4":[0],"5":[0],"6":[4],"7":[54],"8":[54],"9":[47],"10":[40],"11":[3],"12":[5],"13":[7],"14":[4],"15":[4],"16":[0],"17":[0],"18":[60],"19":[39],"20":[46],"21":[11],"22":[37],"23":[0],"24":[54],"25":[11],"26":[49],"27":[56],"28":[2],"29":[3],"30":[0],"31":[46],"32":[3],"33":[13],"34":[1],"35":[60],"36":[60],"37":[5],"38":[60],"39":[0],"40":[54],"41":[6],"42":[6],"43":[0],"44":[0],"45":[0],"46":[6],"47":[0],"48":[0],"49":[3],"50":[7],"51":[10],"52":[6],"53":[4],"54":[6],"55":[4]},"fnMap":{"0":{"name":"isEventDefinition","decl":{"start":{"line":27,"column":7},"end":{"line":44,"column":1}},"loc":{"start":{"line":27,"column":7},"end":{"line":44,"column":1}},"line":27},"1":{"name":"","decl":{"start":{"line":46,"column":72},"end":{"line":264,"column":1}},"loc":{"start":{"line":46,"column":72},"end":{"line":264,"column":1}},"line":46},"2":{"name":"EventEmitter","decl":{"start":{"line":53,"column":2},"end":{"line":54,"column":3}},"loc":{"start":{"line":53,"column":2},"end":{"line":54,"column":3}},"line":53},"3":{"name":"on","decl":{"start":{"line":56,"column":2},"end":{"line":82,"column":3}},"loc":{"start":{"line":56,"column":2},"end":{"line":82,"column":3}},"line":56},"4":{"name":"off","decl":{"start":{"line":84,"column":2},"end":{"line":101,"column":3}},"loc":{"start":{"line":84,"column":2},"end":{"line":101,"column":3}},"line":84},"5":{"name":"removePatternFromIndex","decl":{"start":{"line":103,"column":10},"end":{"line":116,"column":3}},"loc":{"start":{"line":103,"column":10},"end":{"line":116,"column":3}},"line":103},"6":{"name":"emit","decl":{"start":{"line":123,"column":2},"end":{"line":173,"column":3}},"loc":{"start":{"line":123,"column":2},"end":{"line":173,"column":3}},"line":123},"7":{"name":"message","decl":{"start":{"line":167,"column":63},"end":{"line":167,"column":86}},"loc":{"start":{"line":167,"column":63},"end":{"line":167,"column":86}},"line":167},"8":{"name":"getEventLog","decl":{"start":{"line":175,"column":2},"end":{"line":177,"column":3}},"loc":{"start":{"line":175,"column":2},"end":{"line":177,"column":3}},"line":175},"9":{"name":"clearEventLog","decl":{"start":{"line":179,"column":2},"end":{"line":181,"column":3}},"loc":{"start":{"line":179,"column":2},"end":{"line":181,"column":3}},"line":179},"10":{"name":"getWildcardHandlers","decl":{"start":{"line":183,"column":10},"end":{"line":190,"column":3}},"loc":{"start":{"line":183,"column":10},"end":{"line":190,"column":3}},"line":183},"11":{"name":"addGlobalWildcardHandlers","decl":{"start":{"line":192,"column":10},"end":{"line":199,"column":3}},"loc":{"start":{"line":192,"column":10},"end":{"line":199,"column":3}},"line":192},"12":{"name":"addMatchingWildcardHandlers","decl":{"start":{"line":201,"column":10},"end":{"line":223,"column":3}},"loc":{"start":{"line":201,"column":10},"end":{"line":223,"column":3}},"line":201},"13":{"name":"isWildcardMatch","decl":{"start":{"line":225,"column":10},"end":{"line":242,"column":3}},"loc":{"start":{"line":225,"column":10},"end":{"line":242,"column":3}},"line":225},"14":{"name":"matchPrefix","decl":{"start":{"line":244,"column":10},"end":{"line":252,"column":3}},"loc":{"start":{"line":244,"column":10},"end":{"line":252,"column":3}},"line":244},"15":{"name":"matchSuffix","decl":{"start":{"line":254,"column":10},"end":{"line":263,"column":3}},"loc":{"start":{"line":254,"column":10},"end":{"line":263,"column":3}},"line":254},"16":{"name":"defineEvents","decl":{"start":{"line":266,"column":7},"end":{"line":269,"column":1}},"loc":{"start":{"line":266,"column":7},"end":{"line":269,"column":1}},"line":266},"17":{"name":"flattenEvents","decl":{"start":{"line":281,"column":7},"end":{"line":298,"column":1}},"loc":{"start":{"line":281,"column":7},"end":{"line":298,"column":1}},"line":281}},"f":{"0":10,"1":54,"2":54,"3":47,"4":7,"5":4,"6":60,"7":3,"8":13,"9":1,"10":60,"11":60,"12":60,"13":6,"14":6,"15":0,"16":3,"17":7}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\events\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\events\\index.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":47}}},"s":{"0":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\events\\queue.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\events\\queue.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":48}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":65}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":35}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":10}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":39}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":26}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":30}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":25}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":24}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":35}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":35}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":9}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":80}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":45}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":21}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":24}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":7}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":29}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":11}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":38}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":85}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":27}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":52}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":26}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":11}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":27}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":9}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":21}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":24}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":24}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":48}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":81}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":110}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":26}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":7}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":6}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":24}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":19}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":6}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":29}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":34}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":6}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":35}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":26}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":6}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":25}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":28}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":6}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":2}}},"s":{"0":1,"17":1,"18":78,"20":78,"21":78,"22":25,"23":25,"24":25,"25":25,"26":25,"27":25,"28":25,"29":25,"30":25,"32":78,"33":45,"34":31,"35":31,"36":31,"37":14,"38":14,"39":21,"40":17,"41":17,"42":1,"43":1,"44":1,"45":16,"46":16,"47":13,"48":13,"49":21,"50":0,"51":0,"52":0,"53":0,"54":0,"55":45,"57":78,"58":1,"59":1,"61":78,"62":4,"63":4,"65":78,"66":1,"67":1,"69":78,"70":3,"71":3,"72":78,"73":78},"branchMap":{"0":{"type":"branch","line":18,"loc":{"start":{"line":18,"column":39},"end":{"line":74,"column":2}},"locations":[{"start":{"line":18,"column":39},"end":{"line":74,"column":2}}]},"1":{"type":"branch","line":22,"loc":{"start":{"line":22,"column":13},"end":{"line":31,"column":6}},"locations":[{"start":{"line":22,"column":13},"end":{"line":31,"column":6}}]},"2":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":11},"end":{"line":56,"column":6}},"locations":[{"start":{"line":33,"column":11},"end":{"line":56,"column":6}}]},"3":{"type":"branch","line":34,"loc":{"start":{"line":34,"column":11},"end":{"line":34,"column":44}},"locations":[{"start":{"line":34,"column":11},"end":{"line":34,"column":44}}]},"4":{"type":"branch","line":34,"loc":{"start":{"line":34,"column":44},"end":{"line":37,"column":7}},"locations":[{"start":{"line":34,"column":44},"end":{"line":37,"column":7}}]},"5":{"type":"branch","line":37,"loc":{"start":{"line":37,"column":6},"end":{"line":55,"column":7}},"locations":[{"start":{"line":37,"column":6},"end":{"line":55,"column":7}}]},"6":{"type":"branch","line":37,"loc":{"start":{"line":37,"column":6},"end":{"line":40,"column":37}},"locations":[{"start":{"line":37,"column":6},"end":{"line":40,"column":37}}]},"7":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":37},"end":{"line":47,"column":9}},"locations":[{"start":{"line":40,"column":37},"end":{"line":47,"column":9}}]},"8":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":26},"end":{"line":45,"column":11}},"locations":[{"start":{"line":42,"column":26},"end":{"line":45,"column":11}}]},"9":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":10},"end":{"line":47,"column":9}},"locations":[{"start":{"line":45,"column":10},"end":{"line":47,"column":9}}]},"10":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":8},"end":{"line":50,"column":15}},"locations":[{"start":{"line":47,"column":8},"end":{"line":50,"column":15}}]},"11":{"type":"branch","line":50,"loc":{"start":{"line":50,"column":6},"end":{"line":55,"column":7}},"locations":[{"start":{"line":50,"column":6},"end":{"line":55,"column":7}}]},"12":{"type":"branch","line":58,"loc":{"start":{"line":58,"column":11},"end":{"line":60,"column":6}},"locations":[{"start":{"line":58,"column":11},"end":{"line":60,"column":6}}]},"13":{"type":"branch","line":62,"loc":{"start":{"line":62,"column":13},"end":{"line":64,"column":6}},"locations":[{"start":{"line":62,"column":13},"end":{"line":64,"column":6}}]},"14":{"type":"branch","line":66,"loc":{"start":{"line":66,"column":12},"end":{"line":68,"column":6}},"locations":[{"start":{"line":66,"column":12},"end":{"line":68,"column":6}}]},"15":{"type":"branch","line":70,"loc":{"start":{"line":70,"column":10},"end":{"line":72,"column":6}},"locations":[{"start":{"line":70,"column":10},"end":{"line":72,"column":6}}]}},"b":{"0":[78],"1":[25],"2":[45],"3":[14],"4":[31],"5":[21],"6":[14],"7":[17],"8":[1],"9":[16],"10":[13],"11":[0],"12":[1],"13":[4],"14":[1],"15":[3]},"fnMap":{"0":{"name":"createPendingEventQueue","decl":{"start":{"line":18,"column":39},"end":{"line":74,"column":2}},"loc":{"start":{"line":18,"column":39},"end":{"line":74,"column":2}},"line":18},"1":{"name":"enqueue","decl":{"start":{"line":22,"column":13},"end":{"line":31,"column":6}},"loc":{"start":{"line":22,"column":13},"end":{"line":31,"column":6}},"line":22},"2":{"name":"flush","decl":{"start":{"line":33,"column":11},"end":{"line":56,"column":6}},"loc":{"start":{"line":33,"column":11},"end":{"line":56,"column":6}},"line":33},"3":{"name":"message","decl":{"start":{"line":53,"column":63},"end":{"line":53,"column":86}},"loc":{"start":{"line":53,"column":63},"end":{"line":53,"column":86}},"line":53},"4":{"name":"clear","decl":{"start":{"line":58,"column":11},"end":{"line":60,"column":6}},"loc":{"start":{"line":58,"column":11},"end":{"line":60,"column":6}},"line":58},"5":{"name":"isEmpty","decl":{"start":{"line":62,"column":13},"end":{"line":64,"column":6}},"loc":{"start":{"line":62,"column":13},"end":{"line":64,"column":6}},"line":62},"6":{"name":"events","decl":{"start":{"line":66,"column":12},"end":{"line":68,"column":6}},"loc":{"start":{"line":66,"column":12},"end":{"line":68,"column":6}},"line":66},"7":{"name":"size","decl":{"start":{"line":70,"column":10},"end":{"line":72,"column":6}},"loc":{"start":{"line":70,"column":10},"end":{"line":72,"column":6}},"line":70}},"f":{"0":78,"1":25,"2":45,"3":0,"4":1,"5":4,"6":1,"7":3}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\events\\types.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\events\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":63},"end":{"line":1,"column":63}},"locations":[{"start":{"line":1,"column":63},"end":{"line":1,"column":63}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":63},"end":{"line":1,"column":63}},"loc":{"start":{"line":1,"column":63},"end":{"line":1,"column":63}},"line":1}},"f":{"0":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\hooks\\executor.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\hooks\\executor.ts","all":false,"statementMap":{"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":54}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":34}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":11}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":13}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":18}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":26}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":47}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":3}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":18}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":26}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":53}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":10}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":51}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":5}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":3}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":53}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":48}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":11}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":12}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":18}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":13}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":26}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}}},"s":{"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"11":2,"12":2,"13":2,"16":2,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":2,"27":3,"28":3,"29":3,"30":3,"31":3,"32":3,"33":2,"34":2,"35":3},"branchMap":{"0":{"type":"branch","line":5,"loc":{"start":{"line":5,"column":0},"end":{"line":26,"column":1}},"locations":[{"start":{"line":5,"column":0},"end":{"line":26,"column":1}}]},"1":{"type":"branch","line":17,"loc":{"start":{"line":17,"column":17},"end":{"line":25,"column":3}},"locations":[{"start":{"line":17,"column":17},"end":{"line":25,"column":3}}]},"2":{"type":"branch","line":28,"loc":{"start":{"line":28,"column":0},"end":{"line":36,"column":1}},"locations":[{"start":{"line":28,"column":0},"end":{"line":36,"column":1}}]},"3":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":12},"end":{"line":35,"column":3}},"locations":[{"start":{"line":33,"column":12},"end":{"line":35,"column":3}}]}},"b":{"0":[2],"1":[1],"2":[3],"3":[2]},"fnMap":{"0":{"name":"executeHooks","decl":{"start":{"line":5,"column":0},"end":{"line":26,"column":1}},"loc":{"start":{"line":5,"column":0},"end":{"line":26,"column":1}},"line":5},"1":{"name":"executeBeforeInvoke","decl":{"start":{"line":28,"column":0},"end":{"line":36,"column":1}},"loc":{"start":{"line":28,"column":0},"end":{"line":36,"column":1}},"line":28}},"f":{"0":2,"1":3}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\hooks\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\hooks\\index.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}}},"s":{"0":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\hooks\\types.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\hooks\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":426},"end":{"line":9,"column":1}},"locations":[{"start":{"line":1,"column":426},"end":{"line":9,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":426},"end":{"line":9,"column":1}},"loc":{"start":{"line":1,"column":426},"end":{"line":9,"column":1}},"line":1}},"f":{"0":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\internal-mutation\\builder.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\internal-mutation\\builder.ts","all":false,"statementMap":{"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":67}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":51}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":49}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":32}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":29}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":28}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":35}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":53}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":1}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":31}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":63}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":27}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":20}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":32}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":26}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":15}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":20}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":73}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":42}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":22}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":79}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":41}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":22}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":75}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":39}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":22}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":4}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":71}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":37}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":22}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":4}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":58}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":28}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":40}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":34}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":39}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":59}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":6}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":71}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":41}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":21}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":6}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":74}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":40}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":21}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":6}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":70}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":38}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":21}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":6}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":66}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":36}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":21}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":6}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":49}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":27}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":27}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":39}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":33}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":38}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":50}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":8}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":72}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":42}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":22}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":8}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":75}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":41}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":22}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":8}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":71}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":39}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":22}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":8}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":67}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":37}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":22}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":8}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":31}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":20}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":6}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":19}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":4}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":20}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":1}}},"s":{"14":1,"15":11,"16":11,"17":11,"18":11,"19":11,"21":11,"23":11,"24":11,"49":11,"54":11,"55":11,"56":11,"57":11,"58":11,"59":11,"60":11,"61":11,"63":11,"64":2,"65":2,"66":2,"68":11,"69":2,"70":2,"71":2,"73":11,"74":2,"75":2,"76":2,"78":11,"79":2,"80":2,"81":2,"83":11,"84":2,"85":2,"86":2,"87":2,"88":2,"89":2,"90":2,"92":2,"93":0,"94":0,"95":0,"97":2,"98":0,"99":0,"100":0,"102":2,"103":0,"104":0,"105":0,"107":2,"108":0,"109":0,"110":0,"112":2,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"121":0,"122":0,"123":0,"124":0,"126":0,"127":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"138":0,"139":0,"141":0,"142":0,"143":0,"145":2,"146":2,"148":11,"149":11},"branchMap":{"0":{"type":"branch","line":15,"loc":{"start":{"line":15,"column":7},"end":{"line":25,"column":1}},"locations":[{"start":{"line":15,"column":7},"end":{"line":25,"column":1}}]},"1":{"type":"branch","line":50,"loc":{"start":{"line":50,"column":0},"end":{"line":150,"column":1}},"locations":[{"start":{"line":50,"column":0},"end":{"line":150,"column":1}}]},"2":{"type":"branch","line":64,"loc":{"start":{"line":64,"column":28},"end":{"line":67,"column":4}},"locations":[{"start":{"line":64,"column":28},"end":{"line":67,"column":4}}]},"3":{"type":"branch","line":69,"loc":{"start":{"line":69,"column":27},"end":{"line":72,"column":4}},"locations":[{"start":{"line":69,"column":27},"end":{"line":72,"column":4}}]},"4":{"type":"branch","line":74,"loc":{"start":{"line":74,"column":25},"end":{"line":77,"column":4}},"locations":[{"start":{"line":74,"column":25},"end":{"line":77,"column":4}}]},"5":{"type":"branch","line":79,"loc":{"start":{"line":79,"column":23},"end":{"line":82,"column":4}},"locations":[{"start":{"line":79,"column":23},"end":{"line":82,"column":4}}]},"6":{"type":"branch","line":84,"loc":{"start":{"line":84,"column":19},"end":{"line":147,"column":4}},"locations":[{"start":{"line":84,"column":19},"end":{"line":147,"column":4}}]}},"b":{"0":[11],"1":[11],"2":[2],"3":[2],"4":[2],"5":[2],"6":[2]},"fnMap":{"0":{"name":"createInternalMutationWithHooks","decl":{"start":{"line":15,"column":7},"end":{"line":25,"column":1}},"loc":{"start":{"line":15,"column":7},"end":{"line":25,"column":1}},"line":15},"1":{"name":"createHookedProcedure","decl":{"start":{"line":50,"column":0},"end":{"line":150,"column":1}},"loc":{"start":{"line":50,"column":0},"end":{"line":150,"column":1}},"line":50},"2":{"name":"hookedProc.beforeInvoke","decl":{"start":{"line":64,"column":28},"end":{"line":67,"column":4}},"loc":{"start":{"line":64,"column":28},"end":{"line":67,"column":4}},"line":64},"3":{"name":"hookedProc.afterInvoke","decl":{"start":{"line":69,"column":27},"end":{"line":72,"column":4}},"loc":{"start":{"line":69,"column":27},"end":{"line":72,"column":4}},"line":69},"4":{"name":"hookedProc.onSuccess","decl":{"start":{"line":74,"column":25},"end":{"line":77,"column":4}},"loc":{"start":{"line":74,"column":25},"end":{"line":77,"column":4}},"line":74},"5":{"name":"hookedProc.onError","decl":{"start":{"line":79,"column":23},"end":{"line":82,"column":4}},"loc":{"start":{"line":79,"column":23},"end":{"line":82,"column":4}},"line":79},"6":{"name":"hookedProc.use","decl":{"start":{"line":84,"column":19},"end":{"line":147,"column":4}},"loc":{"start":{"line":84,"column":19},"end":{"line":147,"column":4}},"line":84},"7":{"name":"newProc.beforeInvoke","decl":{"start":{"line":93,"column":27},"end":{"line":96,"column":6}},"loc":{"start":{"line":93,"column":27},"end":{"line":96,"column":6}},"line":93},"8":{"name":"newProc.afterInvoke","decl":{"start":{"line":98,"column":26},"end":{"line":101,"column":6}},"loc":{"start":{"line":98,"column":26},"end":{"line":101,"column":6}},"line":98},"9":{"name":"newProc.onSuccess","decl":{"start":{"line":103,"column":24},"end":{"line":106,"column":6}},"loc":{"start":{"line":103,"column":24},"end":{"line":106,"column":6}},"line":103},"10":{"name":"newProc.onError","decl":{"start":{"line":108,"column":22},"end":{"line":111,"column":6}},"loc":{"start":{"line":108,"column":22},"end":{"line":111,"column":6}},"line":108},"11":{"name":"newProc.use","decl":{"start":{"line":113,"column":18},"end":{"line":144,"column":6}},"loc":{"start":{"line":113,"column":18},"end":{"line":144,"column":6}},"line":113}},"f":{"0":11,"1":11,"2":2,"3":2,"4":2,"5":2,"6":2,"7":0,"8":0,"9":0,"10":0,"11":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\internal-mutation\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\internal-mutation\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":57}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}},"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\internal-mutation\\types.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\internal-mutation\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":380},"end":{"line":8,"column":1}},"locations":[{"start":{"line":1,"column":380},"end":{"line":8,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":380},"end":{"line":8,"column":1}},"loc":{"start":{"line":1,"column":380},"end":{"line":8,"column":1}},"line":1}},"f":{"0":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\internal-query\\builder.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\internal-query\\builder.ts","all":false,"statementMap":{"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":58}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":42}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":40}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":32}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":26}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":35}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":44}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":1}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":50}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":35}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":74}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":27}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":20}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":32}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":26}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":15}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":20}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":4}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":73}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":42}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":22}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":4}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":79}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":41}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":22}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":4}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":75}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":39}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":22}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":4}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":68}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":37}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":22}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":4}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":58}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":26}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":28}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":40}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":34}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":39}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":59}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":6}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":71}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":41}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":6}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":74}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":40}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":21}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":6}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":70}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":38}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":21}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":6}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":66}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":36}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":21}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":6}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":49}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":27}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":27}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":39}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":33}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":38}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":50}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":8}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":72}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":42}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":22}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":8}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":75}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":41}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":22}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":8}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":71}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":39}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":22}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":8}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":67}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":37}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":22}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":8}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":31}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":20}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":6}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":19}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":4}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":20}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":1}}},"s":{"14":1,"15":11,"16":11,"17":11,"18":11,"19":11,"20":11,"21":11,"45":11,"46":11,"47":11,"48":11,"49":11,"50":11,"51":11,"52":11,"53":11,"54":11,"56":11,"57":2,"58":2,"59":2,"61":11,"62":2,"63":2,"64":2,"66":11,"67":2,"68":2,"69":2,"71":11,"72":2,"73":2,"74":2,"76":11,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"85":2,"86":0,"87":0,"88":0,"90":2,"91":0,"92":0,"93":0,"95":2,"96":0,"97":0,"98":0,"100":2,"101":0,"102":0,"103":0,"105":2,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"121":0,"122":0,"124":0,"125":0,"126":0,"127":0,"129":0,"130":0,"131":0,"132":0,"134":0,"135":0,"136":0,"138":2,"139":2,"141":11,"142":11},"branchMap":{"0":{"type":"branch","line":15,"loc":{"start":{"line":15,"column":7},"end":{"line":22,"column":1}},"locations":[{"start":{"line":15,"column":7},"end":{"line":22,"column":1}}]},"1":{"type":"branch","line":46,"loc":{"start":{"line":46,"column":0},"end":{"line":143,"column":1}},"locations":[{"start":{"line":46,"column":0},"end":{"line":143,"column":1}}]},"2":{"type":"branch","line":57,"loc":{"start":{"line":57,"column":28},"end":{"line":60,"column":4}},"locations":[{"start":{"line":57,"column":28},"end":{"line":60,"column":4}}]},"3":{"type":"branch","line":62,"loc":{"start":{"line":62,"column":27},"end":{"line":65,"column":4}},"locations":[{"start":{"line":62,"column":27},"end":{"line":65,"column":4}}]},"4":{"type":"branch","line":67,"loc":{"start":{"line":67,"column":25},"end":{"line":70,"column":4}},"locations":[{"start":{"line":67,"column":25},"end":{"line":70,"column":4}}]},"5":{"type":"branch","line":72,"loc":{"start":{"line":72,"column":23},"end":{"line":75,"column":4}},"locations":[{"start":{"line":72,"column":23},"end":{"line":75,"column":4}}]},"6":{"type":"branch","line":77,"loc":{"start":{"line":77,"column":19},"end":{"line":140,"column":4}},"locations":[{"start":{"line":77,"column":19},"end":{"line":140,"column":4}}]}},"b":{"0":[11],"1":[11],"2":[2],"3":[2],"4":[2],"5":[2],"6":[2]},"fnMap":{"0":{"name":"createInternalQueryWithHooks","decl":{"start":{"line":15,"column":7},"end":{"line":22,"column":1}},"loc":{"start":{"line":15,"column":7},"end":{"line":22,"column":1}},"line":15},"1":{"name":"createHookedProcedure","decl":{"start":{"line":46,"column":0},"end":{"line":143,"column":1}},"loc":{"start":{"line":46,"column":0},"end":{"line":143,"column":1}},"line":46},"2":{"name":"hookedProc.beforeInvoke","decl":{"start":{"line":57,"column":28},"end":{"line":60,"column":4}},"loc":{"start":{"line":57,"column":28},"end":{"line":60,"column":4}},"line":57},"3":{"name":"hookedProc.afterInvoke","decl":{"start":{"line":62,"column":27},"end":{"line":65,"column":4}},"loc":{"start":{"line":62,"column":27},"end":{"line":65,"column":4}},"line":62},"4":{"name":"hookedProc.onSuccess","decl":{"start":{"line":67,"column":25},"end":{"line":70,"column":4}},"loc":{"start":{"line":67,"column":25},"end":{"line":70,"column":4}},"line":67},"5":{"name":"hookedProc.onError","decl":{"start":{"line":72,"column":23},"end":{"line":75,"column":4}},"loc":{"start":{"line":72,"column":23},"end":{"line":75,"column":4}},"line":72},"6":{"name":"hookedProc.use","decl":{"start":{"line":77,"column":19},"end":{"line":140,"column":4}},"loc":{"start":{"line":77,"column":19},"end":{"line":140,"column":4}},"line":77},"7":{"name":"newProc.beforeInvoke","decl":{"start":{"line":86,"column":27},"end":{"line":89,"column":6}},"loc":{"start":{"line":86,"column":27},"end":{"line":89,"column":6}},"line":86},"8":{"name":"newProc.afterInvoke","decl":{"start":{"line":91,"column":26},"end":{"line":94,"column":6}},"loc":{"start":{"line":91,"column":26},"end":{"line":94,"column":6}},"line":91},"9":{"name":"newProc.onSuccess","decl":{"start":{"line":96,"column":24},"end":{"line":99,"column":6}},"loc":{"start":{"line":96,"column":24},"end":{"line":99,"column":6}},"line":96},"10":{"name":"newProc.onError","decl":{"start":{"line":101,"column":22},"end":{"line":104,"column":6}},"loc":{"start":{"line":101,"column":22},"end":{"line":104,"column":6}},"line":101},"11":{"name":"newProc.use","decl":{"start":{"line":106,"column":18},"end":{"line":137,"column":6}},"loc":{"start":{"line":106,"column":18},"end":{"line":137,"column":6}},"line":106}},"f":{"0":11,"1":11,"2":2,"3":2,"4":2,"5":2,"6":2,"7":0,"8":0,"9":0,"10":0,"11":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\internal-query\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\internal-query\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":54}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}},"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\internal-query\\types.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\internal-query\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":296},"end":{"line":6,"column":1}},"locations":[{"start":{"line":1,"column":296},"end":{"line":6,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":296},"end":{"line":6,"column":1}},"loc":{"start":{"line":1,"column":296},"end":{"line":6,"column":1}},"line":1}},"f":{"0":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\middleware\\builder.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\middleware\\builder.ts","all":false,"statementMap":{"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":99}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":16}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":1}}},"s":{"2":1,"3":14,"4":14},"branchMap":{"0":{"type":"branch","line":3,"loc":{"start":{"line":3,"column":7},"end":{"line":5,"column":1}},"locations":[{"start":{"line":3,"column":7},"end":{"line":5,"column":1}}]}},"b":{"0":[14]},"fnMap":{"0":{"name":"createMiddleware","decl":{"start":{"line":3,"column":7},"end":{"line":5,"column":1}},"loc":{"start":{"line":3,"column":7},"end":{"line":5,"column":1}},"line":3}},"f":{"0":14}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\middleware\\helpers.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\middleware\\helpers.ts","all":false,"statementMap":{"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":26}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":17}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":22}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":8}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":72}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":21}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":45}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":37}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":23}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":41}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":19}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":1}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":29}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":20}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":22}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":8}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":75}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":24}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":45}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":40}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":23}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":44}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":22}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":1}}},"s":{"27":1,"28":2,"29":2,"30":2,"32":2,"33":1,"34":1,"36":2,"37":0,"38":0,"40":1,"41":1,"42":1,"43":0,"44":0,"69":1,"70":1,"71":1,"72":1,"74":1,"75":0,"76":0,"78":1,"79":0,"80":0,"82":1,"83":1,"84":1,"85":0,"86":0},"branchMap":{"0":{"type":"branch","line":28,"loc":{"start":{"line":28,"column":7},"end":{"line":45,"column":1}},"locations":[{"start":{"line":28,"column":7},"end":{"line":45,"column":1}}]},"1":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":27},"end":{"line":33,"column":71}},"locations":[{"start":{"line":33,"column":27},"end":{"line":33,"column":71}}]},"2":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":71},"end":{"line":37,"column":44}},"locations":[{"start":{"line":33,"column":71},"end":{"line":37,"column":44}}]},"3":{"type":"branch","line":37,"loc":{"start":{"line":37,"column":44},"end":{"line":39,"column":3}},"locations":[{"start":{"line":37,"column":44},"end":{"line":39,"column":3}}]},"4":{"type":"branch","line":39,"loc":{"start":{"line":39,"column":2},"end":{"line":43,"column":3}},"locations":[{"start":{"line":39,"column":2},"end":{"line":43,"column":3}}]},"5":{"type":"branch","line":43,"loc":{"start":{"line":43,"column":2},"end":{"line":45,"column":1}},"locations":[{"start":{"line":43,"column":2},"end":{"line":45,"column":1}}]},"6":{"type":"branch","line":70,"loc":{"start":{"line":70,"column":7},"end":{"line":87,"column":1}},"locations":[{"start":{"line":70,"column":7},"end":{"line":87,"column":1}}]},"7":{"type":"branch","line":75,"loc":{"start":{"line":75,"column":30},"end":{"line":75,"column":74}},"locations":[{"start":{"line":75,"column":30},"end":{"line":75,"column":74}}]},"8":{"type":"branch","line":75,"loc":{"start":{"line":75,"column":74},"end":{"line":77,"column":3}},"locations":[{"start":{"line":75,"column":74},"end":{"line":77,"column":3}}]},"9":{"type":"branch","line":79,"loc":{"start":{"line":79,"column":44},"end":{"line":81,"column":3}},"locations":[{"start":{"line":79,"column":44},"end":{"line":81,"column":3}}]},"10":{"type":"branch","line":85,"loc":{"start":{"line":85,"column":2},"end":{"line":87,"column":1}},"locations":[{"start":{"line":85,"column":2},"end":{"line":87,"column":1}}]}},"b":{"0":[2],"1":[1],"2":[1],"3":[0],"4":[1],"5":[0],"6":[1],"7":[0],"8":[0],"9":[0],"10":[0]},"fnMap":{"0":{"name":"withQuery","decl":{"start":{"line":28,"column":7},"end":{"line":45,"column":1}},"loc":{"start":{"line":28,"column":7},"end":{"line":45,"column":1}},"line":28},"1":{"name":"withMutation","decl":{"start":{"line":70,"column":7},"end":{"line":87,"column":1}},"loc":{"start":{"line":70,"column":7},"end":{"line":87,"column":1}},"line":70}},"f":{"0":2,"1":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\middleware\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\middleware\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":45}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}},"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\middleware\\types.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\middleware\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":46},"end":{"line":1,"column":46}},"locations":[{"start":{"line":1,"column":46},"end":{"line":1,"column":46}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":46},"end":{"line":1,"column":46}},"loc":{"start":{"line":1,"column":46},"end":{"line":1,"column":46}},"line":1}},"f":{"0":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\mutation\\builder.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\mutation\\builder.ts","all":false,"statementMap":{"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":59}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":43}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":41}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":32}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":21}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":28}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":28}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":45}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":1}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":68}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":27}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":20}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":32}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":26}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":15}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":20}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":72}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":42}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":22}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":75}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":41}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":22}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":71}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":39}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":22}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":4}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":67}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":37}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":22}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":4}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":58}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":28}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":40}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":34}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":39}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":59}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":6}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":71}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":41}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":21}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":6}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":74}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":40}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":21}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":6}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":70}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":38}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":21}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":6}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":66}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":36}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":21}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":6}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":49}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":27}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":27}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":39}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":33}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":38}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":50}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":8}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":72}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":42}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":22}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":8}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":75}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":41}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":22}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":8}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":71}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":39}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":22}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":8}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":67}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":37}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":22}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":8}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":31}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":20}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":6}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":19}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":4}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":20}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":1}}},"s":{"16":1,"17":11,"18":11,"19":11,"20":11,"21":11,"22":11,"23":11,"24":11,"54":11,"55":11,"56":11,"57":11,"58":11,"59":11,"60":11,"61":11,"63":11,"64":2,"65":2,"66":2,"68":11,"69":2,"70":2,"71":2,"73":11,"74":2,"75":2,"76":2,"78":11,"79":2,"80":2,"81":2,"83":11,"84":2,"85":2,"86":2,"87":2,"88":2,"89":2,"90":2,"92":2,"93":0,"94":0,"95":0,"97":2,"98":0,"99":0,"100":0,"102":2,"103":0,"104":0,"105":0,"107":2,"108":0,"109":0,"110":0,"112":2,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"121":0,"122":0,"123":0,"124":0,"126":0,"127":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"138":0,"139":0,"141":0,"142":0,"143":0,"145":2,"146":2,"148":11,"149":11},"branchMap":{"0":{"type":"branch","line":17,"loc":{"start":{"line":17,"column":7},"end":{"line":25,"column":1}},"locations":[{"start":{"line":17,"column":7},"end":{"line":25,"column":1}}]},"1":{"type":"branch","line":55,"loc":{"start":{"line":55,"column":0},"end":{"line":150,"column":1}},"locations":[{"start":{"line":55,"column":0},"end":{"line":150,"column":1}}]},"2":{"type":"branch","line":64,"loc":{"start":{"line":64,"column":28},"end":{"line":67,"column":4}},"locations":[{"start":{"line":64,"column":28},"end":{"line":67,"column":4}}]},"3":{"type":"branch","line":69,"loc":{"start":{"line":69,"column":27},"end":{"line":72,"column":4}},"locations":[{"start":{"line":69,"column":27},"end":{"line":72,"column":4}}]},"4":{"type":"branch","line":74,"loc":{"start":{"line":74,"column":25},"end":{"line":77,"column":4}},"locations":[{"start":{"line":74,"column":25},"end":{"line":77,"column":4}}]},"5":{"type":"branch","line":79,"loc":{"start":{"line":79,"column":23},"end":{"line":82,"column":4}},"locations":[{"start":{"line":79,"column":23},"end":{"line":82,"column":4}}]},"6":{"type":"branch","line":84,"loc":{"start":{"line":84,"column":19},"end":{"line":147,"column":4}},"locations":[{"start":{"line":84,"column":19},"end":{"line":147,"column":4}}]}},"b":{"0":[11],"1":[11],"2":[2],"3":[2],"4":[2],"5":[2],"6":[2]},"fnMap":{"0":{"name":"createMutationWithHooks","decl":{"start":{"line":17,"column":7},"end":{"line":25,"column":1}},"loc":{"start":{"line":17,"column":7},"end":{"line":25,"column":1}},"line":17},"1":{"name":"createHookedProcedure","decl":{"start":{"line":55,"column":0},"end":{"line":150,"column":1}},"loc":{"start":{"line":55,"column":0},"end":{"line":150,"column":1}},"line":55},"2":{"name":"hookedProc.beforeInvoke","decl":{"start":{"line":64,"column":28},"end":{"line":67,"column":4}},"loc":{"start":{"line":64,"column":28},"end":{"line":67,"column":4}},"line":64},"3":{"name":"hookedProc.afterInvoke","decl":{"start":{"line":69,"column":27},"end":{"line":72,"column":4}},"loc":{"start":{"line":69,"column":27},"end":{"line":72,"column":4}},"line":69},"4":{"name":"hookedProc.onSuccess","decl":{"start":{"line":74,"column":25},"end":{"line":77,"column":4}},"loc":{"start":{"line":74,"column":25},"end":{"line":77,"column":4}},"line":74},"5":{"name":"hookedProc.onError","decl":{"start":{"line":79,"column":23},"end":{"line":82,"column":4}},"loc":{"start":{"line":79,"column":23},"end":{"line":82,"column":4}},"line":79},"6":{"name":"hookedProc.use","decl":{"start":{"line":84,"column":19},"end":{"line":147,"column":4}},"loc":{"start":{"line":84,"column":19},"end":{"line":147,"column":4}},"line":84},"7":{"name":"newProc.beforeInvoke","decl":{"start":{"line":93,"column":27},"end":{"line":96,"column":6}},"loc":{"start":{"line":93,"column":27},"end":{"line":96,"column":6}},"line":93},"8":{"name":"newProc.afterInvoke","decl":{"start":{"line":98,"column":26},"end":{"line":101,"column":6}},"loc":{"start":{"line":98,"column":26},"end":{"line":101,"column":6}},"line":98},"9":{"name":"newProc.onSuccess","decl":{"start":{"line":103,"column":24},"end":{"line":106,"column":6}},"loc":{"start":{"line":103,"column":24},"end":{"line":106,"column":6}},"line":103},"10":{"name":"newProc.onError","decl":{"start":{"line":108,"column":22},"end":{"line":111,"column":6}},"loc":{"start":{"line":108,"column":22},"end":{"line":111,"column":6}},"line":108},"11":{"name":"newProc.use","decl":{"start":{"line":113,"column":18},"end":{"line":144,"column":6}},"loc":{"start":{"line":113,"column":18},"end":{"line":144,"column":6}},"line":113}},"f":{"0":11,"1":11,"2":2,"3":2,"4":2,"5":2,"6":2,"7":0,"8":0,"9":0,"10":0,"11":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\mutation\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\mutation\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":49}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}},"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":-2}},"line":1}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\mutation\\types.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\mutation\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":372},"end":{"line":8,"column":1}},"locations":[{"start":{"line":1,"column":372},"end":{"line":8,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":372},"end":{"line":8,"column":1}},"loc":{"start":{"line":1,"column":372},"end":{"line":8,"column":1}},"line":1}},"f":{"0":1}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\procedure\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\procedure\\index.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":57}}},"s":{"0":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\procedure\\types.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\procedure\\types.ts","all":false,"statementMap":{"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":37}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":16}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":20}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":22}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":1}}},"s":{"9":1,"10":0,"11":0,"12":0,"13":0,"14":0},"branchMap":{},"b":{},"fnMap":{"0":{"name":"withMetadata","decl":{"start":{"line":10,"column":7},"end":{"line":15,"column":1}},"loc":{"start":{"line":10,"column":7},"end":{"line":15,"column":1}},"line":10}},"f":{"0":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\query\\builder.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\query\\builder.ts","all":false,"statementMap":{"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":78}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":14}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":44}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":6}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":98}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":34}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":20}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":30}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":37}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":44}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":107}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":34}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":23}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":30}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":37}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":47}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":104}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":34}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":37}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":46}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":33}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":53}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":51}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":34}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":31}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":30}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":37}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":55}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":70}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":18}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":74}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":18}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":37}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":21}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":107}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":17}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":29}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":22}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":5}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":82}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":44}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":6}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":55}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":3}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":1}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":86}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":15}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":34}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":30}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":62}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":1}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":50}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":35}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":74}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":20}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":20}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":13}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":31}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":34}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":6}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":32}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":26}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":20}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":17}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":4}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":27}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":20}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":32}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":26}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":14}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":15}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":20}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":4}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":72}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":42}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":22}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":4}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":75}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":41}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":22}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":4}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":71}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":39}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":22}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":4}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":67}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":37}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":22}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":4}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":58}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":26}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":28}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":40}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":34}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":28}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":39}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":59}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":6}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":71}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":41}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":21}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":6}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":74}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":40}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":21}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":6}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":70}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":38}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":21}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":6}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":66}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":36}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":21}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":6}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":49}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":27}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":27}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":39}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":33}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":27}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":38}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":50}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":8}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":72}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":42}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":22}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":8}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":75}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":41}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":22}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":8}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":71}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":39}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":22}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":8}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":67}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":37}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":22}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":8}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":31}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":20}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":6}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":19}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":4}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":20}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":1}}},"s":{"10":1,"11":1,"12":106,"14":106,"16":106,"18":1,"19":59,"20":59,"21":59,"23":59,"25":59,"26":59,"28":1,"29":30,"30":30,"31":30,"33":30,"35":30,"36":30,"39":1,"40":5,"41":5,"42":5,"43":5,"44":5,"47":1,"48":4,"49":4,"50":4,"51":4,"52":4,"54":4,"56":4,"57":4,"59":1,"60":70,"61":70,"63":1,"64":2,"65":2,"67":1,"68":6,"69":6,"70":6,"71":6,"72":1,"73":1,"75":5,"76":6,"77":6,"78":5,"79":6,"80":1,"87":1,"88":0,"90":0,"92":0,"93":0,"94":0,"118":98,"119":98,"120":98,"123":98,"124":98,"125":98,"126":98,"127":98,"128":98,"129":98,"130":98,"131":98,"132":98,"133":98,"135":98,"136":98,"137":98,"138":98,"139":98,"140":98,"141":98,"142":98,"144":98,"145":6,"146":6,"147":6,"149":98,"150":4,"151":4,"152":4,"154":98,"155":4,"156":4,"157":4,"159":98,"160":5,"161":5,"162":5,"164":98,"165":11,"166":11,"167":11,"168":11,"169":11,"170":11,"171":11,"172":11,"174":11,"175":1,"176":1,"177":1,"179":11,"180":0,"181":0,"182":0,"184":11,"185":1,"186":1,"187":1,"189":11,"190":0,"191":0,"192":0,"194":11,"195":4,"196":4,"197":4,"198":4,"199":4,"200":4,"201":4,"202":4,"204":4,"205":0,"206":0,"207":0,"209":4,"210":0,"211":0,"212":0,"214":4,"215":0,"216":0,"217":0,"219":4,"220":0,"221":0,"222":0,"224":4,"225":4,"226":4,"228":11,"229":11,"231":98,"232":98},"branchMap":{"0":{"type":"branch","line":12,"loc":{"start":{"line":12,"column":2},"end":{"line":17,"column":6}},"locations":[{"start":{"line":12,"column":2},"end":{"line":17,"column":6}}]},"1":{"type":"branch","line":19,"loc":{"start":{"line":19,"column":2},"end":{"line":27,"column":3}},"locations":[{"start":{"line":19,"column":2},"end":{"line":27,"column":3}}]},"2":{"type":"branch","line":29,"loc":{"start":{"line":29,"column":2},"end":{"line":37,"column":3}},"locations":[{"start":{"line":29,"column":2},"end":{"line":37,"column":3}}]},"3":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":2},"end":{"line":45,"column":3}},"locations":[{"start":{"line":40,"column":2},"end":{"line":45,"column":3}}]},"4":{"type":"branch","line":48,"loc":{"start":{"line":48,"column":2},"end":{"line":58,"column":3}},"locations":[{"start":{"line":48,"column":2},"end":{"line":58,"column":3}}]},"5":{"type":"branch","line":60,"loc":{"start":{"line":60,"column":2},"end":{"line":62,"column":3}},"locations":[{"start":{"line":60,"column":2},"end":{"line":62,"column":3}}]},"6":{"type":"branch","line":64,"loc":{"start":{"line":64,"column":2},"end":{"line":66,"column":3}},"locations":[{"start":{"line":64,"column":2},"end":{"line":66,"column":3}}]},"7":{"type":"branch","line":68,"loc":{"start":{"line":68,"column":2},"end":{"line":80,"column":3}},"locations":[{"start":{"line":68,"column":2},"end":{"line":80,"column":3}}]},"8":{"type":"branch","line":72,"loc":{"start":{"line":72,"column":28},"end":{"line":79,"column":55}},"locations":[{"start":{"line":72,"column":28},"end":{"line":79,"column":55}}]},"9":{"type":"branch","line":72,"loc":{"start":{"line":72,"column":28},"end":{"line":74,"column":5}},"locations":[{"start":{"line":72,"column":28},"end":{"line":74,"column":5}}]},"10":{"type":"branch","line":73,"loc":{"start":{"line":73,"column":13},"end":{"line":73,"column":22}},"locations":[{"start":{"line":73,"column":13},"end":{"line":73,"column":22}}]},"11":{"type":"branch","line":76,"loc":{"start":{"line":76,"column":27},"end":{"line":78,"column":6}},"locations":[{"start":{"line":76,"column":27},"end":{"line":78,"column":6}}]},"12":{"type":"branch","line":119,"loc":{"start":{"line":119,"column":0},"end":{"line":233,"column":1}},"locations":[{"start":{"line":119,"column":0},"end":{"line":233,"column":1}}]},"13":{"type":"branch","line":145,"loc":{"start":{"line":145,"column":28},"end":{"line":148,"column":4}},"locations":[{"start":{"line":145,"column":28},"end":{"line":148,"column":4}}]},"14":{"type":"branch","line":150,"loc":{"start":{"line":150,"column":27},"end":{"line":153,"column":4}},"locations":[{"start":{"line":150,"column":27},"end":{"line":153,"column":4}}]},"15":{"type":"branch","line":155,"loc":{"start":{"line":155,"column":25},"end":{"line":158,"column":4}},"locations":[{"start":{"line":155,"column":25},"end":{"line":158,"column":4}}]},"16":{"type":"branch","line":160,"loc":{"start":{"line":160,"column":23},"end":{"line":163,"column":4}},"locations":[{"start":{"line":160,"column":23},"end":{"line":163,"column":4}}]},"17":{"type":"branch","line":165,"loc":{"start":{"line":165,"column":19},"end":{"line":230,"column":4}},"locations":[{"start":{"line":165,"column":19},"end":{"line":230,"column":4}}]},"18":{"type":"branch","line":175,"loc":{"start":{"line":175,"column":27},"end":{"line":178,"column":6}},"locations":[{"start":{"line":175,"column":27},"end":{"line":178,"column":6}}]},"19":{"type":"branch","line":185,"loc":{"start":{"line":185,"column":24},"end":{"line":188,"column":6}},"locations":[{"start":{"line":185,"column":24},"end":{"line":188,"column":6}}]},"20":{"type":"branch","line":195,"loc":{"start":{"line":195,"column":18},"end":{"line":227,"column":6}},"locations":[{"start":{"line":195,"column":18},"end":{"line":227,"column":6}}]}},"b":{"0":[106],"1":[59],"2":[30],"3":[5],"4":[4],"5":[70],"6":[2],"7":[6],"8":[5],"9":[1],"10":[1],"11":[6],"12":[98],"13":[6],"14":[4],"15":[4],"16":[5],"17":[11],"18":[1],"19":[1],"20":[4]},"fnMap":{"0":{"name":"QueryBuilder","decl":{"start":{"line":12,"column":2},"end":{"line":17,"column":6}},"loc":{"start":{"line":12,"column":2},"end":{"line":17,"column":6}},"line":12},"1":{"name":"query","decl":{"start":{"line":19,"column":2},"end":{"line":27,"column":3}},"loc":{"start":{"line":19,"column":2},"end":{"line":27,"column":3}},"line":19},"2":{"name":"mutation","decl":{"start":{"line":29,"column":2},"end":{"line":37,"column":3}},"loc":{"start":{"line":29,"column":2},"end":{"line":37,"column":3}},"line":29},"3":{"name":"internalQuery","decl":{"start":{"line":40,"column":2},"end":{"line":45,"column":3}},"loc":{"start":{"line":40,"column":2},"end":{"line":45,"column":3}},"line":40},"4":{"name":"internalMutation","decl":{"start":{"line":48,"column":2},"end":{"line":58,"column":3}},"loc":{"start":{"line":48,"column":2},"end":{"line":58,"column":3}},"line":48},"5":{"name":"router","decl":{"start":{"line":60,"column":2},"end":{"line":62,"column":3}},"loc":{"start":{"line":60,"column":2},"end":{"line":62,"column":3}},"line":60},"6":{"name":"middleware","decl":{"start":{"line":64,"column":2},"end":{"line":66,"column":3}},"loc":{"start":{"line":64,"column":2},"end":{"line":66,"column":3}},"line":64},"7":{"name":"on","decl":{"start":{"line":68,"column":2},"end":{"line":80,"column":3}},"loc":{"start":{"line":68,"column":2},"end":{"line":80,"column":3}},"line":68},"8":{"name":"wrappedHandler","decl":{"start":{"line":76,"column":27},"end":{"line":78,"column":6}},"loc":{"start":{"line":76,"column":27},"end":{"line":78,"column":6}},"line":76},"9":{"name":"createQueryBuilder","decl":{"start":{"line":88,"column":7},"end":{"line":95,"column":1}},"loc":{"start":{"line":88,"column":7},"end":{"line":95,"column":1}},"line":88},"10":{"name":"createHookedProcedure","decl":{"start":{"line":119,"column":0},"end":{"line":233,"column":1}},"loc":{"start":{"line":119,"column":0},"end":{"line":233,"column":1}},"line":119},"11":{"name":"hookedProc.beforeInvoke","decl":{"start":{"line":145,"column":28},"end":{"line":148,"column":4}},"loc":{"start":{"line":145,"column":28},"end":{"line":148,"column":4}},"line":145},"12":{"name":"hookedProc.afterInvoke","decl":{"start":{"line":150,"column":27},"end":{"line":153,"column":4}},"loc":{"start":{"line":150,"column":27},"end":{"line":153,"column":4}},"line":150},"13":{"name":"hookedProc.onSuccess","decl":{"start":{"line":155,"column":25},"end":{"line":158,"column":4}},"loc":{"start":{"line":155,"column":25},"end":{"line":158,"column":4}},"line":155},"14":{"name":"hookedProc.onError","decl":{"start":{"line":160,"column":23},"end":{"line":163,"column":4}},"loc":{"start":{"line":160,"column":23},"end":{"line":163,"column":4}},"line":160},"15":{"name":"hookedProc.use","decl":{"start":{"line":165,"column":19},"end":{"line":230,"column":4}},"loc":{"start":{"line":165,"column":19},"end":{"line":230,"column":4}},"line":165},"16":{"name":"newProc.beforeInvoke","decl":{"start":{"line":175,"column":27},"end":{"line":178,"column":6}},"loc":{"start":{"line":175,"column":27},"end":{"line":178,"column":6}},"line":175},"17":{"name":"newProc.afterInvoke","decl":{"start":{"line":180,"column":26},"end":{"line":183,"column":6}},"loc":{"start":{"line":180,"column":26},"end":{"line":183,"column":6}},"line":180},"18":{"name":"newProc.onSuccess","decl":{"start":{"line":185,"column":24},"end":{"line":188,"column":6}},"loc":{"start":{"line":185,"column":24},"end":{"line":188,"column":6}},"line":185},"19":{"name":"newProc.onError","decl":{"start":{"line":190,"column":22},"end":{"line":193,"column":6}},"loc":{"start":{"line":190,"column":22},"end":{"line":193,"column":6}},"line":190},"20":{"name":"newProc.use","decl":{"start":{"line":195,"column":18},"end":{"line":227,"column":6}},"loc":{"start":{"line":195,"column":18},"end":{"line":227,"column":6}},"line":195},"21":{"name":"result.beforeInvoke","decl":{"start":{"line":205,"column":28},"end":{"line":208,"column":8}},"loc":{"start":{"line":205,"column":28},"end":{"line":208,"column":8}},"line":205},"22":{"name":"result.afterInvoke","decl":{"start":{"line":210,"column":27},"end":{"line":213,"column":8}},"loc":{"start":{"line":210,"column":27},"end":{"line":213,"column":8}},"line":210},"23":{"name":"result.onSuccess","decl":{"start":{"line":215,"column":25},"end":{"line":218,"column":8}},"loc":{"start":{"line":215,"column":25},"end":{"line":218,"column":8}},"line":215},"24":{"name":"result.onError","decl":{"start":{"line":220,"column":23},"end":{"line":223,"column":8}},"loc":{"start":{"line":220,"column":23},"end":{"line":223,"column":8}},"line":220}},"f":{"0":106,"1":59,"2":30,"3":5,"4":4,"5":70,"6":2,"7":6,"8":6,"9":0,"10":98,"11":6,"12":4,"13":4,"14":5,"15":11,"16":1,"17":0,"18":1,"19":0,"20":4,"21":0,"22":0,"23":0,"24":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\query\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\query\\index.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":85}}},"s":{"0":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\query\\types.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\query\\types.ts","all":false,"statementMap":{"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":47}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":40}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":36}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":66}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":1}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":50}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":43}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":36}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":69}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":49}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":42}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":41}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":79}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":1}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":58}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":51}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":36}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":77}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":1}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":47}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":22}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":40}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":60}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":36}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":10}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":11}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":11}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":15}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":45}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":47}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":8}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":17}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":30}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":6}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":9}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":15}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":28}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":79}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":85}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":81}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":74}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":64}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":15}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":20}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":50}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":1}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":51}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":22}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":50}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":36}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":48}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":9}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":13}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":44}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":45}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":6}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":28}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":81}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":22}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":30}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":4}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":10}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":14}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":9}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":28}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":81}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":79}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":85}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":81}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":74}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":64}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":15}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":20}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":50}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":1}}},"s":{"24":1,"25":41,"26":41,"27":41,"28":41,"30":1,"31":9,"32":9,"33":9,"34":9,"36":1,"37":8,"38":8,"39":8,"40":8,"42":1,"43":6,"44":6,"45":6,"46":6,"49":64,"50":64,"51":64,"52":64,"53":64,"55":64,"56":64,"57":64,"58":64,"59":64,"60":64,"61":64,"62":64,"63":64,"64":64,"65":64,"66":64,"67":64,"68":64,"69":64,"70":64,"71":64,"72":64,"73":64,"74":64,"75":64,"76":64,"99":1,"100":5,"101":5,"102":5,"103":5,"104":5,"105":5,"106":5,"107":5,"108":5,"109":5,"110":5,"111":5,"112":5,"113":5,"115":5,"116":5,"117":5,"118":5,"119":5,"120":5,"121":5,"122":5,"123":5,"124":5,"125":5,"126":5,"127":5,"128":5},"branchMap":{"0":{"type":"branch","line":25,"loc":{"start":{"line":25,"column":7},"end":{"line":29,"column":1}},"locations":[{"start":{"line":25,"column":7},"end":{"line":29,"column":1}}]},"1":{"type":"branch","line":31,"loc":{"start":{"line":31,"column":7},"end":{"line":35,"column":1}},"locations":[{"start":{"line":31,"column":7},"end":{"line":35,"column":1}}]},"2":{"type":"branch","line":37,"loc":{"start":{"line":37,"column":7},"end":{"line":41,"column":1}},"locations":[{"start":{"line":37,"column":7},"end":{"line":41,"column":1}}]},"3":{"type":"branch","line":43,"loc":{"start":{"line":43,"column":7},"end":{"line":47,"column":1}},"locations":[{"start":{"line":43,"column":7},"end":{"line":47,"column":1}}]},"4":{"type":"branch","line":50,"loc":{"start":{"line":50,"column":0},"end":{"line":77,"column":1}},"locations":[{"start":{"line":50,"column":0},"end":{"line":77,"column":1}}]},"5":{"type":"branch","line":69,"loc":{"start":{"line":69,"column":18},"end":{"line":69,"column":79}},"locations":[{"start":{"line":69,"column":18},"end":{"line":69,"column":79}}]},"6":{"type":"branch","line":70,"loc":{"start":{"line":70,"column":17},"end":{"line":70,"column":85}},"locations":[{"start":{"line":70,"column":17},"end":{"line":70,"column":85}}]},"7":{"type":"branch","line":71,"loc":{"start":{"line":71,"column":15},"end":{"line":71,"column":81}},"locations":[{"start":{"line":71,"column":15},"end":{"line":71,"column":81}}]},"8":{"type":"branch","line":72,"loc":{"start":{"line":72,"column":13},"end":{"line":72,"column":74}},"locations":[{"start":{"line":72,"column":13},"end":{"line":72,"column":74}}]},"9":{"type":"branch","line":73,"loc":{"start":{"line":73,"column":9},"end":{"line":73,"column":64}},"locations":[{"start":{"line":73,"column":9},"end":{"line":73,"column":64}}]},"10":{"type":"branch","line":100,"loc":{"start":{"line":100,"column":7},"end":{"line":129,"column":1}},"locations":[{"start":{"line":100,"column":7},"end":{"line":129,"column":1}}]}},"b":{"0":[41],"1":[9],"2":[8],"3":[6],"4":[64],"5":[2],"6":[1],"7":[2],"8":[1],"9":[2],"10":[5]},"fnMap":{"0":{"name":"createQuery","decl":{"start":{"line":25,"column":7},"end":{"line":29,"column":1}},"loc":{"start":{"line":25,"column":7},"end":{"line":29,"column":1}},"line":25},"1":{"name":"createMutation","decl":{"start":{"line":31,"column":7},"end":{"line":35,"column":1}},"loc":{"start":{"line":31,"column":7},"end":{"line":35,"column":1}},"line":31},"2":{"name":"createInternalQuery","decl":{"start":{"line":37,"column":7},"end":{"line":41,"column":1}},"loc":{"start":{"line":37,"column":7},"end":{"line":41,"column":1}},"line":37},"3":{"name":"createInternalMutation","decl":{"start":{"line":43,"column":7},"end":{"line":47,"column":1}},"loc":{"start":{"line":43,"column":7},"end":{"line":47,"column":1}},"line":43},"4":{"name":"createAnyProcedure","decl":{"start":{"line":50,"column":0},"end":{"line":77,"column":1}},"loc":{"start":{"line":50,"column":0},"end":{"line":77,"column":1}},"line":50},"5":{"name":"beforeInvoke","decl":{"start":{"line":69,"column":18},"end":{"line":69,"column":79}},"loc":{"start":{"line":69,"column":18},"end":{"line":69,"column":79}},"line":69},"6":{"name":"afterInvoke","decl":{"start":{"line":70,"column":17},"end":{"line":70,"column":85}},"loc":{"start":{"line":70,"column":17},"end":{"line":70,"column":85}},"line":70},"7":{"name":"onSuccess","decl":{"start":{"line":71,"column":15},"end":{"line":71,"column":81}},"loc":{"start":{"line":71,"column":15},"end":{"line":71,"column":81}},"line":71},"8":{"name":"onError","decl":{"start":{"line":72,"column":13},"end":{"line":72,"column":74}},"loc":{"start":{"line":72,"column":13},"end":{"line":72,"column":74}},"line":72},"9":{"name":"use","decl":{"start":{"line":73,"column":9},"end":{"line":73,"column":64}},"loc":{"start":{"line":73,"column":9},"end":{"line":73,"column":64}},"line":73},"10":{"name":"createProcedure","decl":{"start":{"line":100,"column":7},"end":{"line":129,"column":1}},"loc":{"start":{"line":100,"column":7},"end":{"line":129,"column":1}},"line":100},"11":{"name":"beforeInvoke","decl":{"start":{"line":121,"column":18},"end":{"line":121,"column":79}},"loc":{"start":{"line":121,"column":18},"end":{"line":121,"column":79}},"line":121},"12":{"name":"afterInvoke","decl":{"start":{"line":122,"column":17},"end":{"line":122,"column":85}},"loc":{"start":{"line":122,"column":17},"end":{"line":122,"column":85}},"line":122},"13":{"name":"onSuccess","decl":{"start":{"line":123,"column":15},"end":{"line":123,"column":81}},"loc":{"start":{"line":123,"column":15},"end":{"line":123,"column":81}},"line":123},"14":{"name":"onError","decl":{"start":{"line":124,"column":13},"end":{"line":124,"column":74}},"loc":{"start":{"line":124,"column":13},"end":{"line":124,"column":74}},"line":124},"15":{"name":"use","decl":{"start":{"line":125,"column":9},"end":{"line":125,"column":64}},"loc":{"start":{"line":125,"column":9},"end":{"line":125,"column":64}},"line":125}},"f":{"0":41,"1":9,"2":8,"3":6,"4":64,"5":2,"6":1,"7":2,"8":1,"9":2,"10":5,"11":0,"12":0,"13":0,"14":0,"15":0}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\router\\builder.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\router\\builder.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":59}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":63}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":12}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":23}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":65}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":82}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":29}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":39}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":34}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":29}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":62}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":33}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":56}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":5}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":3}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":16}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":65}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":11}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":65}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":38}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":83}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":4}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":67}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":11}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":65}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":38}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":99}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":4}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":61}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":52}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":32}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":38}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":14}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":1}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":72}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":10}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":10}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":30}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":20}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":81}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":1}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":69}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":30}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":14}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":58}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":28}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":32}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":29}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":52}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":5}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":28}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":3}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":31}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":1}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":64}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":11}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":21}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":30}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":60}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":45}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":33}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":41}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":31}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":29}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":81}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":9}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":35}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":37}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":63}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":37}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":7}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":5}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":4}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":23}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":48}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":1}}},"s":{"0":1,"4":1,"5":16,"6":16,"8":16,"10":16,"12":16,"13":24,"14":24,"16":24,"17":17,"18":24,"20":6,"21":6,"22":24,"24":16,"25":16,"27":1,"28":2,"30":2,"31":2,"32":2,"33":2,"34":2,"36":1,"37":1,"39":1,"40":1,"41":1,"42":1,"43":1,"46":1,"47":56,"53":25,"54":56,"58":20,"59":20,"62":1,"63":227,"64":227,"65":217,"66":196,"67":132,"69":227,"71":1,"72":5,"73":5,"74":5,"75":5,"76":5,"77":5,"78":6,"79":0,"80":0,"81":6,"82":6,"83":5,"84":5,"90":1,"91":5,"92":5,"93":5,"95":5,"96":9,"97":11,"98":11,"100":11,"101":7,"102":2,"103":2,"104":11,"105":4,"106":4,"107":0,"108":0,"109":11,"110":9,"112":5,"113":5,"114":5},"branchMap":{"0":{"type":"branch","line":5,"loc":{"start":{"line":5,"column":7},"end":{"line":26,"column":1}},"locations":[{"start":{"line":5,"column":7},"end":{"line":26,"column":1}}]},"1":{"type":"branch","line":13,"loc":{"start":{"line":13,"column":28},"end":{"line":23,"column":3}},"locations":[{"start":{"line":13,"column":28},"end":{"line":23,"column":3}}]},"2":{"type":"branch","line":17,"loc":{"start":{"line":17,"column":28},"end":{"line":19,"column":15}},"locations":[{"start":{"line":17,"column":28},"end":{"line":19,"column":15}}]},"3":{"type":"branch","line":19,"loc":{"start":{"line":19,"column":4},"end":{"line":22,"column":5}},"locations":[{"start":{"line":19,"column":4},"end":{"line":22,"column":5}}]},"4":{"type":"branch","line":19,"loc":{"start":{"line":19,"column":32},"end":{"line":22,"column":5}},"locations":[{"start":{"line":19,"column":32},"end":{"line":22,"column":5}}]},"5":{"type":"branch","line":28,"loc":{"start":{"line":28,"column":7},"end":{"line":35,"column":1}},"locations":[{"start":{"line":28,"column":7},"end":{"line":35,"column":1}}]},"6":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":4},"end":{"line":33,"column":83}},"locations":[{"start":{"line":33,"column":4},"end":{"line":33,"column":83}}]},"7":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":38},"end":{"line":33,"column":83}},"locations":[{"start":{"line":33,"column":38},"end":{"line":33,"column":83}}]},"8":{"type":"branch","line":37,"loc":{"start":{"line":37,"column":7},"end":{"line":44,"column":1}},"locations":[{"start":{"line":37,"column":7},"end":{"line":44,"column":1}}]},"9":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":4},"end":{"line":42,"column":99}},"locations":[{"start":{"line":42,"column":4},"end":{"line":42,"column":99}}]},"10":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":38},"end":{"line":42,"column":99}},"locations":[{"start":{"line":42,"column":38},"end":{"line":42,"column":99}}]},"11":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":7},"end":{"line":60,"column":1}},"locations":[{"start":{"line":47,"column":7},"end":{"line":60,"column":1}}]},"12":{"type":"branch","line":48,"loc":{"start":{"line":48,"column":7},"end":{"line":48,"column":39}},"locations":[{"start":{"line":48,"column":7},"end":{"line":48,"column":39}}]},"13":{"type":"branch","line":48,"loc":{"start":{"line":48,"column":39},"end":{"line":48,"column":52}},"locations":[{"start":{"line":48,"column":39},"end":{"line":48,"column":52}}]},"14":{"type":"branch","line":48,"loc":{"start":{"line":48,"column":46},"end":{"line":55,"column":32}},"locations":[{"start":{"line":48,"column":46},"end":{"line":55,"column":32}}]},"15":{"type":"branch","line":55,"loc":{"start":{"line":55,"column":25},"end":{"line":55,"column":38}},"locations":[{"start":{"line":55,"column":25},"end":{"line":55,"column":38}}]},"16":{"type":"branch","line":55,"loc":{"start":{"line":55,"column":32},"end":{"line":60,"column":1}},"locations":[{"start":{"line":55,"column":32},"end":{"line":60,"column":1}}]},"17":{"type":"branch","line":63,"loc":{"start":{"line":63,"column":7},"end":{"line":70,"column":1}},"locations":[{"start":{"line":63,"column":7},"end":{"line":70,"column":1}}]},"18":{"type":"branch","line":65,"loc":{"start":{"line":65,"column":4},"end":{"line":66,"column":30}},"locations":[{"start":{"line":65,"column":4},"end":{"line":66,"column":30}}]},"19":{"type":"branch","line":66,"loc":{"start":{"line":66,"column":19},"end":{"line":67,"column":20}},"locations":[{"start":{"line":66,"column":19},"end":{"line":67,"column":20}}]},"20":{"type":"branch","line":67,"loc":{"start":{"line":67,"column":14},"end":{"line":68,"column":81}},"locations":[{"start":{"line":67,"column":14},"end":{"line":68,"column":81}}]},"21":{"type":"branch","line":72,"loc":{"start":{"line":72,"column":7},"end":{"line":85,"column":1}},"locations":[{"start":{"line":72,"column":7},"end":{"line":85,"column":1}}]},"22":{"type":"branch","line":78,"loc":{"start":{"line":78,"column":28},"end":{"line":83,"column":3}},"locations":[{"start":{"line":78,"column":28},"end":{"line":83,"column":3}}]},"23":{"type":"branch","line":79,"loc":{"start":{"line":79,"column":51},"end":{"line":81,"column":5}},"locations":[{"start":{"line":79,"column":51},"end":{"line":81,"column":5}}]},"24":{"type":"branch","line":91,"loc":{"start":{"line":91,"column":7},"end":{"line":115,"column":1}},"locations":[{"start":{"line":91,"column":7},"end":{"line":115,"column":1}}]},"25":{"type":"branch","line":96,"loc":{"start":{"line":96,"column":19},"end":{"line":111,"column":4}},"locations":[{"start":{"line":96,"column":19},"end":{"line":111,"column":4}}]},"26":{"type":"branch","line":97,"loc":{"start":{"line":97,"column":44},"end":{"line":110,"column":5}},"locations":[{"start":{"line":97,"column":44},"end":{"line":110,"column":5}}]},"27":{"type":"branch","line":101,"loc":{"start":{"line":101,"column":30},"end":{"line":105,"column":17}},"locations":[{"start":{"line":101,"column":30},"end":{"line":105,"column":17}}]},"28":{"type":"branch","line":102,"loc":{"start":{"line":102,"column":28},"end":{"line":104,"column":9}},"locations":[{"start":{"line":102,"column":28},"end":{"line":104,"column":9}}]},"29":{"type":"branch","line":105,"loc":{"start":{"line":105,"column":6},"end":{"line":109,"column":7}},"locations":[{"start":{"line":105,"column":6},"end":{"line":109,"column":7}}]},"30":{"type":"branch","line":107,"loc":{"start":{"line":107,"column":6},"end":{"line":109,"column":7}},"locations":[{"start":{"line":107,"column":6},"end":{"line":109,"column":7}}]}},"b":{"0":[16],"1":[24],"2":[17],"3":[7],"4":[6],"5":[2],"6":[6],"7":[4],"8":[1],"9":[3],"10":[2],"11":[56],"12":[46],"13":[31],"14":[25],"15":[5],"16":[20],"17":[227],"18":[217],"19":[196],"20":[132],"21":[5],"22":[6],"23":[0],"24":[5],"25":[9],"26":[11],"27":[7],"28":[2],"29":[4],"30":[0]},"fnMap":{"0":{"name":"flattenRouter","decl":{"start":{"line":5,"column":7},"end":{"line":26,"column":1}},"loc":{"start":{"line":5,"column":7},"end":{"line":26,"column":1}},"line":5},"1":{"name":"getPublicRoutes","decl":{"start":{"line":28,"column":7},"end":{"line":35,"column":1}},"loc":{"start":{"line":28,"column":7},"end":{"line":35,"column":1}},"line":28},"2":{"name":"getInternalRoutes","decl":{"start":{"line":37,"column":7},"end":{"line":44,"column":1}},"loc":{"start":{"line":37,"column":7},"end":{"line":44,"column":1}},"line":37},"3":{"name":"isRouter","decl":{"start":{"line":47,"column":7},"end":{"line":60,"column":1}},"loc":{"start":{"line":47,"column":7},"end":{"line":60,"column":1}},"line":47},"4":{"name":"isProcedure","decl":{"start":{"line":63,"column":7},"end":{"line":70,"column":1}},"loc":{"start":{"line":63,"column":7},"end":{"line":70,"column":1}},"line":63},"5":{"name":"resolvePath","decl":{"start":{"line":72,"column":7},"end":{"line":85,"column":1}},"loc":{"start":{"line":72,"column":7},"end":{"line":85,"column":1}},"line":72},"6":{"name":"validateRouter","decl":{"start":{"line":91,"column":7},"end":{"line":115,"column":1}},"loc":{"start":{"line":91,"column":7},"end":{"line":115,"column":1}},"line":91},"7":{"name":"validate","decl":{"start":{"line":96,"column":19},"end":{"line":111,"column":4}},"loc":{"start":{"line":96,"column":19},"end":{"line":111,"column":4}},"line":96}},"f":{"0":16,"1":2,"2":1,"3":56,"4":227,"5":5,"6":5,"7":9}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\router\\index.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\router\\index.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":65}}},"s":{"0":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} -,"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\router\\types.ts": {"path":"C:\\Users\\dpereira\\Documents\\github\\server-worktrees\\second-worktree\\packages\\server\\src\\router\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3294},"end":{"line":119,"column":1}},"locations":[{"start":{"line":1,"column":3294},"end":{"line":119,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3294},"end":{"line":119,"column":1}},"loc":{"start":{"line":1,"column":3294},"end":{"line":119,"column":1}},"line":1}},"f":{"0":1}} -} diff --git a/packages/server/coverage/dist_test/api/types/api.js.html b/packages/server/coverage/dist_test/api/types/api.js.html deleted file mode 100644 index ca8ed85..0000000 --- a/packages/server/coverage/dist_test/api/types/api.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/api/types/api.js - - - - - - - - - -
-
-

All files / dist_test/api/types api.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=api.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/api/types/index.html b/packages/server/coverage/dist_test/api/types/index.html deleted file mode 100644 index a7c4347..0000000 --- a/packages/server/coverage/dist_test/api/types/index.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - Code coverage report for dist_test/api/types - - - - - - - - - -
-
-

All files dist_test/api/types

-
- -
- 0% - Statements - 0/4 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/4 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
api.js -
-
0%0/10%0/10%0/10%0/1
index.js -
-
0%0/10%0/10%0/10%0/1
internal.js -
-
0%0/10%0/10%0/10%0/1
proxy.js -
-
0%0/10%0/10%0/10%0/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/api/types/index.js.html b/packages/server/coverage/dist_test/api/types/index.js.html deleted file mode 100644 index c23f0e0..0000000 --- a/packages/server/coverage/dist_test/api/types/index.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/api/types/index.js - - - - - - - - - -
-
-

All files / dist_test/api/types index.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=index.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/api/types/internal.js.html b/packages/server/coverage/dist_test/api/types/internal.js.html deleted file mode 100644 index ef02a3e..0000000 --- a/packages/server/coverage/dist_test/api/types/internal.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/api/types/internal.js - - - - - - - - - -
-
-

All files / dist_test/api/types internal.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=internal.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/api/types/proxy.js.html b/packages/server/coverage/dist_test/api/types/proxy.js.html deleted file mode 100644 index f3e9f9a..0000000 --- a/packages/server/coverage/dist_test/api/types/proxy.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/api/types/proxy.js - - - - - - - - - -
-
-

All files / dist_test/api/types proxy.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=proxy.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/context/index.html b/packages/server/coverage/dist_test/context/index.html deleted file mode 100644 index 1123c3a..0000000 --- a/packages/server/coverage/dist_test/context/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for dist_test/context - - - - - - - - - -
-
-

All files dist_test/context

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
types.js -
-
0%0/10%0/10%0/10%0/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/context/types.js.html b/packages/server/coverage/dist_test/context/types.js.html deleted file mode 100644 index 611c90f..0000000 --- a/packages/server/coverage/dist_test/context/types.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/context/types.js - - - - - - - - - -
-
-

All files / dist_test/context types.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=types.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/errors/index.html b/packages/server/coverage/dist_test/errors/index.html deleted file mode 100644 index fecf44b..0000000 --- a/packages/server/coverage/dist_test/errors/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for dist_test/errors - - - - - - - - - -
-
-

All files dist_test/errors

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
types.js -
-
0%0/10%0/10%0/10%0/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/errors/types.js.html b/packages/server/coverage/dist_test/errors/types.js.html deleted file mode 100644 index 3ec7048..0000000 --- a/packages/server/coverage/dist_test/errors/types.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/errors/types.js - - - - - - - - - -
-
-

All files / dist_test/errors types.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=types.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/events/index.html b/packages/server/coverage/dist_test/events/index.html deleted file mode 100644 index 52292d9..0000000 --- a/packages/server/coverage/dist_test/events/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for dist_test/events - - - - - - - - - -
-
-

All files dist_test/events

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
types.js -
-
0%0/10%0/10%0/10%0/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/events/types.js.html b/packages/server/coverage/dist_test/events/types.js.html deleted file mode 100644 index b1d92af..0000000 --- a/packages/server/coverage/dist_test/events/types.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/events/types.js - - - - - - - - - -
-
-

All files / dist_test/events types.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=types.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/hooks/index.html b/packages/server/coverage/dist_test/hooks/index.html deleted file mode 100644 index 21418f3..0000000 --- a/packages/server/coverage/dist_test/hooks/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for dist_test/hooks - - - - - - - - - -
-
-

All files dist_test/hooks

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
types.js -
-
0%0/10%0/10%0/10%0/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/hooks/types.js.html b/packages/server/coverage/dist_test/hooks/types.js.html deleted file mode 100644 index ec0b194..0000000 --- a/packages/server/coverage/dist_test/hooks/types.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/hooks/types.js - - - - - - - - - -
-
-

All files / dist_test/hooks types.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=types.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/index.html b/packages/server/coverage/dist_test/index.html deleted file mode 100644 index 5ac7fd5..0000000 --- a/packages/server/coverage/dist_test/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for dist_test - - - - - - - - - -
-
-

All files dist_test

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
types.js -
-
0%0/10%0/10%0/10%0/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/internal-mutation/index.html b/packages/server/coverage/dist_test/internal-mutation/index.html deleted file mode 100644 index 6594021..0000000 --- a/packages/server/coverage/dist_test/internal-mutation/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for dist_test/internal-mutation - - - - - - - - - -
-
-

All files dist_test/internal-mutation

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
types.js -
-
0%0/10%0/10%0/10%0/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/internal-mutation/types.js.html b/packages/server/coverage/dist_test/internal-mutation/types.js.html deleted file mode 100644 index ad49b3e..0000000 --- a/packages/server/coverage/dist_test/internal-mutation/types.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/internal-mutation/types.js - - - - - - - - - -
-
-

All files / dist_test/internal-mutation types.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=types.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/internal-query/index.html b/packages/server/coverage/dist_test/internal-query/index.html deleted file mode 100644 index 118dccd..0000000 --- a/packages/server/coverage/dist_test/internal-query/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for dist_test/internal-query - - - - - - - - - -
-
-

All files dist_test/internal-query

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
types.js -
-
0%0/10%0/10%0/10%0/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/internal-query/types.js.html b/packages/server/coverage/dist_test/internal-query/types.js.html deleted file mode 100644 index d79b232..0000000 --- a/packages/server/coverage/dist_test/internal-query/types.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/internal-query/types.js - - - - - - - - - -
-
-

All files / dist_test/internal-query types.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=types.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/middleware/index.html b/packages/server/coverage/dist_test/middleware/index.html deleted file mode 100644 index be970fe..0000000 --- a/packages/server/coverage/dist_test/middleware/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for dist_test/middleware - - - - - - - - - -
-
-

All files dist_test/middleware

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
types.js -
-
0%0/10%0/10%0/10%0/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/middleware/types.js.html b/packages/server/coverage/dist_test/middleware/types.js.html deleted file mode 100644 index 894c378..0000000 --- a/packages/server/coverage/dist_test/middleware/types.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/middleware/types.js - - - - - - - - - -
-
-

All files / dist_test/middleware types.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=types.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/mutation/index.html b/packages/server/coverage/dist_test/mutation/index.html deleted file mode 100644 index 518f2f3..0000000 --- a/packages/server/coverage/dist_test/mutation/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for dist_test/mutation - - - - - - - - - -
-
-

All files dist_test/mutation

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
types.js -
-
0%0/10%0/10%0/10%0/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/mutation/types.js.html b/packages/server/coverage/dist_test/mutation/types.js.html deleted file mode 100644 index 1117f13..0000000 --- a/packages/server/coverage/dist_test/mutation/types.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/mutation/types.js - - - - - - - - - -
-
-

All files / dist_test/mutation types.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=types.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/query/index.html b/packages/server/coverage/dist_test/query/index.html deleted file mode 100644 index e8346b1..0000000 --- a/packages/server/coverage/dist_test/query/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for dist_test/query - - - - - - - - - -
-
-

All files dist_test/query

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
types.js -
-
0%0/10%0/10%0/10%0/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/query/types.js.html b/packages/server/coverage/dist_test/query/types.js.html deleted file mode 100644 index 3166d43..0000000 --- a/packages/server/coverage/dist_test/query/types.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/query/types.js - - - - - - - - - -
-
-

All files / dist_test/query types.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=types.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/router/index.html b/packages/server/coverage/dist_test/router/index.html deleted file mode 100644 index e8362c3..0000000 --- a/packages/server/coverage/dist_test/router/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for dist_test/router - - - - - - - - - -
-
-

All files dist_test/router

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
types.js -
-
0%0/10%0/10%0/10%0/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/router/types.js.html b/packages/server/coverage/dist_test/router/types.js.html deleted file mode 100644 index dfac357..0000000 --- a/packages/server/coverage/dist_test/router/types.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/router/types.js - - - - - - - - - -
-
-

All files / dist_test/router types.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=types.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/dist_test/types.js.html b/packages/server/coverage/dist_test/types.js.html deleted file mode 100644 index 2b75255..0000000 --- a/packages/server/coverage/dist_test/types.js.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for dist_test/types.js - - - - - - - - - -
-
-

All files / dist_test types.js

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export {};
-//# sourceMappingURL=types.js.map
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/examples/01-basic.ts.html b/packages/server/coverage/examples/01-basic.ts.html deleted file mode 100644 index b56735e..0000000 --- a/packages/server/coverage/examples/01-basic.ts.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - Code coverage report for examples/01-basic.ts - - - - - - - - - -
-
-

All files / examples 01-basic.ts

-
- -
- 0% - Statements - 0/56 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/56 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
/**
- * Example 01: Basic Query and Mutation
- *
- * Demonstrates:
- * - Creating a QueryBuilder
- * - Defining queries and mutations
- * - Creating an API instance
- * - Calling procedures
- */
- 
-import { QueryBuilder, createAPI } from "../src/index.js";
-import { createQueryBuilder } from "../src/query/index.js";
-import { ok } from "@deessejs/fp";
-import { z } from "zod";
- 
-// ============================================
-// 1. Define types
-// ============================================
- 
-interface Context {
-  db: { users: Array<{ id: string; name: string }> };
-}
- 
-// ============================================
-// 2. Create a QueryBuilder (no context needed here)
-// ============================================
- 
-const t = createQueryBuilder<Context>();
- 
-// ============================================
-// 2. Define procedures
-// ============================================
- 
-// Query with no args
-const listUsers = t.query({
-  handler: async (ctx) => {
-    return ok(ctx.db.users);
-  },
-});
- 
-// Query with args (validated via Zod)
-const getUser = t.query({
-  args: z.object({ id: z.string() }),
-  handler: async (ctx, args) => {
-    const user = ctx.db.users.find((u) => u.id === args.id);
-    if (!user) {
-      return ok(null);
-    }
-    return ok(user);
-  },
-});
- 
-// Mutation (same as query but for writes)
-const createUser = t.mutation({
-  args: z.object({ name: z.string() }),
-  handler: async (ctx, args) => {
-    const newUser = { id: String(ctx.db.users.length + 1), name: args.name };
-    ctx.db.users.push(newUser);
-    return ok(newUser);
-  },
-});
- 
-// ============================================
-// 3. Create router and API
-// ============================================
- 
-const router = t.router({
-  users: {
-    list: listUsers,
-    get: getUser,
-    create: createUser,
-  },
-});
- 
-const api = createAPI({
-  router,
-  context: {
-    db: {
-      users: [
-        { id: "1", name: "Alice" },
-        { id: "2", name: "Bob" },
-      ],
-    },
-  },
-});
- 
-// ============================================
-// 4. Call procedures (fully typed!)
-// ============================================
- 
-async function main() {
-  // api.users.list() -> Promise<Result<Array<{id: string, name: string}>>>
-  const users = await api.users.list();
-  console.log("Users:", users);
- 
-  // api.users.get({ id: "1" }) -> Promise<Result<{id: string, name: string} | null>>
-  const user = await api.users.get({ id: "1" });
-  console.log("User 1:", user);
- 
-  // api.users.create({ name: "Charlie" }) -> Promise<Result<{id: string, name: string}>>
-  const newUser = await api.users.create({ name: "Charlie" });
-  console.log("Created:", newUser);
-}
- 
-main();
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/examples/02-nested-routers.ts.html b/packages/server/coverage/examples/02-nested-routers.ts.html deleted file mode 100644 index 9d4b7bc..0000000 --- a/packages/server/coverage/examples/02-nested-routers.ts.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - Code coverage report for examples/02-nested-routers.ts - - - - - - - - - -
-
-

All files / examples 02-nested-routers.ts

-
- -
- 0% - Statements - 0/50 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/50 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
/**
- * Example 02: Nested Routers
- *
- * Demonstrates:
- * - Organizing procedures in nested router structure
- * - Deep nesting (api.v1.users.list)
- * - Router flattening utilities
- */
- 
-import { createAPI, flattenRouter, getPublicRoutes } from "../src/index.js";
-import { createQueryBuilder } from "../src/query/index.js";
-import { ok } from "@deessejs/fp";
-import { z } from "zod";
- 
-// ============================================
-// 1. Create QueryBuilder
-// ============================================
- 
-interface Context {
-  version: string;
-}
- 
-const t = createQueryBuilder<Context>();
- 
-// ============================================
-// 2. Define nested router structure
-// ============================================
- 
-// API v1 - Users
-const usersRouter = t.router({
-  list: t.query({ handler: async () => ok([]) }),
-  get: t.query({
-    args: z.object({ id: z.string() }),
-    handler: async (_, args) => ok({ id: args.id, name: "User" }),
-  }),
-  create: t.mutation({
-    args: z.object({ name: z.string() }),
-    handler: async (_, args) => ok({ id: "1", name: args.name }),
-  }),
-});
- 
-// API v1 - Posts
-const postsRouter = t.router({
-  list: t.query({ handler: async () => ok([]) }),
-  get: t.query({
-    args: z.object({ id: z.string() }),
-    handler: async (_, args) => ok({ id: args.id, title: "Post" }),
-  }),
-});
- 
-// API v1 router
-const v1Router = t.router({
-  users: usersRouter,
-  posts: postsRouter,
-});
- 
-// Root router
-const router = t.router({
-  api: t.router({
-    v1: v1Router,
-  }),
-});
- 
-// ============================================
-// 3. Create API
-// ============================================
- 
-const api = createAPI({
-  router,
-  context: { version: "v1" },
-});
- 
-// ============================================
-// 4. Access nested procedures
-// ============================================
- 
-async function main() {
-  // Deep nesting: api.api.v1.users.list()
-  const users = await api.api.v1.users.list();
-  console.log("V1 Users:", users);
- 
-  // api.api.v1.posts.get({ id: "1" })
-  const post = await api.api.v1.posts.get({ id: "1" });
-  console.log("Post:", post);
- 
-  // TypeScript knows the type at each level
-  // api.api.v1.users -> { list, get, create }
-  // api.api.v1.users.list -> () => Promise<Result<User[]>>
- 
-  // ============================================
-  // 5. Router utilities
-  // ============================================
- 
-  // flattenRouter: Converts nested router to flat array of { path, procedure }
-  const flat = flattenRouter(router);
-  console.log("\nFlattened routes:");
-  flat.forEach((r) => console.log(" -", r.path));
- 
-  // getPublicRoutes: Filters to only public queries and mutations
-  const publicRoutes = getPublicRoutes(router);
-  console.log("\nPublic routes only:");
-  publicRoutes.forEach((r) => console.log(" -", r.path, "- type:", r.procedure.type));
-}
- 
-main();
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/examples/03-hooks.ts.html b/packages/server/coverage/examples/03-hooks.ts.html deleted file mode 100644 index c2e4b68..0000000 --- a/packages/server/coverage/examples/03-hooks.ts.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - Code coverage report for examples/03-hooks.ts - - - - - - - - - -
-
-

All files / examples 03-hooks.ts

-
- -
- 0% - Statements - 0/64 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/64 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
/**
- * Example 03: Hooks
- *
- * Demonstrates:
- * - beforeInvoke: runs before handler
- * - afterInvoke: runs after handler (always)
- * - onSuccess: runs only when result is ok
- * - onError: runs only when result is err
- */
- 
-import { createAPI } from "../src/index.js";
-import { createQueryBuilder } from "../src/query/index.js";
-import { ok, err } from "@deessejs/fp";
-import { z } from "zod";
- 
-interface Context {
-  requestId: string;
-  logger: string[];
-}
- 
-const t = createQueryBuilder<Context>();
- 
-// ============================================
-// 1. Define query with all hooks
-// ============================================
- 
-const getUser = t.query({
-  args: z.object({ id: z.string() }),
-  handler: async (ctx, args) => {
-    ctx.logger.push(`handler called for ${args.id}`);
-    return ok({ id: args.id, name: "User" });
-  },
-});
- 
-// Chain hooks (they return the procedure for chaining)
-getUser
-  .beforeInvoke((ctx, args) => {
-    ctx.logger.push(`beforeInvoke: fetching user ${args.id}`);
-    console.log(`[${ctx.requestId}] Before: ${args.id}`);
-  })
-  .afterInvoke((ctx, args, result) => {
-    ctx.logger.push(`afterInvoke: result is ${result.ok ? "ok" : "error"}`);
-    console.log(`[${ctx.requestId}] After:`, result.ok ? "success" : "failure");
-  })
-  .onSuccess((ctx, args, data) => {
-    ctx.logger.push(`onSuccess: user ${args.id} = ${data.name}`);
-    console.log(`[${ctx.requestId}] Success:`, data);
-  })
-  .onError((ctx, args, error) => {
-    ctx.logger.push(`onError: ${error.message}`);
-    console.log(`[${ctx.requestId}] Error:`, error.message);
-  });
- 
-// ============================================
-// 2. Mutation with error case
-// ============================================
- 
-const createUser = t.mutation({
-  args: z.object({ name: z.string() }),
-  handler: async (ctx, args) => {
-    if (args.name === "error") {
-      return err({ message: "Cannot create user with name 'error'" });
-    }
-    return ok({ id: "1", name: args.name });
-  },
-});
- 
-createUser
-  .beforeInvoke((ctx, args) => {
-    console.log(`Creating user: ${args.name}`);
-  })
-  .onSuccess((ctx, args, data) => {
-    console.log(`User created: ${data.id} - ${data.name}`);
-  })
-  .onError((ctx, args, error) => {
-    console.log(`Creation failed: ${error.message}`);
-  });
- 
-// ============================================
-// 3. Create API
-// ============================================
- 
-const router = t.router({ users: { get: getUser, create: createUser } });
- 
-const api = createAPI({
-  router,
-  context: { requestId: "req-123", logger: [] },
-});
- 
-// ============================================
-// 4. Test
-// ============================================
- 
-async function main() {
-  console.log("=== Successful getUser ===");
-  const result = await api.users.get({ id: "1" });
-  console.log("Final result ok:", result.ok);
-  console.log("Logger:", api.ctx.logger);
- 
-  console.log("\n=== Failed createUser ===");
-  const failResult = await api.users.create({ name: "error" });
-  console.log("Final result ok:", failResult.ok);
-}
- 
-main();
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/examples/04-middleware.ts.html b/packages/server/coverage/examples/04-middleware.ts.html deleted file mode 100644 index 7ccc3c1..0000000 --- a/packages/server/coverage/examples/04-middleware.ts.html +++ /dev/null @@ -1,511 +0,0 @@ - - - - - - Code coverage report for examples/04-middleware.ts - - - - - - - - - -
-
-

All files / examples 04-middleware.ts

-
- -
- 0% - Statements - 0/90 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/90 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
/**
- * Example 04: Middleware
- *
- * Demonstrates:
- * - Creating middleware with createMiddleware
- * - Attaching middleware per-procedure (.use())
- * - Global middleware at API creation
- */
- 
-import { createAPI } from "../src/index.js";
-import { createQueryBuilder } from "../src/query/index.js";
-import { createMiddleware } from "../src/middleware/builder.js";
-import { ok, err } from "@deessejs/fp";
-import { z } from "zod";
- 
-interface Context {
-  user: { id: string; role: string } | null;
-  logs: string[];
-}
- 
-// ============================================
-// 1. Create middlewares
-// ============================================
- 
-// Authentication middleware
-const authMiddleware = createMiddleware({
-  name: "auth",
-  handler: async (ctx, opts) => {
-    if (!ctx.user) {
-      return err({ message: "Unauthorized - no user" });
-    }
-    return opts.next();
-  },
-});
- 
-// Admin-only middleware
-const adminMiddleware = createMiddleware({
-  name: "admin",
-  handler: async (ctx, opts) => {
-    if (ctx.user?.role !== "admin") {
-      return err({ message: "Forbidden - requires admin role" });
-    }
-    return opts.next();
-  },
-});
- 
-// Logging middleware
-const loggingMiddleware = createMiddleware({
-  name: "logging",
-  handler: async (ctx, opts) => {
-    console.log(`[LOG] Starting: ${opts.meta?.procedure}`);
-    const result = await opts.next();
-    console.log(`[LOG] Completed: ${opts.meta?.procedure}`);
-    return result;
-  },
-});
- 
-// ============================================
-// 2. Build procedures with middleware
-// ============================================
- 
-const t = createQueryBuilder<Context>();
- 
-// Public endpoint - no auth required
-const publicEndpoint = t.query({
-  handler: async (ctx) => {
-    ctx.logs.push("public endpoint called");
-    return ok({ message: "Public data" });
-  },
-});
- 
-// Protected endpoint - auth required
-const protectedEndpoint = t.query({
-  handler: async (ctx) => {
-    ctx.logs.push(`protected called by ${ctx.user?.id}`);
-    return ok({ secret: "Sensitive data" });
-  },
-}).use(authMiddleware);
- 
-// Admin-only endpoint
-const adminEndpoint = t.query({
-  handler: async (ctx) => {
-    ctx.logs.push("admin endpoint called");
-    return ok({ admin: true });
-  },
-}).use(authMiddleware).use(adminMiddleware);
- 
-// Endpoint with logging middleware
-const loggedEndpoint = t.query({
-  handler: async (ctx) => {
-    return ok({ logged: true });
-  },
-}).use(loggingMiddleware);
- 
-// ============================================
-// 3. Create API with global middleware
-// ============================================
- 
-const router = t.router({
-  public: publicEndpoint,
-  protected: protectedEndpoint,
-  admin: adminEndpoint,
-  logged: loggedEndpoint,
-});
- 
-// Global middleware runs BEFORE procedure middleware
-const api = createAPI({
-  router,
-  context: { user: { id: "1", role: "user" }, logs: [] },
-  middleware: [
-    createMiddleware({
-      name: "global-logger",
-      handler: async (ctx, opts) => {
-        console.log(`[GLOBAL] Starting`);
-        return opts.next();
-      },
-    }),
-  ],
-});
- 
-// ============================================
-// 4. Test execution order
-// ============================================
- 
-async function main() {
-  console.log("=== Public endpoint (no auth) ===");
-  const publicResult = await api.public();
-  console.log("Result ok:", publicResult.ok);
- 
-  console.log("\n=== Protected endpoint (auth middleware) ===");
-  const protectedResult = await api.protected();
-  console.log("Result ok:", protectedResult.ok);
- 
-  console.log("\n=== Admin endpoint (auth + admin middleware) ===");
-  const adminResult = await api.admin();
-  console.log("Result ok:", adminResult.ok);
-  if (!adminResult.ok) {
-    console.log("Error:", adminResult.error);
-  }
-}
- 
-main();
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/examples/05-events.ts.html b/packages/server/coverage/examples/05-events.ts.html deleted file mode 100644 index eac206f..0000000 --- a/packages/server/coverage/examples/05-events.ts.html +++ /dev/null @@ -1,424 +0,0 @@ - - - - - - Code coverage report for examples/05-events.ts - - - - - - - - - -
-
-

All files / examples 05-events.ts

-
- -
- 0% - Statements - 0/60 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/60 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
/**
- * Example 05: Events System
- *
- * Demonstrates:
- * - Defining events with defineEvents
- * - Subscribing to events with on()
- * - Emitting events via ctx.send()
- * - Event queue (batched until success)
- * - Wildcard subscriptions
- */
- 
-import { createAPI, EventEmitter, defineEvents, event } from "../src/index.js";
-import { createQueryBuilder } from "../src/query/index.js";
-import { ok } from "@deessejs/fp";
-import { z } from "zod";
- 
-// ============================================
-// 1. Define events
-// ============================================
- 
-const events = defineEvents({
-  user: {
-    created: event({ args: z.object({ id: z.string(), email: z.string() }) }),
-    updated: event({ args: z.object({ id: z.string(), name: z.string() }) }),
-  },
-  post: {
-    published: event({ args: z.object({ id: z.string(), title: z.string() }) }),
-  },
-});
- 
-interface Context {
-  userId: string;
-}
- 
-const t = createQueryBuilder<Context, typeof events>();
- 
-// ============================================
-// 2. Create procedures that emit events
-// ============================================
- 
-const createUser = t.mutation({
-  args: z.object({ email: z.string().email() }),
-  handler: async (ctx, args) => {
-    const user = { id: "new-user", email: args.email };
-    // Emit event (batched until procedure succeeds)
-    ctx.send("user.created", { id: user.id, email: user.email });
-    return ok(user);
-  },
-});
- 
-const updateUser = t.mutation({
-  args: z.object({ id: z.string(), name: z.string() }),
-  handler: async (ctx, args) => {
-    // Emit multiple events
-    ctx.send("user.updated", { id: args.id, name: args.name });
-    ctx.send("post.published", { id: "post-1", title: "Announcement" });
-    return ok({ id: args.id, name: args.name });
-  },
-});
- 
-// ============================================
-// 3. Create API with event emitter
-// ============================================
- 
-const eventEmitter = new EventEmitter(events);
- 
-const api = createAPI({
-  router: t.router({ users: { create: createUser, update: updateUser } }),
-  eventEmitter,
-  context: { userId: "user-1" },
-});
- 
-// ============================================
-// 4. Subscribe to events via eventEmitter
-// ============================================
- 
-// Access eventEmitter from API
-const emitter = api.eventEmitter;
-if (emitter) {
-  // Specific event subscription
-  emitter.on("user.created", (payload) => {
-    console.log("[EVENT] User created:", payload.data);
-  });
- 
-  // Wildcard subscription
-  emitter.on("user.*", (payload) => {
-    console.log("[EVENT] Any user event:", payload.name, payload.data);
-  });
- 
-  // Global wildcard
-  emitter.on("*", (payload) => {
-    console.log("[EVENT] Global:", payload.name, payload.data);
-  });
-}
- 
-// ============================================
-// 5. Test
-// ============================================
- 
-async function main() {
-  console.log("=== Creating user ===");
-  const result = await api.users.create({ email: "test@example.com" });
-  console.log("Result:", result.ok);
- 
-  console.log("\n=== Updating user ===");
-  const updateResult = await api.users.update({ id: "1", name: "Updated" });
-  console.log("Result:", updateResult.ok);
- 
-  console.log("\n=== Event log ===");
-  console.log(api.getEvents());
-}
- 
-main();
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/examples/06-internal.ts.html b/packages/server/coverage/examples/06-internal.ts.html deleted file mode 100644 index 916462b..0000000 --- a/packages/server/coverage/examples/06-internal.ts.html +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - Code coverage report for examples/06-internal.ts - - - - - - - - - -
-
-

All files / examples 06-internal.ts

-
- -
- 0% - Statements - 0/55 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/55 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
/**
- * Example 06: Internal Procedures
- *
- * Demonstrates:
- * - internalQuery: queries not exposed to public API (no args)
- * - internalMutation: mutations not exposed to public API
- * - createPublicAPI: filters out internal procedures
- * - Why internal procedures exist: server-to-server communication
- */
- 
-import { createAPI, createPublicAPI } from "../src/index.js";
-import { createQueryBuilder } from "../src/query/index.js";
-import { ok } from "@deessejs/fp";
-import { z } from "zod";
- 
-interface Context {
-  db: { health: string };
-}
- 
-const t = createQueryBuilder<Context>();
- 
-// ============================================
-// 1. Public procedures
-// ============================================
- 
-const listUsers = t.query({
-  handler: async () => {
-    return ok([{ id: "1", name: "Alice" }]);
-  },
-});
- 
-// ============================================
-// 2. Internal procedures (not exposed publicly)
-// ============================================
- 
-// internalQuery: no args, not callable from public API
-// Use case: health checks, server-only data
-const healthCheck = t.internalQuery({
-  handler: async (ctx) => {
-    return ok({ status: ctx.db.health, timestamp: Date.now() });
-  },
-});
- 
-// internalMutation: server-to-server communication
-// Not exposed via createPublicAPI
-const syncData = t.internalMutation({
-  args: z.object({ source: z.string(), data: z.unknown() }),
-  handler: async (ctx, args) => {
-    console.log(`Syncing from ${args.source}:`, args.data);
-    return ok({ synced: true, items: 1 });
-  },
-});
- 
-// Internal query to check permissions
-const checkPermission = t.internalQuery({
-  handler: async () => {
-    return ok({ allowed: true, role: "admin" });
-  },
-});
- 
-// ============================================
-// 3. Full router (with internal procedures)
-// ============================================
- 
-// Internal procedures are nested under _ prefix
-const router = t.router({
-  users: {
-    list: listUsers,
-    // Internal procedures - filtered from public API
-    _health: healthCheck,
-    _sync: syncData,
-    _checkPerm: checkPermission,
-  },
-});
- 
-// ============================================
-// 4. Create full API and public API
-// ============================================
- 
-const fullApi = createAPI({
-  router,
-  context: { db: { health: "ok" } },
-});
- 
-// Public API filters out internalQuery and internalMutation
-// Only exposes: query and mutation
-const publicApi = createPublicAPI(fullApi);
- 
-// ============================================
-// 5. Test
-// ============================================
- 
-async function main() {
-  console.log("=== Full API (all procedures) ===");
-  const users = await fullApi.users.list();
-  console.log("users.list:", users.ok);
- 
-  // Internal procedures are accessible
-  const health = await fullApi.users._health();
-  console.log("users._health:", health.ok);
- 
-  const sync = await fullApi.users._sync({ source: "external", data: {} });
-  console.log("users._sync:", sync.ok);
- 
-  console.log("\n=== Public API (internal filtered) ===");
-  // Access the public router directly to see filtered results
-  console.log("publicApi.router:", publicApi.router);
- 
-  // The proxy access works correctly
-  const pubUsers = await publicApi.users.list();
-  console.log("publicApi.users.list():", pubUsers.ok);
- 
-  // _health and _sync should NOT exist on publicApi
-  // They would be typed as errors if uncommented:
-  // await publicApi.users._health();
-  // await publicApi.users._sync();
-}
- 
-main();
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/examples/07-plugins.ts.html b/packages/server/coverage/examples/07-plugins.ts.html deleted file mode 100644 index 28f6a0e..0000000 --- a/packages/server/coverage/examples/07-plugins.ts.html +++ /dev/null @@ -1,379 +0,0 @@ - - - - - - Code coverage report for examples/07-plugins.ts - - - - - - - - - -
-
-

All files / examples 07-plugins.ts

-
- -
- 0% - Statements - 0/49 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/49 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
/**
- * Example 07: ContextBuilder and Plugins
- *
- * Demonstrates:
- * - createContextBuilder: fluent builder for context
- * - .use(plugin): adding plugins
- * - Plugin.extend: enriching the context
- */
- 
-import { createContextBuilder } from "../src/context/index.js";
-import { createAPI } from "../src/index.js";
-import { ok } from "@deessejs/fp";
-import { z } from "zod";
-import type { Plugin } from "../src/types.js";
- 
-// ============================================
-// 1. Create a custom plugin
-// ============================================
- 
-interface PluginContext {
-  auditLog: string[];
-}
- 
-// Plugin that adds audit log to context
-const auditPlugin = <Ctx extends PluginContext>(): Plugin<Ctx> => ({
-  name: "audit",
-  extend: (ctx: Ctx) => ({
-    auditLog: ctx.auditLog ?? [],
-  }),
-});
- 
-// Plugin that adds timing info
-const timingPlugin = <Ctx>(): Plugin<Ctx> => ({
-  name: "timing",
-  extend: (ctx: Ctx) => ({
-    startTime: Date.now(),
-  }),
-});
- 
-// ============================================
-// 2. Using ContextBuilder
-// ============================================
- 
-const { t, createAPI: createApiWithPlugins } = createContextBuilder<PluginContext>()
-  .use(auditPlugin())
-  .use(timingPlugin())
-  .build();
- 
-// t now has query(), mutation(), router(), etc.
- 
-// ============================================
-// 3. Define router
-// ============================================
- 
-const router = t.router({
-  users: {
-    list: t.query({
-      handler: async () => ok([{ id: "1", name: "User" }]),
-    }),
-    create: t.mutation({
-      args: z.object({ name: z.string() }),
-      handler: async (ctx, args) => {
-        ctx.auditLog.push(`Creating user: ${args.name}`);
-        return ok({ id: "1", name: args.name });
-      },
-    }),
-  },
-});
- 
-// ============================================
-// 4. Create API
-// ============================================
- 
-// Context can be passed but is enriched by plugins
-const api = createApiWithPlugins({
-  router,
-  context: { auditLog: [] }, // Initial context, enriched by plugins
-});
- 
-// ============================================
-// 5. Test
-// ============================================
- 
-async function main() {
-  console.log("=== Using ContextBuilder with plugins ===");
- 
-  const users = await api.users.list();
-  console.log("List:", users.ok);
- 
-  const created = await api.users.create({ name: "Alice" });
-  console.log("Created:", created.ok);
- 
-  console.log("\n=== Context with audit log ===");
-  console.log("api.ctx:", api.ctx);
-  console.log("auditLog:", api.ctx.auditLog);
-}
- 
-main();
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/examples/index.html b/packages/server/coverage/examples/index.html deleted file mode 100644 index 5f5f278..0000000 --- a/packages/server/coverage/examples/index.html +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - Code coverage report for examples - - - - - - - - - -
-
-

All files examples

-
- -
- 0% - Statements - 0/424 -
- - -
- 0% - Branches - 0/7 -
- - -
- 0% - Functions - 0/7 -
- - -
- 0% - Lines - 0/424 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
01-basic.ts -
-
0%0/560%0/10%0/10%0/56
02-nested-routers.ts -
-
0%0/500%0/10%0/10%0/50
03-hooks.ts -
-
0%0/640%0/10%0/10%0/64
04-middleware.ts -
-
0%0/900%0/10%0/10%0/90
05-events.ts -
-
0%0/600%0/10%0/10%0/60
06-internal.ts -
-
0%0/550%0/10%0/10%0/55
07-plugins.ts -
-
0%0/490%0/10%0/10%0/49
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/favicon.png b/packages/server/coverage/favicon.png deleted file mode 100644 index c1525b8..0000000 Binary files a/packages/server/coverage/favicon.png and /dev/null differ diff --git a/packages/server/coverage/index.html b/packages/server/coverage/index.html deleted file mode 100644 index c44782c..0000000 --- a/packages/server/coverage/index.html +++ /dev/null @@ -1,521 +0,0 @@ - - - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- 63.34% - Statements - 1241/1959 -
- - -
- 79.57% - Branches - 265/333 -
- - -
- 66.05% - Functions - 144/218 -
- - -
- 63.34% - Lines - 1241/1959 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
dist_test -
-
0%0/10%0/10%0/10%0/1
dist_test/api/types -
-
0%0/40%0/40%0/40%0/4
dist_test/context -
-
0%0/10%0/10%0/10%0/1
dist_test/errors -
-
0%0/10%0/10%0/10%0/1
dist_test/events -
-
0%0/10%0/10%0/10%0/1
dist_test/hooks -
-
0%0/10%0/10%0/10%0/1
dist_test/internal-mutation -
-
0%0/10%0/10%0/10%0/1
dist_test/internal-query -
-
0%0/10%0/10%0/10%0/1
dist_test/middleware -
-
0%0/10%0/10%0/10%0/1
dist_test/mutation -
-
0%0/10%0/10%0/10%0/1
dist_test/query -
-
0%0/10%0/10%0/10%0/1
dist_test/router -
-
0%0/10%0/10%0/10%0/1
examples -
-
0%0/4240%0/70%0/70%0/424
src -
-
100%1/1100%1/1100%1/1100%1/1
src/api -
-
74.5%38/51100%4/444.44%4/974.5%38/51
src/api/factory -
-
89.29%342/38381.63%80/9896.66%29/3089.29%342/383
src/api/types -
-
100%1/1100%3/3100%3/3100%1/1
src/context -
-
100%88/8889.47%17/19100%10/10100%88/88
src/errors -
-
59.75%49/82100%1/17.69%1/1359.75%49/82
src/events -
-
87.83%231/26381.33%61/7593.1%27/2987.83%231/263
src/hooks -
-
100%29/29100%5/5100%3/3100%29/29
src/internal-mutation -
-
56.66%51/9088.88%8/957.14%8/1456.66%51/90
src/internal-query -
-
56.66%51/9088.88%8/957.14%8/1456.66%51/90
src/middleware -
-
67.64%23/3450%7/1480%4/567.64%23/34
src/mutation -
-
56.17%50/8988.88%8/957.14%8/1456.17%50/89
src/procedure -
-
28.57%2/7100%0/00%0/128.57%2/7
src/query -
-
90.04%208/231100%32/3270.73%29/4190.04%208/231
src/router -
-
95.06%77/8193.75%30/32100%9/995.06%77/81
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/prettify.css b/packages/server/coverage/prettify.css deleted file mode 100644 index b317a7c..0000000 --- a/packages/server/coverage/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/packages/server/coverage/prettify.js b/packages/server/coverage/prettify.js deleted file mode 100644 index b322523..0000000 --- a/packages/server/coverage/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/packages/server/coverage/sort-arrow-sprite.png b/packages/server/coverage/sort-arrow-sprite.png deleted file mode 100644 index 6ed6831..0000000 Binary files a/packages/server/coverage/sort-arrow-sprite.png and /dev/null differ diff --git a/packages/server/coverage/sorter.js b/packages/server/coverage/sorter.js deleted file mode 100644 index 4ed70ae..0000000 --- a/packages/server/coverage/sorter.js +++ /dev/null @@ -1,210 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - - // Try to create a RegExp from the searchValue. If it fails (invalid regex), - // it will be treated as a plain text search - let searchRegex; - try { - searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive - } catch (error) { - searchRegex = null; - } - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - let isMatch = false; - - if (searchRegex) { - // If a valid regex was created, use it for matching - isMatch = searchRegex.test(row.textContent); - } else { - // Otherwise, fall back to the original plain text search - isMatch = row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()); - } - - row.style.display = isMatch ? '' : 'none'; - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/packages/server/coverage/src/api/errors.ts.html b/packages/server/coverage/src/api/errors.ts.html deleted file mode 100644 index 5b8d0dc..0000000 --- a/packages/server/coverage/src/api/errors.ts.html +++ /dev/null @@ -1,367 +0,0 @@ - - - - - - Code coverage report for src/api/errors.ts - - - - - - - - - -
-
-

All files / src/api errors.ts

-
- -
- 74% - Statements - 37/50 -
- - -
- 100% - Branches - 4/4 -
- - -
- 44.44% - Functions - 4/9 -
- - -
- 74% - Lines - 37/50 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -951x -  -  -  -  -  -  -1x -1x -1x -1x -1x -  -  -  -  -1x -1x -1x -1x -1x -1x -1x -  -1x -  -  -  -  -1x -1x -1x -1x -1x -  -  -  -  -1x -1x -1x -1x -1x -  -  -  -  -1x -1x -1x -1x -1x -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -4x -  -  -  -  -1x -6x -6x -  -  -6x - 
import { error, err } from "@deessejs/fp";
-import { z } from "zod";
-import  { type Result } from "@deessejs/fp";
- 
-/**
- * RouteNotFoundError - Returned when a route path cannot be resolved.
- */
-export const RouteNotFoundError = error({
-  name: "RouteNotFoundError",
-  schema: z.object({ route: z.string() }),
-  message: (args) => `Route not found: ${args.route}`,
-});
- 
-/**
- * ValidationError - Returned when Zod validation fails for procedure args.
- */
-export const ValidationError = error({
-  name: "ValidationError",
-  schema: z.object({
-    route: z.string(),
-    errors: z.array(z.object({ path: z.string(), message: z.string() })),
-  }),
-  message: (args) =>
-    `Validation failed for route ${args.route}: ${args.errors.map((e) => e.message).join(", ")}`,
-});
- 
-/**
- * MiddlewareError - Returned when middleware execution fails.
- */
-export const MiddlewareError = error({
-  name: "MiddlewareError",
-  schema: z.object({ middleware: z.string(), reason: z.string() }),
-  message: (args) => `Middleware '${args.middleware}' failed: ${args.reason}`,
-});
- 
-/**
- * InternalError - Returned for unrecoverable internal errors.
- */
-export const InternalError = error({
-  name: "InternalError",
-  schema: z.object({ context: z.string() }),
-  message: (args) => `Internal error: ${args.context}`,
-});
- 
-/**
- * ServerError - Used for server-side exceptions with a code.
- */
-export const ServerError = error({
-  name: "ServerError",
-  schema: z.object({ code: z.string(), message: z.string() }),
-  message: (args) => `[${args.code}] ${args.message}`,
-});
- 
-/**
- * Create a route not found error result.
- */
-export const routeNotFound = (route: string): Result<never, ReturnType<typeof RouteNotFoundError>> =>
-  // eslint-disable-next-line unicorn/throw-new-error -- error() returns a factory function, not a class
-  err(RouteNotFoundError({ route }));
- 
-/**
- * Create a validation error result from Zod issues.
- */
-export const validationFailed = (
-  route: string,
-  zodIssues: z.ZodError["issues"]
-): Result<never, ReturnType<typeof ValidationError>> =>
-  err(
-    // eslint-disable-next-line unicorn/throw-new-error -- error() returns a factory function, not a class
-    ValidationError({
-      route,
-      errors: zodIssues.map((e) => ({
-        path: e.path.join("."),
-        message: e.message,
-      })),
-    })
-  );
- 
-/**
- * Create an internal error result.
- */
-export const internalError = (context: string): Result<never, ReturnType<typeof InternalError>> =>
-  // eslint-disable-next-line unicorn/throw-new-error -- error() returns a factory function, not a class
-  err(InternalError({ context }));
- 
-/**
- * Create a server error result.
- */
-export const serverError = (
-  code: string,
-  message: string
-): Result<never, ReturnType<typeof ServerError>> =>
-  // eslint-disable-next-line unicorn/throw-new-error -- error() returns a factory function, not a class
-  err(ServerError({ code, message }));
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/factory/api.ts.html b/packages/server/coverage/src/api/factory/api.ts.html deleted file mode 100644 index d819541..0000000 --- a/packages/server/coverage/src/api/factory/api.ts.html +++ /dev/null @@ -1,571 +0,0 @@ - - - - - - Code coverage report for src/api/factory/api.ts - - - - - - - - - -
-
-

All files / src/api/factory api.ts

-
- -
- 89.89% - Statements - 89/99 -
- - -
- 91.3% - Branches - 21/23 -
- - -
- 100% - Functions - 6/6 -
- - -
- 89.89% - Lines - 89/99 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -1631x -  -  -  -  -  -  -  -  -  -  -  -1x -  -8x -8x -8x -  -  -  -  -  -1x -15x -15x -  -15x -  -15x -  -42x -  -  -42x -  -4x -42x -  -8x -  -8x -2x -2x -8x -  -42x -  -15x -15x -  -  -  -  -  -1x -70x -  -  -  -  -  -  -  -70x -70x -70x -70x -70x -70x -70x -70x -70x -  -70x -  -  -  -70x -70x -70x -  -70x -70x -70x -70x -70x -70x -70x -  -70x -70x -70x -70x -70x -70x -70x -70x -70x -  -70x -  -  -70x -70x -  -90x -  -  -  -  -  -  -  -  -  -  -  -  -90x -90x -8x -90x -8x -90x -10x -90x -4x -90x -4x -90x -5x -90x -  -  -  -51x -90x -70x -  -70x -70x -  -  -  -  -  -1x -4x -4x -4x -  -  -  -4x -4x -4x -4x -4x -4x -4x -4x -4x - 
import { createPendingEventQueue } from "../../events/queue.js";
-import { isRouter, isProcedure } from "../../router/index.js";
-import  { type APIInstance, type RequestInfo, type EventEmitterAny } from "../types/api.js";
-import  { type TypedAPIInstance, type PublicRouter, apiInternalSymbol } from "../types/proxy.js";
-import  { type APIInstanceState, type RouterProxyContext } from "../types/internal.js";
-import { createRouterProxy } from "./proxy.js";
-import  { type Middleware, type Plugin, type Router } from "../../types.js";
- 
-// ============================================================
-// Public Router Filter
-// ============================================================
- 
-const isQueryOrMutation = (procedure: unknown): boolean => {
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  const type = (procedure as any).type;
-  return type === "query" || type === "mutation";
-};
- 
-/**
- * Filters a router to only include public queries and mutations.
- * Internal procedures and unknown types are explicitly excluded.
- */
-export const filterPublicRouter = <TRoutes extends Router<Ctx>, Ctx>(
-  router: TRoutes
-): PublicRouter<TRoutes> => {
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  const result: Record<string, any> = {};
- 
-  for (const key in router) {
-    // eslint-disable-next-line @typescript-eslint/no-explicit-any
-    const value = (router as Record<string, any>)[key];
- 
-    // Check procedure FIRST - isRouter returns true for procedure objects too
-    if (isProcedure(value) && isQueryOrMutation(value)) {
-      // Only include public queries and mutations
-      result[key] = value;
-    } else if (isRouter(value)) {
-      // Recursively filter nested routers
-      const filtered = filterPublicRouter(value);
-      // Only include nested router if it has public procedures
-      if (Object.keys(filtered).length > 0) {
-        result[key] = filtered;
-      }
-    }
-    // Explicitly ignore everything else (internal procedures, unknown types)
-  }
- 
-  return result as PublicRouter<TRoutes>;
-};
- 
-// ============================================================
-// Public API Creation
-// ============================================================
- 
-export const createAPI = <Ctx, TRoutes extends Router<Ctx>>(
-  config: {
-    readonly router: TRoutes;
-    readonly context?: Ctx;
-    readonly createContext?: (requestInfo?: RequestInfo) => Ctx;
-    readonly plugins?: readonly Plugin<Ctx>[];
-    readonly middleware?: readonly Middleware<Ctx>[];
-    readonly eventEmitter?: EventEmitterAny;
-  }
-): TypedAPIInstance<Ctx, TRoutes> => {
-  const {
-    router,
-    context,
-    createContext,
-    plugins = [],
-    middleware = [],
-    eventEmitter,
-  } = config;
- 
-  const queue = createPendingEventQueue();
- 
-  // Note: contextFactory is called once at creation.
-  // For per-request context, use createContext with proper request handling.
-  const contextFactory =
-    createContext ?? ((_requestInfo?: RequestInfo) => context as Ctx);
-  const initialCtx = contextFactory();
- 
-  const state: APIInstanceState<Ctx, TRoutes> = {
-    router,
-    ctx: initialCtx,
-    plugins,
-    globalMiddleware: middleware,
-    eventEmitter,
-  };
- 
-  const proxyCtx: RouterProxyContext<Ctx> = {
-    router: state.router,
-    ctx: state.ctx,
-    globalMiddleware: state.globalMiddleware,
-    rootRouter: state.router,
-    eventEmitter,
-    queue,
-    plugins: state.plugins,
-  };
- 
-  const routerProxy = createRouterProxy(proxyCtx);
- 
-  // Create a typed Proxy for the API instance
-  const handler: ProxyHandler<APIInstanceState<Ctx, TRoutes>> = {
-    get(target, prop) {
-      // Handle symbol access for internal properties
-      if (typeof prop === "symbol") {
-        if (prop === apiInternalSymbol) {
-          return {
-            router: target.router,
-            ctx: target.ctx,
-            plugins: target.plugins,
-            eventEmitter: target.eventEmitter,
-          };
-        }
-        return undefined;
-      }
- 
-      // Handle root properties (string only)
-      switch (prop) {
-        case "router":
-          return target.router;
-        case "ctx":
-          return target.ctx;
-        case "plugins":
-          return target.plugins;
-        case "globalMiddleware":
-          return target.globalMiddleware;
-        case "eventEmitter":
-          return target.eventEmitter;
-        case "getEvents":
-          return () => target.eventEmitter?.getEventLog() ?? [];
-      }
- 
-      // Delegate to router proxy for route access
-      // eslint-disable-next-line @typescript-eslint/no-explicit-any
-      return (routerProxy as any)[prop];
-    },
-  };
- 
-  return new Proxy(state, handler) as unknown as TypedAPIInstance<Ctx, TRoutes>;
-};
- 
-/**
- * Creates a public-only view of an API by filtering out internal procedures.
- * Shares the same queue and event emitter for efficiency.
- */
-export const createPublicAPI = <Ctx, TRoutes extends Router<Ctx>>(
-  api: APIInstance<Ctx, TRoutes>
-): TypedAPIInstance<Ctx, PublicRouter<TRoutes>> => {
-  const publicRouter = filterPublicRouter(api.router);
- 
-  // Note: createContext is preserved from original API but called once.
-  // This is a known limitation - per-request context requires architecture change.
-  return createAPI({
-    router: publicRouter as TRoutes,
-    context: api.ctx,
-    createContext: undefined,
-    plugins: api.plugins,
-    middleware: api.globalMiddleware,
-    eventEmitter: api.eventEmitter,
-  });
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/factory/errors.ts.html b/packages/server/coverage/src/api/factory/errors.ts.html deleted file mode 100644 index bc67322..0000000 --- a/packages/server/coverage/src/api/factory/errors.ts.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - Code coverage report for src/api/factory/errors.ts - - - - - - - - - -
-
-

All files / src/api/factory errors.ts

-
- -
- 100% - Statements - 20/20 -
- - -
- 100% - Branches - 6/6 -
- - -
- 100% - Functions - 4/4 -
- - -
- 100% - Lines - 20/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -301x -  -  -  -  -  -  -  -1x -4x -4x -4x -4x -4x -4x -4x -4x -4x -  -1x -6x -6x -6x -  -6x -6x -6x -6x -6x - 
import  { type Result } from "@deessejs/fp";
-import { error as errorFn } from "@deessejs/fp";
-import { internalError, serverError } from "../errors.js";
- 
-// ============================================================
-// L1: Error Creation
-// ============================================================
- 
-export const createInternalErrorResult = (message: string, route: string): Result<never> =>
-  internalError(message).mapErr((e) =>
-    e
-      .addNotes(`Error in route: ${route}`)
-      .from(
-        errorFn({ name: "INTERNAL_ERROR", message: (_: unknown) => message })({
-          message,
-        })
-      )
-  );
- 
-export const createServerErrorResult = (
-  code: string,
-  message: string,
-  route: string
-): Result<never> =>
-  serverError(code, message).mapErr((e) =>
-    e
-      .addNotes(`Route: ${route}`)
-      .from(errorFn({ name: code, message: (_: unknown) => message })({ message }))
-  );
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/factory/index.html b/packages/server/coverage/src/api/factory/index.html deleted file mode 100644 index 207a487..0000000 --- a/packages/server/coverage/src/api/factory/index.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - Code coverage report for src/api/factory - - - - - - - - - -
-
-

All files src/api/factory

-
- -
- 89.29% - Statements - 342/383 -
- - -
- 81.63% - Branches - 80/98 -
- - -
- 96.66% - Functions - 29/30 -
- - -
- 89.29% - Lines - 342/383 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
api.ts -
-
89.89%89/9991.3%21/23100%6/689.89%89/99
errors.ts -
-
100%20/20100%6/6100%4/4100%20/20
index.ts -
-
100%1/1100%0/0100%0/0100%1/1
plugins.ts -
-
100%9/9100%5/5100%1/1100%9/9
procedure.ts -
-
87.37%90/10374.07%20/27100%6/687.37%90/103
proxy.ts -
-
88.88%48/5485%17/20100%4/488.88%48/54
route.ts -
-
87.87%29/3325%1/4100%1/187.87%29/33
send.ts -
-
100%26/26100%5/5100%2/2100%26/26
utils.ts -
-
78.94%30/3862.5%5/883.33%5/678.94%30/38
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/factory/index.ts.html b/packages/server/coverage/src/api/factory/index.ts.html deleted file mode 100644 index 6f1bc72..0000000 --- a/packages/server/coverage/src/api/factory/index.ts.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - Code coverage report for src/api/factory/index.ts - - - - - - - - - -
-
-

All files / src/api/factory index.ts

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -151x -  -  -  -  -  -  -  -  -  -  -  -  -  - 
// Factory module - decomposed API factory into focused files
-// Follows abstraction levels: L1 (atomic) -> L2 (composed) -> L3 (orchestration)
- 
-export { createAPI, createPublicAPI, filterPublicRouter } from "./api.js";
-export { createRouterProxy } from "./proxy.js";
-export { executeRoute } from "./route.js";
-export { executeProcedure } from "./procedure.js";
- 
-// Context types
-export type {
-  RouterProxyContext,
-  ExecuteRouteContext,
-  ExecuteProcedureContext,
-} from "../types/internal.js";
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/factory/plugins.ts.html b/packages/server/coverage/src/api/factory/plugins.ts.html deleted file mode 100644 index 4716140..0000000 --- a/packages/server/coverage/src/api/factory/plugins.ts.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - Code coverage report for src/api/factory/plugins.ts - - - - - - - - - -
-
-

All files / src/api/factory plugins.ts

-
- -
- 100% - Statements - 9/9 -
- - -
- 100% - Branches - 5/5 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 9/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21  -  -  -  -  -  -1x -55x -  -  -5x -  -  -6x -6x -6x -6x -  -5x -5x - 
import  { type Plugin } from "../../types.js";
- 
-// ============================================================
-// L1: Plugin Application (Performance Rule)
-// ============================================================
- 
-export const applyPlugins = <Ctx>(ctx: Ctx, plugins: readonly Plugin<Ctx>[]): Ctx => {
-  if (plugins.length === 0) return ctx;
- 
-  // L1: Clone once at start to guarantee immutability of original ctx
-  const extendedCtx = Object.assign({}, ctx as Record<string, unknown>) as Ctx;
- 
-  // L2: Apply plugins using Object.assign (performance rule - no intermediate allocations)
-  for (let i = 0; i < plugins.length; i++) {
-    const extension = plugins[i].extend(extendedCtx);
-    Object.assign(extendedCtx as Record<string, unknown>, extension);
-  }
- 
-  return extendedCtx;
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/factory/procedure.ts.html b/packages/server/coverage/src/api/factory/procedure.ts.html deleted file mode 100644 index 1b43a5e..0000000 --- a/packages/server/coverage/src/api/factory/procedure.ts.html +++ /dev/null @@ -1,544 +0,0 @@ - - - - - - Code coverage report for src/api/factory/procedure.ts - - - - - - - - - -
-
-

All files / src/api/factory procedure.ts

-
- -
- 87.37% - Statements - 90/103 -
- - -
- 74.07% - Branches - 20/27 -
- - -
- 100% - Functions - 6/6 -
- - -
- 87.37% - Lines - 90/103 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -1541x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -48x -48x -48x -48x -48x -48x -48x -48x -  -48x -5x -5x -  -48x -48x -  -  -48x -4x -4x -  -48x -  -41x -3x -3x -  -41x -48x -  -5x -3x -3x -5x -  -46x -48x -  -2x -1x -1x -2x -2x -2x -2x -2x -48x -  -  -  -  -  -1x -49x -49x -49x -49x -49x -49x -  -49x -  -59x -59x -  -  -59x -  -59x -  -59x -48x -48x -  -11x -11x -11x -11x -11x -11x -59x -  -49x -49x -  -  -  -  -  -1x -49x -49x -49x -49x -49x -  -  -49x -45x -45x -  -  -  -  -45x -  -49x -49x -  -  -49x -48x -48x -48x -48x -48x -48x -48x -48x -48x -  -  -49x -  -49x -49x -49x -  -  -  -  -  -  -  -  -  -49x - 
import  { type Result } from "@deessejs/fp";
-import  { type Middleware, type EventRegistry, type HandlerContext, type Procedure } from "../../types.js";
-import  { type ProcedureWithHooks } from "../types/internal.js";
-import  { type EventEmitterAny } from "../types/api.js";
-import  { type EventQueue } from "../../events/queue.js";
-import  { type ExecuteProcedureContext } from "../types/internal.js";
-import { createHandlerContext } from "./send.js";
-import { validationFailed } from "../errors.js";
-import { createInternalErrorResult, createServerErrorResult } from "./errors.js";
-import { ServerException } from "../../errors/server-error.js";
- 
-// ============================================================
-// L2: Procedure Execution with Hooks
-// ============================================================
- 
-const executeProcedureWithHooks = async <Ctx, Args, Output>(
-  ctx: HandlerContext<Ctx, EventRegistry>,
-  args: Args,
-  hookedProc: ProcedureWithHooks<Ctx, Args, Output>,
-  procedure: Procedure<Ctx, Args, Output>,
-  route: string,
-  queue: EventQueue,
-  eventEmitter: EventEmitterAny | undefined
-): Promise<Result<Output>> => {
-  // L1: Invoke beforeInvoke hook
-  if (hookedProc._hooks?.beforeInvoke) {
-    void hookedProc._hooks.beforeInvoke(ctx, args);
-  }
- 
-  try {
-    const result = await procedure.handler(ctx, args);
- 
-    // L1: Invoke afterInvoke hook
-    if (hookedProc._hooks?.afterInvoke) {
-      void hookedProc._hooks.afterInvoke(ctx, args, result);
-    }
- 
-    if (result.ok) {
-      // L1: Invoke onSuccess hook
-      if (hookedProc._hooks?.onSuccess) {
-        void hookedProc._hooks.onSuccess(ctx, args, result.value);
-      }
-      // L1: Flush queue on success
-      await queue.flush(eventEmitter);
-    } else {
-      // L1: Invoke onError hook
-      if (hookedProc._hooks?.onError) {
-        void hookedProc._hooks.onError(ctx, args, result.error);
-      }
-    }
- 
-    return result;
-  } catch (error) {
-    // L1: Invoke onError hook on exception
-    if (hookedProc._hooks?.onError) {
-      void hookedProc._hooks.onError(ctx, args, error);
-    }
-    return createInternalErrorResult(
-      error instanceof Error ? error.message : String(error),
-      route
-    );
-  }
-};
- 
-// ============================================================
-// L2: Middleware Chain Runner (with double-next protection)
-// ============================================================
- 
-const runMiddlewareChain = <Ctx, Args, Output>(
-  allMiddleware: readonly Middleware<Ctx>[],
-  handlerCtx: HandlerContext<Ctx, EventRegistry>,
-  args: Args,
-  finalInvoke: () => Promise<Result<Output>>
-): (() => Promise<Result<Output>>) => {
-  let index = -1;
- 
-  const next = async (overrides?: { ctx?: Partial<Ctx> }): Promise<Result<Output>> => {
-    // L1: Double-next protection - validate index hasn't been reused
-    const nextIndex = index + 1;
-    if (nextIndex <= index) {
-      throw new Error(`Middleware safety violation: next() called multiple times at index ${index}`);
-    }
-    index = nextIndex;
- 
-    const currentCtx = overrides?.ctx ? { ...handlerCtx, ...overrides.ctx } : handlerCtx;
- 
-    if (index >= allMiddleware.length) {
-      return finalInvoke();
-    }
- 
-    const mw = allMiddleware[index];
-    return mw.handler(currentCtx, {
-      next: (innerOverrides?: { ctx?: Partial<Ctx> }) => next(innerOverrides),
-      args,
-      meta: {},
-    }) as unknown as Promise<Result<Output>>;
-  };
- 
-  return next;
-};
- 
-// ============================================================
-// L3: Execute Procedure (main orchestration)
-// ============================================================
- 
-export const executeProcedure = async <Ctx, Args, Output>(
-  ctx: ExecuteProcedureContext<Ctx, Args, Output>
-): Promise<Result<Output>> => {
-  const { procedure, ctx: procedureCtx, args, middleware, eventEmitter, queue, route, plugins } = ctx;
-  const handlerCtx = createHandlerContext(procedureCtx, queue, plugins);
-  const hookedProc = procedure as unknown as ProcedureWithHooks<Ctx, Args, Output>;
- 
-  // L1: Validate args if schema exists
-  if (hookedProc.argsSchema) {
-    const parseResult = hookedProc.argsSchema.safeParse(args);
-    if (!parseResult.success) {
-      return validationFailed(route, parseResult.error.issues).mapErr((e) =>
-        e.addNotes(`Validation failed for route: ${route}`)
-      );
-    }
-  }
- 
-  const procedureMiddleware: readonly Middleware<Ctx>[] = hookedProc._middleware || [];
-  const allMiddleware: readonly Middleware<Ctx>[] = [...middleware, ...procedureMiddleware];
- 
-  // L2: Final invoke function
-  const finalInvoke = (): Promise<Result<Output>> =>
-    executeProcedureWithHooks(
-      handlerCtx,
-      args,
-      hookedProc,
-      procedure,
-      route,
-      queue,
-      eventEmitter
-    );
- 
-  // L2: Run middleware chain
-  const runChain = runMiddlewareChain(allMiddleware, handlerCtx, args, finalInvoke);
- 
-  try {
-    return await runChain();
-  } catch (error: unknown) {
-    queue.clear();
- 
-    if (error instanceof ServerException) {
-      return createServerErrorResult(error.code, error.message, route);
-    }
- 
-    const errToReturn = error instanceof Error ? error : new Error(String(error));
-    return createInternalErrorResult(errToReturn.message, route);
-  }
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/factory/proxy.ts.html b/packages/server/coverage/src/api/factory/proxy.ts.html deleted file mode 100644 index a6e972d..0000000 --- a/packages/server/coverage/src/api/factory/proxy.ts.html +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - Code coverage report for src/api/factory/proxy.ts - - - - - - - - - -
-
-

All files / src/api/factory proxy.ts

-
- -
- 88.88% - Statements - 48/54 -
- - -
- 85% - Branches - 17/20 -
- - -
- 100% - Functions - 4/4 -
- - -
- 88.88% - Lines - 48/54 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -811x -  -  -  -  -  -  -  -  -  -  -1x -115x -115x -  -115x -115x -  -  -115x -  -115x -115x -  -115x -115x -100x -7x -7x -  -100x -  -  -  -100x -  -  -  -93x -100x -2x -2x -  -91x -  -100x -46x -  -  -46x -46x -46x -46x -46x -46x -46x -46x -  -46x -4x -45x -42x -42x -90x -  -45x -45x -45x -45x -45x -  -  -  -  -91x -91x -100x -115x -115x -115x - 
import { none } from "@deessejs/fp";
-import { type Router } from "../../types.js";
-import { isProcedure } from "../../router/index.js";
-import { type ExecuteRouteContext, type RouterProxyContext } from "../types/internal.js";
-import { isValidSymbol, buildFullPath, isNoArgsProcedure } from "./utils.js";
-import { executeRoute } from "./route.js";
- 
-// ============================================================
-// Router Proxy Creation (Memoized per instance)
-// ============================================================
- 
-export const createRouterProxy = <Ctx>(
-  proxyCtx: RouterProxyContext<Ctx>,
-  path: readonly string[] = []
-  /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
-): any => {
-  const { router, ctx, globalMiddleware, rootRouter, eventEmitter, queue, plugins } = proxyCtx;
- 
-  // L1: Memoization cache for this proxy instance (stability for React/useEffect)
-  const cache = new Map<string | symbol, unknown>();
- 
-  return new Proxy(
-    {},
-    /* eslint-disable @typescript-eslint/consistent-return */
-    {
-      get(target: unknown, prop: string | symbol): unknown {
-        if (cache.has(prop)) {
-          return cache.get(prop);
-        }
- 
-        if (!isValidSymbol(prop)) {
-          return undefined;
-        }
- 
-        if (typeof prop !== "string") {
-          return none();
-        }
- 
-        const value = (router as Record<string, unknown>)[prop];
-        if (value === undefined) {
-          return none();
-        }
- 
-        let result: unknown;
- 
-        if (isProcedure(value)) {
-          const fullPath = buildFullPath(path, prop);
- 
-          // L2: Create routeCtx with rootRouter for proper procedure lookup
-          const routeCtx: ExecuteRouteContext<Ctx> = {
-            router: rootRouter,
-            ctx,
-            globalMiddleware,
-            eventEmitter,
-            queue,
-            plugins,
-          };
- 
-          if (isNoArgsProcedure(value)) {
-            result = () => executeRoute(fullPath, undefined, routeCtx);
-          } else {
-            result = (args: unknown) => executeRoute(fullPath, args, routeCtx);
-          }
-        } else if (typeof value === "object" && value !== null) {
-          // L2: Nested proxy created once per path
-          result = createRouterProxy(
-            { ...proxyCtx, router: value as Router<Ctx> },
-            [...path, prop]
-          );
-        } else {
-          result = none();
-        }
- 
-        // L2: Cache the result for consistent references
-        cache.set(prop, result);
-        return result;
-      },
-    }
-  );
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/factory/route.ts.html b/packages/server/coverage/src/api/factory/route.ts.html deleted file mode 100644 index a6e956c..0000000 --- a/packages/server/coverage/src/api/factory/route.ts.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - Code coverage report for src/api/factory/route.ts - - - - - - - - - -
-
-

All files / src/api/factory route.ts

-
- -
- 87.87% - Statements - 29/33 -
- - -
- 25% - Branches - 1/4 -
- - -
- 100% - Functions - 1/1 -
- - -
- 87.87% - Lines - 29/33 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -551x -  -  -  -  -  -  -  -  -  -  -1x -49x -49x -49x -49x -49x -  -  -  -49x -49x -  -  -  -  -49x -49x -49x -  -49x -  -49x -49x -49x -  -49x -  -  -  -  -49x -49x -49x -49x -49x -49x -49x -49x -49x -49x -  -49x -49x - 
import { type Result } from "@deessejs/fp";
-import { type Procedure } from "../../types.js";
-import { type ExecuteRouteContext, type ExecuteProcedureContext } from "../types/internal.js";
-import { splitRoutePath, getProcedureFromPath } from "./utils.js";
-import { routeNotFound } from "../errors.js";
-import { executeProcedure } from "./procedure.js";
- 
-// ============================================================
-// Route Execution (Performance Rule - Route Memoization)
-// ============================================================
- 
-export const executeRoute = async <Ctx>(
-  route: string,
-  args: unknown,
-  routeCtx: ExecuteRouteContext<Ctx>
-): Promise<Result<unknown>> => {
-  const { router, ctx, globalMiddleware, eventEmitter, queue, plugins, routeCache } = routeCtx;
- 
-  // L2: Check cache first (O(1) lookup after first resolution)
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  let procedure: Procedure<any, any, any> | undefined;
-  if (routeCache) {
-    procedure = routeCache.get(route);
-  }
- 
-  // L2: Resolve and cache if not found
-  if (!procedure) {
-    const pathParts = splitRoutePath(route);
-    procedure = getProcedureFromPath(router, pathParts);
- 
-    if (procedure) {
-      // L2: Cache on first resolution (lazy caching per API instance)
-      routeCache?.set(route, procedure);
-    }
-  }
- 
-  if (!procedure) {
-    return routeNotFound(route);
-  }
- 
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  const procedureCtx: ExecuteProcedureContext<any, unknown, unknown> = {
-    procedure,
-    ctx,
-    args,
-    middleware: globalMiddleware,
-    eventEmitter,
-    queue,
-    route,
-    plugins,
-  };
- 
-  return executeProcedure(procedureCtx);
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/factory/send.ts.html b/packages/server/coverage/src/api/factory/send.ts.html deleted file mode 100644 index 6a520e5..0000000 --- a/packages/server/coverage/src/api/factory/send.ts.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - Code coverage report for src/api/factory/send.ts - - - - - - - - - -
-
-

All files / src/api/factory send.ts

-
- -
- 100% - Statements - 26/26 -
- - -
- 100% - Branches - 5/5 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 26/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -431x -  -  -  -  -  -  -  -1x -  -  -  -  -  -1x -49x -  -49x -14x -14x -14x -14x -14x -14x -14x -14x -14x -14x -14x -14x -  -1x -49x -49x -49x -49x -49x -49x -  -  -49x -49x - 
import  { type Plugin, type EventRegistry, type SendOptions, type HandlerContext } from "../../types.js";
-import  { type EventQueue } from "../../events/queue.js";
-import { applyPlugins } from "./plugins.js";
- 
-// ============================================================
-// Constants
-// ============================================================
- 
-const DEFAULT_NAMESPACE = "default" as const;
- 
-// ============================================================
-// L1: Handler Context Creation
-// ============================================================
- 
-export const createSendFn = <Events extends EventRegistry>(
-  queue: EventQueue
-) =>
-  <K extends keyof Events>(
-    name: K,
-    data: Events[K]["data"],
-    options?: SendOptions
-  ): void => {
-    queue.enqueue({
-      name: name as string,
-      data,
-      timestamp: new Date().toISOString(),
-      namespace: options?.namespace ?? DEFAULT_NAMESPACE,
-      options,
-    });
-  };
- 
-export const createHandlerContext = <Ctx, Events extends EventRegistry>(
-  ctx: Ctx,
-  queue: EventQueue,
-  plugins: readonly Plugin<Ctx>[]
-): HandlerContext<Ctx, Events> => {
-  const send = createSendFn<Events>(queue);
-  const extendedCtx = applyPlugins(ctx, plugins);
- 
-  // Use Object.assign to help TypeScript infer the intersection type
-  return Object.assign(extendedCtx as object, { send }) as HandlerContext<Ctx, Events>;
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/factory/utils.ts.html b/packages/server/coverage/src/api/factory/utils.ts.html deleted file mode 100644 index 12d0c9e..0000000 --- a/packages/server/coverage/src/api/factory/utils.ts.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - Code coverage report for src/api/factory/utils.ts - - - - - - - - - -
-
-

All files / src/api/factory utils.ts

-
- -
- 78.94% - Statements - 30/38 -
- - -
- 62.5% - Branches - 5/8 -
- - -
- 83.33% - Functions - 5/6 -
- - -
- 78.94% - Lines - 30/38 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -621x -  -  -  -  -  -  -  -  -1x -  -  -1x -49x -49x -49x -  -49x -49x -  -49x -49x -  -  -49x -49x -49x -49x -  -  -  -49x -49x -  -  -1x -1x -1x -1x -1x -  -1x -  -93x -  -  -  -  -1x -  -  -  -  -1x -46x -46x -  -1x -  -46x -46x - 
/* eslint-disable @typescript-eslint/consistent-return */
-import { none } from "@deessejs/fp";
-import { type Router, type Procedure } from "../../types.js";
-import { isProcedure } from "../../router/index.js";
- 
-// ============================================================
-// L1: Atomic Operations
-// ============================================================
- 
-export const splitRoutePath = (route: string): readonly string[] => route.split(".");
- 
-// eslint-disable-next-line @typescript-eslint/consistent-return
-export const getProcedureFromPath = (
-  router: Router<unknown>,
-  pathParts: readonly string[]
-): Procedure<unknown, unknown, unknown> | undefined => {
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  let current: Record<string, unknown> = router as any;
-  for (let i = 0; i < pathParts.length - 1; i++) {
-    // eslint-disable-next-line @typescript-eslint/no-explicit-any
-    current = current[pathParts[i]] as any;
-    if (!current) {
-      return undefined;
-    }
-  }
-  const procedure = current[pathParts.at(-1)!];
-  const procIsProcedure = isProcedure(procedure);
-  if (!procIsProcedure) {
-    // eslint-disable-next-line @typescript-eslint/consistent-return
-    return undefined;
-  }
-  return procedure;
-};
- 
-// Invalid symbols that Proxy's get trap will be called with
-const INVALID_SYMBOLS = new Set([
-  Symbol.toStringTag,
-  Symbol.iterator,
-  Symbol.toPrimitive,
-]);
- 
-export const isValidSymbol = (prop: string | symbol): boolean => {
-  // String properties are always valid
-  if (typeof prop === "string") return true;
-  // Symbol properties are valid except for special internal ones
-  return !INVALID_SYMBOLS.has(prop);
-};
- 
-export const getSymbolProperty = (_prop: string | symbol): unknown => {
-  // eslint-disable-next-line @typescript-eslint/consistent-return -- all branches return
-  return none();
-};
- 
-export const buildFullPath = (path: readonly string[], prop: string): string => {
-  return [...path, prop].join(".");
-};
- 
-export const isNoArgsProcedure = (procedure: unknown): boolean => {
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  return !(procedure as any).argsSchema;
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/index.html b/packages/server/coverage/src/api/index.html deleted file mode 100644 index d771eb0..0000000 --- a/packages/server/coverage/src/api/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/api - - - - - - - - - -
-
-

All files src/api

-
- -
- 74.5% - Statements - 38/51 -
- - -
- 100% - Branches - 4/4 -
- - -
- 44.44% - Functions - 4/9 -
- - -
- 74.5% - Lines - 38/51 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
errors.ts -
-
74%37/50100%4/444.44%4/974%37/50
index.ts -
-
100%1/1100%0/0100%0/0100%1/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/index.ts.html b/packages/server/coverage/src/api/index.ts.html deleted file mode 100644 index e399009..0000000 --- a/packages/server/coverage/src/api/index.ts.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - Code coverage report for src/api/index.ts - - - - - - - - - -
-
-

All files / src/api index.ts

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -161x -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
export type { APIInstance, APIConfig, RequestInfo } from "./types/api.js";
-export type { TypedAPIInstance, PublicRouter, InferArgs, InferOutput, DecoratedProcedure, DecoratedRouter, apiInternalSymbol } from "./types/proxy.js";
-export type { APIInstanceState } from "./types/internal.js";
-export { createAPI, createPublicAPI, filterPublicRouter } from "./factory/index.js";
-export {
-  RouteNotFoundError,
-  ValidationError,
-  MiddlewareError,
-  InternalError,
-  ServerError,
-  routeNotFound,
-  validationFailed,
-  serverError,
-  internalError,
-} from "./errors.js";
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/types/api.ts.html b/packages/server/coverage/src/api/types/api.ts.html deleted file mode 100644 index 5bba961..0000000 --- a/packages/server/coverage/src/api/types/api.ts.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - Code coverage report for src/api/types/api.ts - - - - - - - - - -
-
-

All files / src/api/types api.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import  { type EventEmitter } from "../../events/emitter.js";
-import  { type Router } from "../../types.js";
-import  { type Plugin, type Middleware } from "../../types.js";
- 
-/* eslint-disable @typescript-eslint/no-explicit-any */
- 
-export type EventEmitterAny = EventEmitter<any>;
- 
-export type RequestInfo = Readonly<{
-  headers?: Record<string, string>;
-  method?: string;
-  url?: string;
-  [key: string]: unknown;
-}>;
- 
-export type APIInstance<Ctx, TRoutes = Router<Ctx, any>> = Readonly<{
-  router: TRoutes;
-  ctx: Ctx;
-  plugins: readonly Plugin<Ctx>[];
-  globalMiddleware: readonly Middleware<Ctx>[];
-  eventEmitter?: EventEmitterAny;
-}>;
- 
-export type APIConfig<TRoutes extends Router<unknown, any>> = Readonly<{
-  router: TRoutes;
-  context?: unknown;
-  /**
-   * Factory function to create context per request.
-   * Receives optional RequestInfo (headers, method, url) for per-request context enrichment.
-   */
-  createContext?: (requestInfo?: RequestInfo) => unknown;
-  plugins: readonly Plugin<unknown>[];
-  middleware: readonly Middleware<unknown>[];
-  eventEmitter?: EventEmitterAny;
-}>;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/types/index.html b/packages/server/coverage/src/api/types/index.html deleted file mode 100644 index 3f8364b..0000000 --- a/packages/server/coverage/src/api/types/index.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - Code coverage report for src/api/types - - - - - - - - - -
-
-

All files src/api/types

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 3/3 -
- - -
- 100% - Functions - 3/3 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
api.ts -
-
0%0/00%1/10%1/10%0/0
index.ts -
-
0%0/00%1/10%1/10%0/0
internal.ts -
-
0%0/00%1/10%1/10%0/0
proxy.ts -
-
100%1/1100%0/0100%0/0100%1/1
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/types/index.ts.html b/packages/server/coverage/src/api/types/index.ts.html deleted file mode 100644 index 1e3709f..0000000 --- a/packages/server/coverage/src/api/types/index.ts.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - Code coverage report for src/api/types/index.ts - - - - - - - - - -
-
-

All files / src/api/types index.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
// API types - public
-export type { EventEmitterAny, APIInstance, APIConfig, RequestInfo } from "./api.js";
- 
-// Proxy types
-export type { TypedAPIInstance, PublicRouter, InferArgs, InferOutput, DecoratedProcedure, DecoratedRouter, apiInternalSymbol } from "./proxy.js";
- 
-// Internal types - for use within the API module
-export type {
-  ProcedureWithHooks,
-  APIInstanceState,
-  RouterProxyContext,
-  ExecuteRouteContext,
-  ExecuteProcedureContext,
-} from "./internal.js";
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/types/internal.ts.html b/packages/server/coverage/src/api/types/internal.ts.html deleted file mode 100644 index 4550f18..0000000 --- a/packages/server/coverage/src/api/types/internal.ts.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - Code coverage report for src/api/types/internal.ts - - - - - - - - - -
-
-

All files / src/api/types internal.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import  { type Result } from "@deessejs/fp";
-import  { type Middleware, type Plugin, type Router, type Procedure, type EventRegistry, type HandlerContext } from "../../types.js";
-import  { type EventEmitterAny } from "./api.js";
-import  { type EventQueue } from "../../events/queue.js";
- 
- 
- 
-// Procedure augmented with internal hooks and metadata (used internally in API execution)
-export type ProcedureWithHooks<Ctx, Args, Output> = Readonly<{
-  argsSchema?: Procedure<Ctx, Args, Output>["argsSchema"];
-  _middleware?: readonly Middleware<Ctx>[];
-  _hooks?: Readonly<{
-    beforeInvoke?: (ctx: HandlerContext<Ctx, EventRegistry>, args: Args) => void | Promise<void>;
-    afterInvoke?: (ctx: HandlerContext<Ctx, EventRegistry>, args: Args, result: Result<Output>) => void | Promise<void>;
-    onSuccess?: (ctx: HandlerContext<Ctx, EventRegistry>, args: Args, data: Output) => void | Promise<void>;
-    onError?: (ctx: HandlerContext<Ctx, EventRegistry>, args: Args, error: unknown) => void | Promise<void>;
-  }>;
-  readonly type: Procedure<Ctx, Args, Output>["type"];
-  readonly handler: Procedure<Ctx, Args, Output>["handler"];
-}>;
- 
-// Internal state for API instance
-export type APIInstanceState<Ctx, TRoutes extends Router<Ctx>> = Readonly<{
-  router: TRoutes;
-  ctx: Ctx;
-  plugins: readonly Plugin<Ctx>[];
-  globalMiddleware: readonly Middleware<Ctx>[];
-  eventEmitter?: EventEmitterAny;
-}>;
- 
-// Context objects to reduce parameters to max 3
-export type RouterProxyContext<Ctx> = Readonly<{
-  readonly router: Router<Ctx>;
-  readonly ctx: Ctx;
-  readonly globalMiddleware: readonly Middleware<Ctx>[];
-  readonly rootRouter: Router<Ctx>;
-  readonly eventEmitter: EventEmitterAny | undefined;
-  readonly queue: EventQueue;
-  readonly plugins: readonly Plugin<Ctx>[];
-  readonly routeCache?: Map<string, Procedure<unknown, unknown, unknown>>;
-}>;
- 
-export type ExecuteRouteContext<Ctx> = Readonly<{
-  readonly router: Router<Ctx>;
-  readonly ctx: Ctx;
-  readonly globalMiddleware: readonly Middleware<Ctx>[];
-  readonly eventEmitter: EventEmitterAny | undefined;
-  readonly queue: EventQueue;
-  readonly plugins: readonly Plugin<Ctx>[];
-  readonly routeCache?: Map<string, Procedure<unknown, unknown, unknown>>;
-}>;
- 
-export type ExecuteProcedureContext<Ctx, Args, Output> = Readonly<{
-  readonly procedure: Procedure<Ctx, Args, Output>;
-  readonly ctx: Ctx;
-  readonly args: Args;
-  readonly middleware: readonly Middleware<Ctx>[];
-  readonly eventEmitter: EventEmitterAny | undefined;
-  readonly queue: EventQueue;
-  readonly route: string;
-  readonly plugins: readonly Plugin<Ctx>[];
-}>;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/api/types/proxy.ts.html b/packages/server/coverage/src/api/types/proxy.ts.html deleted file mode 100644 index df09637..0000000 --- a/packages/server/coverage/src/api/types/proxy.ts.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - Code coverage report for src/api/types/proxy.ts - - - - - - - - - -
-
-

All files / src/api/types proxy.ts

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { type Result } from "@deessejs/fp";
-import { type AnyProcedure, type Router, type Procedure, type Plugin } from "../../types.js";
-import { type EventEmitterAny } from "./api.js";
- 
-/* eslint-disable @typescript-eslint/no-explicit-any */
- 
-// ============================================
-// Symbol for internal API access
-// ============================================
- 
-export const apiInternalSymbol = Symbol.for("deesse.api.internal");
- 
-// ============================================
-// Helper types for extracting procedure types
-// ============================================
- 
-// Extract input type from procedure using _def.$types
-export type InferArgs<T> = T extends { _def: { $types: { input: infer I } } } ? I : never;
- 
-// Extract output type from procedure using _def.$types
-export type InferOutput<T> = T extends { _def: { $types: { output: infer O } } } ? O : never;
- 
-// ============================================
-// DecoratedProcedure - callable procedure proxy with proper input/output types
-// Uses structural constraint instead of requiring exact AnyProcedure type
-// ============================================
- 
-export type DecoratedProcedure<TProc> =
-  [InferArgs<TProc>] extends [never]
-    ? () => Promise<Result<InferOutput<TProc>>>
-    : (args: InferArgs<TProc>) => Promise<Result<InferOutput<TProc>>>;
- 
-// ============================================
-// DecoratedRouter - recursive router decoration (THE KEY TYPE)
-// Uses direct recursion without 'any' - no intersection, no APIInstance
-// ============================================
- 
-export type DecoratedRouter<TRoutes extends Record<string, any>, Ctx = any> = {
-  [K in keyof TRoutes & string]: [TRoutes[K]] extends [{ type: string }]
-    ? DecoratedProcedure<TRoutes[K]>
-    : [TRoutes[K]] extends [Record<string, any>]
-      ? DecoratedRouter<TRoutes[K], Ctx>
-      : TRoutes[K];
-} & Record<string, any>;
- 
-// ============================================
-// TypedAPIInstance - final type using symbol for internal access
-// Uses DecoratedRouter directly as mapped type (preserves exact keys via [K in keyof TRoutes])
-// Symbol key for internals - no index signature that creates union
-// ============================================
- 
-export type TypedAPIInstance<Ctx, TRoutes extends Record<string, any>> =
-  DecoratedRouter<TRoutes, Ctx> & {
-    readonly [apiInternalSymbol]: {
-      router: TRoutes;
-      ctx: Ctx;
-      plugins: readonly Plugin<Ctx>[];
-      eventEmitter?: EventEmitterAny;
-    };
-  };
- 
-// ============================================
-// PublicRouter - filters out internal queries and mutations from router type
-// ============================================
- 
-export type PublicRouter<TRoutes extends Router<any, any>> = {
-  readonly [K in keyof TRoutes as [TRoutes[K]] extends [Procedure<any, any, any>]
-    ? [TRoutes[K]] extends [{ type: "query" | "mutation" }]
-      ? K
-      : never
-    : K]: [TRoutes[K]] extends [Router<any, any>]
-    ? PublicRouter<TRoutes[K]>
-    : TRoutes[K];
-};
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/context/builder.ts.html b/packages/server/coverage/src/context/builder.ts.html deleted file mode 100644 index 8f707ca..0000000 --- a/packages/server/coverage/src/context/builder.ts.html +++ /dev/null @@ -1,538 +0,0 @@ - - - - - - Code coverage report for src/context/builder.ts - - - - - - - - - -
-
-

All files / src/context builder.ts

-
- -
- 100% - Statements - 87/87 -
- - -
- 88.88% - Branches - 16/18 -
- - -
- 100% - Functions - 9/9 -
- - -
- 100% - Lines - 87/87 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -1521x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -1x -31x -31x -31x -31x -  -31x -31x -31x -  -31x -31x -31x -31x -31x -31x -31x -31x -  -  -  -  -  -  -31x -14x -14x -14x -14x -14x -14x -14x -  -  -  -  -31x -2x -2x -2x -2x -2x -2x -2x -  -  -  -  -  -31x -  -  -9x -9x -9x -  -  -9x -  -  -  -9x -10x -5x -5x -5x -5x -5x -5x -5x -7x -7x -5x -5x -10x -  -  -9x -2x -2x -2x -2x -2x -2x -2x -2x -  -9x -9x -31x -  -  -  -  -  -1x -15x -15x -  -  -  -  -  -1x -  -  -  -65x -  -  -  -65x -65x -  -65x -  -65x -  -  -65x -  -  -65x -55x -55x -55x -55x -55x -55x -55x -55x -55x -  -65x -65x - 
import { type EventRegistry, type Middleware, type Router, type Plugin, type PluginEnrichment } from "../types.js";
-import { QueryBuilder } from "../query/builder.js";
-import { EventEmitter } from "../events/emitter.js";
-import { createAPI } from "../api/factory/index.js";
-import { type TypedAPIInstance } from "../api/types/proxy.js";
-import { type DefineContextConfig } from "./types.js";
- 
-// ============================================
-// ContextBuilder - builder for context with plugins
-// ============================================
- 
-export class ContextBuilder<
-  Ctx,
-  Events extends EventRegistry = EventRegistry,
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  Plugins extends Plugin<any>[] = []
-> {
-  private context?: Ctx;
-  private createContext?: (requestInfo?: { headers?: Record<string, string>; method?: string; url?: string }) => Ctx;
-  private plugins: Plugins;
-  private events?: Events;
- 
-  constructor(
-    context?: Ctx,
-    createContext?: (requestInfo?: { headers?: Record<string, string>; method?: string; url?: string }) => Ctx,
-    // eslint-disable-next-line @typescript-eslint/no-explicit-any
-    plugins: Plugins = [] as any,
-    events?: Events
-  ) {
-    this.context = context;
-    this.createContext = createContext;
-    this.plugins = plugins;
-    this.events = events;
-  }
- 
-  /**
-   * Add a plugin to the context builder.
-   * Returns a new ContextBuilder with the plugin added.
-   */
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  use<NewPlugin extends Plugin<any>>(plugin: NewPlugin): ContextBuilder<Ctx, Events, [...Plugins, NewPlugin]> {
-    return new ContextBuilder<Ctx, Events, [...Plugins, NewPlugin]>(
-      this.context,
-      this.createContext,
-      [...this.plugins, plugin] as [...Plugins, NewPlugin],
-      this.events
-    );
-  }
- 
-  /**
-   * Set the events registry.
-   */
-  withEvents<NewEvents extends EventRegistry>(events: NewEvents): ContextBuilder<Ctx, NewEvents, Plugins> {
-    return new ContextBuilder<Ctx, NewEvents, Plugins>(
-      this.context,
-      this.createContext,
-      this.plugins,
-      events
-    );
-  }
- 
-  /**
-   * Build the context with all plugins and their enrichments.
-   * Returns t (QueryBuilder + enrichments) and createAPI function.
-   */
-  build(): {
-    t: QueryBuilder<Ctx, Events>;
-    createAPI: (apiConfig: { router: Router<Ctx>; middleware?: Middleware<Ctx>[]; context?: Ctx }) => TypedAPIInstance<Ctx, Router<Ctx>>;
-  } {
-    const eventEmitter = this.events ? new EventEmitter<Events>(this.events) : undefined;
-    const initialContext = this.createContext ? this.createContext() : this.context;
- 
-    /* eslint-disable @typescript-eslint/no-explicit-any */
-    const t = new QueryBuilder<Ctx, Events>(initialContext as Ctx, eventEmitter as any) as any;
-    /* eslint-enable @typescript-eslint/no-explicit-any */
- 
-    // Apply plugin enrichments to t
-    for (const plugin of this.plugins) {
-      if (plugin.procedures) {
-        const enrichment = plugin.procedures();
-        for (const namespace of Object.keys(enrichment)) {
-          if (!t[namespace]) {
-            (t as any)[namespace] = {};
-          }
-          const ns = (t as any)[namespace];
-          for (const methodName of Object.keys(enrichment[namespace])) {
-            ns[methodName] = enrichment[namespace][methodName];
-          }
-        }
-      }
-    }
- 
-    // Use initialContext (enriched by plugins) by default, or user-provided context
-    const createAPIFn = (apiConfig: { router: Router<Ctx>; middleware?: Middleware<Ctx>[]; context?: Ctx }) => {
-      return createAPI({
-        router: apiConfig.router,
-        context: apiConfig.context ?? initialContext,
-        plugins: this.plugins as Plugin<Ctx>[],
-        middleware: apiConfig.middleware,
-        eventEmitter,
-      });
-    };
- 
-    return { t, createAPI: createAPIFn };
-  }
-}
- 
-// ============================================
-// createContextBuilder - factory function
-// ============================================
- 
-export function createContextBuilder<Ctx>(): ContextBuilder<Ctx> {
-  return new ContextBuilder<Ctx>();
-}
- 
-// ============================================
-// defineContext - backward compatible function API
-// ============================================
- 
-export function defineContext<
-  Ctx,
-  Events extends EventRegistry = EventRegistry
->(
-  config: DefineContextConfig<Ctx, Events>
-): {
-  t: QueryBuilder<Ctx, Events>;
-  createAPI: (apiConfig: { router: Router<Ctx>; middleware?: Middleware<Ctx>[] }) => TypedAPIInstance<Ctx, Router<Ctx>>;
-} {
-  const { context, createContext, plugins = [], events } = config;
- 
-  const eventEmitter = events ? new EventEmitter<Events>(events) : undefined;
- 
-  const initialContext = createContext ? createContext() : context;
- 
-  /* eslint-disable @typescript-eslint/no-explicit-any */
-  const t = new QueryBuilder<Ctx, Events>(initialContext as Ctx, eventEmitter as any);
-  /* eslint-enable @typescript-eslint/no-explicit-any */
- 
-  const createAPIFn = (apiConfig: { router: Router<Ctx>; middleware?: Middleware<Ctx>[] }) => {
-    return createAPI({
-      router: apiConfig.router,
-      context,
-      createContext,
-      plugins,
-      middleware: apiConfig.middleware,
-      eventEmitter,
-    });
-  };
- 
-  return { t, createAPI: createAPIFn };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/context/index.html b/packages/server/coverage/src/context/index.html deleted file mode 100644 index 6b46204..0000000 --- a/packages/server/coverage/src/context/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/context - - - - - - - - - -
-
-

All files src/context

-
- -
- 100% - Statements - 88/88 -
- - -
- 89.47% - Branches - 17/19 -
- - -
- 100% - Functions - 10/10 -
- - -
- 100% - Lines - 88/88 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
builder.ts -
-
100%87/8788.88%16/18100%9/9100%87/87
index.ts -
-
100%1/1100%0/0100%0/0100%1/1
types.ts -
-
0%0/00%1/10%1/10%0/0
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/context/index.ts.html b/packages/server/coverage/src/context/index.ts.html deleted file mode 100644 index 2723270..0000000 --- a/packages/server/coverage/src/context/index.ts.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - Code coverage report for src/context/index.ts - - - - - - - - - -
-
-

All files / src/context index.ts

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -41x -  -  - 
export type { DefineContextConfig } from "./types.js";
-export { defineContext, ContextBuilder, createContextBuilder } from "./builder.js";
-export type { PluginEnrichment } from "../types.js";
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/context/types.ts.html b/packages/server/coverage/src/context/types.ts.html deleted file mode 100644 index ecd0ad6..0000000 --- a/packages/server/coverage/src/context/types.ts.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - Code coverage report for src/context/types.ts - - - - - - - - - -
-
-

All files / src/context types.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { type EventRegistry } from "../types.js";
-import { type RequestInfo } from "../api/types/api.js";
-import  { type Plugin } from "../types.js";
- 
-export interface DefineContextConfig<Ctx, Events extends EventRegistry = EventRegistry> {
-  context?: Ctx;
-  /**
-   * Factory function to create context per request.
-   * Receives optional RequestInfo (headers, method, url) for per-request context enrichment.
-   * Use this for extracting auth user from headers, request-specific data, etc.
-   */
-  createContext?: (requestInfo?: RequestInfo) => Ctx;
-  plugins?: Plugin<Ctx>[];
-  events?: Events;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/errors/index.html b/packages/server/coverage/src/errors/index.html deleted file mode 100644 index f113f8e..0000000 --- a/packages/server/coverage/src/errors/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/errors - - - - - - - - - -
-
-

All files src/errors

-
- -
- 59.75% - Statements - 49/82 -
- - -
- 100% - Branches - 1/1 -
- - -
- 7.69% - Functions - 1/13 -
- - -
- 59.75% - Lines - 49/82 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
index.ts -
-
100%1/1100%0/0100%0/0100%1/1
server-error.ts -
-
59.25%48/81100%0/00%0/1259.25%48/81
types.ts -
-
0%0/00%1/10%1/10%0/0
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/errors/index.ts.html b/packages/server/coverage/src/errors/index.ts.html deleted file mode 100644 index 9cd687a..0000000 --- a/packages/server/coverage/src/errors/index.ts.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Code coverage report for src/errors/index.ts - - - - - - - - - -
-
-

All files / src/errors index.ts

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -111x -  -  -  -  -  -  -  -  -  - 
export type { ServerError } from "./types.js";
-export {
-  ok,
-  err,
-  ServerException,
-  NotFoundException,
-  UnauthorizedException,
-  ValidationException,
-  ErrorCodes,
-  createErrorResult,
-} from "./server-error.js";
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/errors/server-error.ts.html b/packages/server/coverage/src/errors/server-error.ts.html deleted file mode 100644 index 5001b00..0000000 --- a/packages/server/coverage/src/errors/server-error.ts.html +++ /dev/null @@ -1,394 +0,0 @@ - - - - - - Code coverage report for src/errors/server-error.ts - - - - - - - - - -
-
-

All files / src/errors server-error.ts

-
- -
- 59.25% - Statements - 48/81 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/12 -
- - -
- 59.25% - Lines - 48/81 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -1041x -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -  -  -  -1x -  -1x -1x -  -  -  -1x -  -1x -1x -  -  -  -1x -  -  -  -  -  -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -  -  -  -  -  -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -1x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  - 
import { error as errorFn, err as errFn } from "@deessejs/fp";
-import  { type Error } from "@deessejs/fp";
-import  { type Result } from "@deessejs/fp";
- 
-export { ok, err } from "@deessejs/fp";
- 
-export class ServerException extends Error {
-  public readonly code: string;
-  public readonly statusCode: number;
-  public readonly args: Readonly<{ message: string; data?: Record<string, unknown> }>;
- 
-  constructor(code: string, message: string, statusCode = 500, data?: Record<string, unknown>) {
-    const errData = createError(code, { message, data } as { message: string; data?: Record<string, unknown> });
-    super(message);
-    this.name = "ServerException";
-    this.code = code;
-    this.statusCode = statusCode;
-    this.stack = errData.stack;
-    this.cause = errData.cause;
-    this.args = errData.args as Readonly<{ message: string; data?: Record<string, unknown> }>;
-  }
-}
- 
-export class NotFoundException extends ServerException {
-  constructor(message = "Resource not found") {
-    super("NOT_FOUND", message, 404);
-    this.name = "NotFoundException";
-  }
-}
- 
-export class UnauthorizedException extends ServerException {
-  constructor(message = "Unauthorized") {
-    super("UNAUTHORIZED", message, 401);
-    this.name = "UnauthorizedException";
-  }
-}
- 
-export class ValidationException extends ServerException {
-  constructor(message: string) {
-    super("VALIDATION_ERROR", message, 400);
-    this.name = "ValidationException";
-  }
-}
- 
-// ============================================
-// Error Codes
-// ============================================
- 
-export const ErrorCodes = {
-  NOT_FOUND: "NOT_FOUND",
-  UNAUTHORIZED: "UNAUTHORIZED",
-  VALIDATION_ERROR: "VALIDATION_ERROR",
-  FORBIDDEN: "FORBIDDEN",
-  CONFLICT: "CONFLICT",
-  INTERNAL_ERROR: "INTERNAL_ERROR",
-  ROUTE_NOT_FOUND: "ROUTE_NOT_FOUND",
-  INVALID_ARGS: "INVALID_ARGS",
-} as const;
- 
-// ============================================
-// Error Builder Helper
-// ============================================
- 
-const ERROR_BUILDERS = {
-  NOT_FOUND: errorFn({
-    name: "NOT_FOUND",
-    message: (args: { message: string }) => args.message,
-  }),
-  FORBIDDEN: errorFn({
-    name: "FORBIDDEN",
-    message: (args: { message: string }) => args.message,
-  }),
-  CONFLICT: errorFn({
-    name: "CONFLICT",
-    message: (args: { message: string }) => args.message,
-  }),
-  INTERNAL_ERROR: errorFn({
-    name: "INTERNAL_ERROR",
-    message: (args: { message: string }) => args.message,
-  }),
-  ROUTE_NOT_FOUND: errorFn({
-    name: "ROUTE_NOT_FOUND",
-    message: (args: { message: string }) => args.message,
-  }),
-  VALIDATION_ERROR: errorFn({
-    name: "VALIDATION_ERROR",
-    message: (args: { message: string }) => args.message,
-  }),
-} as const;
- 
-function createError(name: string, args: { message: string; data?: Record<string, unknown> }): Error {
-  const builder = ERROR_BUILDERS[name as keyof typeof ERROR_BUILDERS];
-  if (builder) {
-    return builder(args) as Error;
-  }
-  return errorFn({ name, message: (a: { message: string }) => a.message })(args) as Error;
-}
- 
-// Helper to create error result properly typed
-export function createErrorResult(code: string, message: string, data?: Record<string, unknown>): Result<never> {
-  const err = createError(code, { message, data } as { message: string; data?: Record<string, unknown> });
-  return errFn(err);
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/errors/types.ts.html b/packages/server/coverage/src/errors/types.ts.html deleted file mode 100644 index c06e90e..0000000 --- a/packages/server/coverage/src/errors/types.ts.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - Code coverage report for src/errors/types.ts - - - - - - - - - -
-
-

All files / src/errors types.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5  -  -  -  - 
export interface ServerError {
-  code: string;
-  message: string;
-  data?: Record<string, unknown>;
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/events/dsl.ts.html b/packages/server/coverage/src/events/dsl.ts.html deleted file mode 100644 index cfc2068..0000000 --- a/packages/server/coverage/src/events/dsl.ts.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - Code coverage report for src/events/dsl.ts - - - - - - - - - -
-
-

All files / src/events dsl.ts

-
- -
- 100% - Statements - 10/10 -
- - -
- 100% - Branches - 2/2 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 10/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -691x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -6x -6x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -1x -1x -  -1x -1x -  -  -  -  -1x - 
/**
- * Event DSL (Domain-Specific Language)
- *
- * This module provides a fluent API for defining events with better type safety
- * and namespace support.
- */
- 
-import { z } from "zod";
-import { __deesseEventBrand } from "./emitter.js";
- 
-/**
- * Event definition interface
- */
-export interface EventDefinition {
-  data?: unknown;
-  response?: unknown;
-  [__deesseEventBrand]: true;
-}
- 
-/**
- * Wraps event args in the standard event structure.
- *
- * @example
- * const eventDef = event({ args: z.object({ id: z.number(), name: z.string() }) });
- * // Returns: { data: z.object({ id: z.number(), name: z.string() }), [__deesseEventBrand]: true }
- */
-export function event({ args }: { args: z.ZodType }): EventDefinition {
-  return { data: args, [__deesseEventBrand]: true };
-}
- 
-/**
- * Event namespace helper type - represents an event with data
- */
-export interface EventWithData<T = unknown> {
-  data: T;
-}
- 
-/**
- * Groups events under a namespace without prefixing the keys.
- * The outer key in defineEvents provides the namespace context.
- *
- * @example
- * defineEvents({
- *   user: eventNamespace({ name: "user", events: {
- *     created: event({ args: { id: number } }),
- *     updated: event({ args: { id: number, changes: Record<string, unknown> } }),
- *   }),
- *   email: eventNamespace({ name: "email", events: {
- *     sent: event({ args: { to: string, template: string, subject: string } }),
- *   }),
- * });
- *
- * This produces an event registry with nested access: events.user.created
- */
-export function eventNamespace<
-  N extends string,
-  Events extends Record<string, EventDefinition>
->(
-  config: { name: N; events: Events }
-): Events {
-  // Simply return the events object - the outer key provides namespace context
-  return config.events;
-}
- 
-/**
- * @deprecated Use eventNamespace instead
- */
-export const eventsNamespace = eventNamespace;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/events/emitter.ts.html b/packages/server/coverage/src/events/emitter.ts.html deleted file mode 100644 index 5f0d2be..0000000 --- a/packages/server/coverage/src/events/emitter.ts.html +++ /dev/null @@ -1,991 +0,0 @@ - - - - - - Code coverage report for src/events/emitter.ts - - - - - - - - - -
-
-

All files / src/events emitter.ts

-
- -
- 86.5% - Statements - 173/200 -
- - -
- 76.78% - Branches - 43/56 -
- - -
- 94.44% - Functions - 17/18 -
- - -
- 86.5% - Lines - 173/200 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -3031x -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -10x -  -  -  -  -10x -6x -6x -  -  -  -10x -  -  -  -4x -4x -  -1x -54x -54x -  -  -54x -  -54x -54x -  -54x -47x -47x -47x -47x -47x -40x -  -40x -3x -3x -3x -3x -3x -3x -3x -3x -40x -  -47x -  -  -  -47x -5x -5x -47x -  -54x -7x -7x -7x -7x -7x -7x -  -7x -  -  -  -7x -4x -4x -4x -7x -7x -  -54x -4x -  -  -4x -  -  -  -  -  -  -  -  -4x -  -  -  -  -  -  -54x -60x -60x -60x -60x -60x -60x -60x -  -  -60x -60x -39x -46x -46x -39x -60x -11x -11x -  -  -60x -60x -60x -60x -60x -60x -  -60x -60x -  -  -  -  -60x -  -54x -56x -56x -56x -2x -2x -56x -3x -3x -3x -3x -56x -  -46x -60x -  -54x -13x -13x -  -54x -1x -1x -  -54x -60x -  -60x -60x -  -60x -60x -  -54x -60x -60x -5x -5x -5x -5x -60x -  -54x -60x -60x -  -  -  -60x -60x -60x -54x -54x -  -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -60x -  -54x -6x -6x -  -6x -  -  -6x -6x -6x -  -  -  -  -  -  -  -6x -  -54x -6x -6x -  -6x -6x -6x -6x -6x -  -54x -  -  -  -  -  -  -  -  -  -54x -  -1x -  -3x -3x -  -  -  -  -  -  -  -  -  -  -  -1x -7x -7x -7x -7x -7x -10x -10x -  -10x -6x -10x -  -4x -4x -10x -7x -7x -  -  -  -  - 
import { type EventRegistry, type EventPayload } from "../types.js";
-import { ok, err, unit, error, type Result, type Unit } from "@deessejs/fp";
- 
-const MAX_EVENT_LOG_SIZE = 1000;
- 
-/**
- * Unique symbol to brand event definitions for type-safe detection.
- * This avoids magic number/key detection (e.g., Object.keys().length <= 2).
- * Follows docs/rules/typing-rule.md - no magic numbers/keys.
- */
-export const __deesseEventBrand = Symbol("__deesseEventBrand");
- 
-/**
- * Type guard to check if an object is a properly branded EventDefinition.
- * Also supports backward compatibility with plain event definitions that have 'data' property
- * but lack the brand symbol.
- *
- * @param value - The value to check
- * @returns True if the value is an EventDefinition with the brand symbol OR
- *          a backward-compatible event definition with 'data' property
- *
- * @example
- * if (isEventDefinition(value)) {
- *   // value is typed as EventDefinition here
- * }
- */
-export function isEventDefinition(value: unknown): value is { data?: unknown; response?: unknown } {
-  if (typeof value !== "object" || value === null) {
-    return false;
-  }
- 
-  // Primary check: brand symbol (new style)
-  if (__deesseEventBrand in value) {
-    return true;
-  }
- 
-  // Backward compatibility: plain object with 'data' property and <= 2 keys (old style)
-  // This allows existing code using { "event.name": { data: ... } } to still work
-  if ("data" in value && Object.keys(value).length <= 2) {
-    return true;
-  }
- 
-  return false;
-}
- 
-export class EventEmitter<Events extends EventRegistry = EventRegistry> {
-  private listeners: Map<string, Set<(payload: EventPayload) => void | Promise<void>>> = new Map();
-  private eventLog: EventPayload[] = [];
-  // Prefix-based index for wildcard patterns: first segment -> set of patterns
-  // E.g., "user" -> Set of patterns like "user.*"
-  private prefixIndex: Map<string, Set<string>> = new Map();
- 
-  constructor(_events?: Events) {
-  }
- 
-  on<EventName extends keyof Events>(
-    event: EventName,
-    handler: (payload: EventPayload<Events[EventName]["data"]>) => void | Promise<void>
-  ): () => void {
-    const eventStr = event as string;
-    if (!this.listeners.has(eventStr)) {
-      this.listeners.set(eventStr, new Set());
-      // Index wildcard patterns by their first segment
-      if (eventStr.endsWith(".*")) {
-        const firstSegment = eventStr.split(".")[0];
-        if (firstSegment && firstSegment !== "*") {
-          if (!this.prefixIndex.has(firstSegment)) {
-            this.prefixIndex.set(firstSegment, new Set());
-          }
-          this.prefixIndex.get(firstSegment)!.add(eventStr);
-        }
-      }
-    }
-    /* eslint-disable @typescript-eslint/no-explicit-any */
-    this.listeners.get(eventStr)!.add(handler as any);
-    /* eslint-enable @typescript-eslint/no-explicit-any */
- 
-    // Return unsubscribe function
-    return () => {
-      this.off(event, handler);
-    };
-  }
- 
-  off<EventName extends keyof Events>(
-    event: EventName,
-    handler: (payload: EventPayload<Events[EventName]["data"]>) => void | Promise<void>
-  ): void {
-    const eventStr = event as string;
-    const handlers = this.listeners.get(eventStr);
-    if (handlers) {
-      /* eslint-disable @typescript-eslint/no-explicit-any */
-      handlers.delete(handler as any);
-      /* eslint-enable @typescript-eslint/no-explicit-any */
- 
-      // If no more handlers for this pattern, remove from index
-      if (handlers.size === 0) {
-        this.listeners.delete(eventStr);
-        this.removePatternFromIndex(eventStr);
-      }
-    }
-  }
- 
-  private removePatternFromIndex(eventStr: string): void {
-    if (!eventStr.endsWith(".*")) return;
- 
-    const firstSegment = eventStr.split(".")[0];
-    if (!firstSegment || firstSegment === "*") return;
- 
-    const prefixSet = this.prefixIndex.get(firstSegment);
-    if (!prefixSet) return;
- 
-    prefixSet.delete(eventStr);
-    if (prefixSet.size === 0) {
-      this.prefixIndex.delete(firstSegment);
-    }
-  }
- 
-  async emit<EventName extends keyof Events>(
-    event: EventName,
-    data: Events[EventName]["data"]
-  ): Promise<Result<Unit>>;
-  async emit(event: string, data: unknown, namespace?: string): Promise<Result<Unit>>;
-  async emit(
-    event: keyof Events | string,
-    data: unknown,
-    namespace?: string
-  ): Promise<Result<Unit>> {
-    const eventName = event as string;
-    const handlers = this.listeners.get(eventName);
-    const wildcardHandlers = this.getWildcardHandlers(eventName);
- 
-    // Merge regular and wildcard handlers
-    const allHandlers = new Set<((payload: EventPayload) => void | Promise<void>)>();
-    if (handlers) {
-      for (const handler of handlers) {
-        allHandlers.add(handler);
-      }
-    }
-    for (const handler of wildcardHandlers) {
-      allHandlers.add(handler);
-    }
- 
-    // Always log the event, even if there are no handlers
-    const payload: EventPayload = {
-      name: eventName,
-      data,
-      timestamp: new Date().toISOString(),
-      namespace: namespace ?? "default",
-    };
- 
-    this.eventLog.push(payload);
-    if (this.eventLog.length > MAX_EVENT_LOG_SIZE) {
-      this.eventLog.shift();
-    }
- 
-    // If no handlers, we're done
-    if (allHandlers.size === 0) return ok(unit);
- 
-    for (const handler of allHandlers) {
-      try {
-        const result = handler(payload);
-        if (result instanceof Promise) {
-          await result;
-        }
-      } catch (error_) {
-        const errMsg = error_ instanceof Error ? error_.message : String(error_);
-        const fpErr = error({ name: "INTERNAL_ERROR", message: (_: unknown) => errMsg })({ message: errMsg });
-        return err(fpErr);
-      }
-    }
- 
-    return ok(unit);
-  }
- 
-  getEventLog(): EventPayload[] {
-    return [...this.eventLog];
-  }
- 
-  clearEventLog(): void {
-    this.eventLog = [];
-  }
- 
-  private getWildcardHandlers(eventName: string): Set<(payload: EventPayload) => void | Promise<void>> {
-    const handlers = new Set<(payload: EventPayload) => void | Promise<void>>();
- 
-    this.addGlobalWildcardHandlers(handlers);
-    this.addMatchingWildcardHandlers(handlers, eventName);
- 
-    return handlers;
-  }
- 
-  private addGlobalWildcardHandlers(handlers: Set<(payload: EventPayload) => void | Promise<void>>): void {
-    const globalHandlers = this.listeners.get("*");
-    if (globalHandlers) {
-      for (const handler of globalHandlers) {
-        handlers.add(handler);
-      }
-    }
-  }
- 
-  private addMatchingWildcardHandlers(handlers: Set<(payload: EventPayload) => void | Promise<void>>, eventName: string): void {
-    const eventParts = eventName.split(".");
-    if (eventParts.length === 0) {
-      return;
-    }
- 
-    const firstSegment = eventParts[0];
-    const candidatePatterns = this.prefixIndex.get(firstSegment);
-    if (!candidatePatterns) {
-      return;
-    }
- 
-    for (const pattern of candidatePatterns) {
-      if (this.isWildcardMatch(eventName, pattern)) {
-        const wildcardHandlers = this.listeners.get(pattern);
-        if (wildcardHandlers) {
-          for (const handler of wildcardHandlers) {
-            handlers.add(handler);
-          }
-        }
-      }
-    }
-  }
- 
-  private isWildcardMatch(eventName: string, pattern: string): boolean {
-    if (pattern === "*") return true;
-    if (pattern === eventName) return true;
- 
-    const eventParts = eventName.split(".");
- 
-    // Check if pattern ends with ".*" (suffix wildcard)
-    if (pattern.endsWith(".*")) {
-      return this.matchPrefix(eventParts, pattern.slice(0, -2));
-    }
- 
-    // Check if pattern starts with "*." (leading wildcard)
-    if (pattern.startsWith("*.")) {
-      return this.matchSuffix(eventParts, pattern.slice(2));
-    }
- 
-    return false;
-  }
- 
-  private matchPrefix(eventParts: string[], prefix: string): boolean {
-    const prefixParts = prefix.split(".");
-    if (eventParts.length < prefixParts.length) return false;
- 
-    for (let i = 0; i < prefixParts.length; i++) {
-      if (prefixParts[i] !== eventParts[i]) return false;
-    }
-    return true;
-  }
- 
-  private matchSuffix(eventParts: string[], suffix: string): boolean {
-    const suffixParts = suffix.split(".");
-    if (eventParts.length < suffixParts.length) return false;
- 
-    const offset = eventParts.length - suffixParts.length;
-    for (let i = 0; i < suffixParts.length; i++) {
-      if (suffixParts[i] !== eventParts[offset + i]) return false;
-    }
-    return true;
-  }
-}
- 
-export function defineEvents(events: Record<string, unknown>): EventRegistry {
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  return flattenEvents(events as any);
-}
- 
-/**
- * Flattens a nested event object into a flat EventRegistry.
- * { user: { created: { data: T } } } => { "user.created": { data: T } }
- *
- * Uses __deesseEventBrand symbol for type-safe detection instead of
- * magic key counts (Object.keys().length <= 2).
- *
- * This is used internally to support the namespace DSL while
- * maintaining backward compatibility with nested object access.
- */
-export function flattenEvents<Events extends EventRegistry>(
-  events: Events,
-  prefix: string = ""
-): EventRegistry {
-  const result: EventRegistry = {};
-  for (const key of Object.keys(events)) {
-    const fullKey = prefix ? `${prefix}.${key}` : key;
-    const value = events[key] as unknown;
-    // Use type guard instead of magic key count detection
-    if (isEventDefinition(value)) {
-      result[fullKey] = value;
-    } else if (value && typeof value === "object") {
-      // This is a namespace (nested object), recurse into it
-      Object.assign(result, flattenEvents(value as EventRegistry, fullKey));
-    }
-  }
-  return result;
-}
- 
-export type EventHandler<Events extends EventRegistry, EventName extends keyof Events> = (
-  event: { name: EventName; data: Events[EventName]["data"] }
-) => void | Promise<void>;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/events/index.html b/packages/server/coverage/src/events/index.html deleted file mode 100644 index fb6e3b1..0000000 --- a/packages/server/coverage/src/events/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/events - - - - - - - - - -
-
-

All files src/events

-
- -
- 87.83% - Statements - 231/263 -
- - -
- 81.33% - Branches - 61/75 -
- - -
- 93.1% - Functions - 27/29 -
- - -
- 87.83% - Lines - 231/263 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
dsl.ts -
-
100%10/10100%2/2100%2/2100%10/10
emitter.ts -
-
86.5%173/20076.78%43/5694.44%17/1886.5%173/200
index.ts -
-
100%1/1100%0/0100%0/0100%1/1
queue.ts -
-
90.38%47/5293.75%15/1687.5%7/890.38%47/52
types.ts -
-
0%0/00%1/10%1/10%0/0
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/events/index.ts.html b/packages/server/coverage/src/events/index.ts.html deleted file mode 100644 index bec43c1..0000000 --- a/packages/server/coverage/src/events/index.ts.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - Code coverage report for src/events/index.ts - - - - - - - - - -
-
-

All files / src/events index.ts

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -61x -  -  -  -  - 
export type { EventPayload } from "./types.js";
-export { EventEmitter, defineEvents, flattenEvents, isEventDefinition, __deesseEventBrand } from "./emitter.js";
-export type { EventHandler } from "./emitter.js";
-export { event, eventNamespace, eventsNamespace } from "./dsl.js";
-export type { PendingEventQueue } from "./queue.js";
-export { createPendingEventQueue } from "./queue.js";
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/events/queue.ts.html b/packages/server/coverage/src/events/queue.ts.html deleted file mode 100644 index 8e20bc2..0000000 --- a/packages/server/coverage/src/events/queue.ts.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - Code coverage report for src/events/queue.ts - - - - - - - - - -
-
-

All files / src/events queue.ts

-
- -
- 90.38% - Statements - 47/52 -
- - -
- 93.75% - Branches - 15/16 -
- - -
- 87.5% - Functions - 7/8 -
- - -
- 90.38% - Lines - 47/52 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -741x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -78x -  -78x -78x -25x -25x -25x -25x -25x -25x -25x -25x -25x -  -78x -45x -31x -31x -31x -14x -14x -21x -17x -17x -1x -1x -1x -16x -16x -13x -13x -21x -  -  -  -  -  -45x -  -78x -1x -1x -  -78x -4x -4x -  -78x -1x -1x -  -78x -3x -3x -78x -78x
import { type PendingEvent } from "../types.js";
-import { type EventEmitter } from "./emitter.js";
-import  { type Result, type Unit } from "@deessejs/fp";
-import { ok, err, unit, error } from "@deessejs/fp";
- 
-export interface PendingEventQueue {
-  enqueue(event: PendingEvent): Result<{ eventName: string; data: unknown; processed: boolean; timestamp: string; namespace: string }>;
-  flush(emitter: EventEmitter | undefined): Promise<Result<Unit>>;
-  clear(): void;
-  isEmpty(): boolean;
-  events(): PendingEvent[];
-  size(): number;
-}
- 
-// Type alias for queue instances
-export type EventQueue = PendingEventQueue;
- 
-export const createPendingEventQueue = (): PendingEventQueue => {
-  let _events: PendingEvent[] = [];
- 
-  return {
-    enqueue: (event: PendingEvent) => {
-      _events.push(event);
-      return ok({
-        eventName: event.name,
-        data: event.data,
-        processed: true,
-        timestamp: event.timestamp,
-        namespace: event.namespace,
-      });
-    },
- 
-    flush: async (emitter: EventEmitter | undefined): Promise<Result<Unit>> => {
-      if (!emitter || _events.length === 0) {
-        _events = [];
-        return ok(unit);
-      }
-      let processedCount = 0;
-      try {
-        for (const event of _events) {
-          const result = await emitter.emit(event.name, event.data, event.namespace);
-          if (!result.ok) {
-            _events = _events.slice(processedCount);
-            return result;
-          }
-          processedCount++;
-        }
-        _events = [];
-        return ok(unit);
-      } catch (error_) {
-        _events = _events.slice(processedCount);
-        const errMsg = error_ instanceof Error ? error_.message : String(error_);
-        const fpErr = error({ name: "INTERNAL_ERROR", message: (_: unknown) => errMsg })({ message: errMsg });
-        return err(fpErr);
-      }
-    },
- 
-    clear: (): void => {
-      _events = [];
-    },
- 
-    isEmpty: (): boolean => {
-      return _events.length === 0;
-    },
- 
-    events: (): PendingEvent[] => {
-      return [..._events];
-    },
- 
-    size: (): number => {
-      return _events.length;
-    },
-  };
-};
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/events/types.ts.html b/packages/server/coverage/src/events/types.ts.html deleted file mode 100644 index b283ec5..0000000 --- a/packages/server/coverage/src/events/types.ts.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for src/events/types.ts - - - - - - - - - -
-
-

All files / src/events types.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export type { EventRegistry, EventPayload } from "../types.js";
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/hooks/executor.ts.html b/packages/server/coverage/src/hooks/executor.ts.html deleted file mode 100644 index bc437e6..0000000 --- a/packages/server/coverage/src/hooks/executor.ts.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - Code coverage report for src/hooks/executor.ts - - - - - - - - - -
-
-

All files / src/hooks executor.ts

-
- -
- 100% - Statements - 28/28 -
- - -
- 100% - Branches - 4/4 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 28/28 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37  -  -  -  -2x -2x -2x -2x -2x -2x -  -2x -2x -2x -  -  -2x -1x -1x -1x -1x -1x -1x -1x -1x -2x -  -3x -3x -3x -3x -3x -3x -2x -2x -3x - 
import  { type Result } from "@deessejs/fp";
-import  { type BeforeInvokeHook } from "../types.js";
-import  { type Hooks } from "./types.js";
- 
-export async function executeHooks<Ctx, Args, Output>(
-  hooks: Hooks<Ctx, Args, Output>,
-  ctx: Ctx,
-  args: Args,
-  result: Result<Output>
-): Promise<void> {
-  // Call afterInvoke first (always runs)
-  if (hooks.afterInvoke) {
-    await hooks.afterInvoke(ctx, args, result);
-  }
- 
-  // Then call onSuccess or onError based on result
-  if (result.ok) {
-    if (hooks.onSuccess) {
-      await hooks.onSuccess(ctx, args, result.value);
-    }
-  } else {
-    if (hooks.onError) {
-      await hooks.onError(ctx, args, result.error);
-    }
-  }
-}
- 
-export async function executeBeforeInvoke<Ctx, Args>(
-  hook: BeforeInvokeHook<Ctx, Args> | undefined,
-  ctx: Ctx,
-  args: Args
-): Promise<void> {
-  if (hook) {
-    await hook(ctx, args);
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/hooks/index.html b/packages/server/coverage/src/hooks/index.html deleted file mode 100644 index 079a5ea..0000000 --- a/packages/server/coverage/src/hooks/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/hooks - - - - - - - - - -
-
-

All files src/hooks

-
- -
- 100% - Statements - 29/29 -
- - -
- 100% - Branches - 5/5 -
- - -
- 100% - Functions - 3/3 -
- - -
- 100% - Lines - 29/29 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
executor.ts -
-
100%28/28100%4/4100%2/2100%28/28
index.ts -
-
100%1/1100%0/0100%0/0100%1/1
types.ts -
-
0%0/00%1/10%1/10%0/0
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/hooks/index.ts.html b/packages/server/coverage/src/hooks/index.ts.html deleted file mode 100644 index 9ef88e7..0000000 --- a/packages/server/coverage/src/hooks/index.ts.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for src/hooks/index.ts - - - - - - - - - -
-
-

All files / src/hooks index.ts

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -21x - 
export type { Hooks } from "./types.js";
-export { executeHooks, executeBeforeInvoke } from "./executor.js";
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/hooks/types.ts.html b/packages/server/coverage/src/hooks/types.ts.html deleted file mode 100644 index 7c8790c..0000000 --- a/packages/server/coverage/src/hooks/types.ts.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - Code coverage report for src/hooks/types.ts - - - - - - - - - -
-
-

All files / src/hooks types.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10  -  -  -  -  -  -  -  -  - 
import  { type BeforeInvokeHook } from "../types.js";
- 
-export interface Hooks<Ctx, Args, Output> {
-  beforeInvoke?: BeforeInvokeHook<Ctx, Args>;
-  afterInvoke?: import("../types.js").AfterInvokeHook<Ctx, Args, Output>;
-  onSuccess?: import("../types.js").OnSuccessHook<Ctx, Args, Output>;
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  onError?: import("../types.js").OnErrorHook<Ctx, Args, any>;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/index.html b/packages/server/coverage/src/index.html deleted file mode 100644 index 24749cf..0000000 --- a/packages/server/coverage/src/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src - - - - - - - - - -
-
-

All files src

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 1/1 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
index.ts -
-
100%1/1100%0/0100%0/0100%1/1
types.ts -
-
0%0/00%1/10%1/10%0/0
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/index.ts.html b/packages/server/coverage/src/index.ts.html deleted file mode 100644 index da0be4a..0000000 --- a/packages/server/coverage/src/index.ts.html +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - Code coverage report for src/index.ts - - - - - - - - - -
-
-

All files / src index.ts

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -731x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
// ============================================
-// Main Exports
-// ============================================
- 
-// Core functions
-export { defineContext } from "./context/index.js";
-export { createAPI, createPublicAPI } from "./api/index.js";
-export { QueryBuilder } from "./query/index.js";
- 
-// Re-export types from @deessejs/fp
-export type { Result } from "@deessejs/fp";
- 
-// Types from types.ts
-export type {
-  Query,
-  Mutation,
-  InternalQuery,
-  InternalMutation,
-  Procedure,
-  Router,
-  Middleware,
-  Plugin,
-  BeforeInvokeHook,
-  AfterInvokeHook,
-  OnSuccessHook,
-  OnErrorHook,
-  EventRegistry,
-  EventPayload,
-  SendOptions,
-  PendingEvent,
-} from "./types.js";
- 
-// Events
-export { EventEmitter, defineEvents } from "./events/index.js";
-export type { EventHandler } from "./events/index.js";
-export { event, eventNamespace, eventsNamespace } from "./events/index.js";
- 
-// Router helpers
-export {
-  isRouter,
-  isProcedure,
-  resolvePath,
-  flattenRouter,
-  getPublicRoutes,
-  getInternalRoutes,
-} from "./router/index.js";
-export type { RouterConfig, ValidationResult } from "./router/index.js";
- 
-// Hooks
-export { executeHooks, executeBeforeInvoke } from "./hooks/index.js";
- 
-// Procedures
-export {
-  withMetadata,
-  type Metadata,
-} from "./procedure/index.js";
- 
-// Middleware
-export { createMiddleware } from "./middleware/builder.js";
-export { withQuery, withMutation } from "./middleware/helpers.js";
- 
-// Also re-export the individual config types from their modules for convenience
-export type { QueryConfig } from "./query/types.js";
-export type { MutationConfig } from "./mutation/types.js";
-export type { InternalQueryConfig } from "./internal-query/types.js";
-export type { InternalMutationConfig } from "./internal-mutation/types.js";
- 
-// API types
-export type { RequestInfo } from "./api/types/api.js";
- 
-// Errors
-export { ok, err, ServerException, NotFoundException, UnauthorizedException, ValidationException, ErrorCodes, createErrorResult } from "./errors/index.js";
-export type { ServerError } from "./errors/index.js";
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/internal-mutation/builder.ts.html b/packages/server/coverage/src/internal-mutation/builder.ts.html deleted file mode 100644 index 5f12e0e..0000000 --- a/packages/server/coverage/src/internal-mutation/builder.ts.html +++ /dev/null @@ -1,538 +0,0 @@ - - - - - - Code coverage report for src/internal-mutation/builder.ts - - - - - - - - - -
-
-

All files / src/internal-mutation builder.ts

-
- -
- 57.3% - Statements - 51/89 -
- - -
- 100% - Branches - 7/7 -
- - -
- 58.33% - Functions - 7/12 -
- - -
- 57.3% - Lines - 51/89 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -11x -11x -11x -11x -11x -  -11x -  -11x -11x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -11x -  -  -  -  -11x -11x -11x -11x -11x -11x -11x -11x -  -11x -2x -2x -2x -  -11x -2x -2x -2x -  -11x -2x -2x -2x -  -11x -2x -2x -2x -  -11x -2x -2x -2x -2x -2x -2x -2x -  -2x -  -  -  -  -2x -  -  -  -  -2x -  -  -  -  -2x -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -2x -  -11x -11x -  - 
import  { type ZodType } from "zod";
-import  { type Result } from "@deessejs/fp";
-import  { type InternalMutation, type Middleware } from "../types.js";
-import  { type InternalMutationConfig } from "./types.js";
-import  {
-  type BeforeInvokeHook,
-  type AfterInvokeHook,
-  type OnSuccessHook,
-  type OnErrorHook,
-} from "../types.js";
- 
-export type InternalMutationWithHooks<Ctx, Args, Output> = InternalMutation<Ctx, Args, Output> &
-  HookedProcedureMixin<Ctx, Args, Output>;
- 
-export function createInternalMutationWithHooks<Ctx, Args, Output>(
-  config: InternalMutationConfig<Ctx, Args, Output>
-): InternalMutationWithHooks<Ctx, Args, Output> {
-  return createHookedProcedure({
-    type: "internalMutation",
-    argsSchema: config.args,
-    /* eslint-disable @typescript-eslint/no-explicit-any */
-    handler: config.handler as any,
-    /* eslint-enable @typescript-eslint/no-explicit-any */
-  }) as InternalMutationWithHooks<Ctx, Args, Output>;
-}
- 
-/* eslint-disable @typescript-eslint/no-explicit-any */
-interface HookedProcedureMixin<Ctx, Args, Output> {
-  type: "query" | "mutation" | "internalQuery" | "internalMutation";
-  beforeInvoke(hook: BeforeInvokeHook<Ctx, Args>): this;
-  afterInvoke(hook: AfterInvokeHook<Ctx, Args, Output>): this;
-  onSuccess(hook: OnSuccessHook<Ctx, Args, Output>): this;
-  onError(hook: OnErrorHook<Ctx, Args, any>): this;
-  use(middleware: Middleware<Ctx>): this;
-  _hooks: {
-    beforeInvoke?: BeforeInvokeHook<Ctx, Args>;
-    afterInvoke?: AfterInvokeHook<Ctx, Args, Output>;
-    onSuccess?: OnSuccessHook<Ctx, Args, Output>;
-    onError?: OnErrorHook<Ctx, Args, any>;
-  };
-  _middleware: Middleware<Ctx>[];
-}
- 
-interface BaseProc<Ctx, Args, Output> {
-  type: "query" | "mutation" | "internalQuery" | "internalMutation";
-  argsSchema?: ZodType<Args>;
-  handler: (ctx: Ctx, args: Args) => Promise<Result<Output>>;
-}
- 
-function createHookedProcedure<
-  Ctx,
-  Args,
-  Output,
-  Proc extends BaseProc<Ctx, Args, Output>,
->(proc: Proc): Proc & HookedProcedureMixin<Ctx, Args, Output> {
-  const hookedProc: any = {
-    type: proc.type,
-    argsSchema: proc.argsSchema,
-    handler: proc.handler,
-    _hooks: {},
-    _middleware: [],
-  };
- 
-  hookedProc.beforeInvoke = function(hook: BeforeInvokeHook<Ctx, Args>) {
-    hookedProc._hooks.beforeInvoke = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.afterInvoke = function(hook: AfterInvokeHook<Ctx, Args, Output>) {
-    hookedProc._hooks.afterInvoke = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.onSuccess = function(hook: OnSuccessHook<Ctx, Args, Output>) {
-    hookedProc._hooks.onSuccess = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.onError = function(hook: OnErrorHook<Ctx, Args, Output>) {
-    hookedProc._hooks.onError = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.use = function(middleware: Middleware<any>) {
-    const newProc: any = {
-      type: hookedProc.type,
-      argsSchema: hookedProc.argsSchema,
-      handler: hookedProc.handler,
-      _hooks: { ...hookedProc._hooks },
-      _middleware: [...hookedProc._middleware, middleware],
-    };
- 
-    newProc.beforeInvoke = function(hook: BeforeInvokeHook<any, any>) {
-      newProc._hooks.beforeInvoke = hook;
-      return newProc;
-    };
- 
-    newProc.afterInvoke = function(hook: AfterInvokeHook<any, any, any>) {
-      newProc._hooks.afterInvoke = hook;
-      return newProc;
-    };
- 
-    newProc.onSuccess = function(hook: OnSuccessHook<any, any, any>) {
-      newProc._hooks.onSuccess = hook;
-      return newProc;
-    };
- 
-    newProc.onError = function(hook: OnErrorHook<any, any, any>) {
-      newProc._hooks.onError = hook;
-      return newProc;
-    };
- 
-    newProc.use = function(mw: Middleware<any>) {
-      const result: any = {
-        type: newProc.type,
-        argsSchema: newProc.argsSchema,
-        handler: newProc.handler,
-        _hooks: { ...newProc._hooks },
-        _middleware: [...newProc._middleware, mw],
-      };
- 
-      result.beforeInvoke = function(hook: BeforeInvokeHook<any, any>) {
-        result._hooks.beforeInvoke = hook;
-        return result;
-      };
- 
-      result.afterInvoke = function(hook: AfterInvokeHook<any, any, any>) {
-        result._hooks.afterInvoke = hook;
-        return result;
-      };
- 
-      result.onSuccess = function(hook: OnSuccessHook<any, any, any>) {
-        result._hooks.onSuccess = hook;
-        return result;
-      };
- 
-      result.onError = function(hook: OnErrorHook<any, any, any>) {
-        result._hooks.onError = hook;
-        return result;
-      };
- 
-      result.use = newProc.use;
-      return result;
-    };
- 
-    return newProc;
-  };
- 
-  return hookedProc;
-}
-/* eslint-enable @typescript-eslint/no-explicit-any */
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/internal-mutation/index.html b/packages/server/coverage/src/internal-mutation/index.html deleted file mode 100644 index 0a91beb..0000000 --- a/packages/server/coverage/src/internal-mutation/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/internal-mutation - - - - - - - - - -
-
-

All files src/internal-mutation

-
- -
- 56.66% - Statements - 51/90 -
- - -
- 88.88% - Branches - 8/9 -
- - -
- 57.14% - Functions - 8/14 -
- - -
- 56.66% - Lines - 51/90 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
builder.ts -
-
57.3%51/89100%7/758.33%7/1257.3%51/89
index.ts -
-
0%0/10%0/10%0/10%0/1
types.ts -
-
0%0/00%1/10%1/10%0/0
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/internal-mutation/index.ts.html b/packages/server/coverage/src/internal-mutation/index.ts.html deleted file mode 100644 index ebd0ce1..0000000 --- a/packages/server/coverage/src/internal-mutation/index.ts.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for src/internal-mutation/index.ts - - - - - - - - - -
-
-

All files / src/internal-mutation index.ts

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export type { InternalMutationConfig } from "./types.js";
-export { createInternalMutationWithHooks, InternalMutationWithHooks } from "./builder.js";
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/internal-mutation/types.ts.html b/packages/server/coverage/src/internal-mutation/types.ts.html deleted file mode 100644 index b2e92d2..0000000 --- a/packages/server/coverage/src/internal-mutation/types.ts.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - Code coverage report for src/internal-mutation/types.ts - - - - - - - - - -
-
-

All files / src/internal-mutation types.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9  -  -  -  -  -  -  -  - 
import  { type ZodType } from "zod";
-import  { type Result } from "@deessejs/fp";
-import  { type HandlerContext, type EventRegistry } from "../types.js";
- 
-export interface InternalMutationConfig<Ctx, Args, Output, Events extends EventRegistry = EventRegistry> {
-  args?: ZodType<Args>;
-  handler: (ctx: HandlerContext<Ctx, Events>, args: Args) => Promise<Result<Output>>;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/internal-query/builder.ts.html b/packages/server/coverage/src/internal-query/builder.ts.html deleted file mode 100644 index c667718..0000000 --- a/packages/server/coverage/src/internal-query/builder.ts.html +++ /dev/null @@ -1,517 +0,0 @@ - - - - - - Code coverage report for src/internal-query/builder.ts - - - - - - - - - -
-
-

All files / src/internal-query builder.ts

-
- -
- 57.3% - Statements - 51/89 -
- - -
- 100% - Branches - 7/7 -
- - -
- 58.33% - Functions - 7/12 -
- - -
- 57.3% - Lines - 51/89 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -11x -11x -11x -11x -11x -11x -11x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -11x -11x -11x -11x -11x -11x -11x -11x -11x -11x -  -11x -2x -2x -2x -  -11x -2x -2x -2x -  -11x -2x -2x -2x -  -11x -2x -2x -2x -  -11x -2x -2x -2x -2x -2x -2x -2x -  -2x -  -  -  -  -2x -  -  -  -  -2x -  -  -  -  -2x -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -2x -  -11x -11x -  - 
import  { type Result } from "@deessejs/fp";
-import  { type InternalQuery, type Middleware } from "../types.js";
-import  { type InternalQueryConfig } from "./types.js";
-import  {
-  type BeforeInvokeHook,
-  type AfterInvokeHook,
-  type OnSuccessHook,
-  type OnErrorHook,
-} from "../types.js";
- 
-export type InternalQueryWithHooks<Ctx, Output> = InternalQuery<Ctx, void, Output> &
-  HookedProcedureMixin<Ctx, void, Output>;
- 
-/* eslint-disable @typescript-eslint/no-explicit-any */
-export function createInternalQueryWithHooks<Ctx, Output>(
-  config: InternalQueryConfig<Ctx, Output>
-): InternalQueryWithHooks<Ctx, Output> {
-  return createHookedProcedure({
-    type: "internalQuery",
-    handler: config.handler as any,
-  }) as InternalQueryWithHooks<Ctx, Output>;
-}
- 
-interface HookedProcedureMixin<Ctx, Args, Output> {
-  type: "query" | "mutation" | "internalQuery" | "internalMutation";
-  beforeInvoke(hook: BeforeInvokeHook<Ctx, Args>): this;
-  afterInvoke(hook: AfterInvokeHook<Ctx, Args, Output>): this;
-  onSuccess(hook: OnSuccessHook<Ctx, Args, Output>): this;
-  onError(hook: OnErrorHook<Ctx, Args, any>): this;
-  use(middleware: Middleware<Ctx>): this;
-  _hooks: {
-    beforeInvoke?: BeforeInvokeHook<Ctx, Args>;
-    afterInvoke?: AfterInvokeHook<Ctx, Args, Output>;
-    onSuccess?: OnSuccessHook<Ctx, Args, Output>;
-    onError?: OnErrorHook<Ctx, Args, any>;
-  };
-  _middleware: Middleware<Ctx>[];
-}
- 
-interface BaseProc<Ctx, Args, Output> {
-  type: "query" | "mutation" | "internalQuery" | "internalMutation";
-  argsSchema?: any;
-  handler: (ctx: Ctx, args: Args) => Promise<Result<Output>>;
-}
- 
-function createHookedProcedure<Ctx, Args, Output>(
-  proc: BaseProc<Ctx, Args, Output>
-): BaseProc<Ctx, Args, Output> & HookedProcedureMixin<Ctx, Args, Output> {
-  const hookedProc: any = {
-    type: proc.type,
-    argsSchema: proc.argsSchema,
-    handler: proc.handler,
-    _hooks: {},
-    _middleware: [],
-  };
- 
-  hookedProc.beforeInvoke = function(hook: BeforeInvokeHook<Ctx, Args>) {
-    hookedProc._hooks.beforeInvoke = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.afterInvoke = function(hook: AfterInvokeHook<Ctx, Args, Output>) {
-    hookedProc._hooks.afterInvoke = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.onSuccess = function(hook: OnSuccessHook<Ctx, Args, Output>) {
-    hookedProc._hooks.onSuccess = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.onError = function(hook: OnErrorHook<Ctx, Args, any>) {
-    hookedProc._hooks.onError = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.use = function(middleware: Middleware<any>) {
-    const newProc: any = {
-      type: hookedProc.type,
-      argsSchema: hookedProc.argsSchema,
-      handler: hookedProc.handler,
-      _hooks: { ...hookedProc._hooks },
-      _middleware: [...hookedProc._middleware, middleware],
-    };
- 
-    newProc.beforeInvoke = function(hook: BeforeInvokeHook<any, any>) {
-      newProc._hooks.beforeInvoke = hook;
-      return newProc;
-    };
- 
-    newProc.afterInvoke = function(hook: AfterInvokeHook<any, any, any>) {
-      newProc._hooks.afterInvoke = hook;
-      return newProc;
-    };
- 
-    newProc.onSuccess = function(hook: OnSuccessHook<any, any, any>) {
-      newProc._hooks.onSuccess = hook;
-      return newProc;
-    };
- 
-    newProc.onError = function(hook: OnErrorHook<any, any, any>) {
-      newProc._hooks.onError = hook;
-      return newProc;
-    };
- 
-    newProc.use = function(mw: Middleware<any>) {
-      const result: any = {
-        type: newProc.type,
-        argsSchema: newProc.argsSchema,
-        handler: newProc.handler,
-        _hooks: { ...newProc._hooks },
-        _middleware: [...newProc._middleware, mw],
-      };
- 
-      result.beforeInvoke = function(hook: BeforeInvokeHook<any, any>) {
-        result._hooks.beforeInvoke = hook;
-        return result;
-      };
- 
-      result.afterInvoke = function(hook: AfterInvokeHook<any, any, any>) {
-        result._hooks.afterInvoke = hook;
-        return result;
-      };
- 
-      result.onSuccess = function(hook: OnSuccessHook<any, any, any>) {
-        result._hooks.onSuccess = hook;
-        return result;
-      };
- 
-      result.onError = function(hook: OnErrorHook<any, any, any>) {
-        result._hooks.onError = hook;
-        return result;
-      };
- 
-      result.use = newProc.use;
-      return result;
-    };
- 
-    return newProc;
-  };
- 
-  return hookedProc;
-}
-/* eslint-enable @typescript-eslint/no-explicit-any */
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/internal-query/index.html b/packages/server/coverage/src/internal-query/index.html deleted file mode 100644 index 47506a9..0000000 --- a/packages/server/coverage/src/internal-query/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/internal-query - - - - - - - - - -
-
-

All files src/internal-query

-
- -
- 56.66% - Statements - 51/90 -
- - -
- 88.88% - Branches - 8/9 -
- - -
- 57.14% - Functions - 8/14 -
- - -
- 56.66% - Lines - 51/90 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
builder.ts -
-
57.3%51/89100%7/758.33%7/1257.3%51/89
index.ts -
-
0%0/10%0/10%0/10%0/1
types.ts -
-
0%0/00%1/10%1/10%0/0
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/internal-query/index.ts.html b/packages/server/coverage/src/internal-query/index.ts.html deleted file mode 100644 index 6e4cdca..0000000 --- a/packages/server/coverage/src/internal-query/index.ts.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for src/internal-query/index.ts - - - - - - - - - -
-
-

All files / src/internal-query index.ts

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export type { InternalQueryConfig } from "./types.js";
-export { createInternalQueryWithHooks, InternalQueryWithHooks } from "./builder.js";
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/internal-query/types.ts.html b/packages/server/coverage/src/internal-query/types.ts.html deleted file mode 100644 index b8d4b21..0000000 --- a/packages/server/coverage/src/internal-query/types.ts.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - Code coverage report for src/internal-query/types.ts - - - - - - - - - -
-
-

All files / src/internal-query types.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7  -  -  -  -  -  - 
import  { type Result } from "@deessejs/fp";
-import  { type HandlerContext, type EventRegistry } from "../types.js";
- 
-export interface InternalQueryConfig<Ctx, Output, Events extends EventRegistry = EventRegistry> {
-  handler: (ctx: HandlerContext<Ctx, Events>) => Promise<Result<Output>>;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/middleware/builder.ts.html b/packages/server/coverage/src/middleware/builder.ts.html deleted file mode 100644 index 61a5f0e..0000000 --- a/packages/server/coverage/src/middleware/builder.ts.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - Code coverage report for src/middleware/builder.ts - - - - - - - - - -
-
-

All files / src/middleware builder.ts

-
- -
- 100% - Statements - 3/3 -
- - -
- 100% - Branches - 1/1 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 3/3 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5  -  -1x -14x -14x
import  { type Middleware } from "../types.js";
- 
-export function createMiddleware<Ctx, Args>(config: Middleware<Ctx, Args>): Middleware<Ctx, Args> {
-  return config;
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/middleware/helpers.ts.html b/packages/server/coverage/src/middleware/helpers.ts.html deleted file mode 100644 index 1129c3b..0000000 --- a/packages/server/coverage/src/middleware/helpers.ts.html +++ /dev/null @@ -1,346 +0,0 @@ - - - - - - Code coverage report for src/middleware/helpers.ts - - - - - - - - - -
-
-

All files / src/middleware helpers.ts

-
- -
- 66.66% - Statements - 20/30 -
- - -
- 45.45% - Branches - 5/11 -
- - -
- 100% - Functions - 2/2 -
- - -
- 66.66% - Lines - 20/30 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -2x -2x -2x -  -2x -1x -1x -  -2x -  -  -  -1x -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -1x -1x -  -1x -  -  -  -1x -  -  -  -1x -1x -1x -  -  - 
import  { type Middleware } from "../types.js";
-import  { type QueryWithHooks } from "../query/types.js";
-import  { type MutationWithHooks } from "../mutation/builder.js";
- 
-/**
- * Apply middleware to a query
- */
-export function withQuery<Ctx, Args, Output>(
-  query: QueryWithHooks<Ctx, Args, Output>
-): QueryWithHooks<Ctx, Args, Output>;
- 
-/**
- * Apply middleware to a query
- */
-export function withQuery<Ctx, Args, Output>(
-  query: QueryWithHooks<Ctx, Args, Output>,
-  middleware: Middleware<Ctx>
-): QueryWithHooks<Ctx, Args, Output>;
- 
-/**
- * Apply middleware to a query using a function transformer (curried form)
- */
-/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types -- Curried form requires dynamic type inference */
-export function withQuery<Ctx>(
-  fn: (q: QueryWithHooks<Ctx, any, any>) => QueryWithHooks<Ctx, any, any>
-): (query: QueryWithHooks<Ctx, any, any>) => QueryWithHooks<Ctx, any, any>;
- 
-export function withQuery(
-  queryOrFn: any,
-  middlewareOrFn?: any
-): any {
-  // Curried form: withQuery((q) => q.use(admin))
-  if (typeof queryOrFn === "function" && middlewareOrFn === undefined) {
-    return queryOrFn;
-  }
-  // Middleware function transformer: withQuery(query, (q) => q.use(admin))
-  if (typeof middlewareOrFn === "function") {
-    return middlewareOrFn(queryOrFn);
-  }
-  // Middleware: withQuery(query, adminMiddleware)
-  if (middlewareOrFn) {
-    return queryOrFn.use(middlewareOrFn);
-  }
-  return queryOrFn;
-}
- 
-/**
- * Apply middleware to a mutation
- */
-export function withMutation<Ctx, Args, Output>(
-  mutation: MutationWithHooks<Ctx, Args, Output>
-): MutationWithHooks<Ctx, Args, Output>;
- 
-/**
- * Apply middleware to a mutation
- */
-export function withMutation<Ctx, Args, Output>(
-  mutation: MutationWithHooks<Ctx, Args, Output>,
-  middleware: Middleware<Ctx>
-): MutationWithHooks<Ctx, Args, Output>;
- 
-/**
- * Apply middleware to a mutation using a function transformer (curried form)
- */
-/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types -- Curried form requires dynamic type inference */
-export function withMutation<Ctx>(
-  fn: (m: MutationWithHooks<Ctx, any, any>) => MutationWithHooks<Ctx, any, any>
-): (mutation: MutationWithHooks<Ctx, any, any>) => MutationWithHooks<Ctx, any, any>;
- 
-export function withMutation(
-  mutationOrFn: any,
-  middlewareOrFn?: any
-): any {
-  // Curried form: withMutation((m) => m.use(admin))
-  if (typeof mutationOrFn === "function" && middlewareOrFn === undefined) {
-    return mutationOrFn;
-  }
-  // Middleware function transformer: withMutation(mutation, (m) => m.use(admin))
-  if (typeof middlewareOrFn === "function") {
-    return middlewareOrFn(mutationOrFn);
-  }
-  // Middleware: withMutation(mutation, adminMiddleware)
-  if (middlewareOrFn) {
-    return mutationOrFn.use(middlewareOrFn);
-  }
-  return mutationOrFn;
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/middleware/index.html b/packages/server/coverage/src/middleware/index.html deleted file mode 100644 index b2e2c84..0000000 --- a/packages/server/coverage/src/middleware/index.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - Code coverage report for src/middleware - - - - - - - - - -
-
-

All files src/middleware

-
- -
- 67.64% - Statements - 23/34 -
- - -
- 50% - Branches - 7/14 -
- - -
- 80% - Functions - 4/5 -
- - -
- 67.64% - Lines - 23/34 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
builder.ts -
-
100%3/3100%1/1100%1/1100%3/3
helpers.ts -
-
66.66%20/3045.45%5/11100%2/266.66%20/30
index.ts -
-
0%0/10%0/10%0/10%0/1
types.ts -
-
0%0/00%1/10%1/10%0/0
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/middleware/index.ts.html b/packages/server/coverage/src/middleware/index.ts.html deleted file mode 100644 index 266f0bd..0000000 --- a/packages/server/coverage/src/middleware/index.ts.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for src/middleware/index.ts - - - - - - - - - -
-
-

All files / src/middleware index.ts

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export type { Middleware } from "./types.js";
-export { createMiddleware } from "./builder.js";
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/middleware/types.ts.html b/packages/server/coverage/src/middleware/types.ts.html deleted file mode 100644 index e7ac042..0000000 --- a/packages/server/coverage/src/middleware/types.ts.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for src/middleware/types.ts - - - - - - - - - -
-
-

All files / src/middleware types.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export type { Middleware } from "../types.js";
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/mutation/builder.ts.html b/packages/server/coverage/src/mutation/builder.ts.html deleted file mode 100644 index beb6b0a..0000000 --- a/packages/server/coverage/src/mutation/builder.ts.html +++ /dev/null @@ -1,538 +0,0 @@ - - - - - - Code coverage report for src/mutation/builder.ts - - - - - - - - - -
-
-

All files / src/mutation builder.ts

-
- -
- 56.81% - Statements - 50/88 -
- - -
- 100% - Branches - 7/7 -
- - -
- 58.33% - Functions - 7/12 -
- - -
- 56.81% - Lines - 50/88 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -11x -11x -11x -11x -11x -11x -11x -11x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -11x -11x -11x -11x -11x -11x -11x -11x -  -11x -2x -2x -2x -  -11x -2x -2x -2x -  -11x -2x -2x -2x -  -11x -2x -2x -2x -  -11x -2x -2x -2x -2x -2x -2x -2x -  -2x -  -  -  -  -2x -  -  -  -  -2x -  -  -  -  -2x -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -2x -  -11x -11x -  - 
import  { type ZodType } from "zod";
-import  { type Result } from "@deessejs/fp";
-import  { type Mutation } from "../types.js";
-import  { type MutationConfig } from "./types.js";
-import  {
-  type BeforeInvokeHook,
-  type AfterInvokeHook,
-  type OnSuccessHook,
-  type OnErrorHook,
-  type ProcedureType,
-  type Middleware,
-} from "../types.js";
- 
-export type MutationWithHooks<Ctx, Args, Output> = Mutation<Ctx, Args, Output> &
-  HookedProcedureMixin<Ctx, Args, Output>;
- 
-export function createMutationWithHooks<Ctx, Args, Output>(
-  config: MutationConfig<Ctx, Args, Output>
-): MutationWithHooks<Ctx, Args, Output> {
-  return createHookedProcedure({
-    type: "mutation",
-    argsSchema: config.args,
-    handler: config.handler,
-  }) as MutationWithHooks<Ctx, Args, Output>;
-}
- 
-/* eslint-disable @typescript-eslint/no-explicit-any */
-interface HookedProcedureMixin<Ctx, Args, Output> {
-  type: ProcedureType;
-  beforeInvoke(hook: BeforeInvokeHook<Ctx, Args>): this;
-  afterInvoke(hook: AfterInvokeHook<Ctx, Args, Output>): this;
-  onSuccess(hook: OnSuccessHook<Ctx, Args, Output>): this;
-  onError(hook: OnErrorHook<Ctx, Args, any>): this;
-  use(middleware: Middleware<Ctx>): this;
-  _hooks: {
-    beforeInvoke?: BeforeInvokeHook<Ctx, Args>;
-    afterInvoke?: AfterInvokeHook<Ctx, Args, Output>;
-    onSuccess?: OnSuccessHook<Ctx, Args, Output>;
-    onError?: OnErrorHook<Ctx, Args, any>;
-  };
-  _middleware: Middleware<Ctx>[];
-}
- 
-interface BaseProc<Ctx, Args, Output> {
-  type: ProcedureType;
-  argsSchema?: ZodType<Args>;
-  handler: (ctx: Ctx, args: Args) => Promise<Result<Output>>;
-}
- 
-function createHookedProcedure<
-  Ctx,
-  Args,
-  Output,
->(proc: BaseProc<Ctx, Args, Output>): BaseProc<Ctx, Args, Output> & HookedProcedureMixin<Ctx, Args, Output>;
-function createHookedProcedure(proc: BaseProc<any, any, any>): any {
-  const hookedProc: any = {
-    type: proc.type,
-    argsSchema: proc.argsSchema,
-    handler: proc.handler,
-    _hooks: {},
-    _middleware: [],
-  };
- 
-  hookedProc.beforeInvoke = function(hook: BeforeInvokeHook<any, any>) {
-    hookedProc._hooks.beforeInvoke = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.afterInvoke = function(hook: AfterInvokeHook<any, any, any>) {
-    hookedProc._hooks.afterInvoke = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.onSuccess = function(hook: OnSuccessHook<any, any, any>) {
-    hookedProc._hooks.onSuccess = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.onError = function(hook: OnErrorHook<any, any, any>) {
-    hookedProc._hooks.onError = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.use = function(middleware: Middleware<any>) {
-    const newProc: any = {
-      type: hookedProc.type,
-      argsSchema: hookedProc.argsSchema,
-      handler: hookedProc.handler,
-      _hooks: { ...hookedProc._hooks },
-      _middleware: [...hookedProc._middleware, middleware],
-    };
- 
-    newProc.beforeInvoke = function(hook: BeforeInvokeHook<any, any>) {
-      newProc._hooks.beforeInvoke = hook;
-      return newProc;
-    };
- 
-    newProc.afterInvoke = function(hook: AfterInvokeHook<any, any, any>) {
-      newProc._hooks.afterInvoke = hook;
-      return newProc;
-    };
- 
-    newProc.onSuccess = function(hook: OnSuccessHook<any, any, any>) {
-      newProc._hooks.onSuccess = hook;
-      return newProc;
-    };
- 
-    newProc.onError = function(hook: OnErrorHook<any, any, any>) {
-      newProc._hooks.onError = hook;
-      return newProc;
-    };
- 
-    newProc.use = function(mw: Middleware<any>) {
-      const result: any = {
-        type: newProc.type,
-        argsSchema: newProc.argsSchema,
-        handler: newProc.handler,
-        _hooks: { ...newProc._hooks },
-        _middleware: [...newProc._middleware, mw],
-      };
- 
-      result.beforeInvoke = function(hook: BeforeInvokeHook<any, any>) {
-        result._hooks.beforeInvoke = hook;
-        return result;
-      };
- 
-      result.afterInvoke = function(hook: AfterInvokeHook<any, any, any>) {
-        result._hooks.afterInvoke = hook;
-        return result;
-      };
- 
-      result.onSuccess = function(hook: OnSuccessHook<any, any, any>) {
-        result._hooks.onSuccess = hook;
-        return result;
-      };
- 
-      result.onError = function(hook: OnErrorHook<any, any, any>) {
-        result._hooks.onError = hook;
-        return result;
-      };
- 
-      result.use = newProc.use;
-      return result;
-    };
- 
-    return newProc;
-  };
- 
-  return hookedProc;
-}
-/* eslint-enable @typescript-eslint/no-explicit-any */
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/mutation/index.html b/packages/server/coverage/src/mutation/index.html deleted file mode 100644 index 33e1a8a..0000000 --- a/packages/server/coverage/src/mutation/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/mutation - - - - - - - - - -
-
-

All files src/mutation

-
- -
- 56.17% - Statements - 50/89 -
- - -
- 88.88% - Branches - 8/9 -
- - -
- 57.14% - Functions - 8/14 -
- - -
- 56.17% - Lines - 50/89 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
builder.ts -
-
56.81%50/88100%7/758.33%7/1256.81%50/88
index.ts -
-
0%0/10%0/10%0/10%0/1
types.ts -
-
0%0/00%1/10%1/10%0/0
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/mutation/index.ts.html b/packages/server/coverage/src/mutation/index.ts.html deleted file mode 100644 index 8307b68..0000000 --- a/packages/server/coverage/src/mutation/index.ts.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Code coverage report for src/mutation/index.ts - - - - - - - - - -
-
-

All files / src/mutation index.ts

-
- -
- 0% - Statements - 0/1 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2  - 
export type { MutationConfig } from "./types.js";
-export { createMutationWithHooks, MutationWithHooks } from "./builder.js";
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/mutation/types.ts.html b/packages/server/coverage/src/mutation/types.ts.html deleted file mode 100644 index 55b2e25..0000000 --- a/packages/server/coverage/src/mutation/types.ts.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - Code coverage report for src/mutation/types.ts - - - - - - - - - -
-
-

All files / src/mutation types.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9  -  -  -  -  -  -  -  - 
import  { type ZodType } from "zod";
-import  { type Result } from "@deessejs/fp";
-import  { type HandlerContext, type EventRegistry } from "../types.js";
- 
-export interface MutationConfig<Ctx, Args, Output, Events extends EventRegistry = EventRegistry> {
-  args?: ZodType<Args>;
-  handler: (ctx: HandlerContext<Ctx, Events>, args: Args) => Promise<Result<Output>>;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/procedure/index.html b/packages/server/coverage/src/procedure/index.html deleted file mode 100644 index d3e621c..0000000 --- a/packages/server/coverage/src/procedure/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/procedure - - - - - - - - - -
-
-

All files src/procedure

-
- -
- 28.57% - Statements - 2/7 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 28.57% - Lines - 2/7 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
index.ts -
-
100%1/1100%0/0100%0/0100%1/1
types.ts -
-
16.66%1/6100%0/00%0/116.66%1/6
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/procedure/index.ts.html b/packages/server/coverage/src/procedure/index.ts.html deleted file mode 100644 index a73f823..0000000 --- a/packages/server/coverage/src/procedure/index.ts.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - Code coverage report for src/procedure/index.ts - - - - - - - - - -
-
-

All files / src/procedure index.ts

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
11x
export { withMetadata, type Metadata } from "./types.js";
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/procedure/types.ts.html b/packages/server/coverage/src/procedure/types.ts.html deleted file mode 100644 index fa34537..0000000 --- a/packages/server/coverage/src/procedure/types.ts.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - Code coverage report for src/procedure/types.ts - - - - - - - - - -
-
-

All files / src/procedure types.ts

-
- -
- 16.66% - Statements - 1/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 16.66% - Lines - 1/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  - 
// ============================================
-// Metadata helpers
-// ============================================
- 
-export interface Metadata {
-  keys?: string[];
-  invalidate?: string[];
-}
- 
-export function withMetadata<Output>(
-  value: Output,
-  metadata: Metadata
-): Output & Metadata {
-  return Object.assign({}, value, metadata);
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/query/builder.ts.html b/packages/server/coverage/src/query/builder.ts.html deleted file mode 100644 index 50cc34e..0000000 --- a/packages/server/coverage/src/query/builder.ts.html +++ /dev/null @@ -1,787 +0,0 @@ - - - - - - Code coverage report for src/query/builder.ts - - - - - - - - - -
-
-

All files / src/query builder.ts

-
- -
- 85.06% - Statements - 131/154 -
- - -
- 100% - Branches - 21/21 -
- - -
- 72% - Functions - 18/25 -
- - -
- 85.06% - Lines - 131/154 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235  -  -  -  -  -  -  -  -  -  -1x -1x -106x -  -106x -  -106x -  -1x -59x -59x -59x -  -59x -  -59x -59x -  -1x -30x -30x -30x -  -30x -  -30x -30x -  -  -1x -5x -5x -5x -5x -5x -  -  -1x -4x -4x -4x -4x -4x -  -4x -  -4x -4x -  -1x -70x -70x -  -1x -2x -2x -  -1x -6x -6x -6x -6x -1x -1x -  -5x -6x -6x -5x -6x -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -98x -98x -98x -  -  -98x -98x -98x -98x -98x -98x -98x -98x -98x -98x -98x -  -98x -98x -98x -98x -98x -98x -98x -98x -  -98x -6x -6x -6x -  -98x -4x -4x -4x -  -98x -4x -4x -4x -  -98x -5x -5x -5x -  -98x -11x -11x -11x -11x -11x -11x -11x -11x -  -11x -1x -1x -1x -  -11x -  -  -  -  -11x -1x -1x -1x -  -11x -  -  -  -  -11x -4x -4x -4x -4x -4x -4x -4x -4x -  -4x -  -  -  -  -4x -  -  -  -  -4x -  -  -  -  -4x -  -  -  -  -4x -4x -4x -  -11x -11x -  -98x -98x -  - 
import { type ZodType } from "zod";
-import { type Result } from "@deessejs/fp";
-import { type EventRegistry, type Middleware, type Router, type EventPayload } from "../types.js";
-import { type BeforeInvokeHook, type AfterInvokeHook, type OnSuccessHook, type OnErrorHook } from "../types.js";
-import { type EventEmitter } from "../events/emitter.js";
-import { type QueryConfig, type QueryWithHooks } from "./types.js";
-import { type MutationConfig, type MutationWithHooks } from "../mutation/index.js";
-import { type InternalQueryConfig, type InternalQueryWithHooks } from "../internal-query/index.js";
-import { type InternalMutationConfig, type InternalMutationWithHooks } from "../internal-mutation/index.js";
- 
-export class QueryBuilder<Ctx, Events extends EventRegistry = EventRegistry> {
-  constructor(
-    private context: Ctx,
-    /* eslint-disable @typescript-eslint/no-explicit-any */
-    private eventEmitter?: EventEmitter<any>
-    /* eslint-enable @typescript-eslint/no-explicit-any */
-  ) {}
- 
-  query<Args, Output>(config: QueryConfig<Ctx, Args, Output>): QueryWithHooks<Ctx, Args, Output> {
-    return createHookedProcedure({
-      type: "query",
-      argsSchema: config.args,
-      /* eslint-disable @typescript-eslint/no-explicit-any */
-      handler: config.handler as any,
-      /* eslint-enable @typescript-eslint/no-explicit-any */
-    }) as QueryWithHooks<Ctx, Args, Output>;
-  }
- 
-  mutation<Args, Output>(config: MutationConfig<Ctx, Args, Output>): MutationWithHooks<Ctx, Args, Output> {
-    return createHookedProcedure({
-      type: "mutation",
-      argsSchema: config.args,
-      /* eslint-disable @typescript-eslint/no-explicit-any */
-      handler: config.handler as any,
-      /* eslint-enable @typescript-eslint/no-explicit-any */
-    }) as MutationWithHooks<Ctx, Args, Output>;
-  }
- 
-  /* eslint-disable @typescript-eslint/no-explicit-any */
-  internalQuery<Output>(config: InternalQueryConfig<Ctx, Output>): InternalQueryWithHooks<Ctx, Output> {
-    return createHookedProcedure({
-      type: "internalQuery",
-      handler: config.handler as any,
-    }) as InternalQueryWithHooks<Ctx, Output>;
-  }
-  /* eslint-enable @typescript-eslint/no-explicit-any */
- 
-  internalMutation<Args, Output>(
-    config: InternalMutationConfig<Ctx, Args, Output>
-  ): InternalMutationWithHooks<Ctx, Args, Output> {
-    return createHookedProcedure({
-      type: "internalMutation",
-      argsSchema: config.args,
-      /* eslint-disable @typescript-eslint/no-explicit-any */
-      handler: config.handler as any,
-      /* eslint-enable @typescript-eslint/no-explicit-any */
-    }) as InternalMutationWithHooks<Ctx, Args, Output>;
-  }
- 
-  router<Routes extends Record<string, any>>(routes: Routes): Routes {
-    return routes;
-  }
- 
-  middleware<Args>(config: Middleware<Ctx, Args>): Middleware<Ctx, Args> {
-    return config;
-  }
- 
-  on<EventName extends keyof Events>(
-    event: EventName,
-    handler: (ctx: Ctx, payload: { name: string; data: Events[EventName]["data"] }) => void | Promise<void>
-  ): () => void {
-    if (!this.eventEmitter) {
-      return () => {};
-    }
-    // Wrap the handler to pass context (this.context) as the first argument
-    const wrappedHandler = (payload: EventPayload<Events[EventName]["data"]>) => {
-      return handler(this.context, payload);
-    };
-    return this.eventEmitter.on(event, wrappedHandler);
-  }
-}
- 
-export type { QueryWithHooks } from "./types.js";
-export type { MutationWithHooks } from "../mutation/builder.js";
-export type { InternalQueryWithHooks } from "../internal-query/builder.js";
-export type { InternalMutationWithHooks } from "../internal-mutation/builder.js";
- 
-export function createQueryBuilder<Ctx, Events extends EventRegistry = EventRegistry>(
-  context: Ctx,
-  /* eslint-disable @typescript-eslint/no-explicit-any */
-  eventEmitter?: EventEmitter<any>
-  /* eslint-enable @typescript-eslint/no-explicit-any */
-): QueryBuilder<Ctx, Events> {
-  return new QueryBuilder<Ctx, Events>(context, eventEmitter);
-}
- 
-/* eslint-disable @typescript-eslint/no-explicit-any */
-interface HookedProcedureMixin<Ctx, Args, Output> {
-  beforeInvoke(hook: BeforeInvokeHook<Ctx, Args>): this;
-  afterInvoke(hook: AfterInvokeHook<Ctx, Args, Output>): this;
-  onSuccess(hook: OnSuccessHook<Ctx, Args, Output>): this;
-  onError(hook: OnErrorHook<Ctx, Args, any>): this;
-  use(middleware: Middleware<Ctx>): this;
-  _hooks: {
-    beforeInvoke?: BeforeInvokeHook<Ctx, Args>;
-    afterInvoke?: AfterInvokeHook<Ctx, Args, Output>;
-    onSuccess?: OnSuccessHook<Ctx, Args, Output>;
-    onError?: OnErrorHook<Ctx, Args, any>;
-  };
-  _middleware: Middleware<Ctx>[];
-}
- 
-interface BaseProc<Ctx = any, Args = any, Output = any> {
-  type: "query" | "mutation" | "internalQuery" | "internalMutation";
-  argsSchema?: ZodType<Args>;
-  handler: (ctx: Ctx, args: Args) => Promise<Result<Output>>;
-}
- 
-function createHookedProcedure<Ctx, Args, Output>(
-  proc: BaseProc<Ctx, Args, Output>
-): BaseProc<Ctx, Args, Output> & HookedProcedureMixin<Ctx, Args, Output> {
-  // Create _def with $types for proper type inference
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  const def: any = {
-    type: proc.type,
-    $types: {
-      input: undefined as Args,
-      output: undefined as Output,
-    },
-    argsSchema: proc.argsSchema,
-    handler: proc.handler,
-    name: undefined,
-    metadata: {},
-  };
- 
-  const hookedProc: any = {
-    type: proc.type,
-    argsSchema: proc.argsSchema,
-    handler: proc.handler,
-    _def: def,
-    _hooks: {},
-    _middleware: [],
-  };
- 
-  hookedProc.beforeInvoke = function(hook: BeforeInvokeHook<any, any>) {
-    hookedProc._hooks.beforeInvoke = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.afterInvoke = function(hook: AfterInvokeHook<any, any, any>) {
-    hookedProc._hooks.afterInvoke = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.onSuccess = function(hook: OnSuccessHook<any, any, any>) {
-    hookedProc._hooks.onSuccess = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.onError = function(hook: OnErrorHook<any, any, any>) {
-    hookedProc._hooks.onError = hook;
-    return hookedProc;
-  };
- 
-  hookedProc.use = function(middleware: Middleware<any>) {
-    const newProc: any = {
-      type: hookedProc.type,
-      argsSchema: hookedProc.argsSchema,
-      handler: hookedProc.handler,
-      _def: hookedProc._def,
-      _hooks: { ...hookedProc._hooks },
-      _middleware: [...hookedProc._middleware, middleware],
-    };
- 
-    newProc.beforeInvoke = function(hook: BeforeInvokeHook<any, any>) {
-      newProc._hooks.beforeInvoke = hook;
-      return newProc;
-    };
- 
-    newProc.afterInvoke = function(hook: AfterInvokeHook<any, any, any>) {
-      newProc._hooks.afterInvoke = hook;
-      return newProc;
-    };
- 
-    newProc.onSuccess = function(hook: OnSuccessHook<any, any, any>) {
-      newProc._hooks.onSuccess = hook;
-      return newProc;
-    };
- 
-    newProc.onError = function(hook: OnErrorHook<any, any, any>) {
-      newProc._hooks.onError = hook;
-      return newProc;
-    };
- 
-    newProc.use = function(mw: Middleware<any>) {
-      const result: any = {
-        type: newProc.type,
-        argsSchema: newProc.argsSchema,
-        handler: newProc.handler,
-        _def: newProc._def,
-        _hooks: { ...newProc._hooks },
-        _middleware: [...newProc._middleware, mw],
-      };
- 
-      result.beforeInvoke = function(hook: BeforeInvokeHook<any, any>) {
-        result._hooks.beforeInvoke = hook;
-        return result;
-      };
- 
-      result.afterInvoke = function(hook: AfterInvokeHook<any, any, any>) {
-        result._hooks.afterInvoke = hook;
-        return result;
-      };
- 
-      result.onSuccess = function(hook: OnSuccessHook<any, any, any>) {
-        result._hooks.onSuccess = hook;
-        return result;
-      };
- 
-      result.onError = function(hook: OnErrorHook<any, any, any>) {
-        result._hooks.onError = hook;
-        return result;
-      };
- 
-      result.use = newProc.use;
-      return result;
-    };
- 
-    return newProc;
-  };
- 
-  return hookedProc;
-}
-/* eslint-enable @typescript-eslint/no-explicit-any */
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/query/index.html b/packages/server/coverage/src/query/index.html deleted file mode 100644 index c28a8aa..0000000 --- a/packages/server/coverage/src/query/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/query - - - - - - - - - -
-
-

All files src/query

-
- -
- 90.04% - Statements - 208/231 -
- - -
- 100% - Branches - 32/32 -
- - -
- 70.73% - Functions - 29/41 -
- - -
- 90.04% - Lines - 208/231 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
builder.ts -
-
85.06%131/154100%21/2172%18/2585.06%131/154
index.ts -
-
100%1/1100%0/0100%0/0100%1/1
types.ts -
-
100%76/76100%11/1168.75%11/16100%76/76
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/query/index.ts.html b/packages/server/coverage/src/query/index.ts.html deleted file mode 100644 index a8138e6..0000000 --- a/packages/server/coverage/src/query/index.ts.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - Code coverage report for src/query/index.ts - - - - - - - - - -
-
-

All files / src/query index.ts

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -31x -  - 
export type { QueryConfig, QueryWithHooks, CreateProcedureConfig } from "./types.js";
-export { QueryBuilder, createQueryBuilder } from "./builder.js";
-export { createQuery, createMutation, createInternalQuery, createInternalMutation, createProcedure } from "./types.js";
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/query/types.ts.html b/packages/server/coverage/src/query/types.ts.html deleted file mode 100644 index dc9cd12..0000000 --- a/packages/server/coverage/src/query/types.ts.html +++ /dev/null @@ -1,472 +0,0 @@ - - - - - - Code coverage report for src/query/types.ts - - - - - - - - - -
-
-

All files / src/query types.ts

-
- -
- 100% - Statements - 76/76 -
- - -
- 100% - Branches - 11/11 -
- - -
- 68.75% - Functions - 11/16 -
- - -
- 100% - Lines - 76/76 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -41x -41x -41x -41x -  -1x -9x -9x -9x -9x -  -1x -8x -8x -8x -8x -  -1x -6x -6x -6x -6x -  -  -64x -64x -64x -64x -64x -  -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -64x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -  -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x - 
import { type ZodType } from "zod";
-import { type Result } from "@deessejs/fp";
-import { type AnyProcedure, type ProcedureType, type BeforeInvokeHook, type AfterInvokeHook, type OnSuccessHook, type OnErrorHook, type Middleware, type ProcedureDef } from "../types.js";
- 
-export interface QueryConfig<Ctx, Args, Output> {
-  args?: ZodType<Args>;
-  handler: (ctx: Ctx, args: Args) => Promise<Result<Output>>;
-}
- 
-export interface MutationConfig<Ctx, Args, Output> {
-  args?: ZodType<Args>;
-  handler: (ctx: Ctx, args: Args) => Promise<Result<Output>>;
-}
- 
-export interface InternalQueryConfig<Ctx, Output> {
-  handler: (ctx: Ctx) => Promise<Result<Output>>;
-}
- 
-export interface InternalMutationConfig<Ctx, Args, Output> {
-  args?: ZodType<Args>;
-  handler: (ctx: Ctx, args: Args) => Promise<Result<Output>>;
-}
- 
-// Factory functions
-export function createQuery<Ctx, Args, Output>(
-  config: QueryConfig<Ctx, Args, Output>
-): AnyProcedure<Ctx, Args, Output> {
-  return createAnyProcedure("query", config.args, config.handler);
-}
- 
-export function createMutation<Ctx, Args, Output>(
-  config: MutationConfig<Ctx, Args, Output>
-): AnyProcedure<Ctx, Args, Output> {
-  return createAnyProcedure("mutation", config.args, config.handler);
-}
- 
-export function createInternalQuery<Ctx, Output>(
-  config: InternalQueryConfig<Ctx, Output>
-): AnyProcedure<Ctx, undefined, Output> {
-  return createAnyProcedure("internalQuery", undefined, config.handler as any);
-}
- 
-export function createInternalMutation<Ctx, Args, Output>(
-  config: InternalMutationConfig<Ctx, Args, Output>
-): AnyProcedure<Ctx, Args, Output> {
-  return createAnyProcedure("internalMutation", config.args, config.handler);
-}
- 
-// Internal helper
-function createAnyProcedure<Ctx, Args, Output>(
-  type: ProcedureType,
-  argsSchema: ZodType<Args> | undefined,
-  handler: (ctx: Ctx, args: Args) => Promise<Result<Output>>
-): AnyProcedure<Ctx, Args, Output> {
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  return {
-    _def: {
-      type,
-      $types: {
-        input: argsSchema as unknown as Args,
-        output: undefined as unknown as Output,
-      },
-      argsSchema,
-      handler: handler as any,
-    },
-    type,
-    argsSchema,
-    handler: handler as any,
-    beforeInvoke: function(hook: BeforeInvokeHook<Ctx, Args>) { return this; },
-    afterInvoke: function(hook: AfterInvokeHook<Ctx, Args, Output>) { return this; },
-    onSuccess: function(hook: OnSuccessHook<Ctx, Args, Output>) { return this; },
-    onError: function(hook: OnErrorHook<Ctx, Args, any>) { return this; },
-    use: function(middleware: Middleware<Ctx>) { return this; },
-    _hooks: {},
-    _middleware: [],
-  } as unknown as AnyProcedure<Ctx, Args, Output>;
-}
- 
-// Backward compatibility - keep QueryWithHooks as alias
-export type QueryWithHooks<Ctx, Args, Output> = AnyProcedure<Ctx, Args, Output>;
-export type MutationWithHooks<Ctx, Args, Output> = AnyProcedure<Ctx, Args, Output>;
-export type InternalQueryWithHooks<Ctx, Output> = AnyProcedure<Ctx, undefined, Output>;
-export type InternalMutationWithHooks<Ctx, Args, Output> = AnyProcedure<Ctx, Args, Output>;
- 
-// ============================================
-// createProcedure - DSL for plugins
-// ============================================
- 
-export interface CreateProcedureConfig<Ctx, Args, Output> {
-  name?: string;
-  args?: ZodType<Args>;
-  handler: (ctx: Ctx, args: Args) => Promise<Result<Output>>;
-  metadata?: Record<string | symbol, unknown>;
-}
- 
-/**
- * Factory function for creating procedures from plugins.
- * Takes a procedure type and configuration, returns an AnyProcedure.
- */
-export function createProcedure<Ctx, Args, Output>(
-  type: ProcedureType,
-  config: CreateProcedureConfig<Ctx, Args, Output>
-): AnyProcedure<Ctx, Args, Output> {
-  const def: ProcedureDef<Ctx, Args, Output> = {
-    type,
-    $types: {
-      input: config.args as unknown as Args,
-      output: undefined as unknown as Output,
-    },
-    argsSchema: config.args,
-    handler: config.handler as (ctx: Ctx, args: Args) => Promise<Result<Output>>,
-    name: config.name,
-    metadata: config.metadata,
-  };
- 
-  return {
-    _def: def,
-    type,
-    argsSchema: config.args,
-    handler: config.handler as (ctx: Ctx, args: Args) => Promise<Result<Output>>,
-    beforeInvoke: function(hook: BeforeInvokeHook<Ctx, Args>) { return this; },
-    afterInvoke: function(hook: AfterInvokeHook<Ctx, Args, Output>) { return this; },
-    onSuccess: function(hook: OnSuccessHook<Ctx, Args, Output>) { return this; },
-    onError: function(hook: OnErrorHook<Ctx, Args, any>) { return this; },
-    use: function(middleware: Middleware<Ctx>) { return this; },
-    _hooks: {},
-    _middleware: [],
-  } as unknown as AnyProcedure<Ctx, Args, Output>;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/router/builder.ts.html b/packages/server/coverage/src/router/builder.ts.html deleted file mode 100644 index 5696827..0000000 --- a/packages/server/coverage/src/router/builder.ts.html +++ /dev/null @@ -1,433 +0,0 @@ - - - - - - Code coverage report for src/router/builder.ts - - - - - - - - - -
-
-

All files / src/router builder.ts

-
- -
- 95% - Statements - 76/80 -
- - -
- 93.54% - Branches - 29/31 -
- - -
- 100% - Functions - 8/8 -
- - -
- 95% - Lines - 76/80 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -1171x -  -  -  -1x -16x -16x -  -16x -  -16x -  -16x -24x -24x -  -24x -17x -24x -  -6x -6x -24x -  -16x -16x -  -1x -2x -  -2x -2x -2x -2x -2x -  -1x -1x -  -1x -1x -1x -1x -1x -  -  -1x -56x -  -  -  -  -  -25x -56x -  -  -  -20x -20x -  -  -1x -227x -227x -217x -196x -132x -  -227x -  -1x -5x -5x -5x -5x -5x -5x -6x -  -  -6x -6x -5x -5x -  -  -  -  -  -1x -5x -5x -5x -  -5x -9x -11x -11x -  -11x -7x -2x -2x -11x -4x -4x -  -  -11x -9x -  -5x -5x -5x -  - 
import  { type Router, type Procedure } from "../types.js";
-import { type Maybe, none, fromNullable } from "@deessejs/fp";
- 
-/* eslint-disable @typescript-eslint/no-explicit-any */
-export function flattenRouter<Ctx, R extends Router<Ctx, any>>(
-  router: R,
-  prefix: string[] = []
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-): Array<{ path: string; procedure: Procedure<any, any, any> }> {
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  const result: Array<{ path: string; procedure: Procedure<any, any, any> }> = [];
- 
-  for (const key in router) {
-    const value = (router as any)[key];
-    const path = [...prefix, key];
- 
-    if (isProcedure(value)) {
-      result.push({ path: path.join("."), procedure: value });
-    } else if (isRouter(value)) {
-      // eslint-disable-next-line @typescript-eslint/no-explicit-any
-      result.push(...flattenRouter(value as any, path));
-    }
-  }
- 
-  return result;
-}
- 
-export function getPublicRoutes<Ctx, R extends Router<Ctx, any>>(
-  router: R
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-): Array<{ path: string; procedure: Procedure<any, any, any> }> {
-  return flattenRouter(router).filter(
-    (item) => item.procedure.type === "query" || item.procedure.type === "mutation"
-  );
-}
- 
-export function getInternalRoutes<Ctx, R extends Router<Ctx, any>>(
-  router: R
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-): Array<{ path: string; procedure: Procedure<any, any, any> }> {
-  return flattenRouter(router).filter(
-    (item) => item.procedure.type === "internalQuery" || item.procedure.type === "internalMutation"
-  );
-}
- 
-/* eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types -- Type guard must accept any type */
-export function isRouter(obj: any): obj is Router<any, any> {
-  if (!obj || typeof obj !== "object") return false;
- 
-  // A router is an object whose properties are either:
-  // 1. Procedures (has 'type' property with procedure value)
-  // 2. Other routers (nested structure)
-  // If it has ANY property that is a procedure, it's still a router (just not empty)
-  const keys = Object.keys(obj);
-  if (keys.length === 0) return false;
- 
-  // Check if at least one property exists (we don't check type here anymore)
-  // The distinction between procedure and nested router is made at filter time
-  return true;
-}
- 
-/* eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types -- Type guard must accept any type */
-export function isProcedure(obj: any): obj is Procedure<any, any, any> {
-  return (
-    obj &&
-    typeof obj === "object" &&
-    "type" in obj &&
-    ["query", "mutation", "internalQuery", "internalMutation"].includes(obj.type)
-  );
-}
- 
-export function resolvePath<Ctx, Routes extends Record<string, any>>(
-  router: Router<Ctx, Routes>,
-  path: string
-): Maybe<Procedure<Ctx, any, any> | Router<Ctx, Routes>> {
-  let current: any = router;
-  const parts = path.split(".");
-  for (const part of parts) {
-    if (current === null || current === undefined) {
-      return none();
-    }
-    current = current[part];
-  }
-  return fromNullable(current);
-}
-/* eslint-enable @typescript-eslint/no-explicit-any */
- 
-import  { type ValidationResult } from "./types.js";
- 
-/* eslint-disable @typescript-eslint/no-explicit-any */
-export function validateRouter<Ctx, R extends Router<Ctx, any>>(
-  router: R
-): ValidationResult {
-  const errors: string[] = [];
- 
-  const validate = (current: any, path: string[]): void => {
-    for (const key of Object.keys(current)) {
-      const value = current[key];
-      const currentPath = [...path, key];
- 
-      if (isProcedure(value)) {
-        if (!value.handler) {
-          errors.push(`Procedure at "${currentPath.join(".")}" missing handler`);
-        }
-      } else if (isRouter(value)) {
-        validate(value, currentPath);
-      } else if (typeof value === "object" && value !== null) {
-        validate(value, currentPath);
-      }
-    }
-  };
- 
-  validate(router, []);
-  return { valid: errors.length === 0, errors };
-}
-/* eslint-enable @typescript-eslint/no-explicit-any */
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/router/index.html b/packages/server/coverage/src/router/index.html deleted file mode 100644 index e153bd8..0000000 --- a/packages/server/coverage/src/router/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/router - - - - - - - - - -
-
-

All files src/router

-
- -
- 95.06% - Statements - 77/81 -
- - -
- 93.75% - Branches - 30/32 -
- - -
- 100% - Functions - 9/9 -
- - -
- 95.06% - Lines - 77/81 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
builder.ts -
-
95%76/8093.54%29/31100%8/895%76/80
index.ts -
-
100%1/1100%0/0100%0/0100%1/1
types.ts -
-
0%0/00%1/10%1/10%0/0
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/router/index.ts.html b/packages/server/coverage/src/router/index.ts.html deleted file mode 100644 index 8e6f28d..0000000 --- a/packages/server/coverage/src/router/index.ts.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - Code coverage report for src/router/index.ts - - - - - - - - - -
-
-

All files / src/router index.ts

-
- -
- 100% - Statements - 1/1 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 1/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -101x -  -  -  -  -  -  -  -  - 
export type { RouterConfig, ValidationResult } from "./types.js";
-export {
-  flattenRouter,
-  getPublicRoutes,
-  getInternalRoutes,
-  isRouter,
-  isProcedure,
-  resolvePath,
-  validateRouter,
-} from "./builder.js";
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/router/types.ts.html b/packages/server/coverage/src/router/types.ts.html deleted file mode 100644 index 72d98ca..0000000 --- a/packages/server/coverage/src/router/types.ts.html +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - Code coverage report for src/router/types.ts - - - - - - - - - -
-
-

All files / src/router types.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { type ZodType } from "zod";
-import { type Result } from "@deessejs/fp";
- 
-export type { Result } from "@deessejs/fp";
- 
-export type ProcedureType = "query" | "mutation" | "internalQuery" | "internalMutation";
- 
-export interface BaseProcedure<Ctx, Args, Output> {
-  readonly type: ProcedureType;
-  readonly argsSchema?: ZodType<Args>;
-  readonly handler: (ctx: Ctx, args: Args) => Promise<Result<Output>>;
-  readonly name?: string;
-}
- 
-export interface Query<Ctx, Args, Output> extends BaseProcedure<Ctx, Args, Output> {
-  readonly type: "query";
-}
- 
-export interface Mutation<Ctx, Args, Output> extends BaseProcedure<Ctx, Args, Output> {
-  readonly type: "mutation";
-}
- 
-export interface InternalQuery<Ctx, Args, Output> extends BaseProcedure<Ctx, Args, Output> {
-  readonly type: "internalQuery";
-}
- 
-export interface InternalMutation<Ctx, Args, Output> extends BaseProcedure<Ctx, Args, Output> {
-  readonly type: "internalMutation";
-}
- 
-export type BeforeInvokeHook<Ctx, Args> = (ctx: Ctx, args: Args) => void | Promise<void>;
- 
-export type AfterInvokeHook<Ctx, Args, Output> = (
-  ctx: Ctx,
-  args: Args,
-  result: Result<Output>
-) => void | Promise<void>;
- 
-export type OnSuccessHook<Ctx, Args, Output> = (ctx: Ctx, args: Args, data: Output) => void | Promise<void>;
- 
-export type OnErrorHook<Ctx, Args, Error> = (ctx: Ctx, args: Args, error: Error) => void | Promise<void>;
- 
-export interface Middleware<Ctx, Args = unknown> {
-  readonly name: string;
-  readonly args?: Args;
-  readonly handler: (
-    ctx: Ctx,
-    opts: {
-      next: (overrides?: { ctx?: Partial<Ctx> }) => Promise<Result<unknown>>;
-      args: Args;
-      meta: Record<string, unknown>;
-    }
-  ) => Promise<Result<unknown>>;
-}
- 
-export interface Plugin<Ctx> {
-  readonly name: string;
-  readonly extend: (ctx: Ctx) => Partial<Ctx>;
-}
- 
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export type Router<Ctx = unknown, Routes = Record<string, any>> = Routes;
- 
-export type Procedure<Ctx, Args, Output> =
-  | Query<Ctx, Args, Output>
-  | Mutation<Ctx, Args, Output>
-  | InternalQuery<Ctx, Args, Output>
-  | InternalMutation<Ctx, Args, Output>;
- 
-export interface EventRegistry {
-  [eventName: string]: {
-    data?: unknown;
-    response?: unknown;
-  };
-}
- 
-export interface EventPayload<T = unknown> {
-  name: string;
-  data: T;
-  timestamp: string;
-  namespace: string;
-  source?: string;
-}
- 
-export interface SendOptions {
-  namespace?: string;
-  broadcast?: boolean;
-  delay?: number;
-}
- 
-export interface PendingEvent {
-  name: string;
-  data: unknown;
-  timestamp: string;
-  namespace: string;
-  options?: SendOptions;
-}
- 
-export interface ContextWithSend<Ctx, Events extends EventRegistry> {
-  ctx: Ctx;
-  send: <EventName extends keyof Events>(
-    event: EventName,
-    data: Events[EventName]["data"]
-  ) => void;
-}
- 
-export type HandlerContext<Ctx, Events extends EventRegistry> = Ctx & {
-  send: <EventName extends keyof Events>(
-    event: EventName,
-    data: Events[EventName]["data"]
-  ) => void;
-};
- 
-export type RouterConfig<Ctx> = Record<string, Procedure<Ctx, unknown, unknown> | Record<string, unknown>>;
- 
-export interface ValidationResult {
-  valid: boolean;
-  errors: string[];
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/coverage/src/types.ts.html b/packages/server/coverage/src/types.ts.html deleted file mode 100644 index 0680e77..0000000 --- a/packages/server/coverage/src/types.ts.html +++ /dev/null @@ -1,562 +0,0 @@ - - - - - - Code coverage report for src/types.ts - - - - - - - - - -
-
-

All files / src types.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 1/1 -
- - -
- 0% - Functions - 1/1 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { type ZodType } from "zod";
-import { type Result } from "@deessejs/fp";
- 
-export type { Result } from "@deessejs/fp";
- 
-export type ProcedureType = "query" | "mutation" | "internalQuery" | "internalMutation";
- 
-// ============================================
-// Procedure definition with _def (like tRPC)
-// ============================================
- 
-export interface ProcedureDef<Ctx, Args, Output> {
-  readonly type: ProcedureType;
-  readonly $types: {
-    readonly input: Args;
-    readonly output: Output;
-  };
-  readonly argsSchema?: ZodType<Args>;
-  readonly handler: (ctx: Ctx, args: Args) => Promise<Result<Output>>;
-  readonly name?: string;
-  readonly metadata?: Record<string | symbol, unknown>;
-}
- 
-// All procedure types are now a single interface with _def
-export interface AnyProcedure<Ctx = unknown, Args = unknown, Output = unknown> {
-  readonly _def: ProcedureDef<Ctx, Args, Output>;
-  readonly type: ProcedureType;
-  readonly argsSchema?: ZodType<Args>;
-  readonly handler: (ctx: Ctx, args: Args) => Promise<Result<Output>>;
-  // Hook methods
-  readonly beforeInvoke: (hook: BeforeInvokeHook<Ctx, Args>) => AnyProcedure<Ctx, Args, Output>;
-  readonly afterInvoke: (hook: AfterInvokeHook<Ctx, Args, Output>) => AnyProcedure<Ctx, Args, Output>;
-  readonly onSuccess: (hook: OnSuccessHook<Ctx, Args, Output>) => AnyProcedure<Ctx, Args, Output>;
-  readonly onError: (hook: OnErrorHook<Ctx, Args, Error>) => AnyProcedure<Ctx, Args, Output>;
-  readonly use: (middleware: Middleware<Ctx>) => AnyProcedure<Ctx, Args, Output>;
-  // Internal state
-  readonly _hooks: {
-    beforeInvoke?: BeforeInvokeHook<Ctx, Args>;
-    afterInvoke?: AfterInvokeHook<Ctx, Args, Output>;
-    onSuccess?: OnSuccessHook<Ctx, Args, Output>;
-    onError?: OnErrorHook<Ctx, Args, Error>;
-  };
-  readonly _middleware: Middleware<Ctx>[];
-}
- 
-// Type aliases for backward compatibility
-export type Query<Ctx, Args, Output> = AnyProcedure<Ctx, Args, Output>;
-export type Mutation<Ctx, Args, Output> = AnyProcedure<Ctx, Args, Output>;
-export type InternalQuery<Ctx, Args, Output> = AnyProcedure<Ctx, Args, Output>;
-export type InternalMutation<Ctx, Args, Output> = AnyProcedure<Ctx, Args, Output>;
- 
-// Convenience type for procedures without args
-export type NoArgsProcedure<Ctx, Output> = AnyProcedure<Ctx, undefined, Output>;
- 
-// Backward compatible Procedure type alias
-export type Procedure<Ctx, Args, Output> = AnyProcedure<Ctx, Args, Output>;
- 
-// ============================================
-// Other types (unchanged)
-// ============================================
- 
-export type BeforeInvokeHook<Ctx, Args> = (ctx: Ctx, args: Args) => void | Promise<void>;
- 
-export type AfterInvokeHook<Ctx, Args, Output> = (
-  ctx: Ctx,
-  args: Args,
-  result: Result<Output>
-) => void | Promise<void>;
- 
-export type OnSuccessHook<Ctx, Args, Output> = (ctx: Ctx, args: Args, data: Output) => void | Promise<void>;
- 
-export type OnErrorHook<Ctx, Args, Error> = (ctx: Ctx, args: Args, error: Error) => void | Promise<void>;
- 
-export interface Middleware<Ctx, Args = unknown> {
-  readonly name: string;
-  readonly args?: Args;
-  readonly handler: (
-    ctx: Ctx,
-    opts: {
-      next: (overrides?: { ctx?: Partial<Ctx> }) => Promise<Result<unknown>>;
-      args: Args;
-      meta: Record<string, unknown>;
-    }
-  ) => Promise<Result<unknown>>;
-}
- 
-export interface Plugin<Ctx> {
-  readonly name: string;
-  readonly extend: (ctx: Ctx) => Partial<Ctx>;
-  readonly procedures?: () => PluginEnrichment<Ctx>;
-}
- 
-/**
- * PluginEnrichment describes how a plugin adds new methods to the t object.
- * Each namespace contains methods that create procedures.
- */
-export type PluginEnrichment<Ctx> = {
-  [namespace: string]: {
-    [methodName: string]: (config: {
-      name?: string;
-      args?: ZodType<unknown>;
-      handler: (ctx: Ctx, args: unknown) => Promise<Result<unknown>>;
-      metadata?: Record<string | symbol, unknown>;
-    }) => AnyProcedure<Ctx, unknown, unknown>;
-  };
-};
- 
-// Router type - recursively maps routes using non-distributive conditionals
-// Uses [T] instead of T to prevent distribution over union types
-export type Router<Ctx = unknown, Routes extends Record<string, any> = Record<string, any>> = {
-  [K in keyof Routes & string]: [Routes[K]] extends [{ type: string }]
-    ? Routes[K]
-    : [Routes[K]] extends [Record<string, any>]
-      ? Router<Ctx, Routes[K]>
-      : never;
-} & Record<string, any>;
- 
-export interface EventRegistry {
-  [eventName: string]: {
-    data?: unknown;
-    response?: unknown;
-  };
-}
- 
-export interface EventPayload<T = unknown> {
-  name: string;
-  data: T;
-  timestamp: string;
-  namespace: string;
-  source?: string;
-}
- 
-export interface SendOptions {
-  namespace?: string;
-  broadcast?: boolean;
-  delay?: number;
-}
- 
-export interface PendingEvent {
-  name: string;
-  data: unknown;
-  timestamp: string;
-  namespace: string;
-  options?: SendOptions;
-}
- 
-export interface ContextWithSend<Ctx, Events extends EventRegistry> {
-  ctx: Ctx;
-  send: <EventName extends keyof Events>(
-    event: EventName,
-    data: Events[EventName]["data"]
-  ) => void;
-}
- 
-export type HandlerContext<Ctx, Events extends EventRegistry> = Ctx & {
-  send: <EventName extends keyof Events>(
-    event: EventName,
-    data: Events[EventName]["data"]
-  ) => void;
-};
- -
-
- - - - - - - - \ No newline at end of file diff --git a/packages/server/dist_test/api/errors.d.ts b/packages/server/dist_test/api/errors.d.ts deleted file mode 100644 index e956f41..0000000 --- a/packages/server/dist_test/api/errors.d.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { Result } from "@deessejs/fp"; -import type { ZodIssue } from "zod"; -/** - * RouteNotFoundError - Returned when a route path cannot be resolved. - */ -export declare const RouteNotFoundError: import("@deessejs/fp").ErrorBuilder<{ - route: string; -}>; -/** - * ValidationError - Returned when Zod validation fails for procedure args. - */ -export declare const ValidationError: import("@deessejs/fp").ErrorBuilder<{ - route: string; - errors: { - path: string; - message: string; - }[]; -}>; -/** - * MiddlewareError - Returned when middleware execution fails. - */ -export declare const MiddlewareError: import("@deessejs/fp").ErrorBuilder<{ - middleware: string; - reason: string; -}>; -/** - * InternalError - Returned for unrecoverable internal errors. - */ -export declare const InternalError: import("@deessejs/fp").ErrorBuilder<{ - context: string; -}>; -/** - * ServerError - Used for server-side exceptions with a code. - */ -export declare const ServerError: import("@deessejs/fp").ErrorBuilder<{ - code: string; - message: string; -}>; -/** - * Create a route not found error result. - */ -export declare const routeNotFound: (route: string) => Result>; -/** - * Create a validation error result from Zod issues. - */ -export declare const validationFailed: (route: string, zodIssues: ZodIssue[]) => Result>; -/** - * Create an internal error result. - */ -export declare const internalError: (context: string) => Result>; -/** - * Create a server error result. - */ -export declare const serverError: (code: string, message: string) => Result>; -//# sourceMappingURL=errors.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/errors.d.ts.map b/packages/server/dist_test/api/errors.d.ts.map deleted file mode 100644 index ab01465..0000000 --- a/packages/server/dist_test/api/errors.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,kBAAkB;;EAI7B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;EAQ1B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe;;;EAI1B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;;EAIxB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW;;;EAItB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAC7D,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,MAAM,EACb,WAAW,QAAQ,EAAE,KACpB,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAShD,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,KAAG,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAC7D,CAAC;AAElC;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,MAAM,MAAM,EACZ,SAAS,MAAM,KACd,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAwC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/errors.js b/packages/server/dist_test/api/errors.js deleted file mode 100644 index 0c31277..0000000 --- a/packages/server/dist_test/api/errors.js +++ /dev/null @@ -1,68 +0,0 @@ -import { error, err } from "@deessejs/fp"; -import { z } from "zod"; -/** - * RouteNotFoundError - Returned when a route path cannot be resolved. - */ -export const RouteNotFoundError = error({ - name: "RouteNotFoundError", - schema: z.object({ route: z.string() }), - message: (args) => `Route not found: ${args.route}`, -}); -/** - * ValidationError - Returned when Zod validation fails for procedure args. - */ -export const ValidationError = error({ - name: "ValidationError", - schema: z.object({ - route: z.string(), - errors: z.array(z.object({ path: z.string(), message: z.string() })), - }), - message: (args) => `Validation failed for route ${args.route}: ${args.errors.map((e) => e.message).join(", ")}`, -}); -/** - * MiddlewareError - Returned when middleware execution fails. - */ -export const MiddlewareError = error({ - name: "MiddlewareError", - schema: z.object({ middleware: z.string(), reason: z.string() }), - message: (args) => `Middleware '${args.middleware}' failed: ${args.reason}`, -}); -/** - * InternalError - Returned for unrecoverable internal errors. - */ -export const InternalError = error({ - name: "InternalError", - schema: z.object({ context: z.string() }), - message: (args) => `Internal error: ${args.context}`, -}); -/** - * ServerError - Used for server-side exceptions with a code. - */ -export const ServerError = error({ - name: "ServerError", - schema: z.object({ code: z.string(), message: z.string() }), - message: (args) => `[${args.code}] ${args.message}`, -}); -/** - * Create a route not found error result. - */ -export const routeNotFound = (route) => err(RouteNotFoundError({ route })); -/** - * Create a validation error result from Zod issues. - */ -export const validationFailed = (route, zodIssues) => err(ValidationError({ - route, - errors: zodIssues.map((e) => ({ - path: e.path.join("."), - message: e.message, - })), -})); -/** - * Create an internal error result. - */ -export const internalError = (context) => err(InternalError({ context })); -/** - * Create a server error result. - */ -export const serverError = (code, message) => err(ServerError({ code, message })); -//# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/errors.js.map b/packages/server/dist_test/api/errors.js.map deleted file mode 100644 index dff6f91..0000000 --- a/packages/server/dist_test/api/errors.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;IACtC,IAAI,EAAE,oBAAoB;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACvC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,IAAI,CAAC,KAAK,EAAE;CACpD,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;IACnC,IAAI,EAAE,iBAAiB;IACvB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;KACrE,CAAC;IACF,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAChB,+BAA+B,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;CAC/F,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;IACnC,IAAI,EAAE,iBAAiB;IACvB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAChE,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,IAAI,CAAC,UAAU,aAAa,IAAI,CAAC,MAAM,EAAE;CAC5E,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;IACjC,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACzC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,IAAI,CAAC,OAAO,EAAE;CACrD,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;IAC/B,IAAI,EAAE,aAAa;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAC3D,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE;CACpD,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAa,EAAwD,EAAE,CACnG,GAAG,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,KAAa,EACb,SAAqB,EAC8B,EAAE,CACrD,GAAG,CACD,eAAe,CAAC;IACd,KAAK;IACL,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACtB,OAAO,EAAE,CAAC,CAAC,OAAO;KACnB,CAAC,CAAC;CACJ,CAAC,CACH,CAAC;AAEJ;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAe,EAAmD,EAAE,CAChG,GAAG,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,IAAY,EACZ,OAAe,EACgC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/api.d.ts b/packages/server/dist_test/api/factory/api.d.ts deleted file mode 100644 index 2caed8d..0000000 --- a/packages/server/dist_test/api/factory/api.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { Middleware, Plugin, Router } from "../../types.js"; -import type { APIInstance, RequestInfo, EventEmitterAny } from "../types/api.js"; -import type { TypedAPIInstance, PublicRouter } from "../types/proxy.js"; -/** - * Filters a router to only include public queries and mutations. - * Internal procedures and unknown types are explicitly excluded. - */ -export declare const filterPublicRouter: >(router: TRoutes) => PublicRouter; -export declare const createAPI: >(config: { - readonly router: TRoutes; - readonly context?: Ctx; - readonly createContext?: (requestInfo?: RequestInfo) => Ctx; - readonly plugins?: readonly Plugin[]; - readonly middleware?: readonly Middleware[]; - readonly eventEmitter?: EventEmitterAny; -}) => TypedAPIInstance; -/** - * Creates a public-only view of an API by filtering out internal procedures. - * Shares the same queue and event emitter for efficiency. - */ -export declare const createPublicAPI: >(api: APIInstance) => APIInstance>; -//# sourceMappingURL=api.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/api.d.ts.map b/packages/server/dist_test/api/factory/api.d.ts.map deleted file mode 100644 index 90b06c1..0000000 --- a/packages/server/dist_test/api/factory/api.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api/factory/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA0BxE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EACjE,QAAQ,OAAO,KACd,YAAY,CAAC,OAAO,CAoBtB,CAAC;AAMF,eAAO,MAAM,SAAS,GAAI,GAAG,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,CAAC,EACxD,QAAQ;IACN,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC;IACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,KAAK,GAAG,CAAC;IAC5D,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IACjD,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe,CAAC;CACzC,KACA,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAqE/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,GAAG,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,CAAC,EAC9D,KAAK,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,KAC7B,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,CAaxC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/api.js b/packages/server/dist_test/api/factory/api.js deleted file mode 100644 index 4bf2fa9..0000000 --- a/packages/server/dist_test/api/factory/api.js +++ /dev/null @@ -1,118 +0,0 @@ -import { createPendingEventQueue } from "../../events/queue.js"; -import { isRouter, isProcedure } from "../../router/index.js"; -import { createRouterProxy } from "./proxy.js"; -// ============================================================ -// Constants -// ============================================================ -const ROOT_PROPERTIES = new Set([ - "router", - "ctx", - "plugins", - "globalMiddleware", - "eventEmitter", -]); -// ============================================================ -// Public Router Filter -// ============================================================ -const isQueryOrMutation = (procedure) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const type = procedure.type; - return type === "query" || type === "mutation"; -}; -/** - * Filters a router to only include public queries and mutations. - * Internal procedures and unknown types are explicitly excluded. - */ -export const filterPublicRouter = (router) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const result = {}; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - for (const key in router) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const value = router[key]; - if (isRouter(value)) { - // Recursively filter nested routers - result[key] = filterPublicRouter(value); - } - else if (isProcedure(value) && isQueryOrMutation(value)) { - // Only include public queries and mutations - result[key] = value; - } - // Explicitly ignore everything else (internal procedures, unknown types) - } - return result; -}; -// ============================================================ -// Public API Creation -// ============================================================ -export const createAPI = (config) => { - const { router, context, createContext, plugins = [], middleware = [], eventEmitter, } = config; - const queue = createPendingEventQueue(); - // Note: contextFactory is called once at creation. - // For per-request context, use createContext with proper request handling. - const contextFactory = createContext ?? ((_requestInfo) => context); - const initialCtx = contextFactory(); - const state = { - router, - ctx: initialCtx, - plugins, - globalMiddleware: middleware, - eventEmitter, - }; - const proxyCtx = { - router: state.router, - ctx: state.ctx, - globalMiddleware: state.globalMiddleware, - rootRouter: state.router, - eventEmitter, - queue, - plugins: state.plugins, - }; - const routerProxy = createRouterProxy(proxyCtx); - // Create a typed Proxy for the API instance - const handler = { - get(target, prop) { - // Handle root properties (string only) - if (typeof prop === "string") { - switch (prop) { - case "router": - return target.router; - case "ctx": - return target.ctx; - case "plugins": - return target.plugins; - case "globalMiddleware": - return target.globalMiddleware; - case "eventEmitter": - return target.eventEmitter; - } - } - // Handle special property 'getEvents' - if (prop === "getEvents") { - return () => target.eventEmitter?.getEventLog() ?? []; - } - // Delegate to router proxy for route access - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return routerProxy[prop]; - }, - }; - return new Proxy(state, handler); -}; -/** - * Creates a public-only view of an API by filtering out internal procedures. - * Shares the same queue and event emitter for efficiency. - */ -export const createPublicAPI = (api) => { - const publicRouter = filterPublicRouter(api.router); - // Note: createContext is preserved from original API but called once. - // This is a known limitation - per-request context requires architecture change. - return createAPI({ - router: publicRouter, - context: api.ctx, - createContext: undefined, - plugins: api.plugins, - middleware: api.globalMiddleware, - eventEmitter: api.eventEmitter, - }); -}; -//# sourceMappingURL=api.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/api.js.map b/packages/server/dist_test/api/factory/api.js.map deleted file mode 100644 index 6967771..0000000 --- a/packages/server/dist_test/api/factory/api.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/api/factory/api.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/errors.d.ts b/packages/server/dist_test/api/factory/errors.d.ts deleted file mode 100644 index 75c1356..0000000 --- a/packages/server/dist_test/api/factory/errors.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type { Result } from "@deessejs/fp"; -export declare const createInternalErrorResult: (message: string, route: string) => Result; -export declare const createServerErrorResult: (code: string, message: string, route: string) => Result; -//# sourceMappingURL=errors.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/errors.d.ts.map b/packages/server/dist_test/api/factory/errors.d.ts.map deleted file mode 100644 index 4a17bd0..0000000 --- a/packages/server/dist_test/api/factory/errors.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/api/factory/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQ3C,eAAO,MAAM,yBAAyB,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,MAAM,CAAC,KAAK,CASpF,CAAC;AAEJ,eAAO,MAAM,uBAAuB,GAClC,MAAM,MAAM,EACZ,SAAS,MAAM,EACf,OAAO,MAAM,KACZ,MAAM,CAAC,KAAK,CAKZ,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/errors.js b/packages/server/dist_test/api/factory/errors.js deleted file mode 100644 index fe554fc..0000000 --- a/packages/server/dist_test/api/factory/errors.js +++ /dev/null @@ -1,14 +0,0 @@ -import { error as errorFn } from "@deessejs/fp"; -import { internalError, serverError } from "../errors.js"; -// ============================================================ -// L1: Error Creation -// ============================================================ -export const createInternalErrorResult = (message, route) => internalError(message).mapErr((e) => e - .addNotes(`Error in route: ${route}`) - .from(errorFn({ name: "INTERNAL_ERROR", message: (_) => message })({ - message, -}))); -export const createServerErrorResult = (code, message, route) => serverError(code, message).mapErr((e) => e - .addNotes(`Route: ${route}`) - .from(errorFn({ name: code, message: (_) => message })({ message }))); -//# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/errors.js.map b/packages/server/dist_test/api/factory/errors.js.map deleted file mode 100644 index 2c4af7b..0000000 --- a/packages/server/dist_test/api/factory/errors.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/api/factory/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE1D,+DAA+D;AAC/D,qBAAqB;AACrB,+DAA+D;AAE/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,OAAe,EAAE,KAAa,EAAiB,EAAE,CACzF,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAClC,CAAC;KACE,QAAQ,CAAC,mBAAmB,KAAK,EAAE,CAAC;KACpC,IAAI,CACH,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,OAAO;CACR,CAAC,CACH,CACJ,CAAC;AAEJ,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,IAAY,EACZ,OAAe,EACf,KAAa,EACE,EAAE,CACjB,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACtC,CAAC;KACE,QAAQ,CAAC,UAAU,KAAK,EAAE,CAAC;KAC3B,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAChF,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/index.d.ts b/packages/server/dist_test/api/factory/index.d.ts deleted file mode 100644 index 9e5da05..0000000 --- a/packages/server/dist_test/api/factory/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { createAPI, createPublicAPI, filterPublicRouter } from "./api.js"; -export { createRouterProxy } from "./proxy.js"; -export { executeRoute } from "./route.js"; -export { executeProcedure } from "./procedure.js"; -export type { RouterProxyContext, ExecuteRouteContext, ExecuteProcedureContext, } from "../types/internal.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/index.d.ts.map b/packages/server/dist_test/api/factory/index.d.ts.map deleted file mode 100644 index 8264971..0000000 --- a/packages/server/dist_test/api/factory/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/factory/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/index.js b/packages/server/dist_test/api/factory/index.js deleted file mode 100644 index c5ffc8d..0000000 --- a/packages/server/dist_test/api/factory/index.js +++ /dev/null @@ -1,7 +0,0 @@ -// Factory module - decomposed API factory into focused files -// Follows abstraction levels: L1 (atomic) -> L2 (composed) -> L3 (orchestration) -export { createAPI, createPublicAPI, filterPublicRouter } from "./api.js"; -export { createRouterProxy } from "./proxy.js"; -export { executeRoute } from "./route.js"; -export { executeProcedure } from "./procedure.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/index.js.map b/packages/server/dist_test/api/factory/index.js.map deleted file mode 100644 index 9664835..0000000 --- a/packages/server/dist_test/api/factory/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/factory/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,iFAAiF;AAEjF,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/plugins.d.ts b/packages/server/dist_test/api/factory/plugins.d.ts deleted file mode 100644 index 33cb4d3..0000000 --- a/packages/server/dist_test/api/factory/plugins.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { Plugin } from "../../types.js"; -export declare const applyPlugins: (ctx: Ctx, plugins: readonly Plugin[]) => Ctx; -//# sourceMappingURL=plugins.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/plugins.d.ts.map b/packages/server/dist_test/api/factory/plugins.d.ts.map deleted file mode 100644 index f625588..0000000 --- a/packages/server/dist_test/api/factory/plugins.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../../src/api/factory/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAM7C,eAAO,MAAM,YAAY,GAAI,GAAG,EAAE,KAAK,GAAG,EAAE,SAAS,SAAS,MAAM,CAAC,GAAG,CAAC,EAAE,KAAG,GAa7E,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/plugins.js b/packages/server/dist_test/api/factory/plugins.js deleted file mode 100644 index ab14ec4..0000000 --- a/packages/server/dist_test/api/factory/plugins.js +++ /dev/null @@ -1,16 +0,0 @@ -// ============================================================ -// L1: Plugin Application (Performance Rule) -// ============================================================ -export const applyPlugins = (ctx, plugins) => { - if (plugins.length === 0) - return ctx; - // L1: Clone once at start to guarantee immutability of original ctx - const extendedCtx = Object.assign({}, ctx); - // L2: Apply plugins using Object.assign (performance rule - no intermediate allocations) - for (let i = 0; i < plugins.length; i++) { - const extension = plugins[i].extend(extendedCtx); - Object.assign(extendedCtx, extension); - } - return extendedCtx; -}; -//# sourceMappingURL=plugins.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/plugins.js.map b/packages/server/dist_test/api/factory/plugins.js.map deleted file mode 100644 index f796248..0000000 --- a/packages/server/dist_test/api/factory/plugins.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../../src/api/factory/plugins.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,4CAA4C;AAC5C,+DAA+D;AAE/D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAM,GAAQ,EAAE,OAA+B,EAAO,EAAE;IAClF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAErC,oEAAoE;IACpE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAA8B,CAAQ,CAAC;IAE7E,yFAAyF;IACzF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,WAAsC,EAAE,SAAS,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/procedure.d.ts b/packages/server/dist_test/api/factory/procedure.d.ts deleted file mode 100644 index 3d0e367..0000000 --- a/packages/server/dist_test/api/factory/procedure.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type { Result } from "@deessejs/fp"; -import type { ExecuteProcedureContext } from "../types/internal.js"; -export declare const executeProcedure: (ctx: ExecuteProcedureContext) => Promise>; -//# sourceMappingURL=procedure.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/procedure.d.ts.map b/packages/server/dist_test/api/factory/procedure.d.ts.map deleted file mode 100644 index 4aaea5d..0000000 --- a/packages/server/dist_test/api/factory/procedure.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"procedure.d.ts","sourceRoot":"","sources":["../../../src/api/factory/procedure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAK3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAoGpE,eAAO,MAAM,gBAAgB,GAAU,GAAG,EAAE,IAAI,EAAE,MAAM,EACtD,KAAK,uBAAuB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,KAC9C,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CA6CxB,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/procedure.js b/packages/server/dist_test/api/factory/procedure.js deleted file mode 100644 index 31da0a0..0000000 --- a/packages/server/dist_test/api/factory/procedure.js +++ /dev/null @@ -1,100 +0,0 @@ -import { createHandlerContext } from "./send.js"; -import { validationFailed } from "../errors.js"; -import { createInternalErrorResult, createServerErrorResult } from "./errors.js"; -import { ServerException } from "../../errors/server-error.js"; -// ============================================================ -// L2: Procedure Execution with Hooks -// ============================================================ -const executeProcedureWithHooks = async (ctx, args, hookedProc, procedure, route, queue, eventEmitter) => { - // L1: Invoke beforeInvoke hook - if (hookedProc._hooks?.beforeInvoke) { - hookedProc._hooks.beforeInvoke(ctx, args); - } - try { - const result = await procedure.handler(ctx, args); - // L1: Invoke afterInvoke hook - if (hookedProc._hooks?.afterInvoke) { - hookedProc._hooks.afterInvoke(ctx, args, result); - } - if (result.ok) { - // L1: Invoke onSuccess hook - if (hookedProc._hooks?.onSuccess) { - hookedProc._hooks.onSuccess(ctx, args, result.value); - } - // L1: Flush queue on success - await queue.flush(eventEmitter); - } - else { - // L1: Invoke onError hook - if (hookedProc._hooks?.onError) { - hookedProc._hooks.onError(ctx, args, result.error); - } - } - return result; - } - catch (error) { - // L1: Invoke onError hook on exception - if (hookedProc._hooks?.onError) { - hookedProc._hooks.onError(ctx, args, error); - } - return createInternalErrorResult(error instanceof Error ? error.message : String(error), route); - } -}; -// ============================================================ -// L2: Middleware Chain Runner (with double-next protection) -// ============================================================ -const runMiddlewareChain = (allMiddleware, handlerCtx, args, finalInvoke) => { - let index = -1; - const next = async (overrides) => { - // L1: Double-next protection - validate index hasn't been reused - const nextIndex = index + 1; - if (nextIndex <= index) { - throw new Error(`Middleware safety violation: next() called multiple times at index ${index}`); - } - index = nextIndex; - const currentCtx = overrides?.ctx ? { ...handlerCtx, ...overrides.ctx } : handlerCtx; - if (index >= allMiddleware.length) { - return finalInvoke(); - } - const mw = allMiddleware[index]; - return mw.handler(currentCtx, { - next: (innerOverrides) => next(innerOverrides), - args, - meta: {}, - }); - }; - return next; -}; -// ============================================================ -// L3: Execute Procedure (main orchestration) -// ============================================================ -export const executeProcedure = async (ctx) => { - const { procedure, ctx: procedureCtx, args, middleware, eventEmitter, queue, route, plugins } = ctx; - const handlerCtx = createHandlerContext(procedureCtx, queue, plugins); - const hookedProc = procedure; - // L1: Validate args if schema exists - if (hookedProc.argsSchema) { - const parseResult = hookedProc.argsSchema.safeParse(args); - if (!parseResult.success) { - return validationFailed(route, parseResult.error.issues).mapErr((e) => e.addNotes(`Validation failed for route: ${route}`)); - } - } - const procedureMiddleware = hookedProc._middleware || []; - const allMiddleware = [...middleware, ...procedureMiddleware]; - // L2: Final invoke function - const finalInvoke = () => executeProcedureWithHooks(handlerCtx, args, hookedProc, procedure, route, queue, eventEmitter); - // L2: Run middleware chain - const runChain = runMiddlewareChain(allMiddleware, handlerCtx, args, finalInvoke); - try { - return await runChain(); - } - catch (error) { - queue.clear(); - if (error instanceof ServerException) { - return createServerErrorResult(error.code, error.message, route); - } - const errToReturn = error instanceof Error ? error : new Error(String(error)); - return createInternalErrorResult(errToReturn.message, route); - } -}; -//# sourceMappingURL=procedure.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/procedure.js.map b/packages/server/dist_test/api/factory/procedure.js.map deleted file mode 100644 index 879bc23..0000000 --- a/packages/server/dist_test/api/factory/procedure.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"procedure.js","sourceRoot":"","sources":["../../../src/api/factory/procedure.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/proxy.d.ts b/packages/server/dist_test/api/factory/proxy.d.ts deleted file mode 100644 index 1358bff..0000000 --- a/packages/server/dist_test/api/factory/proxy.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { RouterProxyContext } from "../types/internal.js"; -export declare const createRouterProxy: (proxyCtx: RouterProxyContext, path?: readonly string[]) => any; -//# sourceMappingURL=proxy.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/proxy.d.ts.map b/packages/server/dist_test/api/factory/proxy.d.ts.map deleted file mode 100644 index e41daf5..0000000 --- a/packages/server/dist_test/api/factory/proxy.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../src/api/factory/proxy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAQpF,eAAO,MAAM,iBAAiB,GAAI,GAAG,EACnC,UAAU,kBAAkB,CAAC,GAAG,CAAC,EACjC,OAAM,SAAS,MAAM,EAAO,KAE3B,GAoDF,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/proxy.js b/packages/server/dist_test/api/factory/proxy.js deleted file mode 100644 index 1135803..0000000 --- a/packages/server/dist_test/api/factory/proxy.js +++ /dev/null @@ -1,58 +0,0 @@ -import { none } from "@deessejs/fp"; -import { isProcedure } from "../../router/index.js"; -import { isValidSymbol, buildFullPath, isNoArgsProcedure } from "./utils.js"; -import { executeRoute } from "./route.js"; -// ============================================================ -// Router Proxy Creation (Memoized per instance) -// ============================================================ -export const createRouterProxy = (proxyCtx, path = [] -/* eslint-disable-next-line @typescript-eslint/no-explicit-any */ -) => { - const { router, ctx, globalMiddleware, rootRouter, eventEmitter, queue, plugins } = proxyCtx; - // L1: Memoization cache for this proxy instance (stability for React/useEffect) - const cache = new Map(); - return new Proxy({}, { - get(target, prop) { - // L2: Return cached result if exists (api.users === api.users) - if (cache.has(prop)) - return cache.get(prop); - if (!isValidSymbol(prop)) - return undefined; - if (typeof prop !== "string") - return none(); - const value = router[prop]; - if (value === undefined) - return none(); - let result; - if (isProcedure(value)) { - const fullPath = buildFullPath(path, prop); - // L2: Create routeCtx with rootRouter for proper procedure lookup - const routeCtx = { - router: rootRouter, - ctx, - globalMiddleware, - eventEmitter, - queue, - plugins, - }; - if (isNoArgsProcedure(value)) { - result = () => executeRoute(fullPath, undefined, routeCtx); - } - else { - result = (args) => executeRoute(fullPath, args, routeCtx); - } - } - else if (typeof value === "object" && value !== null) { - // L2: Nested proxy created once per path - result = createRouterProxy({ ...proxyCtx, router: value }, [...path, prop]); - } - else { - result = none(); - } - // L2: Cache the result for consistent references - cache.set(prop, result); - return result; - }, - }); -}; -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/proxy.js.map b/packages/server/dist_test/api/factory/proxy.js.map deleted file mode 100644 index bda86c1..0000000 --- a/packages/server/dist_test/api/factory/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/api/factory/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,+DAA+D;AAC/D,gDAAgD;AAChD,+DAA+D;AAE/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,QAAiC,EACjC,OAA0B,EAAE;AAC5B,iEAAiE;EAC5D,EAAE;IACP,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IAE7F,gFAAgF;IAChF,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAElD,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE;QACnB,GAAG,CAAC,MAAe,EAAE,IAAqB;YACxC,+DAA+D;YAC/D,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,EAAE,CAAC;YAE5C,MAAM,KAAK,GAAI,MAAkC,CAAC,IAAI,CAAC,CAAC;YACxD,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,IAAI,EAAE,CAAC;YAEvC,IAAI,MAAe,CAAC;YAEpB,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAE3C,kEAAkE;gBAClE,MAAM,QAAQ,GAA6B;oBACzC,MAAM,EAAE,UAAU;oBAClB,GAAG;oBACH,gBAAgB;oBAChB,YAAY;oBACZ,KAAK;oBACL,OAAO;iBACR,CAAC;gBAEF,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC7D,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACvD,yCAAyC;gBACzC,MAAM,GAAG,iBAAiB,CACxB,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAoB,EAAE,EAC7C,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAChB,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,IAAI,EAAE,CAAC;YAClB,CAAC;YAED,iDAAiD;YACjD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACxB,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/route.d.ts b/packages/server/dist_test/api/factory/route.d.ts deleted file mode 100644 index 970c492..0000000 --- a/packages/server/dist_test/api/factory/route.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type { Result } from "@deessejs/fp"; -import type { ExecuteRouteContext } from "../types/internal.js"; -export declare const executeRoute: (route: string, args: unknown, routeCtx: ExecuteRouteContext) => Promise>; -//# sourceMappingURL=route.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/route.d.ts.map b/packages/server/dist_test/api/factory/route.d.ts.map deleted file mode 100644 index 4e286ee..0000000 --- a/packages/server/dist_test/api/factory/route.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../src/api/factory/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,mBAAmB,EAA2B,MAAM,sBAAsB,CAAC;AASzF,eAAO,MAAM,YAAY,GAAU,GAAG,EACpC,OAAO,MAAM,EACb,MAAM,OAAO,EACb,UAAU,mBAAmB,CAAC,GAAG,CAAC,KACjC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAoCzB,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/route.js b/packages/server/dist_test/api/factory/route.js deleted file mode 100644 index ae46cef..0000000 --- a/packages/server/dist_test/api/factory/route.js +++ /dev/null @@ -1,38 +0,0 @@ -import { splitRoutePath, getProcedureFromPath } from "./utils.js"; -import { routeNotFound } from "../errors.js"; -import { executeProcedure } from "./procedure.js"; -// ============================================================ -// Route Execution (Performance Rule - Route Memoization) -// ============================================================ -export const executeRoute = async (route, args, routeCtx) => { - const { router, ctx, globalMiddleware, eventEmitter, queue, plugins, routeCache } = routeCtx; - // L2: Check cache first (O(1) lookup after first resolution) - let procedure; - if (routeCache) { - procedure = routeCache.get(route); - } - // L2: Resolve and cache if not found - if (!procedure) { - const pathParts = splitRoutePath(route); - procedure = getProcedureFromPath(router, pathParts); - if (procedure) { - // L2: Cache on first resolution (lazy caching per API instance) - routeCache?.set(route, procedure); - } - } - if (!procedure) { - return routeNotFound(route); - } - const procedureCtx = { - procedure, - ctx, - args, - middleware: globalMiddleware, - eventEmitter, - queue, - route, - plugins, - }; - return executeProcedure(procedureCtx); -}; -//# sourceMappingURL=route.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/route.js.map b/packages/server/dist_test/api/factory/route.js.map deleted file mode 100644 index ca2a5c9..0000000 --- a/packages/server/dist_test/api/factory/route.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../src/api/factory/route.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,+DAA+D;AAC/D,yDAAyD;AACzD,+DAA+D;AAE/D,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,KAAa,EACb,IAAa,EACb,QAAkC,EACR,EAAE;IAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;IAE7F,6DAA6D;IAC7D,IAAI,SAA2D,CAAC;IAChE,IAAI,UAAU,EAAE,CAAC;QACf,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACxC,SAAS,GAAG,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEpD,IAAI,SAAS,EAAE,CAAC;YACd,gEAAgE;YAChE,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,YAAY,GAAmD;QACnE,SAAS;QACT,GAAG;QACH,IAAI;QACJ,UAAU,EAAE,gBAAgB;QAC5B,YAAY;QACZ,KAAK;QACL,KAAK;QACL,OAAO;KACR,CAAC;IAEF,OAAO,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACxC,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/send.d.ts b/packages/server/dist_test/api/factory/send.d.ts deleted file mode 100644 index b42b50d..0000000 --- a/packages/server/dist_test/api/factory/send.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { Plugin, EventRegistry, SendOptions, HandlerContext } from "../../types.js"; -import type { EventQueue } from "../../events/queue.js"; -export declare const createSendFn: (queue: EventQueue) => (name: K, data: Events[K]["data"], options?: SendOptions) => void; -export declare const createHandlerContext: (ctx: Ctx, queue: EventQueue, plugins: readonly Plugin[]) => HandlerContext; -//# sourceMappingURL=send.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/send.d.ts.map b/packages/server/dist_test/api/factory/send.d.ts.map deleted file mode 100644 index 2c794a8..0000000 --- a/packages/server/dist_test/api/factory/send.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../../src/api/factory/send.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAaxD,eAAO,MAAM,YAAY,GAAI,MAAM,SAAS,aAAa,EACvD,OAAO,UAAU,MAEhB,CAAC,SAAS,MAAM,MAAM,EACrB,MAAM,CAAC,EACP,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EACvB,UAAU,WAAW,KACpB,IAQF,CAAC;AAEJ,eAAO,MAAM,oBAAoB,GAAI,GAAG,EAAE,MAAM,SAAS,aAAa,EACpE,KAAK,GAAG,EACR,OAAO,UAAU,EACjB,SAAS,SAAS,MAAM,CAAC,GAAG,CAAC,EAAE,KAC9B,cAAc,CAAC,GAAG,EAAE,MAAM,CAM5B,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/send.js b/packages/server/dist_test/api/factory/send.js deleted file mode 100644 index 739a127..0000000 --- a/packages/server/dist_test/api/factory/send.js +++ /dev/null @@ -1,24 +0,0 @@ -import { applyPlugins } from "./plugins.js"; -// ============================================================ -// Constants -// ============================================================ -const DEFAULT_NAMESPACE = "default"; -// ============================================================ -// L1: Handler Context Creation -// ============================================================ -export const createSendFn = (queue) => (name, data, options) => { - queue.enqueue({ - name: name, - data, - timestamp: new Date().toISOString(), - namespace: options?.namespace ?? DEFAULT_NAMESPACE, - options, - }); -}; -export const createHandlerContext = (ctx, queue, plugins) => { - const send = createSendFn(queue); - const extendedCtx = applyPlugins(ctx, plugins); - // Use Object.assign to help TypeScript infer the intersection type - return Object.assign(extendedCtx, { send }); -}; -//# sourceMappingURL=send.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/send.js.map b/packages/server/dist_test/api/factory/send.js.map deleted file mode 100644 index 0c76506..0000000 --- a/packages/server/dist_test/api/factory/send.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"send.js","sourceRoot":"","sources":["../../../src/api/factory/send.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,+DAA+D;AAC/D,YAAY;AACZ,+DAA+D;AAE/D,MAAM,iBAAiB,GAAG,SAAkB,CAAC;AAE7C,+DAA+D;AAC/D,+BAA+B;AAC/B,+DAA+D;AAE/D,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAAiB,EACjB,EAAE,CACF,CACE,IAAO,EACP,IAAuB,EACvB,OAAqB,EACf,EAAE;IACR,KAAK,CAAC,OAAO,CAAC;QACZ,IAAI,EAAE,IAAc;QACpB,IAAI;QACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,iBAAiB;QAClD,OAAO;KACR,CAAC,CAAC;AACL,CAAC,CAAC;AAEJ,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,GAAQ,EACR,KAAiB,EACjB,OAA+B,EACF,EAAE;IAC/B,MAAM,IAAI,GAAG,YAAY,CAAS,KAAK,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE/C,mEAAmE;IACnE,OAAO,MAAM,CAAC,MAAM,CAAC,WAAqB,EAAE,EAAE,IAAI,EAAE,CAAgC,CAAC;AACvF,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/utils.d.ts b/packages/server/dist_test/api/factory/utils.d.ts deleted file mode 100644 index dbdb44c..0000000 --- a/packages/server/dist_test/api/factory/utils.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { Router, Procedure } from "../../types.js"; -export declare const splitRoutePath: (route: string) => readonly string[]; -export declare const getProcedureFromPath: (router: Router, pathParts: readonly string[]) => Procedure | undefined; -export declare const isValidSymbol: (prop: string | symbol) => boolean; -export declare const getSymbolProperty: (prop: string | symbol) => unknown; -export declare const buildFullPath: (path: readonly string[], prop: string) => string; -export declare const isNoArgsProcedure: (procedure: unknown) => boolean; -//# sourceMappingURL=utils.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/utils.d.ts.map b/packages/server/dist_test/api/factory/utils.d.ts.map deleted file mode 100644 index 7f2c5de..0000000 --- a/packages/server/dist_test/api/factory/utils.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/api/factory/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAOxD,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,KAAG,SAAS,MAAM,EAAsB,CAAC;AAErF,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,MAAM,CAAC,OAAO,CAAC,EACvB,WAAW,SAAS,MAAM,EAAE,KAC3B,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,SAUzC,CAAC;AASF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,GAAG,MAAM,KAAG,OAKrD,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,GAAG,MAAM,KAAG,OAGzD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,MAAM,SAAS,MAAM,EAAE,EAAE,MAAM,MAAM,KAAG,MAC3C,CAAC;AAE5B,eAAO,MAAM,iBAAiB,GAAI,WAAW,OAAO,KAAG,OAGtD,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/utils.js b/packages/server/dist_test/api/factory/utils.js deleted file mode 100644 index f889ed6..0000000 --- a/packages/server/dist_test/api/factory/utils.js +++ /dev/null @@ -1,42 +0,0 @@ -import { none } from "@deessejs/fp"; -import { isProcedure } from "../../router/index.js"; -// ============================================================ -// L1: Atomic Operations -// ============================================================ -export const splitRoutePath = (route) => route.split("."); -export const getProcedureFromPath = (router, pathParts) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let current = router; - for (let i = 0; i < pathParts.length - 1; i++) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - current = current[pathParts[i]]; - if (!current) - return undefined; - } - const procedure = current[pathParts.at(-1)]; - return isProcedure(procedure) ? procedure : undefined; -}; -// Invalid symbols that Proxy's get trap will be called with -const INVALID_SYMBOLS = new Set([ - Symbol.toStringTag, - Symbol.iterator, - Symbol.toPrimitive, -]); -export const isValidSymbol = (prop) => { - // String properties are always valid - if (typeof prop === "string") - return true; - // Symbol properties are valid except for special internal ones - return !INVALID_SYMBOLS.has(prop); -}; -export const getSymbolProperty = (prop) => { - if (typeof prop !== "string") - return none(); - return none(); -}; -export const buildFullPath = (path, prop) => [...path, prop].join("."); -export const isNoArgsProcedure = (procedure) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return !procedure.argsSchema; -}; -//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/factory/utils.js.map b/packages/server/dist_test/api/factory/utils.js.map deleted file mode 100644 index 03a3ce2..0000000 --- a/packages/server/dist_test/api/factory/utils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/api/factory/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,+DAA+D;AAC/D,wBAAwB;AACxB,+DAA+D;AAE/D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAa,EAAqB,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAErF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,MAAuB,EACvB,SAA4B,EACsB,EAAE;IACpD,8DAA8D;IAC9D,IAAI,OAAO,GAA4B,MAAa,CAAC;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,8DAA8D;QAC9D,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAQ,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;IACjC,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IAC7C,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC,CAAC;AAEF,4DAA4D;AAC5D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,MAAM,CAAC,WAAW;IAClB,MAAM,CAAC,QAAQ;IACf,MAAM,CAAC,WAAW;CACnB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAqB,EAAW,EAAE;IAC9D,qCAAqC;IACrC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,+DAA+D;IAC/D,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAqB,EAAW,EAAE;IAClE,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,EAAE,CAAC;IAC5C,OAAO,IAAI,EAAE,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAuB,EAAE,IAAY,EAAU,EAAE,CAC7E,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE5B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAkB,EAAW,EAAE;IAC/D,8DAA8D;IAC9D,OAAO,CAAE,SAAiB,CAAC,UAAU,CAAC;AACxC,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/index.d.ts b/packages/server/dist_test/api/index.d.ts deleted file mode 100644 index 54ea6e7..0000000 --- a/packages/server/dist_test/api/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type { APIInstance, APIConfig, RequestInfo } from "./types/api.js"; -export type { ProcedureProxy, RouterProxy, TypedAPIInstance } from "./types/proxy.js"; -export type { APIInstanceState } from "./types/internal.js"; -export { createAPI, createPublicAPI, filterPublicRouter } from "./factory/index.js"; -export { RouteNotFoundError, ValidationError, MiddlewareError, InternalError, ServerError, routeNotFound, validationFailed, serverError, internalError, } from "./errors.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/index.d.ts.map b/packages/server/dist_test/api/index.d.ts.map deleted file mode 100644 index 4b1c875..0000000 --- a/packages/server/dist_test/api/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC1E,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtF,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,aAAa,EACb,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,aAAa,GACd,MAAM,aAAa,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/index.js b/packages/server/dist_test/api/index.js deleted file mode 100644 index 3f1b81d..0000000 --- a/packages/server/dist_test/api/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export { createAPI, createPublicAPI, filterPublicRouter } from "./factory/index.js"; -export { RouteNotFoundError, ValidationError, MiddlewareError, InternalError, ServerError, routeNotFound, validationFailed, serverError, internalError, } from "./errors.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/index.js.map b/packages/server/dist_test/api/index.js.map deleted file mode 100644 index d1f7b4c..0000000 --- a/packages/server/dist_test/api/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,aAAa,EACb,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,aAAa,GACd,MAAM,aAAa,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/types/api.d.ts b/packages/server/dist_test/api/types/api.d.ts deleted file mode 100644 index c3d5d90..0000000 --- a/packages/server/dist_test/api/types/api.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { EventEmitter } from "../../events/emitter.js"; -import type { Router } from "../../types.js"; -import type { Plugin, Middleware } from "../../types.js"; -export type EventEmitterAny = EventEmitter; -export type RequestInfo = Readonly<{ - headers?: Record; - method?: string; - url?: string; - [key: string]: unknown; -}>; -export type APIInstance> = Readonly<{ - router: TRoutes; - ctx: Ctx; - plugins: readonly Plugin[]; - globalMiddleware: readonly Middleware[]; - eventEmitter?: EventEmitterAny; -}>; -export type APIConfig> = Readonly<{ - router: TRoutes; - context?: unknown; - /** - * Factory function to create context per request. - * Receives optional RequestInfo (headers, method, url) for per-request context enrichment. - */ - createContext?: (requestInfo?: RequestInfo) => unknown; - plugins: readonly Plugin[]; - middleware: readonly Middleware[]; - eventEmitter?: EventEmitterAny; -}>; -//# sourceMappingURL=api.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/types/api.d.ts.map b/packages/server/dist_test/api/types/api.d.ts.map deleted file mode 100644 index 7e66ea7..0000000 --- a/packages/server/dist_test/api/types/api.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api/types/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAIzD,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,QAAQ,CAAC;IAClE,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,EAAE,SAAS,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAChC,gBAAgB,EAAE,SAAS,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7C,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC,CAAC,CAAC;AAEH,MAAM,MAAM,SAAS,CAAC,OAAO,SAAS,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,QAAQ,CAAC;IACrE,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC;IACvD,OAAO,EAAE,SAAS,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IACpC,UAAU,EAAE,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3C,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/types/api.js b/packages/server/dist_test/api/types/api.js deleted file mode 100644 index b350887..0000000 --- a/packages/server/dist_test/api/types/api.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=api.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/types/api.js.map b/packages/server/dist_test/api/types/api.js.map deleted file mode 100644 index 9864ec0..0000000 --- a/packages/server/dist_test/api/types/api.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/api/types/api.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/api/types/index.d.ts b/packages/server/dist_test/api/types/index.d.ts deleted file mode 100644 index 66c5fdc..0000000 --- a/packages/server/dist_test/api/types/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type { EventEmitterAny, APIInstance, APIConfig, RequestInfo } from "./api.js"; -export type { ProcedureProxy, RouterProxy, TypedAPIInstance, PublicRouter } from "./proxy.js"; -export type { ProcedureWithHooks, APIInstanceState, RouterProxyContext, ExecuteRouteContext, ExecuteProcedureContext, } from "./internal.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/types/index.d.ts.map b/packages/server/dist_test/api/types/index.d.ts.map deleted file mode 100644 index e5bc183..0000000 --- a/packages/server/dist_test/api/types/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/types/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGrF,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG9F,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,eAAe,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/types/index.js b/packages/server/dist_test/api/types/index.js deleted file mode 100644 index f8a711a..0000000 --- a/packages/server/dist_test/api/types/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/types/index.js.map b/packages/server/dist_test/api/types/index.js.map deleted file mode 100644 index 32ebcae..0000000 --- a/packages/server/dist_test/api/types/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/types/index.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/api/types/internal.d.ts b/packages/server/dist_test/api/types/internal.d.ts deleted file mode 100644 index 602db83..0000000 --- a/packages/server/dist_test/api/types/internal.d.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { Result } from "@deessejs/fp"; -import type { Middleware, Plugin, Router, Procedure, EventRegistry, HandlerContext } from "../../types.js"; -import type { EventEmitterAny } from "./api.js"; -import type { EventQueue } from "../../events/queue.js"; -export type ProcedureWithHooks = Readonly<{ - argsSchema?: Procedure["argsSchema"]; - _middleware?: readonly Middleware[]; - _hooks?: Readonly<{ - beforeInvoke?: (ctx: HandlerContext, args: Args) => void | Promise; - afterInvoke?: (ctx: HandlerContext, args: Args, result: Result) => void | Promise; - onSuccess?: (ctx: HandlerContext, args: Args, data: Output) => void | Promise; - onError?: (ctx: HandlerContext, args: Args, error: unknown) => void | Promise; - }>; - readonly type: Procedure["type"]; - readonly handler: Procedure["handler"]; -}>; -export type APIInstanceState> = Readonly<{ - router: TRoutes; - ctx: Ctx; - plugins: readonly Plugin[]; - globalMiddleware: readonly Middleware[]; - eventEmitter?: EventEmitterAny; -}>; -export type RouterProxyContext = Readonly<{ - readonly router: Router; - readonly ctx: Ctx; - readonly globalMiddleware: readonly Middleware[]; - readonly rootRouter: Router; - readonly eventEmitter: EventEmitterAny | undefined; - readonly queue: EventQueue; - readonly plugins: readonly Plugin[]; - readonly routeCache?: Map>; -}>; -export type ExecuteRouteContext = Readonly<{ - readonly router: Router; - readonly ctx: Ctx; - readonly globalMiddleware: readonly Middleware[]; - readonly eventEmitter: EventEmitterAny | undefined; - readonly queue: EventQueue; - readonly plugins: readonly Plugin[]; - readonly routeCache?: Map>; -}>; -export type ExecuteProcedureContext = Readonly<{ - readonly procedure: Procedure; - readonly ctx: Ctx; - readonly args: Args; - readonly middleware: readonly Middleware[]; - readonly eventEmitter: EventEmitterAny | undefined; - readonly queue: EventQueue; - readonly route: string; - readonly plugins: readonly Plugin[]; -}>; -//# sourceMappingURL=internal.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/types/internal.d.ts.map b/packages/server/dist_test/api/types/internal.d.ts.map deleted file mode 100644 index cff150f..0000000 --- a/packages/server/dist_test/api/types/internal.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../src/api/types/internal.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/server/dist_test/api/types/internal.js b/packages/server/dist_test/api/types/internal.js deleted file mode 100644 index 3dc0027..0000000 --- a/packages/server/dist_test/api/types/internal.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=internal.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/types/internal.js.map b/packages/server/dist_test/api/types/internal.js.map deleted file mode 100644 index c0c34a3..0000000 --- a/packages/server/dist_test/api/types/internal.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/api/types/internal.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/api/types/proxy.d.ts b/packages/server/dist_test/api/types/proxy.d.ts deleted file mode 100644 index 38d4860..0000000 --- a/packages/server/dist_test/api/types/proxy.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { Result } from "@deessejs/fp"; -import type { Router, Procedure } from "../../types.js"; -import type { APIInstance } from "./api.js"; -export type ProcedureProxy = [Args] extends [never] ? () => Promise> : (args: Args) => Promise>; -export type RouterProxy> = { - readonly [K in keyof Routes]: Routes[K] extends Procedure ? ProcedureProxy : Routes[K] extends Router ? RouterProxy : Routes[K]; -}; -export type TypedAPIInstance> = APIInstance & RouterProxy; -export type PublicRouter> = { - readonly [K in keyof TRoutes as TRoutes[K] extends Procedure ? TRoutes[K] extends { - type: "query" | "mutation"; - } ? K : never : K]: TRoutes[K] extends Router ? PublicRouter : TRoutes[K]; -}; -//# sourceMappingURL=proxy.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/api/types/proxy.d.ts.map b/packages/server/dist_test/api/types/proxy.d.ts.map deleted file mode 100644 index 486842c..0000000 --- a/packages/server/dist_test/api/types/proxy.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../src/api/types/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM5C,MAAM,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAClE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAC7B,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAG5C,MAAM,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI;IAC9D,QAAQ,EAAE,CAAC,IAAI,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,MAAM,MAAM,CAAC,GACpF,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GACjC,MAAM,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAChC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAC3B,MAAM,CAAC,CAAC,CAAC;CAChB,CAAC;AAGF,MAAM,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAG5H,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI;IAC3D,QAAQ,EAAE,CAAC,IAAI,MAAM,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GACvE,OAAO,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,OAAO,GAAG,UAAU,CAAA;KAAE,GAC/C,CAAC,GACD,KAAK,GACP,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GACvC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,CAAC;CACf,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/api/types/proxy.js b/packages/server/dist_test/api/types/proxy.js deleted file mode 100644 index 3531cb4..0000000 --- a/packages/server/dist_test/api/types/proxy.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/packages/server/dist_test/api/types/proxy.js.map b/packages/server/dist_test/api/types/proxy.js.map deleted file mode 100644 index f316032..0000000 --- a/packages/server/dist_test/api/types/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/api/types/proxy.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/context/builder.d.ts b/packages/server/dist_test/context/builder.d.ts deleted file mode 100644 index 852b4ab..0000000 --- a/packages/server/dist_test/context/builder.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { type EventRegistry, type Middleware, type Router } from "../types.js"; -import { QueryBuilder } from "../query/builder.js"; -import { type TypedAPIInstance } from "../api/types/proxy.js"; -import { type DefineContextConfig } from "./types.js"; -export declare function defineContext(config: DefineContextConfig): { - t: QueryBuilder; - createAPI: (apiConfig: { - router: Router; - middleware?: Middleware[]; - }) => TypedAPIInstance>; -}; -//# sourceMappingURL=builder.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/context/builder.d.ts.map b/packages/server/dist_test/context/builder.d.ts.map deleted file mode 100644 index 9065032..0000000 --- a/packages/server/dist_test/context/builder.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/context/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,aAAa,CAC3B,GAAG,EACH,MAAM,SAAS,aAAa,GAAG,aAAa,EAE5C,MAAM,EAAE,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,GACvC;IACD,CAAC,EAAE,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,EAAE,CAAC,SAAS,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAA;KAAE,KAAK,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;CACvH,CAuBA"} \ No newline at end of file diff --git a/packages/server/dist_test/context/builder.js b/packages/server/dist_test/context/builder.js deleted file mode 100644 index e811644..0000000 --- a/packages/server/dist_test/context/builder.js +++ /dev/null @@ -1,23 +0,0 @@ -import { QueryBuilder } from "../query/builder.js"; -import { EventEmitter } from "../events/emitter.js"; -import { createAPI } from "../api/factory/index.js"; -export function defineContext(config) { - const { context, createContext, plugins = [], events } = config; - const eventEmitter = events ? new EventEmitter(events) : undefined; - const initialContext = createContext ? createContext() : context; - /* eslint-disable @typescript-eslint/no-explicit-any */ - const t = new QueryBuilder(initialContext, eventEmitter); - /* eslint-enable @typescript-eslint/no-explicit-any */ - const createAPIFn = (apiConfig) => { - return createAPI({ - router: apiConfig.router, - context, - createContext, - plugins, - middleware: apiConfig.middleware, - eventEmitter, - }); - }; - return { t, createAPI: createAPIFn }; -} -//# sourceMappingURL=builder.js.map \ No newline at end of file diff --git a/packages/server/dist_test/context/builder.js.map b/packages/server/dist_test/context/builder.js.map deleted file mode 100644 index 6be6e28..0000000 --- a/packages/server/dist_test/context/builder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/context/builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAIpD,MAAM,UAAU,aAAa,CAI3B,MAAwC;IAKxC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEhE,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,YAAY,CAAS,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3E,MAAM,cAAc,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAEjE,uDAAuD;IACvD,MAAM,CAAC,GAAG,IAAI,YAAY,CAAc,cAAqB,EAAE,YAAmB,CAAC,CAAC;IACpF,sDAAsD;IAEtD,MAAM,WAAW,GAAG,CAAC,SAAkE,EAAE,EAAE;QACzF,OAAO,SAAS,CAAC;YACf,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,OAAO;YACP,aAAa;YACb,OAAO;YACP,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,YAAY;SACb,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AACvC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/context/index.d.ts b/packages/server/dist_test/context/index.d.ts deleted file mode 100644 index cd5b1ad..0000000 --- a/packages/server/dist_test/context/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { DefineContextConfig } from "./types.js"; -export { defineContext } from "./builder.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/context/index.d.ts.map b/packages/server/dist_test/context/index.d.ts.map deleted file mode 100644 index 5f97db1..0000000 --- a/packages/server/dist_test/context/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/context/index.js b/packages/server/dist_test/context/index.js deleted file mode 100644 index 3b71389..0000000 --- a/packages/server/dist_test/context/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { defineContext } from "./builder.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/context/index.js.map b/packages/server/dist_test/context/index.js.map deleted file mode 100644 index 0ad8711..0000000 --- a/packages/server/dist_test/context/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/context/types.d.ts b/packages/server/dist_test/context/types.d.ts deleted file mode 100644 index 034c4ff..0000000 --- a/packages/server/dist_test/context/types.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { type EventRegistry } from "../types.js"; -import { type RequestInfo } from "../api/types/api.js"; -import type { Plugin } from "../types.js"; -export interface DefineContextConfig { - context?: Ctx; - /** - * Factory function to create context per request. - * Receives optional RequestInfo (headers, method, url) for per-request context enrichment. - * Use this for extracting auth user from headers, request-specific data, etc. - */ - createContext?: (requestInfo?: RequestInfo) => Ctx; - plugins?: Plugin[]; - events?: Events; -} -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/context/types.d.ts.map b/packages/server/dist_test/context/types.d.ts.map deleted file mode 100644 index 1bb0e64..0000000 --- a/packages/server/dist_test/context/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/context/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,mBAAmB,CAAC,GAAG,EAAE,MAAM,SAAS,aAAa,GAAG,aAAa;IACpF,OAAO,CAAC,EAAE,GAAG,CAAC;IACd;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,KAAK,GAAG,CAAC;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"} \ No newline at end of file diff --git a/packages/server/dist_test/context/types.js b/packages/server/dist_test/context/types.js deleted file mode 100644 index 718fd38..0000000 --- a/packages/server/dist_test/context/types.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/server/dist_test/context/types.js.map b/packages/server/dist_test/context/types.js.map deleted file mode 100644 index 6f0cf2c..0000000 --- a/packages/server/dist_test/context/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/context/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/errors/index.d.ts b/packages/server/dist_test/errors/index.d.ts deleted file mode 100644 index 8edede2..0000000 --- a/packages/server/dist_test/errors/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { ServerError } from "./types.js"; -export { ok, err, ServerException, NotFoundException, UnauthorizedException, ValidationException, ErrorCodes, createErrorResult, } from "./server-error.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/errors/index.d.ts.map b/packages/server/dist_test/errors/index.d.ts.map deleted file mode 100644 index bbe0891..0000000 --- a/packages/server/dist_test/errors/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EACL,EAAE,EACF,GAAG,EACH,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,UAAU,EACV,iBAAiB,GAClB,MAAM,mBAAmB,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/errors/index.js b/packages/server/dist_test/errors/index.js deleted file mode 100644 index 17ac9dd..0000000 --- a/packages/server/dist_test/errors/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { ok, err, ServerException, NotFoundException, UnauthorizedException, ValidationException, ErrorCodes, createErrorResult, } from "./server-error.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/errors/index.js.map b/packages/server/dist_test/errors/index.js.map deleted file mode 100644 index dae59fe..0000000 --- a/packages/server/dist_test/errors/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,EAAE,EACF,GAAG,EACH,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,UAAU,EACV,iBAAiB,GAClB,MAAM,mBAAmB,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/errors/server-error.d.ts b/packages/server/dist_test/errors/server-error.d.ts deleted file mode 100644 index 0cf33fc..0000000 --- a/packages/server/dist_test/errors/server-error.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { type Result } from "@deessejs/fp"; -export { ok, err } from "@deessejs/fp"; -export declare class ServerException extends Error { - readonly code: string; - readonly statusCode: number; - readonly args: Readonly<{ - message: string; - data?: Record; - }>; - constructor(code: string, message: string, statusCode?: number, data?: Record); -} -export declare class NotFoundException extends ServerException { - constructor(message?: string); -} -export declare class UnauthorizedException extends ServerException { - constructor(message?: string); -} -export declare class ValidationException extends ServerException { - constructor(message: string); -} -export declare const ErrorCodes: { - readonly NOT_FOUND: "NOT_FOUND"; - readonly UNAUTHORIZED: "UNAUTHORIZED"; - readonly VALIDATION_ERROR: "VALIDATION_ERROR"; - readonly FORBIDDEN: "FORBIDDEN"; - readonly CONFLICT: "CONFLICT"; - readonly INTERNAL_ERROR: "INTERNAL_ERROR"; - readonly ROUTE_NOT_FOUND: "ROUTE_NOT_FOUND"; - readonly INVALID_ARGS: "INVALID_ARGS"; -}; -export declare function createErrorResult(code: string, message: string, data?: Record): Result; -//# sourceMappingURL=server-error.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/errors/server-error.d.ts.map b/packages/server/dist_test/errors/server-error.d.ts.map deleted file mode 100644 index 541c320..0000000 --- a/packages/server/dist_test/errors/server-error.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"server-error.d.ts","sourceRoot":"","sources":["../../src/errors/server-error.ts"],"names":[],"mappings":"AAEA,OAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEvC,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,IAAI,EAAE,QAAQ,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;gBAExE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,SAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAU5F;AAED,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,OAAO,SAAuB;CAI3C;AAED,qBAAa,qBAAsB,SAAQ,eAAe;gBAC5C,OAAO,SAAiB;CAIrC;AAED,qBAAa,mBAAoB,SAAQ,eAAe;gBAC1C,OAAO,EAAE,MAAM;CAI5B;AAMD,eAAO,MAAM,UAAU;;;;;;;;;CASb,CAAC;AA0CX,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAG9G"} \ No newline at end of file diff --git a/packages/server/dist_test/errors/server-error.js b/packages/server/dist_test/errors/server-error.js deleted file mode 100644 index 019e869..0000000 --- a/packages/server/dist_test/errors/server-error.js +++ /dev/null @@ -1,90 +0,0 @@ -import { error as errorFn, err as errFn } from "@deessejs/fp"; -export { ok, err } from "@deessejs/fp"; -export class ServerException extends Error { - code; - statusCode; - args; - constructor(code, message, statusCode = 500, data) { - const errData = createError(code, { message, data }); - super(message); - this.name = "ServerException"; - this.code = code; - this.statusCode = statusCode; - this.stack = errData.stack; - this.cause = errData.cause; - this.args = errData.args; - } -} -export class NotFoundException extends ServerException { - constructor(message = "Resource not found") { - super("NOT_FOUND", message, 404); - this.name = "NotFoundException"; - } -} -export class UnauthorizedException extends ServerException { - constructor(message = "Unauthorized") { - super("UNAUTHORIZED", message, 401); - this.name = "UnauthorizedException"; - } -} -export class ValidationException extends ServerException { - constructor(message) { - super("VALIDATION_ERROR", message, 400); - this.name = "ValidationException"; - } -} -// ============================================ -// Error Codes -// ============================================ -export const ErrorCodes = { - NOT_FOUND: "NOT_FOUND", - UNAUTHORIZED: "UNAUTHORIZED", - VALIDATION_ERROR: "VALIDATION_ERROR", - FORBIDDEN: "FORBIDDEN", - CONFLICT: "CONFLICT", - INTERNAL_ERROR: "INTERNAL_ERROR", - ROUTE_NOT_FOUND: "ROUTE_NOT_FOUND", - INVALID_ARGS: "INVALID_ARGS", -}; -// ============================================ -// Error Builder Helper -// ============================================ -const ERROR_BUILDERS = { - NOT_FOUND: errorFn({ - name: "NOT_FOUND", - message: (args) => args.message, - }), - FORBIDDEN: errorFn({ - name: "FORBIDDEN", - message: (args) => args.message, - }), - CONFLICT: errorFn({ - name: "CONFLICT", - message: (args) => args.message, - }), - INTERNAL_ERROR: errorFn({ - name: "INTERNAL_ERROR", - message: (args) => args.message, - }), - ROUTE_NOT_FOUND: errorFn({ - name: "ROUTE_NOT_FOUND", - message: (args) => args.message, - }), - VALIDATION_ERROR: errorFn({ - name: "VALIDATION_ERROR", - message: (args) => args.message, - }), -}; -function createError(name, args) { - const builder = ERROR_BUILDERS[name]; - if (builder) { - return builder(args); - } - return errorFn({ name, message: (a) => a.message })(args); -} -// Helper to create error result properly typed -export function createErrorResult(code, message, data) { - const err = createError(code, { message, data }); - return errFn(err); -} -//# sourceMappingURL=server-error.js.map \ No newline at end of file diff --git a/packages/server/dist_test/errors/server-error.js.map b/packages/server/dist_test/errors/server-error.js.map deleted file mode 100644 index 3557efc..0000000 --- a/packages/server/dist_test/errors/server-error.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"server-error.js","sourceRoot":"","sources":["../../src/errors/server-error.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/server/dist_test/errors/types.d.ts b/packages/server/dist_test/errors/types.d.ts deleted file mode 100644 index 32f3721..0000000 --- a/packages/server/dist_test/errors/types.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface ServerError { - code: string; - message: string; - data?: Record; -} -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/errors/types.d.ts.map b/packages/server/dist_test/errors/types.d.ts.map deleted file mode 100644 index 0900475..0000000 --- a/packages/server/dist_test/errors/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/errors/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC"} \ No newline at end of file diff --git a/packages/server/dist_test/errors/types.js b/packages/server/dist_test/errors/types.js deleted file mode 100644 index 718fd38..0000000 --- a/packages/server/dist_test/errors/types.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/server/dist_test/errors/types.js.map b/packages/server/dist_test/errors/types.js.map deleted file mode 100644 index 56d6991..0000000 --- a/packages/server/dist_test/errors/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/errors/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/events/dsl.d.ts b/packages/server/dist_test/events/dsl.d.ts deleted file mode 100644 index 9ef3ad7..0000000 --- a/packages/server/dist_test/events/dsl.d.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Event DSL (Domain-Specific Language) - * - * This module provides a fluent API for defining events with better type safety - * and namespace support. - */ -import { z } from "zod"; -/** - * Event definition interface - */ -export interface EventDefinition { - data?: unknown; -} -/** - * Wraps event args in the standard event structure. - * - * @example - * const eventDef = event({ args: z.object({ id: z.number(), name: z.string() }) }); - * // Returns: { data: z.object({ id: z.number(), name: z.string() }) } - */ -export declare function event({ args }: { - args: z.ZodType; -}): EventDefinition; -/** - * Event namespace helper type - represents an event with data - */ -export interface EventWithData { - data: T; -} -/** - * Groups events under a namespace without prefixing the keys. - * The outer key in defineEvents provides the namespace context. - * - * @example - * defineEvents({ - * user: eventNamespace({ name: "user", events: { - * created: event({ args: { id: number } }), - * updated: event({ args: { id: number, changes: Record } }), - * }), - * email: eventNamespace({ name: "email", events: { - * sent: event({ args: { to: string, template: string, subject: string } }), - * }), - * }); - * - * This produces an event registry with nested access: events.user.created - */ -export declare function eventNamespace>(config: { - name: N; - events: Events; -}): Events; -/** - * @deprecated Use eventNamespace instead - */ -export declare const eventsNamespace: typeof eventNamespace; -//# sourceMappingURL=dsl.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/events/dsl.d.ts.map b/packages/server/dist_test/events/dsl.d.ts.map deleted file mode 100644 index 8d07a83..0000000 --- a/packages/server/dist_test/events/dsl.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dsl.d.ts","sourceRoot":"","sources":["../../src/events/dsl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAA;CAAE,GAAG,eAAe,CAEpE;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,IAAI,EAAE,CAAC,CAAC;CACT;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAC5B,CAAC,SAAS,MAAM,EAChB,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAE9C,MAAM,EAAE;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC,MAAM,CAGR;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,uBAAiB,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/events/dsl.js b/packages/server/dist_test/events/dsl.js deleted file mode 100644 index a165a6a..0000000 --- a/packages/server/dist_test/events/dsl.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Event DSL (Domain-Specific Language) - * - * This module provides a fluent API for defining events with better type safety - * and namespace support. - */ -/** - * Wraps event args in the standard event structure. - * - * @example - * const eventDef = event({ args: z.object({ id: z.number(), name: z.string() }) }); - * // Returns: { data: z.object({ id: z.number(), name: z.string() }) } - */ -export function event({ args }) { - return { data: args }; -} -/** - * Groups events under a namespace without prefixing the keys. - * The outer key in defineEvents provides the namespace context. - * - * @example - * defineEvents({ - * user: eventNamespace({ name: "user", events: { - * created: event({ args: { id: number } }), - * updated: event({ args: { id: number, changes: Record } }), - * }), - * email: eventNamespace({ name: "email", events: { - * sent: event({ args: { to: string, template: string, subject: string } }), - * }), - * }); - * - * This produces an event registry with nested access: events.user.created - */ -export function eventNamespace(config) { - // Simply return the events object - the outer key provides namespace context - return config.events; -} -/** - * @deprecated Use eventNamespace instead - */ -export const eventsNamespace = eventNamespace; -//# sourceMappingURL=dsl.js.map \ No newline at end of file diff --git a/packages/server/dist_test/events/dsl.js.map b/packages/server/dist_test/events/dsl.js.map deleted file mode 100644 index bdff360..0000000 --- a/packages/server/dist_test/events/dsl.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dsl.js","sourceRoot":"","sources":["../../src/events/dsl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CAAC,EAAE,IAAI,EAAuB;IACjD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AASD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc,CAI5B,MAAmC;IAEnC,6EAA6E;IAC7E,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/events/emitter.d.ts b/packages/server/dist_test/events/emitter.d.ts deleted file mode 100644 index df6cffa..0000000 --- a/packages/server/dist_test/events/emitter.d.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { type EventRegistry, type EventPayload } from "../types.js"; -import { type Result, type Unit } from "@deessejs/fp"; -export declare class EventEmitter { - private listeners; - private eventLog; - private prefixIndex; - constructor(_events?: Events); - on(event: EventName, handler: (payload: EventPayload) => void | Promise): () => void; - off(event: EventName, handler: (payload: EventPayload) => void | Promise): void; - private removePatternFromIndex; - emit(event: EventName, data: Events[EventName]["data"]): Promise>; - emit(event: string, data: unknown, namespace?: string): Promise>; - getEventLog(): EventPayload[]; - clearEventLog(): void; - private getWildcardHandlers; - private addGlobalWildcardHandlers; - private addMatchingWildcardHandlers; - private isWildcardMatch; - private matchPrefix; - private matchSuffix; -} -export declare function defineEvents(events: Record): EventRegistry; -/** - * Flattens a nested event object into a flat EventRegistry. - * { user: { created: { data: T } } } => { "user.created": { data: T } } - * - * This is used internally to support the namespace DSL while - * maintaining backward compatibility with nested object access. - */ -export declare function flattenEvents(events: Events, prefix?: string): EventRegistry; -export type EventHandler = (event: { - name: EventName; - data: Events[EventName]["data"]; -}) => void | Promise; -//# sourceMappingURL=emitter.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/events/emitter.d.ts.map b/packages/server/dist_test/events/emitter.d.ts.map deleted file mode 100644 index 6dce937..0000000 --- a/packages/server/dist_test/events/emitter.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/events/emitter.ts"],"names":[],"mappings":"AAAA,OAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAwB,KAAK,MAAM,EAAE,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AAI5E,qBAAa,YAAY,CAAC,MAAM,SAAS,aAAa,GAAG,aAAa;IACpE,OAAO,CAAC,SAAS,CAAgF;IACjG,OAAO,CAAC,QAAQ,CAAsB;IAGtC,OAAO,CAAC,WAAW,CAAuC;gBAE9C,OAAO,CAAC,EAAE,MAAM;IAG5B,EAAE,CAAC,SAAS,SAAS,MAAM,MAAM,EAC/B,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClF,MAAM,IAAI;IAyBb,GAAG,CAAC,SAAS,SAAS,MAAM,MAAM,EAChC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClF,IAAI;IAgBP,OAAO,CAAC,sBAAsB;IAexB,IAAI,CAAC,SAAS,SAAS,MAAM,MAAM,EACvC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAqDnF,WAAW,IAAI,YAAY,EAAE;IAI7B,aAAa,IAAI,IAAI;IAIrB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,yBAAyB;IASjC,OAAO,CAAC,2BAA2B;IAwBnC,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,WAAW;CAUpB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAG3E;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,SAAS,aAAa,EACxD,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAW,GAClB,aAAa,CAef;AAED,MAAM,MAAM,YAAY,CAAC,MAAM,SAAS,aAAa,EAAE,SAAS,SAAS,MAAM,MAAM,IAAI,CACvF,KAAK,EAAE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;CAAE,KACxD,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/events/emitter.js b/packages/server/dist_test/events/emitter.js deleted file mode 100644 index 165e927..0000000 --- a/packages/server/dist_test/events/emitter.js +++ /dev/null @@ -1,212 +0,0 @@ -import { ok, err, unit, error } from "@deessejs/fp"; -const MAX_EVENT_LOG_SIZE = 1000; -export class EventEmitter { - listeners = new Map(); - eventLog = []; - // Prefix-based index for wildcard patterns: first segment -> set of patterns - // E.g., "user" -> Set of patterns like "user.*" - prefixIndex = new Map(); - constructor(_events) { - } - on(event, handler) { - const eventStr = event; - if (!this.listeners.has(eventStr)) { - this.listeners.set(eventStr, new Set()); - // Index wildcard patterns by their first segment - if (eventStr.endsWith(".*")) { - const firstSegment = eventStr.split(".")[0]; - if (firstSegment && firstSegment !== "*") { - if (!this.prefixIndex.has(firstSegment)) { - this.prefixIndex.set(firstSegment, new Set()); - } - this.prefixIndex.get(firstSegment).add(eventStr); - } - } - } - /* eslint-disable @typescript-eslint/no-explicit-any */ - this.listeners.get(eventStr).add(handler); - /* eslint-enable @typescript-eslint/no-explicit-any */ - // Return unsubscribe function - return () => { - this.off(event, handler); - }; - } - off(event, handler) { - const eventStr = event; - const handlers = this.listeners.get(eventStr); - if (handlers) { - /* eslint-disable @typescript-eslint/no-explicit-any */ - handlers.delete(handler); - /* eslint-enable @typescript-eslint/no-explicit-any */ - // If no more handlers for this pattern, remove from index - if (handlers.size === 0) { - this.listeners.delete(eventStr); - this.removePatternFromIndex(eventStr); - } - } - } - removePatternFromIndex(eventStr) { - if (!eventStr.endsWith(".*")) - return; - const firstSegment = eventStr.split(".")[0]; - if (!firstSegment || firstSegment === "*") - return; - const prefixSet = this.prefixIndex.get(firstSegment); - if (!prefixSet) - return; - prefixSet.delete(eventStr); - if (prefixSet.size === 0) { - this.prefixIndex.delete(firstSegment); - } - } - async emit(event, data, namespace) { - const eventName = event; - const handlers = this.listeners.get(eventName); - const wildcardHandlers = this.getWildcardHandlers(eventName); - // Merge regular and wildcard handlers - const allHandlers = new Set(); - if (handlers) { - for (const handler of handlers) { - allHandlers.add(handler); - } - } - for (const handler of wildcardHandlers) { - allHandlers.add(handler); - } - // Always log the event, even if there are no handlers - const payload = { - name: eventName, - data, - timestamp: new Date().toISOString(), - namespace: namespace ?? "default", - }; - this.eventLog.push(payload); - if (this.eventLog.length > MAX_EVENT_LOG_SIZE) { - this.eventLog.shift(); - } - // If no handlers, we're done - if (allHandlers.size === 0) - return ok(unit); - for (const handler of allHandlers) { - try { - const result = handler(payload); - if (result instanceof Promise) { - await result; - } - } - catch (error_) { - const errMsg = error_ instanceof Error ? error_.message : String(error_); - const fpErr = error({ name: "INTERNAL_ERROR", message: (_) => errMsg })({ message: errMsg }); - return err(fpErr); - } - } - return ok(unit); - } - getEventLog() { - return [...this.eventLog]; - } - clearEventLog() { - this.eventLog = []; - } - getWildcardHandlers(eventName) { - const handlers = new Set(); - this.addGlobalWildcardHandlers(handlers); - this.addMatchingWildcardHandlers(handlers, eventName); - return handlers; - } - addGlobalWildcardHandlers(handlers) { - const globalHandlers = this.listeners.get("*"); - if (globalHandlers) { - for (const handler of globalHandlers) { - handlers.add(handler); - } - } - } - addMatchingWildcardHandlers(handlers, eventName) { - const eventParts = eventName.split("."); - if (eventParts.length === 0) { - return; - } - const firstSegment = eventParts[0]; - const candidatePatterns = this.prefixIndex.get(firstSegment); - if (!candidatePatterns) { - return; - } - for (const pattern of candidatePatterns) { - if (this.isWildcardMatch(eventName, pattern)) { - const wildcardHandlers = this.listeners.get(pattern); - if (wildcardHandlers) { - for (const handler of wildcardHandlers) { - handlers.add(handler); - } - } - } - } - } - isWildcardMatch(eventName, pattern) { - if (pattern === "*") - return true; - if (pattern === eventName) - return true; - const eventParts = eventName.split("."); - // Check if pattern ends with ".*" (suffix wildcard) - if (pattern.endsWith(".*")) { - return this.matchPrefix(eventParts, pattern.slice(0, -2)); - } - // Check if pattern starts with "*." (leading wildcard) - if (pattern.startsWith("*.")) { - return this.matchSuffix(eventParts, pattern.slice(2)); - } - return false; - } - matchPrefix(eventParts, prefix) { - const prefixParts = prefix.split("."); - if (eventParts.length < prefixParts.length) - return false; - for (let i = 0; i < prefixParts.length; i++) { - if (prefixParts[i] !== eventParts[i]) - return false; - } - return true; - } - matchSuffix(eventParts, suffix) { - const suffixParts = suffix.split("."); - if (eventParts.length < suffixParts.length) - return false; - const offset = eventParts.length - suffixParts.length; - for (let i = 0; i < suffixParts.length; i++) { - if (suffixParts[i] !== eventParts[offset + i]) - return false; - } - return true; - } -} -export function defineEvents(events) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return flattenEvents(events); -} -/** - * Flattens a nested event object into a flat EventRegistry. - * { user: { created: { data: T } } } => { "user.created": { data: T } } - * - * This is used internally to support the namespace DSL while - * maintaining backward compatibility with nested object access. - */ -export function flattenEvents(events, prefix = "") { - const result = {}; - for (const key of Object.keys(events)) { - const fullKey = prefix ? `${prefix}.${key}` : key; - const value = events[key]; - // Check if value is an event definition (has 'data' property) or a namespace - if (value && typeof value === "object" && "data" in value && Object.keys(value).length <= 2) { - // This is an event definition (has data and optionally response) - result[fullKey] = value; - } - else if (value && typeof value === "object") { - // This is a namespace (nested object), recurse into it - Object.assign(result, flattenEvents(value, fullKey)); - } - } - return result; -} -//# sourceMappingURL=emitter.js.map \ No newline at end of file diff --git a/packages/server/dist_test/events/emitter.js.map b/packages/server/dist_test/events/emitter.js.map deleted file mode 100644 index a4fd070..0000000 --- a/packages/server/dist_test/events/emitter.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/events/emitter.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/server/dist_test/events/index.d.ts b/packages/server/dist_test/events/index.d.ts deleted file mode 100644 index fa8ecc7..0000000 --- a/packages/server/dist_test/events/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type { EventPayload } from "./types.js"; -export { EventEmitter, defineEvents, flattenEvents, EventHandler } from "./emitter.js"; -export { event, eventNamespace, eventsNamespace } from "./dsl.js"; -export type { PendingEventQueue } from "./queue.js"; -export { createPendingEventQueue } from "./queue.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/events/index.d.ts.map b/packages/server/dist_test/events/index.d.ts.map deleted file mode 100644 index d324f86..0000000 --- a/packages/server/dist_test/events/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAClE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/events/index.js b/packages/server/dist_test/events/index.js deleted file mode 100644 index 98b8481..0000000 --- a/packages/server/dist_test/events/index.js +++ /dev/null @@ -1,4 +0,0 @@ -export { EventEmitter, defineEvents, flattenEvents } from "./emitter.js"; -export { event, eventNamespace, eventsNamespace } from "./dsl.js"; -export { createPendingEventQueue } from "./queue.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/events/index.js.map b/packages/server/dist_test/events/index.js.map deleted file mode 100644 index 9e1dc31..0000000 --- a/packages/server/dist_test/events/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAgB,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAElE,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/events/queue.d.ts b/packages/server/dist_test/events/queue.d.ts deleted file mode 100644 index d77f3eb..0000000 --- a/packages/server/dist_test/events/queue.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { type PendingEvent } from "../types.js"; -import { type EventEmitter } from "./emitter.js"; -import type { Result, Unit } from "@deessejs/fp"; -export interface PendingEventQueue { - enqueue(event: PendingEvent): Result<{ - eventName: string; - data: unknown; - processed: boolean; - timestamp: string; - namespace: string; - }>; - flush(emitter: EventEmitter | undefined): Promise>; - clear(): void; - isEmpty(): boolean; - events(): PendingEvent[]; - size(): number; -} -export type EventQueue = PendingEventQueue; -export declare const createPendingEventQueue: () => PendingEventQueue; -//# sourceMappingURL=queue.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/events/queue.d.ts.map b/packages/server/dist_test/events/queue.d.ts.map deleted file mode 100644 index 9d74bef..0000000 --- a/packages/server/dist_test/events/queue.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/events/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGjD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrI,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,OAAO,CAAC;IACnB,MAAM,IAAI,YAAY,EAAE,CAAC;IACzB,IAAI,IAAI,MAAM,CAAC;CAChB;AAGD,MAAM,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAE3C,eAAO,MAAM,uBAAuB,QAAO,iBAwD1C,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/events/queue.js b/packages/server/dist_test/events/queue.js deleted file mode 100644 index 81b7422..0000000 --- a/packages/server/dist_test/events/queue.js +++ /dev/null @@ -1,54 +0,0 @@ -import { ok, err, unit, error } from "@deessejs/fp"; -export const createPendingEventQueue = () => { - let _events = []; - return { - enqueue: (event) => { - _events.push(event); - return ok({ - eventName: event.name, - data: event.data, - processed: true, - timestamp: event.timestamp, - namespace: event.namespace, - }); - }, - flush: async (emitter) => { - if (!emitter || _events.length === 0) { - _events = []; - return ok(unit); - } - let processedCount = 0; - try { - for (const event of _events) { - const result = await emitter.emit(event.name, event.data, event.namespace); - if (!result.ok) { - _events = _events.slice(processedCount); - return result; - } - processedCount++; - } - _events = []; - return ok(unit); - } - catch (error_) { - _events = _events.slice(processedCount); - const errMsg = error_ instanceof Error ? error_.message : String(error_); - const fpErr = error({ name: "INTERNAL_ERROR", message: (_) => errMsg })({ message: errMsg }); - return err(fpErr); - } - }, - clear: () => { - _events = []; - }, - isEmpty: () => { - return _events.length === 0; - }, - events: () => { - return [..._events]; - }, - size: () => { - return _events.length; - }, - }; -}; -//# sourceMappingURL=queue.js.map \ No newline at end of file diff --git a/packages/server/dist_test/events/queue.js.map b/packages/server/dist_test/events/queue.js.map deleted file mode 100644 index a94c72d..0000000 --- a/packages/server/dist_test/events/queue.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/events/queue.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAcpD,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAsB,EAAE;IAC7D,IAAI,OAAO,GAAmB,EAAE,CAAC;IAEjC,OAAO;QACL,OAAO,EAAE,CAAC,KAAmB,EAAE,EAAE;YAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,EAAE,CAAC;gBACR,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,KAAK,EAAE,KAAK,EAAE,OAAiC,EAAyB,EAAE;YACxE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,cAAc,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC;gBACH,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;oBAC3E,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;wBACf,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;wBACxC,OAAO,MAAM,CAAC;oBAChB,CAAC;oBACD,cAAc,EAAE,CAAC;gBACnB,CAAC;gBACD,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBACxC,MAAM,MAAM,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACzE,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACtG,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAED,KAAK,EAAE,GAAS,EAAE;YAChB,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;QAED,OAAO,EAAE,GAAY,EAAE;YACrB,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,EAAE,GAAmB,EAAE;YAC3B,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;QACtB,CAAC;QAED,IAAI,EAAE,GAAW,EAAE;YACjB,OAAO,OAAO,CAAC,MAAM,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/events/types.d.ts b/packages/server/dist_test/events/types.d.ts deleted file mode 100644 index e1a5c21..0000000 --- a/packages/server/dist_test/events/types.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type { EventRegistry, EventPayload } from "../types.js"; -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/events/types.d.ts.map b/packages/server/dist_test/events/types.d.ts.map deleted file mode 100644 index 40622c1..0000000 --- a/packages/server/dist_test/events/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/events/types.js b/packages/server/dist_test/events/types.js deleted file mode 100644 index 718fd38..0000000 --- a/packages/server/dist_test/events/types.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/server/dist_test/events/types.js.map b/packages/server/dist_test/events/types.js.map deleted file mode 100644 index e436193..0000000 --- a/packages/server/dist_test/events/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/hooks/executor.d.ts b/packages/server/dist_test/hooks/executor.d.ts deleted file mode 100644 index 485186e..0000000 --- a/packages/server/dist_test/hooks/executor.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type Result } from "@deessejs/fp"; -import { type BeforeInvokeHook } from "../types.js"; -import { type Hooks } from "./types.js"; -export declare function executeHooks(hooks: Hooks, ctx: Ctx, args: Args, result: Result): Promise; -export declare function executeBeforeInvoke(hook: BeforeInvokeHook | undefined, ctx: Ctx, args: Args): Promise; -//# sourceMappingURL=executor.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/hooks/executor.d.ts.map b/packages/server/dist_test/hooks/executor.d.ts.map deleted file mode 100644 index 36ec4d5..0000000 --- a/packages/server/dist_test/hooks/executor.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/hooks/executor.ts"],"names":[],"mappings":"AAAA,OAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAEzC,wBAAsB,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAClD,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,EAC/B,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GACrB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EACjD,IAAI,EAAE,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,SAAS,EAC7C,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,IAAI,CAAC,CAIf"} \ No newline at end of file diff --git a/packages/server/dist_test/hooks/executor.js b/packages/server/dist_test/hooks/executor.js deleted file mode 100644 index dd9f28d..0000000 --- a/packages/server/dist_test/hooks/executor.js +++ /dev/null @@ -1,23 +0,0 @@ -export async function executeHooks(hooks, ctx, args, result) { - // Call afterInvoke first (always runs) - if (hooks.afterInvoke) { - await hooks.afterInvoke(ctx, args, result); - } - // Then call onSuccess or onError based on result - if (result.ok) { - if (hooks.onSuccess) { - await hooks.onSuccess(ctx, args, result.value); - } - } - else { - if (hooks.onError) { - await hooks.onError(ctx, args, result.error); - } - } -} -export async function executeBeforeInvoke(hook, ctx, args) { - if (hook) { - await hook(ctx, args); - } -} -//# sourceMappingURL=executor.js.map \ No newline at end of file diff --git a/packages/server/dist_test/hooks/executor.js.map b/packages/server/dist_test/hooks/executor.js.map deleted file mode 100644 index 3722d4e..0000000 --- a/packages/server/dist_test/hooks/executor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/hooks/executor.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAA+B,EAC/B,GAAQ,EACR,IAAU,EACV,MAAsB;IAEtB,uCAAuC;IACvC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,iDAAiD;IACjD,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAA6C,EAC7C,GAAQ,EACR,IAAU;IAEV,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;AACH,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/hooks/index.d.ts b/packages/server/dist_test/hooks/index.d.ts deleted file mode 100644 index 8554389..0000000 --- a/packages/server/dist_test/hooks/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { Hooks } from "./types.js"; -export { executeHooks, executeBeforeInvoke } from "./executor.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/hooks/index.d.ts.map b/packages/server/dist_test/hooks/index.d.ts.map deleted file mode 100644 index 7829787..0000000 --- a/packages/server/dist_test/hooks/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/hooks/index.js b/packages/server/dist_test/hooks/index.js deleted file mode 100644 index 7ed24a1..0000000 --- a/packages/server/dist_test/hooks/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { executeHooks, executeBeforeInvoke } from "./executor.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/hooks/index.js.map b/packages/server/dist_test/hooks/index.js.map deleted file mode 100644 index eae2764..0000000 --- a/packages/server/dist_test/hooks/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/hooks/types.d.ts b/packages/server/dist_test/hooks/types.d.ts deleted file mode 100644 index bf0b0dc..0000000 --- a/packages/server/dist_test/hooks/types.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { type BeforeInvokeHook } from "../types.js"; -export interface Hooks { - beforeInvoke?: BeforeInvokeHook; - afterInvoke?: import("../types.js").AfterInvokeHook; - onSuccess?: import("../types.js").OnSuccessHook; - onError?: import("../types.js").OnErrorHook; -} -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/hooks/types.d.ts.map b/packages/server/dist_test/hooks/types.d.ts.map deleted file mode 100644 index 4eed7c9..0000000 --- a/packages/server/dist_test/hooks/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":"AAAA,OAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM;IACtC,YAAY,CAAC,EAAE,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,OAAO,aAAa,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACvE,SAAS,CAAC,EAAE,OAAO,aAAa,EAAE,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAEnE,OAAO,CAAC,EAAE,OAAO,aAAa,EAAE,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;CAC7D"} \ No newline at end of file diff --git a/packages/server/dist_test/hooks/types.js b/packages/server/dist_test/hooks/types.js deleted file mode 100644 index 718fd38..0000000 --- a/packages/server/dist_test/hooks/types.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/server/dist_test/hooks/types.js.map b/packages/server/dist_test/hooks/types.js.map deleted file mode 100644 index c660c10..0000000 --- a/packages/server/dist_test/hooks/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/index.d.ts b/packages/server/dist_test/index.d.ts deleted file mode 100644 index bcc48d9..0000000 --- a/packages/server/dist_test/index.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -export { defineContext } from "./context/index.js"; -export { createAPI, createPublicAPI } from "./api/index.js"; -export { QueryBuilder } from "./query/index.js"; -export type { Result } from "@deessejs/fp"; -export type { Query, Mutation, InternalQuery, InternalMutation, Procedure, Router, Middleware, Plugin, BeforeInvokeHook, AfterInvokeHook, OnSuccessHook, OnErrorHook, EventRegistry, EventPayload, SendOptions, PendingEvent, } from "./types.js"; -export { plugin } from "./types.js"; -export { EventEmitter, defineEvents } from "./events/index.js"; -export type { EventHandler } from "./events/index.js"; -export { event, eventNamespace, eventsNamespace } from "./events/index.js"; -export { isRouter, isProcedure, resolvePath, flattenRouter, getPublicRoutes, getInternalRoutes, } from "./router/index.js"; -export type { RouterConfig, ValidationResult } from "./router/index.js"; -export { executeHooks, executeBeforeInvoke } from "./hooks/index.js"; -export { withMetadata, type Metadata, } from "./procedure/index.js"; -export { createMiddleware } from "./middleware/builder.js"; -export { withQuery, withMutation } from "./middleware/helpers.js"; -export type { QueryConfig } from "./query/types.js"; -export type { MutationConfig } from "./mutation/types.js"; -export type { InternalQueryConfig } from "./internal-query/types.js"; -export type { InternalMutationConfig } from "./internal-mutation/types.js"; -export type { RequestInfo } from "./api/types/api.js"; -export { ok, err, ServerError, ServerException, NotFoundException, UnauthorizedException, ValidationException, ErrorCodes, } from "./errors/index.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/index.d.ts.map b/packages/server/dist_test/index.d.ts.map deleted file mode 100644 index 0cac14b..0000000 --- a/packages/server/dist_test/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,YAAY,EACV,KAAK,EACL,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,MAAM,EACN,UAAU,EACV,MAAM,EACN,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGpC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAG3E,OAAO,EACL,QAAQ,EACR,WAAW,EACX,WAAW,EACX,aAAa,EACb,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGxE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGrE,OAAO,EACL,YAAY,EACZ,KAAK,QAAQ,GACd,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGlE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,YAAY,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAG3E,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,EACL,EAAE,EACF,GAAG,EACH,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,UAAU,GACX,MAAM,mBAAmB,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/index.js b/packages/server/dist_test/index.js deleted file mode 100644 index cb93cd4..0000000 --- a/packages/server/dist_test/index.js +++ /dev/null @@ -1,23 +0,0 @@ -// ============================================ -// Main Exports -// ============================================ -// Core functions -export { defineContext } from "./context/index.js"; -export { createAPI, createPublicAPI } from "./api/index.js"; -export { QueryBuilder } from "./query/index.js"; -export { plugin } from "./types.js"; -// Events -export { EventEmitter, defineEvents } from "./events/index.js"; -export { event, eventNamespace, eventsNamespace } from "./events/index.js"; -// Router helpers -export { isRouter, isProcedure, resolvePath, flattenRouter, getPublicRoutes, getInternalRoutes, } from "./router/index.js"; -// Hooks -export { executeHooks, executeBeforeInvoke } from "./hooks/index.js"; -// Procedures -export { withMetadata, } from "./procedure/index.js"; -// Middleware -export { createMiddleware } from "./middleware/builder.js"; -export { withQuery, withMutation } from "./middleware/helpers.js"; -// Errors -export { ok, err, ServerException, NotFoundException, UnauthorizedException, ValidationException, ErrorCodes, } from "./errors/index.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/index.js.map b/packages/server/dist_test/index.js.map deleted file mode 100644 index fb9424c..0000000 --- a/packages/server/dist_test/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,eAAe;AACf,+CAA+C;AAE/C,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAwBhD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE3E,iBAAiB;AACjB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,WAAW,EACX,aAAa,EACb,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAErE,aAAa;AACb,OAAO,EACL,YAAY,GAEb,MAAM,sBAAsB,CAAC;AAE9B,aAAa;AACb,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAWlE,SAAS;AACT,OAAO,EACL,EAAE,EACF,GAAG,EAEH,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,UAAU,GACX,MAAM,mBAAmB,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/internal-mutation/builder.d.ts b/packages/server/dist_test/internal-mutation/builder.d.ts deleted file mode 100644 index cfb3fdf..0000000 --- a/packages/server/dist_test/internal-mutation/builder.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { type InternalMutation, type Middleware } from "../types.js"; -import { type InternalMutationConfig } from "./types.js"; -import { type BeforeInvokeHook, type AfterInvokeHook, type OnSuccessHook, type OnErrorHook } from "../types.js"; -export type InternalMutationWithHooks = InternalMutation & HookedProcedureMixin; -export declare function createInternalMutationWithHooks(config: InternalMutationConfig): InternalMutationWithHooks; -interface HookedProcedureMixin { - type: "query" | "mutation" | "internalQuery" | "internalMutation"; - beforeInvoke(hook: BeforeInvokeHook): this; - afterInvoke(hook: AfterInvokeHook): this; - onSuccess(hook: OnSuccessHook): this; - onError(hook: OnErrorHook): this; - use(middleware: Middleware): this; - _hooks: { - beforeInvoke?: BeforeInvokeHook; - afterInvoke?: AfterInvokeHook; - onSuccess?: OnSuccessHook; - onError?: OnErrorHook; - }; - _middleware: Middleware[]; -} -export {}; -//# sourceMappingURL=builder.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/internal-mutation/builder.d.ts.map b/packages/server/dist_test/internal-mutation/builder.d.ts.map deleted file mode 100644 index 5281947..0000000 --- a/packages/server/dist_test/internal-mutation/builder.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/internal-mutation/builder.ts"],"names":[],"mappings":"AAEA,OAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACtE,OAAQ,EAAE,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAQ,EACN,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,yBAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,IAAI,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAC5F,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAE1C,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAC/D,MAAM,EAAE,sBAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAChD,yBAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAQ9C;AAGD,UAAU,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM;IAC9C,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,eAAe,GAAG,kBAAkB,CAAC;IAClE,YAAY,CAAC,IAAI,EAAE,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;IACtD,WAAW,CAAC,IAAI,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5D,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACxD,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IACjD,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACvC,MAAM,EAAE;QACN,YAAY,CAAC,EAAE,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3C,WAAW,CAAC,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACjD,SAAS,CAAC,EAAE,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,CAAC,EAAE,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;KACvC,CAAC;IACF,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;CAChC"} \ No newline at end of file diff --git a/packages/server/dist_test/internal-mutation/builder.js b/packages/server/dist_test/internal-mutation/builder.js deleted file mode 100644 index 5f01ecc..0000000 --- a/packages/server/dist_test/internal-mutation/builder.js +++ /dev/null @@ -1,90 +0,0 @@ -export function createInternalMutationWithHooks(config) { - return createHookedProcedure({ - type: "internalMutation", - argsSchema: config.args, - /* eslint-disable @typescript-eslint/no-explicit-any */ - handler: config.handler, - /* eslint-enable @typescript-eslint/no-explicit-any */ - }); -} -function createHookedProcedure(proc) { - const hookedProc = { - type: proc.type, - argsSchema: proc.argsSchema, - handler: proc.handler, - _hooks: {}, - _middleware: [], - }; - hookedProc.beforeInvoke = function (hook) { - hookedProc._hooks.beforeInvoke = hook; - return hookedProc; - }; - hookedProc.afterInvoke = function (hook) { - hookedProc._hooks.afterInvoke = hook; - return hookedProc; - }; - hookedProc.onSuccess = function (hook) { - hookedProc._hooks.onSuccess = hook; - return hookedProc; - }; - hookedProc.onError = function (hook) { - hookedProc._hooks.onError = hook; - return hookedProc; - }; - hookedProc.use = function (middleware) { - const newProc = { - type: hookedProc.type, - argsSchema: hookedProc.argsSchema, - handler: hookedProc.handler, - _hooks: { ...hookedProc._hooks }, - _middleware: [...hookedProc._middleware, middleware], - }; - newProc.beforeInvoke = function (hook) { - newProc._hooks.beforeInvoke = hook; - return newProc; - }; - newProc.afterInvoke = function (hook) { - newProc._hooks.afterInvoke = hook; - return newProc; - }; - newProc.onSuccess = function (hook) { - newProc._hooks.onSuccess = hook; - return newProc; - }; - newProc.onError = function (hook) { - newProc._hooks.onError = hook; - return newProc; - }; - newProc.use = function (mw) { - const result = { - type: newProc.type, - argsSchema: newProc.argsSchema, - handler: newProc.handler, - _hooks: { ...newProc._hooks }, - _middleware: [...newProc._middleware, mw], - }; - result.beforeInvoke = function (hook) { - result._hooks.beforeInvoke = hook; - return result; - }; - result.afterInvoke = function (hook) { - result._hooks.afterInvoke = hook; - return result; - }; - result.onSuccess = function (hook) { - result._hooks.onSuccess = hook; - return result; - }; - result.onError = function (hook) { - result._hooks.onError = hook; - return result; - }; - result.use = newProc.use; - return result; - }; - return newProc; - }; - return hookedProc; -} -/* eslint-enable @typescript-eslint/no-explicit-any */ -//# sourceMappingURL=builder.js.map \ No newline at end of file diff --git a/packages/server/dist_test/internal-mutation/builder.js.map b/packages/server/dist_test/internal-mutation/builder.js.map deleted file mode 100644 index c777573..0000000 --- a/packages/server/dist_test/internal-mutation/builder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/internal-mutation/builder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/server/dist_test/internal-mutation/index.d.ts b/packages/server/dist_test/internal-mutation/index.d.ts deleted file mode 100644 index 916b853..0000000 --- a/packages/server/dist_test/internal-mutation/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { InternalMutationConfig } from "./types.js"; -export { createInternalMutationWithHooks, InternalMutationWithHooks } from "./builder.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/internal-mutation/index.d.ts.map b/packages/server/dist_test/internal-mutation/index.d.ts.map deleted file mode 100644 index 2021dfb..0000000 --- a/packages/server/dist_test/internal-mutation/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/internal-mutation/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/internal-mutation/index.js b/packages/server/dist_test/internal-mutation/index.js deleted file mode 100644 index 50b3507..0000000 --- a/packages/server/dist_test/internal-mutation/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { createInternalMutationWithHooks } from "./builder.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/internal-mutation/index.js.map b/packages/server/dist_test/internal-mutation/index.js.map deleted file mode 100644 index 4250d35..0000000 --- a/packages/server/dist_test/internal-mutation/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/internal-mutation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,+BAA+B,EAA6B,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/internal-mutation/types.d.ts b/packages/server/dist_test/internal-mutation/types.d.ts deleted file mode 100644 index 7a48ef7..0000000 --- a/packages/server/dist_test/internal-mutation/types.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; -import { type HandlerContext, type EventRegistry } from "../types.js"; -export interface InternalMutationConfig { - args?: ZodType; - handler: (ctx: HandlerContext, args: Args) => Promise>; -} -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/internal-mutation/types.d.ts.map b/packages/server/dist_test/internal-mutation/types.d.ts.map deleted file mode 100644 index 4126629..0000000 --- a/packages/server/dist_test/internal-mutation/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/internal-mutation/types.ts"],"names":[],"mappings":"AAAA,OAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AACpC,OAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEvE,MAAM,WAAW,sBAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,SAAS,aAAa,GAAG,aAAa;IACrG,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;CACpF"} \ No newline at end of file diff --git a/packages/server/dist_test/internal-mutation/types.js b/packages/server/dist_test/internal-mutation/types.js deleted file mode 100644 index 718fd38..0000000 --- a/packages/server/dist_test/internal-mutation/types.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/server/dist_test/internal-mutation/types.js.map b/packages/server/dist_test/internal-mutation/types.js.map deleted file mode 100644 index 267962b..0000000 --- a/packages/server/dist_test/internal-mutation/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/internal-mutation/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/internal-query/builder.d.ts b/packages/server/dist_test/internal-query/builder.d.ts deleted file mode 100644 index 5fc99c6..0000000 --- a/packages/server/dist_test/internal-query/builder.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { type InternalQuery, type Middleware } from "../types.js"; -import { type InternalQueryConfig } from "./types.js"; -import { type BeforeInvokeHook, type AfterInvokeHook, type OnSuccessHook, type OnErrorHook } from "../types.js"; -export type InternalQueryWithHooks = InternalQuery & HookedProcedureMixin; -export declare function createInternalQueryWithHooks(config: InternalQueryConfig): InternalQueryWithHooks; -interface HookedProcedureMixin { - type: "query" | "mutation" | "internalQuery" | "internalMutation"; - beforeInvoke(hook: BeforeInvokeHook): this; - afterInvoke(hook: AfterInvokeHook): this; - onSuccess(hook: OnSuccessHook): this; - onError(hook: OnErrorHook): this; - use(middleware: Middleware): this; - _hooks: { - beforeInvoke?: BeforeInvokeHook; - afterInvoke?: AfterInvokeHook; - onSuccess?: OnSuccessHook; - onError?: OnErrorHook; - }; - _middleware: Middleware[]; -} -export {}; -//# sourceMappingURL=builder.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/internal-query/builder.d.ts.map b/packages/server/dist_test/internal-query/builder.d.ts.map deleted file mode 100644 index 6f874c1..0000000 --- a/packages/server/dist_test/internal-query/builder.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/internal-query/builder.ts"],"names":[],"mappings":"AACA,OAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACnE,OAAQ,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAQ,EACN,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,sBAAsB,CAAC,GAAG,EAAE,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAChF,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAG1C,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,EACtD,MAAM,EAAE,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,GACvC,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAKrC;AAED,UAAU,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM;IAC9C,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,eAAe,GAAG,kBAAkB,CAAC;IAClE,YAAY,CAAC,IAAI,EAAE,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;IACtD,WAAW,CAAC,IAAI,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5D,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACxD,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IACjD,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACvC,MAAM,EAAE;QACN,YAAY,CAAC,EAAE,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3C,WAAW,CAAC,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACjD,SAAS,CAAC,EAAE,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,CAAC,EAAE,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;KACvC,CAAC;IACF,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;CAChC"} \ No newline at end of file diff --git a/packages/server/dist_test/internal-query/builder.js b/packages/server/dist_test/internal-query/builder.js deleted file mode 100644 index b1a0fa9..0000000 --- a/packages/server/dist_test/internal-query/builder.js +++ /dev/null @@ -1,88 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -export function createInternalQueryWithHooks(config) { - return createHookedProcedure({ - type: "internalQuery", - handler: config.handler, - }); -} -function createHookedProcedure(proc) { - const hookedProc = { - type: proc.type, - argsSchema: proc.argsSchema, - handler: proc.handler, - _hooks: {}, - _middleware: [], - }; - hookedProc.beforeInvoke = function (hook) { - hookedProc._hooks.beforeInvoke = hook; - return hookedProc; - }; - hookedProc.afterInvoke = function (hook) { - hookedProc._hooks.afterInvoke = hook; - return hookedProc; - }; - hookedProc.onSuccess = function (hook) { - hookedProc._hooks.onSuccess = hook; - return hookedProc; - }; - hookedProc.onError = function (hook) { - hookedProc._hooks.onError = hook; - return hookedProc; - }; - hookedProc.use = function (middleware) { - const newProc = { - type: hookedProc.type, - argsSchema: hookedProc.argsSchema, - handler: hookedProc.handler, - _hooks: { ...hookedProc._hooks }, - _middleware: [...hookedProc._middleware, middleware], - }; - newProc.beforeInvoke = function (hook) { - newProc._hooks.beforeInvoke = hook; - return newProc; - }; - newProc.afterInvoke = function (hook) { - newProc._hooks.afterInvoke = hook; - return newProc; - }; - newProc.onSuccess = function (hook) { - newProc._hooks.onSuccess = hook; - return newProc; - }; - newProc.onError = function (hook) { - newProc._hooks.onError = hook; - return newProc; - }; - newProc.use = function (mw) { - const result = { - type: newProc.type, - argsSchema: newProc.argsSchema, - handler: newProc.handler, - _hooks: { ...newProc._hooks }, - _middleware: [...newProc._middleware, mw], - }; - result.beforeInvoke = function (hook) { - result._hooks.beforeInvoke = hook; - return result; - }; - result.afterInvoke = function (hook) { - result._hooks.afterInvoke = hook; - return result; - }; - result.onSuccess = function (hook) { - result._hooks.onSuccess = hook; - return result; - }; - result.onError = function (hook) { - result._hooks.onError = hook; - return result; - }; - result.use = newProc.use; - return result; - }; - return newProc; - }; - return hookedProc; -} -/* eslint-enable @typescript-eslint/no-explicit-any */ -//# sourceMappingURL=builder.js.map \ No newline at end of file diff --git a/packages/server/dist_test/internal-query/builder.js.map b/packages/server/dist_test/internal-query/builder.js.map deleted file mode 100644 index af3d578..0000000 --- a/packages/server/dist_test/internal-query/builder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/internal-query/builder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/server/dist_test/internal-query/index.d.ts b/packages/server/dist_test/internal-query/index.d.ts deleted file mode 100644 index 482f6d1..0000000 --- a/packages/server/dist_test/internal-query/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { InternalQueryConfig } from "./types.js"; -export { createInternalQueryWithHooks, InternalQueryWithHooks } from "./builder.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/internal-query/index.d.ts.map b/packages/server/dist_test/internal-query/index.d.ts.map deleted file mode 100644 index 492794c..0000000 --- a/packages/server/dist_test/internal-query/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/internal-query/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/internal-query/index.js b/packages/server/dist_test/internal-query/index.js deleted file mode 100644 index 557fccb..0000000 --- a/packages/server/dist_test/internal-query/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { createInternalQueryWithHooks } from "./builder.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/internal-query/index.js.map b/packages/server/dist_test/internal-query/index.js.map deleted file mode 100644 index 6e932de..0000000 --- a/packages/server/dist_test/internal-query/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/internal-query/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAA0B,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/internal-query/types.d.ts b/packages/server/dist_test/internal-query/types.d.ts deleted file mode 100644 index 2cf18c6..0000000 --- a/packages/server/dist_test/internal-query/types.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type Result } from "@deessejs/fp"; -import { type HandlerContext, type EventRegistry } from "../types.js"; -export interface InternalQueryConfig { - handler: (ctx: HandlerContext) => Promise>; -} -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/internal-query/types.d.ts.map b/packages/server/dist_test/internal-query/types.d.ts.map deleted file mode 100644 index ee44fda..0000000 --- a/packages/server/dist_test/internal-query/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/internal-query/types.ts"],"names":[],"mappings":"AAAA,OAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEvE,MAAM,WAAW,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAS,aAAa,GAAG,aAAa;IAC5F,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;CACxE"} \ No newline at end of file diff --git a/packages/server/dist_test/internal-query/types.js b/packages/server/dist_test/internal-query/types.js deleted file mode 100644 index 718fd38..0000000 --- a/packages/server/dist_test/internal-query/types.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/server/dist_test/internal-query/types.js.map b/packages/server/dist_test/internal-query/types.js.map deleted file mode 100644 index 7bad731..0000000 --- a/packages/server/dist_test/internal-query/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/internal-query/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/middleware/builder.d.ts b/packages/server/dist_test/middleware/builder.d.ts deleted file mode 100644 index e1a9ae3..0000000 --- a/packages/server/dist_test/middleware/builder.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { type Middleware } from "../types.js"; -export declare function createMiddleware(config: Middleware): Middleware; -//# sourceMappingURL=builder.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/middleware/builder.d.ts.map b/packages/server/dist_test/middleware/builder.d.ts.map deleted file mode 100644 index 29e70f4..0000000 --- a/packages/server/dist_test/middleware/builder.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/middleware/builder.ts"],"names":[],"mappings":"AAAA,OAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAEhG"} \ No newline at end of file diff --git a/packages/server/dist_test/middleware/builder.js b/packages/server/dist_test/middleware/builder.js deleted file mode 100644 index 22e5d1b..0000000 --- a/packages/server/dist_test/middleware/builder.js +++ /dev/null @@ -1,4 +0,0 @@ -export function createMiddleware(config) { - return config; -} -//# sourceMappingURL=builder.js.map \ No newline at end of file diff --git a/packages/server/dist_test/middleware/builder.js.map b/packages/server/dist_test/middleware/builder.js.map deleted file mode 100644 index 036482e..0000000 --- a/packages/server/dist_test/middleware/builder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/middleware/builder.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAY,MAA6B;IACvE,OAAO,MAAM,CAAC;AAChB,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/middleware/helpers.d.ts b/packages/server/dist_test/middleware/helpers.d.ts deleted file mode 100644 index cd962c5..0000000 --- a/packages/server/dist_test/middleware/helpers.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { type Middleware } from "../types.js"; -import { type QueryWithHooks } from "../query/types.js"; -import { type MutationWithHooks } from "../mutation/builder.js"; -/** - * Apply middleware to a query - */ -export declare function withQuery(query: QueryWithHooks): QueryWithHooks; -/** - * Apply middleware to a query - */ -export declare function withQuery(query: QueryWithHooks, middleware: Middleware): QueryWithHooks; -/** - * Apply middleware to a query using a function transformer (curried form) - */ -export declare function withQuery(fn: (q: QueryWithHooks) => QueryWithHooks): (query: QueryWithHooks) => QueryWithHooks; -/** - * Apply middleware to a mutation - */ -export declare function withMutation(mutation: MutationWithHooks): MutationWithHooks; -/** - * Apply middleware to a mutation - */ -export declare function withMutation(mutation: MutationWithHooks, middleware: Middleware): MutationWithHooks; -/** - * Apply middleware to a mutation using a function transformer (curried form) - */ -export declare function withMutation(fn: (m: MutationWithHooks) => MutationWithHooks): (mutation: MutationWithHooks) => MutationWithHooks; -//# sourceMappingURL=helpers.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/middleware/helpers.d.ts.map b/packages/server/dist_test/middleware/helpers.d.ts.map deleted file mode 100644 index 4995737..0000000 --- a/packages/server/dist_test/middleware/helpers.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/middleware/helpers.ts"],"names":[],"mappings":"AAAA,OAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAQ,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EACzC,KAAK,EAAE,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GACvC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAErC;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EACzC,KAAK,EAAE,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,EACxC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,GAC1B,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAErC;;GAEG;AAEH,wBAAgB,SAAS,CAAC,GAAG,EAC3B,EAAE,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GACtE,CAAC,KAAK,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAqB3E;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAC5C,QAAQ,EAAE,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAC7C,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAExC;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAC5C,QAAQ,EAAE,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,EAC9C,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,GAC1B,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAExC;;GAEG;AAEH,wBAAgB,YAAY,CAAC,GAAG,EAC9B,EAAE,EAAE,CAAC,CAAC,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAC5E,CAAC,QAAQ,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/middleware/helpers.js b/packages/server/dist_test/middleware/helpers.js deleted file mode 100644 index 4567561..0000000 --- a/packages/server/dist_test/middleware/helpers.js +++ /dev/null @@ -1,31 +0,0 @@ -export function withQuery(queryOrFn, middlewareOrFn) { - // Curried form: withQuery((q) => q.use(admin)) - if (typeof queryOrFn === "function" && middlewareOrFn === undefined) { - return queryOrFn; - } - // Middleware function transformer: withQuery(query, (q) => q.use(admin)) - if (typeof middlewareOrFn === "function") { - return middlewareOrFn(queryOrFn); - } - // Middleware: withQuery(query, adminMiddleware) - if (middlewareOrFn) { - return queryOrFn.use(middlewareOrFn); - } - return queryOrFn; -} -export function withMutation(mutationOrFn, middlewareOrFn) { - // Curried form: withMutation((m) => m.use(admin)) - if (typeof mutationOrFn === "function" && middlewareOrFn === undefined) { - return mutationOrFn; - } - // Middleware function transformer: withMutation(mutation, (m) => m.use(admin)) - if (typeof middlewareOrFn === "function") { - return middlewareOrFn(mutationOrFn); - } - // Middleware: withMutation(mutation, adminMiddleware) - if (middlewareOrFn) { - return mutationOrFn.use(middlewareOrFn); - } - return mutationOrFn; -} -//# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/packages/server/dist_test/middleware/helpers.js.map b/packages/server/dist_test/middleware/helpers.js.map deleted file mode 100644 index dceca5c..0000000 --- a/packages/server/dist_test/middleware/helpers.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/middleware/helpers.ts"],"names":[],"mappings":"AA2BA,MAAM,UAAU,SAAS,CACvB,SAAc,EACd,cAAoB;IAEpB,+CAA+C;IAC/C,IAAI,OAAO,SAAS,KAAK,UAAU,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACpE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,yEAAyE;IACzE,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;QACzC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IACD,gDAAgD;IAChD,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAyBD,MAAM,UAAU,YAAY,CAC1B,YAAiB,EACjB,cAAoB;IAEpB,kDAAkD;IAClD,IAAI,OAAO,YAAY,KAAK,UAAU,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACvE,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,+EAA+E;IAC/E,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;QACzC,OAAO,cAAc,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IACD,sDAAsD;IACtD,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/middleware/index.d.ts b/packages/server/dist_test/middleware/index.d.ts deleted file mode 100644 index 78fbb3d..0000000 --- a/packages/server/dist_test/middleware/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { Middleware } from "./types.js"; -export { createMiddleware } from "./builder.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/middleware/index.d.ts.map b/packages/server/dist_test/middleware/index.d.ts.map deleted file mode 100644 index ff849ed..0000000 --- a/packages/server/dist_test/middleware/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/middleware/index.js b/packages/server/dist_test/middleware/index.js deleted file mode 100644 index 212e030..0000000 --- a/packages/server/dist_test/middleware/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { createMiddleware } from "./builder.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/middleware/index.js.map b/packages/server/dist_test/middleware/index.js.map deleted file mode 100644 index f87ff79..0000000 --- a/packages/server/dist_test/middleware/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/middleware/types.d.ts b/packages/server/dist_test/middleware/types.d.ts deleted file mode 100644 index 1ffd63f..0000000 --- a/packages/server/dist_test/middleware/types.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type { Middleware } from "../types.js"; -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/middleware/types.d.ts.map b/packages/server/dist_test/middleware/types.d.ts.map deleted file mode 100644 index 19d6961..0000000 --- a/packages/server/dist_test/middleware/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/middleware/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/middleware/types.js b/packages/server/dist_test/middleware/types.js deleted file mode 100644 index 718fd38..0000000 --- a/packages/server/dist_test/middleware/types.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/server/dist_test/middleware/types.js.map b/packages/server/dist_test/middleware/types.js.map deleted file mode 100644 index 9eec043..0000000 --- a/packages/server/dist_test/middleware/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/middleware/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/mutation/builder.d.ts b/packages/server/dist_test/mutation/builder.d.ts deleted file mode 100644 index 7fb0c05..0000000 --- a/packages/server/dist_test/mutation/builder.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { type Mutation } from "../types.js"; -import { type MutationConfig } from "./types.js"; -import { type BeforeInvokeHook, type AfterInvokeHook, type OnSuccessHook, type OnErrorHook, type ProcedureType, type Middleware } from "../types.js"; -export type MutationWithHooks = Mutation & HookedProcedureMixin; -export declare function createMutationWithHooks(config: MutationConfig): MutationWithHooks; -interface HookedProcedureMixin { - type: ProcedureType; - beforeInvoke(hook: BeforeInvokeHook): this; - afterInvoke(hook: AfterInvokeHook): this; - onSuccess(hook: OnSuccessHook): this; - onError(hook: OnErrorHook): this; - use(middleware: Middleware): this; - _hooks: { - beforeInvoke?: BeforeInvokeHook; - afterInvoke?: AfterInvokeHook; - onSuccess?: OnSuccessHook; - onError?: OnErrorHook; - }; - _middleware: Middleware[]; -} -export {}; -//# sourceMappingURL=builder.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/mutation/builder.d.ts.map b/packages/server/dist_test/mutation/builder.d.ts.map deleted file mode 100644 index 20c8f84..0000000 --- a/packages/server/dist_test/mutation/builder.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/mutation/builder.ts"],"names":[],"mappings":"AAEA,OAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAClD,OAAQ,EACN,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAC5E,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAE1C,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EACvD,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GACxC,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAMtC;AAGD,UAAU,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM;IAC9C,IAAI,EAAE,aAAa,CAAC;IACpB,YAAY,CAAC,IAAI,EAAE,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;IACtD,WAAW,CAAC,IAAI,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5D,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACxD,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IACjD,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACvC,MAAM,EAAE;QACN,YAAY,CAAC,EAAE,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3C,WAAW,CAAC,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACjD,SAAS,CAAC,EAAE,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,CAAC,EAAE,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;KACvC,CAAC;IACF,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;CAChC"} \ No newline at end of file diff --git a/packages/server/dist_test/mutation/builder.js b/packages/server/dist_test/mutation/builder.js deleted file mode 100644 index c7cf79a..0000000 --- a/packages/server/dist_test/mutation/builder.js +++ /dev/null @@ -1,88 +0,0 @@ -export function createMutationWithHooks(config) { - return createHookedProcedure({ - type: "mutation", - argsSchema: config.args, - handler: config.handler, - }); -} -function createHookedProcedure(proc) { - const hookedProc = { - type: proc.type, - argsSchema: proc.argsSchema, - handler: proc.handler, - _hooks: {}, - _middleware: [], - }; - hookedProc.beforeInvoke = function (hook) { - hookedProc._hooks.beforeInvoke = hook; - return hookedProc; - }; - hookedProc.afterInvoke = function (hook) { - hookedProc._hooks.afterInvoke = hook; - return hookedProc; - }; - hookedProc.onSuccess = function (hook) { - hookedProc._hooks.onSuccess = hook; - return hookedProc; - }; - hookedProc.onError = function (hook) { - hookedProc._hooks.onError = hook; - return hookedProc; - }; - hookedProc.use = function (middleware) { - const newProc = { - type: hookedProc.type, - argsSchema: hookedProc.argsSchema, - handler: hookedProc.handler, - _hooks: { ...hookedProc._hooks }, - _middleware: [...hookedProc._middleware, middleware], - }; - newProc.beforeInvoke = function (hook) { - newProc._hooks.beforeInvoke = hook; - return newProc; - }; - newProc.afterInvoke = function (hook) { - newProc._hooks.afterInvoke = hook; - return newProc; - }; - newProc.onSuccess = function (hook) { - newProc._hooks.onSuccess = hook; - return newProc; - }; - newProc.onError = function (hook) { - newProc._hooks.onError = hook; - return newProc; - }; - newProc.use = function (mw) { - const result = { - type: newProc.type, - argsSchema: newProc.argsSchema, - handler: newProc.handler, - _hooks: { ...newProc._hooks }, - _middleware: [...newProc._middleware, mw], - }; - result.beforeInvoke = function (hook) { - result._hooks.beforeInvoke = hook; - return result; - }; - result.afterInvoke = function (hook) { - result._hooks.afterInvoke = hook; - return result; - }; - result.onSuccess = function (hook) { - result._hooks.onSuccess = hook; - return result; - }; - result.onError = function (hook) { - result._hooks.onError = hook; - return result; - }; - result.use = newProc.use; - return result; - }; - return newProc; - }; - return hookedProc; -} -/* eslint-enable @typescript-eslint/no-explicit-any */ -//# sourceMappingURL=builder.js.map \ No newline at end of file diff --git a/packages/server/dist_test/mutation/builder.js.map b/packages/server/dist_test/mutation/builder.js.map deleted file mode 100644 index 4f0fe42..0000000 --- a/packages/server/dist_test/mutation/builder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/mutation/builder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/server/dist_test/mutation/index.d.ts b/packages/server/dist_test/mutation/index.d.ts deleted file mode 100644 index f1a429b..0000000 --- a/packages/server/dist_test/mutation/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { MutationConfig } from "./types.js"; -export { createMutationWithHooks, MutationWithHooks } from "./builder.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/mutation/index.d.ts.map b/packages/server/dist_test/mutation/index.d.ts.map deleted file mode 100644 index 8451cb3..0000000 --- a/packages/server/dist_test/mutation/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mutation/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/mutation/index.js b/packages/server/dist_test/mutation/index.js deleted file mode 100644 index d890574..0000000 --- a/packages/server/dist_test/mutation/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { createMutationWithHooks } from "./builder.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/mutation/index.js.map b/packages/server/dist_test/mutation/index.js.map deleted file mode 100644 index 8d18ed8..0000000 --- a/packages/server/dist_test/mutation/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mutation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAqB,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/mutation/types.d.ts b/packages/server/dist_test/mutation/types.d.ts deleted file mode 100644 index eda4a79..0000000 --- a/packages/server/dist_test/mutation/types.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; -import { type HandlerContext, type EventRegistry } from "../types.js"; -export interface MutationConfig { - args?: ZodType; - handler: (ctx: HandlerContext, args: Args) => Promise>; -} -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/mutation/types.d.ts.map b/packages/server/dist_test/mutation/types.d.ts.map deleted file mode 100644 index 3ff8b93..0000000 --- a/packages/server/dist_test/mutation/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mutation/types.ts"],"names":[],"mappings":"AAAA,OAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AACpC,OAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEvE,MAAM,WAAW,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,SAAS,aAAa,GAAG,aAAa;IAC7F,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;CACpF"} \ No newline at end of file diff --git a/packages/server/dist_test/mutation/types.js b/packages/server/dist_test/mutation/types.js deleted file mode 100644 index 718fd38..0000000 --- a/packages/server/dist_test/mutation/types.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/server/dist_test/mutation/types.js.map b/packages/server/dist_test/mutation/types.js.map deleted file mode 100644 index 78020cd..0000000 --- a/packages/server/dist_test/mutation/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mutation/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/procedure/index.d.ts b/packages/server/dist_test/procedure/index.d.ts deleted file mode 100644 index ad1f7fb..0000000 --- a/packages/server/dist_test/procedure/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { withMetadata, type Metadata } from "./types.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/procedure/index.d.ts.map b/packages/server/dist_test/procedure/index.d.ts.map deleted file mode 100644 index 74662e4..0000000 --- a/packages/server/dist_test/procedure/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/procedure/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/procedure/index.js b/packages/server/dist_test/procedure/index.js deleted file mode 100644 index a962979..0000000 --- a/packages/server/dist_test/procedure/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { withMetadata } from "./types.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/procedure/index.js.map b/packages/server/dist_test/procedure/index.js.map deleted file mode 100644 index 56e264a..0000000 --- a/packages/server/dist_test/procedure/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/procedure/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAiB,MAAM,YAAY,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/procedure/types.d.ts b/packages/server/dist_test/procedure/types.d.ts deleted file mode 100644 index cf0b130..0000000 --- a/packages/server/dist_test/procedure/types.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface Metadata { - keys?: string[]; - invalidate?: string[]; -} -export declare function withMetadata(value: Output, metadata: Metadata): Output & Metadata; -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/procedure/types.d.ts.map b/packages/server/dist_test/procedure/types.d.ts.map deleted file mode 100644 index 1e3889e..0000000 --- a/packages/server/dist_test/procedure/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/procedure/types.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,MAAM,EACjC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,GACjB,MAAM,GAAG,QAAQ,CAEnB"} \ No newline at end of file diff --git a/packages/server/dist_test/procedure/types.js b/packages/server/dist_test/procedure/types.js deleted file mode 100644 index 5ad053c..0000000 --- a/packages/server/dist_test/procedure/types.js +++ /dev/null @@ -1,7 +0,0 @@ -// ============================================ -// Metadata helpers -// ============================================ -export function withMetadata(value, metadata) { - return Object.assign({}, value, metadata); -} -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/server/dist_test/procedure/types.js.map b/packages/server/dist_test/procedure/types.js.map deleted file mode 100644 index 99c655b..0000000 --- a/packages/server/dist_test/procedure/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/procedure/types.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,mBAAmB;AACnB,+CAA+C;AAO/C,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,QAAkB;IAElB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/query/builder.d.ts b/packages/server/dist_test/query/builder.d.ts deleted file mode 100644 index b77a680..0000000 --- a/packages/server/dist_test/query/builder.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { type EventRegistry, type Middleware, type Router } from "../types.js"; -import { type EventEmitter } from "../events/emitter.js"; -import { type QueryConfig, type QueryWithHooks } from "./types.js"; -import { type MutationConfig, type MutationWithHooks } from "../mutation/index.js"; -import { type InternalQueryConfig, type InternalQueryWithHooks } from "../internal-query/index.js"; -import { type InternalMutationConfig, type InternalMutationWithHooks } from "../internal-mutation/index.js"; -export declare class QueryBuilder { - private context; - private eventEmitter?; - constructor(context: Ctx, eventEmitter?: EventEmitter | undefined); - query(config: QueryConfig): QueryWithHooks; - mutation(config: MutationConfig): MutationWithHooks; - internalQuery(config: InternalQueryConfig): InternalQueryWithHooks; - internalMutation(config: InternalMutationConfig): InternalMutationWithHooks; - router>(routes: Routes): Routes; - middleware(config: Middleware): Middleware; - on(event: EventName, handler: (ctx: Ctx, payload: { - name: string; - data: Events[EventName]["data"]; - }) => void | Promise): () => void; -} -export type { QueryWithHooks } from "./types.js"; -export type { MutationWithHooks } from "../mutation/builder.js"; -export type { InternalQueryWithHooks } from "../internal-query/builder.js"; -export type { InternalMutationWithHooks } from "../internal-mutation/builder.js"; -export declare function createQueryBuilder(context: Ctx, eventEmitter?: EventEmitter): QueryBuilder; -//# sourceMappingURL=builder.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/query/builder.d.ts.map b/packages/server/dist_test/query/builder.d.ts.map deleted file mode 100644 index 8dcb50c..0000000 --- a/packages/server/dist_test/query/builder.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/query/builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmC,KAAK,aAAa,EAAsB,KAAK,UAAU,EAAE,KAAK,MAAM,EAAqB,MAAM,aAAa,CAAC;AAEvJ,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACnG,OAAO,EAAE,KAAK,sBAAsB,EAAE,KAAK,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE5G,qBAAa,YAAY,CAAC,GAAG,EAAE,MAAM,SAAS,aAAa,GAAG,aAAa;IAEvE,OAAO,CAAC,OAAO;IAEf,OAAO,CAAC,YAAY,CAAC;gBAFb,OAAO,EAAE,GAAG,EAEZ,YAAY,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,YAAA;IAI1C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC;IAUtG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC;IAW/G,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC;IAQ5G,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAC3B,MAAM,EAAE,sBAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GACxD,yBAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC;IAU/C,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAI1D,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC;IAItE,EAAE,CAAC,SAAS,SAAS,MAAM,MAAM,EAC/B,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACtG,MAAM,IAAI;CAUd;AAED,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,YAAY,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEjF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,SAAS,aAAa,GAAG,aAAa,EAClF,OAAO,EAAE,GAAG,EAEZ,YAAY,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,GAE/B,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAE3B"} \ No newline at end of file diff --git a/packages/server/dist_test/query/builder.js b/packages/server/dist_test/query/builder.js deleted file mode 100644 index 63ed9f9..0000000 --- a/packages/server/dist_test/query/builder.js +++ /dev/null @@ -1,151 +0,0 @@ -export class QueryBuilder { - context; - eventEmitter; - constructor(context, - /* eslint-disable @typescript-eslint/no-explicit-any */ - eventEmitter - /* eslint-enable @typescript-eslint/no-explicit-any */ - ) { - this.context = context; - this.eventEmitter = eventEmitter; - } - query(config) { - return createHookedProcedure({ - type: "query", - argsSchema: config.args, - /* eslint-disable @typescript-eslint/no-explicit-any */ - handler: config.handler, - /* eslint-enable @typescript-eslint/no-explicit-any */ - }); - } - mutation(config) { - return createHookedProcedure({ - type: "mutation", - argsSchema: config.args, - /* eslint-disable @typescript-eslint/no-explicit-any */ - handler: config.handler, - /* eslint-enable @typescript-eslint/no-explicit-any */ - }); - } - /* eslint-disable @typescript-eslint/no-explicit-any */ - internalQuery(config) { - return createHookedProcedure({ - type: "internalQuery", - handler: config.handler, - }); - } - /* eslint-enable @typescript-eslint/no-explicit-any */ - internalMutation(config) { - return createHookedProcedure({ - type: "internalMutation", - argsSchema: config.args, - /* eslint-disable @typescript-eslint/no-explicit-any */ - handler: config.handler, - /* eslint-enable @typescript-eslint/no-explicit-any */ - }); - } - router(routes) { - return routes; - } - middleware(config) { - return config; - } - on(event, handler) { - if (!this.eventEmitter) { - return () => { }; - } - // Wrap the handler to pass context (this.context) as the first argument - const wrappedHandler = (payload) => { - return handler(this.context, payload); - }; - return this.eventEmitter.on(event, wrappedHandler); - } -} -export function createQueryBuilder(context, -/* eslint-disable @typescript-eslint/no-explicit-any */ -eventEmitter -/* eslint-enable @typescript-eslint/no-explicit-any */ -) { - return new QueryBuilder(context, eventEmitter); -} -function createHookedProcedure(proc) { - const hookedProc = { - type: proc.type, - argsSchema: proc.argsSchema, - handler: proc.handler, - _hooks: {}, - _middleware: [], - }; - hookedProc.beforeInvoke = function (hook) { - hookedProc._hooks.beforeInvoke = hook; - return hookedProc; - }; - hookedProc.afterInvoke = function (hook) { - hookedProc._hooks.afterInvoke = hook; - return hookedProc; - }; - hookedProc.onSuccess = function (hook) { - hookedProc._hooks.onSuccess = hook; - return hookedProc; - }; - hookedProc.onError = function (hook) { - hookedProc._hooks.onError = hook; - return hookedProc; - }; - hookedProc.use = function (middleware) { - const newProc = { - type: hookedProc.type, - argsSchema: hookedProc.argsSchema, - handler: hookedProc.handler, - _hooks: { ...hookedProc._hooks }, - _middleware: [...hookedProc._middleware, middleware], - }; - newProc.beforeInvoke = function (hook) { - newProc._hooks.beforeInvoke = hook; - return newProc; - }; - newProc.afterInvoke = function (hook) { - newProc._hooks.afterInvoke = hook; - return newProc; - }; - newProc.onSuccess = function (hook) { - newProc._hooks.onSuccess = hook; - return newProc; - }; - newProc.onError = function (hook) { - newProc._hooks.onError = hook; - return newProc; - }; - newProc.use = function (mw) { - const result = { - type: newProc.type, - argsSchema: newProc.argsSchema, - handler: newProc.handler, - _hooks: { ...newProc._hooks }, - _middleware: [...newProc._middleware, mw], - }; - result.beforeInvoke = function (hook) { - result._hooks.beforeInvoke = hook; - return result; - }; - result.afterInvoke = function (hook) { - result._hooks.afterInvoke = hook; - return result; - }; - result.onSuccess = function (hook) { - result._hooks.onSuccess = hook; - return result; - }; - result.onError = function (hook) { - result._hooks.onError = hook; - return result; - }; - result.use = newProc.use; - return result; - }; - return newProc; - }; - return hookedProc; -} -/* eslint-enable @typescript-eslint/no-explicit-any */ -//# sourceMappingURL=builder.js.map \ No newline at end of file diff --git a/packages/server/dist_test/query/builder.js.map b/packages/server/dist_test/query/builder.js.map deleted file mode 100644 index 2828f39..0000000 --- a/packages/server/dist_test/query/builder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/query/builder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/server/dist_test/query/index.d.ts b/packages/server/dist_test/query/index.d.ts deleted file mode 100644 index d62500a..0000000 --- a/packages/server/dist_test/query/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { QueryConfig, QueryWithHooks } from "./types.js"; -export { QueryBuilder, createQueryBuilder } from "./builder.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/query/index.d.ts.map b/packages/server/dist_test/query/index.d.ts.map deleted file mode 100644 index 952241a..0000000 --- a/packages/server/dist_test/query/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/query/index.js b/packages/server/dist_test/query/index.js deleted file mode 100644 index 9595d3a..0000000 --- a/packages/server/dist_test/query/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { QueryBuilder, createQueryBuilder } from "./builder.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/query/index.js.map b/packages/server/dist_test/query/index.js.map deleted file mode 100644 index 9801cb6..0000000 --- a/packages/server/dist_test/query/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/query/types.d.ts b/packages/server/dist_test/query/types.d.ts deleted file mode 100644 index 02cf20e..0000000 --- a/packages/server/dist_test/query/types.d.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; -import { type Query, type HandlerContext, type EventRegistry, type ProcedureType, type Middleware } from "../types.js"; -import { type BeforeInvokeHook, type AfterInvokeHook, type OnSuccessHook, type OnErrorHook } from "../types.js"; -export interface QueryConfig { - args?: ZodType; - handler: (ctx: HandlerContext, args: Args) => Promise>; -} -interface HookedProcedureMixin { - type: ProcedureType; - beforeInvoke(hook: BeforeInvokeHook): this; - afterInvoke(hook: AfterInvokeHook): this; - onSuccess(hook: OnSuccessHook): this; - onError(hook: OnErrorHook): this; - use(middleware: Middleware): this; - _hooks: { - beforeInvoke?: BeforeInvokeHook; - afterInvoke?: AfterInvokeHook; - onSuccess?: OnSuccessHook; - onError?: OnErrorHook; - }; - _middleware: Middleware[]; -} -export type QueryWithHooks = Query & HookedProcedureMixin; -export interface MutationConfig { - args?: ZodType; - handler: (ctx: HandlerContext, args: Args) => Promise>; -} -export interface InternalQueryConfig { - handler: (ctx: HandlerContext) => Promise>; -} -export interface InternalMutationConfig { - args?: ZodType; - handler: (ctx: HandlerContext, args: Args) => Promise>; -} -export {}; -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/query/types.d.ts.map b/packages/server/dist_test/query/types.d.ts.map deleted file mode 100644 index da19ab0..0000000 --- a/packages/server/dist_test/query/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/server/dist_test/query/types.js b/packages/server/dist_test/query/types.js deleted file mode 100644 index 718fd38..0000000 --- a/packages/server/dist_test/query/types.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/server/dist_test/query/types.js.map b/packages/server/dist_test/query/types.js.map deleted file mode 100644 index 18cbe68..0000000 --- a/packages/server/dist_test/query/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/router/builder.d.ts b/packages/server/dist_test/router/builder.d.ts deleted file mode 100644 index 7efc106..0000000 --- a/packages/server/dist_test/router/builder.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { type Router, type Procedure } from "../types.js"; -import { type Maybe } from "@deessejs/fp"; -export declare function flattenRouter>(router: R, prefix?: string[]): Array<{ - path: string; - procedure: Procedure; -}>; -export declare function getPublicRoutes>(router: R): Array<{ - path: string; - procedure: Procedure; -}>; -export declare function getInternalRoutes>(router: R): Array<{ - path: string; - procedure: Procedure; -}>; -export declare function isRouter(obj: any): obj is Router; -export declare function isProcedure(obj: any): obj is Procedure; -export declare function resolvePath>(router: Router, path: string): Maybe | Router>; -import { type ValidationResult } from "./types.js"; -export declare function validateRouter>(router: R): ValidationResult; -//# sourceMappingURL=builder.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/router/builder.d.ts.map b/packages/server/dist_test/router/builder.d.ts.map deleted file mode 100644 index ce56d2b..0000000 --- a/packages/server/dist_test/router/builder.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/router/builder.ts"],"names":[],"mappings":"AAAA,OAAQ,EAAE,KAAK,MAAM,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,KAAK,KAAK,EAAsB,MAAM,cAAc,CAAC;AAG9D,wBAAgB,aAAa,CAAC,GAAG,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC3D,MAAM,EAAE,CAAC,EACT,MAAM,GAAE,MAAM,EAAO,GACpB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,CAAC,CAe9D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC7D,MAAM,EAAE,CAAC,GACR,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,CAAC,CAI9D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC/D,MAAM,EAAE,CAAC,GACR,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,CAAC,CAI9D;AAGD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAU1D;AAGD,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAOrE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,EAC3B,IAAI,EAAE,MAAM,GACX,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAUvD;AAGD,OAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGpD,wBAAgB,cAAc,CAAC,GAAG,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC5D,MAAM,EAAE,CAAC,GACR,gBAAgB,CAsBlB"} \ No newline at end of file diff --git a/packages/server/dist_test/router/builder.js b/packages/server/dist_test/router/builder.js deleted file mode 100644 index e87da83..0000000 --- a/packages/server/dist_test/router/builder.js +++ /dev/null @@ -1,76 +0,0 @@ -import { none, fromNullable } from "@deessejs/fp"; -/* eslint-disable @typescript-eslint/no-explicit-any */ -export function flattenRouter(router, prefix = []) { - const result = []; - for (const key in router) { - const value = router[key]; - const path = [...prefix, key]; - if (isProcedure(value)) { - result.push({ path: path.join("."), procedure: value }); - } - else if (isRouter(value)) { - result.push(...flattenRouter(value, path)); - } - } - return result; -} -export function getPublicRoutes(router) { - return flattenRouter(router).filter((item) => item.procedure.type === "query" || item.procedure.type === "mutation"); -} -export function getInternalRoutes(router) { - return flattenRouter(router).filter((item) => item.procedure.type === "internalQuery" || item.procedure.type === "internalMutation"); -} -/* eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types -- Type guard must accept any type */ -export function isRouter(obj) { - if (!obj || typeof obj !== "object") - return false; - for (const key of Object.keys(obj)) { - if (isProcedure(obj[key])) { - return false; - } - } - return true; -} -/* eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types -- Type guard must accept any type */ -export function isProcedure(obj) { - return (obj && - typeof obj === "object" && - "type" in obj && - ["query", "mutation", "internalQuery", "internalMutation"].includes(obj.type)); -} -export function resolvePath(router, path) { - let current = router; - const parts = path.split("."); - for (const part of parts) { - if (current === null || current === undefined) { - return none(); - } - current = current[part]; - } - return fromNullable(current); -} -/* eslint-disable @typescript-eslint/no-explicit-any */ -export function validateRouter(router) { - const errors = []; - const validate = (current, path) => { - for (const key of Object.keys(current)) { - const value = current[key]; - const currentPath = [...path, key]; - if (isProcedure(value)) { - if (!value.handler) { - errors.push(`Procedure at "${currentPath.join(".")}" missing handler`); - } - } - else if (isRouter(value)) { - validate(value, currentPath); - } - else if (typeof value === "object" && value !== null) { - validate(value, currentPath); - } - } - }; - validate(router, []); - return { valid: errors.length === 0, errors }; -} -/* eslint-enable @typescript-eslint/no-explicit-any */ -//# sourceMappingURL=builder.js.map \ No newline at end of file diff --git a/packages/server/dist_test/router/builder.js.map b/packages/server/dist_test/router/builder.js.map deleted file mode 100644 index c85b584..0000000 --- a/packages/server/dist_test/router/builder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/router/builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,IAAI,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE9D,uDAAuD;AACvD,MAAM,UAAU,aAAa,CAC3B,MAAS,EACT,SAAmB,EAAE;IAErB,MAAM,MAAM,GAAiE,EAAE,CAAC;IAEhF,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,KAAK,GAAI,MAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;QAE9B,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAS;IAET,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CACjC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU,CAChF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAS;IAET,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CACjC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,kBAAkB,CAChG,CAAC;AACJ,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,QAAQ,CAAC,GAAQ;IAC/B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAElD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,WAAW,CAAC,GAAQ;IAClC,OAAO,CACL,GAAG;QACH,OAAO,GAAG,KAAK,QAAQ;QACvB,MAAM,IAAI,GAAG;QACb,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAC9E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,MAA2B,EAC3B,IAAY;IAEZ,IAAI,OAAO,GAAQ,MAAM,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9C,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAKD,uDAAuD;AACvD,MAAM,UAAU,cAAc,CAC5B,MAAS;IAET,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,QAAQ,GAAG,CAAC,OAAY,EAAE,IAAc,EAAQ,EAAE;QACtD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YAEnC,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,iBAAiB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;iBAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAC/B,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACvD,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrB,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AACD,sDAAsD"} \ No newline at end of file diff --git a/packages/server/dist_test/router/index.d.ts b/packages/server/dist_test/router/index.d.ts deleted file mode 100644 index 6babc36..0000000 --- a/packages/server/dist_test/router/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { RouterConfig, ValidationResult } from "./types.js"; -export { flattenRouter, getPublicRoutes, getInternalRoutes, isRouter, isProcedure, resolvePath, validateRouter, } from "./builder.js"; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/router/index.d.ts.map b/packages/server/dist_test/router/index.d.ts.map deleted file mode 100644 index a644f9d..0000000 --- a/packages/server/dist_test/router/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EACL,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/router/index.js b/packages/server/dist_test/router/index.js deleted file mode 100644 index 1f7f352..0000000 --- a/packages/server/dist_test/router/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { flattenRouter, getPublicRoutes, getInternalRoutes, isRouter, isProcedure, resolvePath, validateRouter, } from "./builder.js"; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/server/dist_test/router/index.js.map b/packages/server/dist_test/router/index.js.map deleted file mode 100644 index 7a0ca8d..0000000 --- a/packages/server/dist_test/router/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/packages/server/dist_test/router/types.d.ts b/packages/server/dist_test/router/types.d.ts deleted file mode 100644 index e850b33..0000000 --- a/packages/server/dist_test/router/types.d.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; -export type { Result } from "@deessejs/fp"; -export type ProcedureType = "query" | "mutation" | "internalQuery" | "internalMutation"; -export interface BaseProcedure { - readonly type: ProcedureType; - readonly argsSchema?: ZodType; - readonly handler: (ctx: Ctx, args: Args) => Promise>; - readonly name?: string; -} -export interface Query extends BaseProcedure { - readonly type: "query"; -} -export interface Mutation extends BaseProcedure { - readonly type: "mutation"; -} -export interface InternalQuery extends BaseProcedure { - readonly type: "internalQuery"; -} -export interface InternalMutation extends BaseProcedure { - readonly type: "internalMutation"; -} -export type BeforeInvokeHook = (ctx: Ctx, args: Args) => void | Promise; -export type AfterInvokeHook = (ctx: Ctx, args: Args, result: Result) => void | Promise; -export type OnSuccessHook = (ctx: Ctx, args: Args, data: Output) => void | Promise; -export type OnErrorHook = (ctx: Ctx, args: Args, error: Error) => void | Promise; -export interface Middleware { - readonly name: string; - readonly args?: Args; - readonly handler: (ctx: Ctx, opts: { - next: (overrides?: { - ctx?: Partial; - }) => Promise>; - args: Args; - meta: Record; - }) => Promise>; -} -export interface Plugin { - readonly name: string; - readonly extend: (ctx: Ctx) => Partial; -} -export type Router = Record> = { - [K in keyof Routes & string]: Routes[K] extends Procedure ? Routes[K] : Routes[K] extends Record ? Router : never; -}; -export type Procedure = Query | Mutation | InternalQuery | InternalMutation; -export interface EventRegistry { - [eventName: string]: { - data?: unknown; - response?: unknown; - }; -} -export interface EventPayload { - name: string; - data: T; - timestamp: string; - namespace: string; - source?: string; -} -export interface SendOptions { - namespace?: string; - broadcast?: boolean; - delay?: number; -} -export interface PendingEvent { - name: string; - data: unknown; - timestamp: string; - namespace: string; - options?: SendOptions; -} -export interface ContextWithSend { - ctx: Ctx; - send: (event: EventName, data: Events[EventName]["data"]) => void; -} -export type HandlerContext = Ctx & { - send: (event: EventName, data: Events[EventName]["data"]) => void; -}; -export type RouterConfig = Record | Record>; -export interface ValidationResult { - valid: boolean; - errors: string[]; -} -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/router/types.d.ts.map b/packages/server/dist_test/router/types.d.ts.map deleted file mode 100644 index 57c4f7d..0000000 --- a/packages/server/dist_test/router/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/server/dist_test/router/types.js b/packages/server/dist_test/router/types.js deleted file mode 100644 index 718fd38..0000000 --- a/packages/server/dist_test/router/types.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/server/dist_test/router/types.js.map b/packages/server/dist_test/router/types.js.map deleted file mode 100644 index 5905f76..0000000 --- a/packages/server/dist_test/router/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/dist_test/types.d.ts b/packages/server/dist_test/types.d.ts deleted file mode 100644 index 99d0ce6..0000000 --- a/packages/server/dist_test/types.d.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; -export type { Result } from "@deessejs/fp"; -export type ProcedureType = "query" | "mutation" | "internalQuery" | "internalMutation"; -export interface BaseProcedure { - readonly type: ProcedureType; - readonly argsSchema?: ZodType; - readonly handler: (ctx: Ctx, args: Args) => Promise>; - readonly name?: string; -} -export interface Query extends BaseProcedure { - readonly type: "query"; -} -export interface Mutation extends BaseProcedure { - readonly type: "mutation"; -} -export interface InternalQuery extends BaseProcedure { - readonly type: "internalQuery"; -} -export interface InternalMutation extends BaseProcedure { - readonly type: "internalMutation"; -} -export type BeforeInvokeHook = (ctx: Ctx, args: Args) => void | Promise; -export type AfterInvokeHook = (ctx: Ctx, args: Args, result: Result) => void | Promise; -export type OnSuccessHook = (ctx: Ctx, args: Args, data: Output) => void | Promise; -export type OnErrorHook = (ctx: Ctx, args: Args, error: Error) => void | Promise; -export interface Middleware { - readonly name: string; - readonly args?: Args; - readonly handler: (ctx: Ctx, opts: { - next: (overrides?: { - ctx?: Partial; - }) => Promise>; - args: Args; - meta: Record; - }) => Promise>; -} -export interface Plugin { - readonly name: string; - readonly extend: (ctx: Ctx) => Partial; -} -export type Router = Record> = { - [K in keyof Routes & string]: Routes[K] extends Procedure ? Routes[K] : Routes[K] extends Record ? Router : never; -}; -export type Procedure = Query | Mutation | InternalQuery | InternalMutation; -export interface EventRegistry { - [eventName: string]: { - data?: unknown; - response?: unknown; - }; -} -export interface EventPayload { - name: string; - data: T; - timestamp: string; - namespace: string; - source?: string; -} -export interface SendOptions { - namespace?: string; - broadcast?: boolean; - delay?: number; -} -export interface PendingEvent { - name: string; - data: unknown; - timestamp: string; - namespace: string; - options?: SendOptions; -} -export interface ContextWithSend { - ctx: Ctx; - send: (event: EventName, data: Events[EventName]["data"]) => void; -} -export type HandlerContext = Ctx & { - send: (event: EventName, data: Events[EventName]["data"]) => void; -}; -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/packages/server/dist_test/types.d.ts.map b/packages/server/dist_test/types.d.ts.map deleted file mode 100644 index 75743bb..0000000 --- a/packages/server/dist_test/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/server/dist_test/types.js b/packages/server/dist_test/types.js deleted file mode 100644 index 718fd38..0000000 --- a/packages/server/dist_test/types.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/server/dist_test/types.js.map b/packages/server/dist_test/types.js.map deleted file mode 100644 index c768b79..0000000 --- a/packages/server/dist_test/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/server/examples/01-basic-services.ts b/packages/server/examples/01-basic-services.ts new file mode 100644 index 0000000..13d1bd4 --- /dev/null +++ b/packages/server/examples/01-basic-services.ts @@ -0,0 +1,95 @@ +/** + * Example 01: Basic query and mutation services + * + * This example shows how to create simple query and mutation services + * with context binding. + */ + +import { query, mutation, defineServices } from '../src/index.js'; +import { z } from 'zod'; +import * as v from 'valibot'; + +// Define database context +interface DbContext { + db: { + users: Map; + nextId: number; + }; +} + +// Query: Get all users +const listUsers = query }>({ + handler: async (ctx) => ({ + users: Array.from(ctx.db.users.values()), + }), +}); + +// Query: Get user by ID +const getUser = query({ + args: z.object({ id: z.string() }), + handler: async (ctx, args) => ({ + user: ctx.db.users.get(args.id) ?? null, + }), +}); + +// Mutation: Create user +const createUser = mutation({ + args: z.object({ + name: z.string().min(1), + email: z.string().email(), + }), + handler: async (ctx, args) => { + const id = `user-${ctx.db.nextId++}`; + ctx.db.users.set(id, { id, ...args }); + return { id }; + }, +}); + +// Mutation: Delete user +const deleteUser = mutation({ + args: z.object({ id: z.string() }), + handler: async (ctx, args) => { + const deleted = ctx.db.users.delete(args.id); + return { deleted }; + }, +}); + +// Create the API with bound context +const db = { + users: new Map(), + nextId: 1, +}; + +const api = defineServices({ + services: { listUsers, getUser, createUser, deleteUser }, + context: { db }, +}); + +async function main() { + console.log('=== Basic Services Example ===\n'); + + // Create some users + const created1 = await api.createUser({ name: 'Alice', email: 'alice@example.com' }); + console.log('Created user 1:', created1); + + const created2 = await api.createUser({ name: 'Bob', email: 'bob@example.com' }); + console.log('Created user 2:', created2); + + // List all users + const allUsers = await api.listUsers(); + console.log('All users:', allUsers); + + // Get specific user + const user = await api.getUser({ id: created1.id }); + console.log('Got user:', user); + + // Delete user + const deleted = await api.deleteUser({ id: created1.id }); + console.log('Deleted:', deleted); + + // Try to get deleted user + const deletedUser = await api.getUser({ id: created1.id }); + console.log('Deleted user:', deletedUser); +} + +main().catch(console.error); diff --git a/packages/server/examples/01-basic/index.ts b/packages/server/examples/01-basic/index.ts deleted file mode 100644 index 5b2831e..0000000 --- a/packages/server/examples/01-basic/index.ts +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Example 01: Basic Query and Mutation - * - * Demonstrates: - * - Creating a QueryBuilder - * - Defining queries and mutations - * - Creating an API instance - * - Calling procedures - */ - -import { QueryBuilder, createAPI } from "../src/index.js"; -import { createQueryBuilder } from "../src/query/index.js"; -import { ok } from "@deessejs/fp"; -import { z } from "zod"; - -// ============================================ -// 1. Define types -// ============================================ - -interface Context { - db: { users: Array<{ id: string; name: string }> }; -} - -// ============================================ -// 2. Create a QueryBuilder (no context needed here) -// ============================================ - -const t = createQueryBuilder(); - -// ============================================ -// 2. Define procedures -// ============================================ - -// Query with no args -const listUsers = t.query({ - handler: async (ctx) => { - return ok(ctx.db.users); - }, -}); - -// Query with args (validated via Zod) -const getUser = t.query({ - args: z.object({ id: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.users.find((u) => u.id === args.id); - if (!user) { - return ok(null); - } - return ok(user); - }, -}); - -// Mutation (same as query but for writes) -const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - const newUser = { id: String(ctx.db.users.length + 1), name: args.name }; - ctx.db.users.push(newUser); - return ok(newUser); - }, -}); - -// ============================================ -// 3. Create router and API -// ============================================ - -const router = t.router({ - users: { - list: listUsers, - get: getUser, - create: createUser, - }, -}); - -const api = createAPI({ - router, - context: { - db: { - users: [ - { id: "1", name: "Alice" }, - { id: "2", name: "Bob" }, - ], - }, - }, -}); - -// ============================================ -// 4. Call procedures (fully typed!) -// ============================================ - -async function main() { - // api.users.list() -> Promise>> - const users = await api.users.list(); - console.log("Users:", users); - - // api.users.get({ id: "1" }) -> Promise> - const user = await api.users.get({ id: "1" }); - console.log("User 1:", user); - - // api.users.create({ name: "Charlie" }) -> Promise> - const newUser = await api.users.create({ name: "Charlie" }); - console.log("Created:", newUser); -} - -main(); diff --git a/packages/server/examples/02-nested-routers/index.ts b/packages/server/examples/02-nested-routers/index.ts deleted file mode 100644 index ea1f081..0000000 --- a/packages/server/examples/02-nested-routers/index.ts +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Example 02: Nested Routers - * - * Demonstrates: - * - Organizing procedures in nested router structure - * - Deep nesting (api.v1.users.list) - * - Router flattening utilities - */ - -import { createAPI, flattenRouter, getPublicRoutes } from "../src/index.js"; -import { createQueryBuilder } from "../src/query/index.js"; -import { ok } from "@deessejs/fp"; -import { z } from "zod"; - -// ============================================ -// 1. Create QueryBuilder -// ============================================ - -interface Context { - version: string; -} - -const t = createQueryBuilder(); - -// ============================================ -// 2. Define nested router structure -// ============================================ - -// API v1 - Users -const usersRouter = t.router({ - list: t.query({ handler: async () => ok([]) }), - get: t.query({ - args: z.object({ id: z.string() }), - handler: async (_, args) => ok({ id: args.id, name: "User" }), - }), - create: t.mutation({ - args: z.object({ name: z.string() }), - handler: async (_, args) => ok({ id: "1", name: args.name }), - }), -}); - -// API v1 - Posts -const postsRouter = t.router({ - list: t.query({ handler: async () => ok([]) }), - get: t.query({ - args: z.object({ id: z.string() }), - handler: async (_, args) => ok({ id: args.id, title: "Post" }), - }), -}); - -// API v1 router -const v1Router = t.router({ - users: usersRouter, - posts: postsRouter, -}); - -// Root router -const router = t.router({ - api: t.router({ - v1: v1Router, - }), -}); - -// ============================================ -// 3. Create API -// ============================================ - -const api = createAPI({ - router, - context: { version: "v1" }, -}); - -// ============================================ -// 4. Access nested procedures -// ============================================ - -async function main() { - // Deep nesting: api.api.v1.users.list() - const users = await api.api.v1.users.list(); - console.log("V1 Users:", users); - - // api.api.v1.posts.get({ id: "1" }) - const post = await api.api.v1.posts.get({ id: "1" }); - console.log("Post:", post); - - // TypeScript knows the type at each level - // api.api.v1.users -> { list, get, create } - // api.api.v1.users.list -> () => Promise> - - // ============================================ - // 5. Router utilities - // ============================================ - - // flattenRouter: Converts nested router to flat array of { path, procedure } - const flat = flattenRouter(router); - console.log("\nFlattened routes:"); - flat.forEach((r) => console.log(" -", r.path)); - - // getPublicRoutes: Filters to only public queries and mutations - const publicRoutes = getPublicRoutes(router); - console.log("\nPublic routes only:"); - publicRoutes.forEach((r) => console.log(" -", r.path, "- type:", r.procedure.type)); -} - -main(); diff --git a/packages/server/examples/02-validation.ts b/packages/server/examples/02-validation.ts new file mode 100644 index 0000000..67d1f24 --- /dev/null +++ b/packages/server/examples/02-validation.ts @@ -0,0 +1,136 @@ +/** + * Example 02: Validation with Zod and Valibot + * + * This example shows how to use StandardSchemaV1 compatible validation + * libraries (Zod and Valibot) to validate input arguments. + */ + +import { query, mutation, defineServices, ValidationError } from '../src/index.js'; +import { z } from 'zod'; +import * as v from 'valibot'; + +interface ServiceContext { + counter: number; +} + +// Query with Zod validation +const incrementWithZod = query({ + args: z.object({ + value: z.number().int().positive().max(100), + }), + handler: async (ctx, args) => ({ + result: ctx.counter + args.value, + }), +}); + +// Query with Valibot validation +const incrementWithValibot = query({ + args: v.object({ + value: v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(100)), + }), + handler: async (ctx, args) => ({ + result: ctx.counter + args.value, + }), +}); + +// Async validation with Valibot (check against "database") +const checkUsername = mutation<{ usedNames: Set }, { username: string }, { available: boolean }>({ + args: v.pipeAsync( + v.object({ + username: v.pipe(v.string(), v.minLength(3), v.maxLength(20), v.regex(/^[a-zA-Z0-9_]+$/)), + }), + // Simulate async database check + v.checkAsync(async ({ username }) => { + await new Promise(r => setTimeout(r, 50)); // Simulate DB latency + return true; // Username is available + }) + ), + handler: async (ctx, args) => ({ + available: !ctx.usedNames.has(args.username), + }), +}); + +// Service that demonstrates error handling +const divide = query<{}, { a: number; b: number }, { result: number }>({ + args: z.object({ + a: z.number(), + b: z.number().refine(val => val !== 0, { message: 'Division by zero' }), + }), + handler: async (_, args) => ({ + result: args.a / args.b, + }), +}); + +const api = defineServices({ + services: { incrementWithZod, incrementWithValibot, checkUsername, divide }, + context: { counter: 0, usedNames: new Set(['admin', 'root']) }, +}); + +async function main() { + console.log('=== Validation Example ===\n'); + + // Successful validation + console.log('--- Valid calls ---'); + const r1 = await api.incrementWithZod({ value: 5 }); + console.log('Zod increment:', r1); + + const r2 = await api.incrementWithValibot({ value: 10 }); + console.log('Valibot increment:', r2); + + const r3 = await api.divide({ a: 10, b: 2 }); + console.log('Divide 10/2:', r3); + + // Validation errors (will throw) + console.log('\n--- Validation errors ---'); + + // Zod: value too big + try { + await api.incrementWithZod({ value: 150 }); + } catch (e) { + if (e instanceof ValidationError) { + console.log('Zod error (value > 100):', e.issues); + } + } + + // Zod: wrong type + try { + await api.incrementWithZod({ value: 'not-a-number' as never }); + } catch (e) { + if (e instanceof ValidationError) { + console.log('Zod error (wrong type):', e.issues); + } + } + + // Valibot: integer required + try { + await api.incrementWithValibot({ value: 1.5 }); + } catch (e) { + if (e instanceof ValidationError) { + console.log('Valibot error (not integer):', e.issues); + } + } + + // Division by zero + try { + await api.divide({ a: 10, b: 0 }); + } catch (e) { + if (e instanceof ValidationError) { + console.log('Zod refine error:', e.issues); + } + } + + // Async validation + console.log('\n--- Async validation ---'); + const r4 = await api.checkUsername({ username: 'newuser123' }); + console.log('Username check:', r4); + + try { + await api.checkUsername({ username: 'ab' }); // Too short + } catch (e) { + if (e instanceof ValidationError) { + console.log('Username too short:', e.issues); + } + } +} + +main().catch(console.error); diff --git a/packages/server/examples/03-hooks/index.ts b/packages/server/examples/03-hooks/index.ts deleted file mode 100644 index 13f1e73..0000000 --- a/packages/server/examples/03-hooks/index.ts +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Example 03: Hooks - * - * Demonstrates: - * - beforeInvoke: runs before handler - * - afterInvoke: runs after handler (always) - * - onSuccess: runs only when result is ok - * - onError: runs only when result is err - */ - -import { createAPI } from "../src/index.js"; -import { createQueryBuilder } from "../src/query/index.js"; -import { ok, err } from "@deessejs/fp"; -import { z } from "zod"; - -interface Context { - requestId: string; - logger: string[]; -} - -const t = createQueryBuilder(); - -// ============================================ -// 1. Define query with all hooks -// ============================================ - -const getUser = t.query({ - args: z.object({ id: z.string() }), - handler: async (ctx, args) => { - ctx.logger.push(`handler called for ${args.id}`); - return ok({ id: args.id, name: "User" }); - }, -}); - -// Chain hooks (they return the procedure for chaining) -getUser - .beforeInvoke((ctx, args) => { - ctx.logger.push(`beforeInvoke: fetching user ${args.id}`); - console.log(`[${ctx.requestId}] Before: ${args.id}`); - }) - .afterInvoke((ctx, args, result) => { - ctx.logger.push(`afterInvoke: result is ${result.ok ? "ok" : "error"}`); - console.log(`[${ctx.requestId}] After:`, result.ok ? "success" : "failure"); - }) - .onSuccess((ctx, args, data) => { - ctx.logger.push(`onSuccess: user ${args.id} = ${data.name}`); - console.log(`[${ctx.requestId}] Success:`, data); - }) - .onError((ctx, args, error) => { - ctx.logger.push(`onError: ${error.message}`); - console.log(`[${ctx.requestId}] Error:`, error.message); - }); - -// ============================================ -// 2. Mutation with error case -// ============================================ - -const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - if (args.name === "error") { - return err({ message: "Cannot create user with name 'error'" }); - } - return ok({ id: "1", name: args.name }); - }, -}); - -createUser - .beforeInvoke((ctx, args) => { - console.log(`Creating user: ${args.name}`); - }) - .onSuccess((ctx, args, data) => { - console.log(`User created: ${data.id} - ${data.name}`); - }) - .onError((ctx, args, error) => { - console.log(`Creation failed: ${error.message}`); - }); - -// ============================================ -// 3. Create API -// ============================================ - -const router = t.router({ users: { get: getUser, create: createUser } }); - -const api = createAPI({ - router, - context: { requestId: "req-123", logger: [] }, -}); - -// ============================================ -// 4. Test -// ============================================ - -async function main() { - console.log("=== Successful getUser ==="); - const result = await api.users.get({ id: "1" }); - console.log("Final result ok:", result.ok); - console.log("Logger:", api.ctx.logger); - - console.log("\n=== Failed createUser ==="); - const failResult = await api.users.create({ name: "error" }); - console.log("Final result ok:", failResult.ok); -} - -main(); diff --git a/packages/server/examples/03-no-args-services.ts b/packages/server/examples/03-no-args-services.ts new file mode 100644 index 0000000..5dd9df2 --- /dev/null +++ b/packages/server/examples/03-no-args-services.ts @@ -0,0 +1,74 @@ +/** + * Example 03: Services without arguments + * + * This example shows how to create services that don't require arguments. + * They can be called without passing {}. + */ + +import { query, mutation, defineServices } from '../src/index.js'; + +interface ClockContext { + getTime: () => Date; +} + +// Query with no arguments - no args schema, handler takes no second parameter +const getTime = query({ + handler: async (ctx) => { + const now = ctx.getTime(); + return { + timestamp: now.getTime(), + formatted: now.toISOString(), + }; + }, +}); + +// Query returning current date info +const getDateInfo = query({ + handler: async (ctx) => { + const now = ctx.getTime(); + return { + day: now.getDate(), + month: now.getMonth() + 1, + year: now.getFullYear(), + }; + }, +}); + +// Mutation with no arguments - creates a session +const createSession = mutation<{ sessionId: string }, void, { sessionId: string; created: boolean }>({ + handler: async (ctx) => ({ + sessionId: ctx.sessionId, + created: true, + }), +}); + +// Multiple services with no args +const api = defineServices({ + services: { getTime, getDateInfo, createSession }, + context: { + getTime: () => new Date(), + sessionId: 'sess_' + Math.random().toString(36).substring(2), + }, +}); + +async function main() { + console.log('=== No Args Services Example ===\n'); + + // Call services WITHOUT passing {} - this is the key feature! + console.log('--- Calling without args ---'); + const time = await api.getTime(); + console.log('Time:', time); + + const date = await api.getDateInfo(); + console.log('Date:', date); + + const session = await api.createSession(); + console.log('Session:', session); + + // But you can also pass {} if you want (for compatibility) + console.log('\n--- Calling with {} (also works) ---'); + const time2 = await api.getTime({}); + console.log('Time (with {}):', time2); +} + +main().catch(console.error); diff --git a/packages/server/examples/04-middleware/index.ts b/packages/server/examples/04-middleware/index.ts deleted file mode 100644 index 2e51ac1..0000000 --- a/packages/server/examples/04-middleware/index.ts +++ /dev/null @@ -1,142 +0,0 @@ -/** - * Example 04: Middleware - * - * Demonstrates: - * - Creating middleware with createMiddleware - * - Attaching middleware per-procedure (.use()) - * - Global middleware at API creation - */ - -import { createAPI } from "../src/index.js"; -import { createQueryBuilder } from "../src/query/index.js"; -import { createMiddleware } from "../src/middleware/builder.js"; -import { ok, err } from "@deessejs/fp"; -import { z } from "zod"; - -interface Context { - user: { id: string; role: string } | null; - logs: string[]; -} - -// ============================================ -// 1. Create middlewares -// ============================================ - -// Authentication middleware -const authMiddleware = createMiddleware({ - name: "auth", - handler: async (ctx, opts) => { - if (!ctx.user) { - return err({ message: "Unauthorized - no user" }); - } - return opts.next(); - }, -}); - -// Admin-only middleware -const adminMiddleware = createMiddleware({ - name: "admin", - handler: async (ctx, opts) => { - if (ctx.user?.role !== "admin") { - return err({ message: "Forbidden - requires admin role" }); - } - return opts.next(); - }, -}); - -// Logging middleware -const loggingMiddleware = createMiddleware({ - name: "logging", - handler: async (ctx, opts) => { - console.log(`[LOG] Starting: ${opts.meta?.procedure}`); - const result = await opts.next(); - console.log(`[LOG] Completed: ${opts.meta?.procedure}`); - return result; - }, -}); - -// ============================================ -// 2. Build procedures with middleware -// ============================================ - -const t = createQueryBuilder(); - -// Public endpoint - no auth required -const publicEndpoint = t.query({ - handler: async (ctx) => { - ctx.logs.push("public endpoint called"); - return ok({ message: "Public data" }); - }, -}); - -// Protected endpoint - auth required -const protectedEndpoint = t.query({ - handler: async (ctx) => { - ctx.logs.push(`protected called by ${ctx.user?.id}`); - return ok({ secret: "Sensitive data" }); - }, -}).use(authMiddleware); - -// Admin-only endpoint -const adminEndpoint = t.query({ - handler: async (ctx) => { - ctx.logs.push("admin endpoint called"); - return ok({ admin: true }); - }, -}).use(authMiddleware).use(adminMiddleware); - -// Endpoint with logging middleware -const loggedEndpoint = t.query({ - handler: async (ctx) => { - return ok({ logged: true }); - }, -}).use(loggingMiddleware); - -// ============================================ -// 3. Create API with global middleware -// ============================================ - -const router = t.router({ - public: publicEndpoint, - protected: protectedEndpoint, - admin: adminEndpoint, - logged: loggedEndpoint, -}); - -// Global middleware runs BEFORE procedure middleware -const api = createAPI({ - router, - context: { user: { id: "1", role: "user" }, logs: [] }, - middleware: [ - createMiddleware({ - name: "global-logger", - handler: async (ctx, opts) => { - console.log(`[GLOBAL] Starting`); - return opts.next(); - }, - }), - ], -}); - -// ============================================ -// 4. Test execution order -// ============================================ - -async function main() { - console.log("=== Public endpoint (no auth) ==="); - const publicResult = await api.public(); - console.log("Result ok:", publicResult.ok); - - console.log("\n=== Protected endpoint (auth middleware) ==="); - const protectedResult = await api.protected(); - console.log("Result ok:", protectedResult.ok); - - console.log("\n=== Admin endpoint (auth + admin middleware) ==="); - const adminResult = await api.admin(); - console.log("Result ok:", adminResult.ok); - if (!adminResult.ok) { - console.log("Error:", adminResult.error); - } -} - -main(); diff --git a/packages/server/examples/05-events/index.ts b/packages/server/examples/05-events/index.ts deleted file mode 100644 index ae9be2c..0000000 --- a/packages/server/examples/05-events/index.ts +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Example 05: Events System - * - * Demonstrates: - * - Defining events with defineEvents - * - Subscribing to events with on() - * - Emitting events via ctx.send() - * - Event queue (batched until success) - * - Wildcard subscriptions - */ - -import { createAPI, EventEmitter, defineEvents, event } from "../src/index.js"; -import { createQueryBuilder } from "../src/query/index.js"; -import { ok } from "@deessejs/fp"; -import { z } from "zod"; - -// ============================================ -// 1. Define events -// ============================================ - -const events = defineEvents({ - user: { - created: event({ args: z.object({ id: z.string(), email: z.string() }) }), - updated: event({ args: z.object({ id: z.string(), name: z.string() }) }), - }, - post: { - published: event({ args: z.object({ id: z.string(), title: z.string() }) }), - }, -}); - -interface Context { - userId: string; -} - -const t = createQueryBuilder(); - -// ============================================ -// 2. Create procedures that emit events -// ============================================ - -const createUser = t.mutation({ - args: z.object({ email: z.string().email() }), - handler: async (ctx, args) => { - const user = { id: "new-user", email: args.email }; - // Emit event (batched until procedure succeeds) - ctx.send("user.created", { id: user.id, email: user.email }); - return ok(user); - }, -}); - -const updateUser = t.mutation({ - args: z.object({ id: z.string(), name: z.string() }), - handler: async (ctx, args) => { - // Emit multiple events - ctx.send("user.updated", { id: args.id, name: args.name }); - ctx.send("post.published", { id: "post-1", title: "Announcement" }); - return ok({ id: args.id, name: args.name }); - }, -}); - -// ============================================ -// 3. Create API with event emitter -// ============================================ - -const eventEmitter = new EventEmitter(events); - -const api = createAPI({ - router: t.router({ users: { create: createUser, update: updateUser } }), - eventEmitter, - context: { userId: "user-1" }, -}); - -// ============================================ -// 4. Subscribe to events via eventEmitter -// ============================================ - -// Access eventEmitter from API -const emitter = api.eventEmitter; -if (emitter) { - // Specific event subscription - emitter.on("user.created", (payload) => { - console.log("[EVENT] User created:", payload.data); - }); - - // Wildcard subscription - emitter.on("user.*", (payload) => { - console.log("[EVENT] Any user event:", payload.name, payload.data); - }); - - // Global wildcard - emitter.on("*", (payload) => { - console.log("[EVENT] Global:", payload.name, payload.data); - }); -} - -// ============================================ -// 5. Test -// ============================================ - -async function main() { - console.log("=== Creating user ==="); - const result = await api.users.create({ email: "test@example.com" }); - console.log("Result:", result.ok); - - console.log("\n=== Updating user ==="); - const updateResult = await api.users.update({ id: "1", name: "Updated" }); - console.log("Result:", updateResult.ok); - - console.log("\n=== Event log ==="); - console.log(api.getEvents()); -} - -main(); diff --git a/packages/server/examples/06-internal/index.ts b/packages/server/examples/06-internal/index.ts deleted file mode 100644 index 0adc4a7..0000000 --- a/packages/server/examples/06-internal/index.ts +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Example 06: Internal Procedures - * - * Demonstrates: - * - internalQuery: queries not exposed to public API (no args) - * - internalMutation: mutations not exposed to public API - * - createPublicAPI: filters out internal procedures - * - Why internal procedures exist: server-to-server communication - */ - -import { createAPI, createPublicAPI } from "../src/index.js"; -import { createQueryBuilder } from "../src/query/index.js"; -import { ok } from "@deessejs/fp"; -import { z } from "zod"; - -interface Context { - db: { health: string }; -} - -const t = createQueryBuilder(); - -// ============================================ -// 1. Public procedures -// ============================================ - -const listUsers = t.query({ - handler: async () => { - return ok([{ id: "1", name: "Alice" }]); - }, -}); - -// ============================================ -// 2. Internal procedures (not exposed publicly) -// ============================================ - -// internalQuery: no args, not callable from public API -// Use case: health checks, server-only data -const healthCheck = t.internalQuery({ - handler: async (ctx) => { - return ok({ status: ctx.db.health, timestamp: Date.now() }); - }, -}); - -// internalMutation: server-to-server communication -// Not exposed via createPublicAPI -const syncData = t.internalMutation({ - args: z.object({ source: z.string(), data: z.unknown() }), - handler: async (ctx, args) => { - console.log(`Syncing from ${args.source}:`, args.data); - return ok({ synced: true, items: 1 }); - }, -}); - -// Internal query to check permissions -const checkPermission = t.internalQuery({ - handler: async () => { - return ok({ allowed: true, role: "admin" }); - }, -}); - -// ============================================ -// 3. Full router (with internal procedures) -// ============================================ - -// Internal procedures are nested under _ prefix -const router = t.router({ - users: { - list: listUsers, - // Internal procedures - filtered from public API - _health: healthCheck, - _sync: syncData, - _checkPerm: checkPermission, - }, -}); - -// ============================================ -// 4. Create full API and public API -// ============================================ - -const fullApi = createAPI({ - router, - context: { db: { health: "ok" } }, -}); - -// Public API filters out internalQuery and internalMutation -// Only exposes: query and mutation -const publicApi = createPublicAPI(fullApi); - -// ============================================ -// 5. Test -// ============================================ - -async function main() { - console.log("=== Full API (all procedures) ==="); - const users = await fullApi.users.list(); - console.log("users.list:", users.ok); - - // Internal procedures are accessible - const health = await fullApi.users._health(); - console.log("users._health:", health.ok); - - const sync = await fullApi.users._sync({ source: "external", data: {} }); - console.log("users._sync:", sync.ok); - - console.log("\n=== Public API (internal filtered) ==="); - // Access the public router directly to see filtered results - console.log("publicApi.router:", publicApi.router); - - // The proxy access works correctly - const pubUsers = await publicApi.users.list(); - console.log("publicApi.users.list():", pubUsers.ok); - - // _health and _sync should NOT exist on publicApi - // They would be typed as errors if uncommented: - // await publicApi.users._health(); - // await publicApi.users._sync(); -} - -main(); diff --git a/packages/server/examples/07-plugins/index.ts b/packages/server/examples/07-plugins/index.ts deleted file mode 100644 index bff9671..0000000 --- a/packages/server/examples/07-plugins/index.ts +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Example 07: ContextBuilder and Plugins - * - * Demonstrates: - * - createContextBuilder: fluent builder for context - * - .use(plugin): adding plugins - * - Plugin.extend: enriching the context - */ - -import { createContextBuilder } from "../src/context/index.js"; -import { createAPI } from "../src/index.js"; -import { ok } from "@deessejs/fp"; -import { z } from "zod"; -import type { Plugin } from "../src/types.js"; - -// ============================================ -// 1. Create a custom plugin -// ============================================ - -interface PluginContext { - auditLog: string[]; -} - -// Plugin that adds audit log to context -const auditPlugin = (): Plugin => ({ - name: "audit", - extend: (ctx: Ctx) => ({ - auditLog: ctx.auditLog ?? [], - }), -}); - -// Plugin that adds timing info -const timingPlugin = (): Plugin => ({ - name: "timing", - extend: (ctx: Ctx) => ({ - startTime: Date.now(), - }), -}); - -// ============================================ -// 2. Using ContextBuilder -// ============================================ - -const { t, createAPI: createApiWithPlugins } = createContextBuilder() - .use(auditPlugin()) - .use(timingPlugin()) - .build(); - -// t now has query(), mutation(), router(), etc. - -// ============================================ -// 3. Define router -// ============================================ - -const router = t.router({ - users: { - list: t.query({ - handler: async () => ok([{ id: "1", name: "User" }]), - }), - create: t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - ctx.auditLog.push(`Creating user: ${args.name}`); - return ok({ id: "1", name: args.name }); - }, - }), - }, -}); - -// ============================================ -// 4. Create API -// ============================================ - -// Context can be passed but is enriched by plugins -const api = createApiWithPlugins({ - router, - context: { auditLog: [] }, // Initial context, enriched by plugins -}); - -// ============================================ -// 5. Test -// ============================================ - -async function main() { - console.log("=== Using ContextBuilder with plugins ==="); - - const users = await api.users.list(); - console.log("List:", users.ok); - - const created = await api.users.create({ name: "Alice" }); - console.log("Created:", created.ok); - - console.log("\n=== Context with audit log ==="); - console.log("api.ctx:", api.ctx); - console.log("auditLog:", api.ctx.auditLog); -} - -main(); diff --git a/packages/server/examples/README.md b/packages/server/examples/README.md index 314173c..71dfb61 100644 --- a/packages/server/examples/README.md +++ b/packages/server/examples/README.md @@ -1,100 +1,11 @@ -# Examples - -These files demonstrate how to use `@deessejs/server` internally. Each file is self-contained and runnable. - -## Running Examples - -```bash -cd packages/server -npx tsx examples/01-basic.ts -npx tsx examples/02-nested-routers.ts -# etc. -``` - -## File Index - -| File | Topic | Key Concepts | -|------|-------|-------------| -| `01-basic.ts` | Basic Query/Mutation | `createQueryBuilder`, `t.query()`, `t.mutation()`, `createAPI` | -| `02-nested-routers.ts` | Nested Routers | `t.router()`, deep nesting, `flattenRouter` | -| `03-hooks.ts` | Hooks | `beforeInvoke`, `afterInvoke`, `onSuccess`, `onError` | -| `04-middleware.ts` | Middleware | `createMiddleware`, `.use()`, global middleware | -| `05-events.ts` | Events | `defineEvents`, `event()`, `ctx.send()`, wildcards | -| `06-internal.ts` | Internal Procedures | `internalQuery`, `internalMutation`, `createPublicAPI` | -| `07-plugins.ts` | ContextBuilder & Plugins | `createContextBuilder()`, `Plugin.enrich`, `Plugin.extend` | -| `08-full-example.ts` | Full Blog API | Complete realistic application | - -## Request Flow - -``` -User Code: api.module.procedure(args) - │ - ▼ -Router Proxy (createRouterProxy) - └─ Nested proxies resolve path - │ - ▼ -executeRoute (route.ts) - └─ Cache lookup, path resolution - │ - ▼ -executeProcedure (procedure.ts) - ├─ Create handler context + send() - ├─ Validate args (if schema) - ├─ Build middleware chain - │ │ - │ ▼ - │ Middleware: auth, logging, etc. - │ │ - │ ▼ - │ runMiddlewareChain() - │ │ - └─────┴─► executeProcedureWithHooks - │ - ├─ beforeInvoke hook - ├─ Handler: procedure.handler(ctx, args) - ├─ afterInvoke hook - ├─ onSuccess / onError hook - └─ flush event queue - │ - ▼ -Result -``` - -## Key Types - -```typescript -// Context passed to all handlers -interface Context { ... } - -// Procedure types -type Query -type Mutation -type InternalQuery // no args -type InternalMutation - -// All procedures have _def with $types for inference -AnyProcedure._def.$types.input // Args -AnyProcedure._def.$types.output // Output - -// DecoratedRouter maps routes to callables -TypedAPIInstance = DecoratedRouter -``` - -## Architecture - -``` -src/ -├── query/ # QueryBuilder + factory functions -├── mutation/ # Mutation builder -├── internal-*/ # Internal procedures -├── router/ # Router utilities (flatten, validate) -├── context/ # ContextBuilder + defineContext -├── api/factory/ # createAPI, createPublicAPI -│ ├── proxy.ts # Router proxy -│ ├── route.ts # Route execution -│ └── procedure.ts # Procedure execution + middleware -├── events/ # EventEmitter, queue -├── middleware/ # createMiddleware, helpers -└── hooks/ # executeHooks -``` +/** + * Examples Index + * + * Run examples with: npx tsx examples/01-basic-services.ts + * Or: npx tsx examples/02-validation.ts + * Or: npx tsx examples/03-no-args-services.ts + */ + +export { default as basicServices } from './01-basic-services'; +export { default as validation } from './02-validation'; +export { default as noArgsServices } from './03-no-args-services'; diff --git a/packages/server/package-lock.json b/packages/server/package-lock.json index bd56473..8624f39 100644 --- a/packages/server/package-lock.json +++ b/packages/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "@deessejs/server", - "version": "1.2.0", + "version": "1.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@deessejs/server", - "version": "1.2.0", + "version": "1.2.1", "license": "MIT", "devDependencies": { "@deessejs/fp": "^3.0.0", @@ -19,12 +19,14 @@ "eslint-plugin-unicorn": "^64.0.0", "typescript": "^5.0.0", "typescript-eslint": "^8.15.0", + "valibot": "^1.4.0", "vitest": "^2.0.0", - "zod": "^3.0.0" + "zod": "^4.0.0" }, "peerDependencies": { "@deessejs/fp": "*", - "zod": "^3.0.0" + "@standard-schema/spec": "*", + "zod": "^4.0.0" } }, "../../node_modules/.pnpm/@deessejs+fp@3.0.0/node_modules/@deessejs/fp": { @@ -406,14 +408,6 @@ } } }, - "../../node_modules/.pnpm/zod@3.25.76/node_modules/zod": { - "version": "3.25.76", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", @@ -468,6 +462,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT", + "peer": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -2972,6 +2973,21 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/valibot": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.0.tgz", + "integrity": "sha512-iC/x7fVcSyOwlm/VSt7RlHnzNGLGvR9GnxdifUeWoCJo0q4ZZvrVkIHC6faTlkxG47I2Y4UrFquPuVHCrOnrLg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/vitest": { "resolved": "../../node_modules/.pnpm/vitest@2.1.9_@types+node@20.19.39_jsdom@25.0.1/node_modules/vitest", "link": true @@ -3066,8 +3082,14 @@ } }, "node_modules/zod": { - "resolved": "../../node_modules/.pnpm/zod@3.25.76/node_modules/zod", - "link": true + "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" + } } } } diff --git a/packages/server/package.json b/packages/server/package.json index 457e941..32e1220 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -23,6 +23,7 @@ }, "peerDependencies": { "@deessejs/fp": "*", + "@standard-schema/spec": "*", "zod": "^4.0.0" }, "devDependencies": { @@ -36,6 +37,7 @@ "eslint-plugin-unicorn": "^64.0.0", "typescript": "^5.0.0", "typescript-eslint": "^8.15.0", + "valibot": "^1.4.0", "vitest": "^2.0.0", "zod": "^4.0.0" } diff --git a/packages/server/src/api/errors.ts b/packages/server/src/api/errors.ts deleted file mode 100644 index a79a843..0000000 --- a/packages/server/src/api/errors.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { error, err } from "@deessejs/fp"; -import { z } from "zod"; -import { type Result } from "@deessejs/fp"; - -/** - * RouteNotFoundError - Returned when a route path cannot be resolved. - */ -export const RouteNotFoundError = error({ - name: "RouteNotFoundError", - schema: z.object({ route: z.string() }), - message: (args) => `Route not found: ${args.route}`, -}); - -/** - * ValidationError - Returned when Zod validation fails for procedure args. - */ -export const ValidationError = error({ - name: "ValidationError", - schema: z.object({ - route: z.string(), - errors: z.array(z.object({ path: z.string(), message: z.string() })), - }), - message: (args) => - `Validation failed for route ${args.route}: ${args.errors.map((e) => e.message).join(", ")}`, -}); - -/** - * MiddlewareError - Returned when middleware execution fails. - */ -export const MiddlewareError = error({ - name: "MiddlewareError", - schema: z.object({ middleware: z.string(), reason: z.string() }), - message: (args) => `Middleware '${args.middleware}' failed: ${args.reason}`, -}); - -/** - * InternalError - Returned for unrecoverable internal errors. - */ -export const InternalError = error({ - name: "InternalError", - schema: z.object({ context: z.string() }), - message: (args) => `Internal error: ${args.context}`, -}); - -/** - * ServerError - Used for server-side exceptions with a code. - */ -export const ServerError = error({ - name: "ServerError", - schema: z.object({ code: z.string(), message: z.string() }), - message: (args) => `[${args.code}] ${args.message}`, -}); - -/** - * Create a route not found error result. - */ -export const routeNotFound = (route: string): Result> => - // eslint-disable-next-line unicorn/throw-new-error -- error() returns a factory function, not a class - err(RouteNotFoundError({ route })); - -/** - * Create a validation error result from Zod issues. - */ -export const validationFailed = ( - route: string, - zodIssues: z.ZodError["issues"] -): Result> => - err( - // eslint-disable-next-line unicorn/throw-new-error -- error() returns a factory function, not a class - ValidationError({ - route, - errors: zodIssues.map((e) => ({ - path: e.path.join("."), - message: e.message, - })), - }) - ); - -/** - * Create an internal error result. - */ -export const internalError = (context: string): Result> => - // eslint-disable-next-line unicorn/throw-new-error -- error() returns a factory function, not a class - err(InternalError({ context })); - -/** - * Create a server error result. - */ -export const serverError = ( - code: string, - message: string -): Result> => - // eslint-disable-next-line unicorn/throw-new-error -- error() returns a factory function, not a class - err(ServerError({ code, message })); diff --git a/packages/server/src/api/factory/api.ts b/packages/server/src/api/factory/api.ts deleted file mode 100644 index fdb35de..0000000 --- a/packages/server/src/api/factory/api.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { createPendingEventQueue } from "../../events/queue.js"; -import { isRouter, isProcedure } from "../../router/index.js"; -import { type APIInstance, type RequestInfo, type EventEmitterAny } from "../types/api.js"; -import { type TypedAPIInstance, type PublicRouter, apiInternalSymbol } from "../types/proxy.js"; -import { type APIInstanceState, type RouterProxyContext } from "../types/internal.js"; -import { createRouterProxy } from "./proxy.js"; -import { type Middleware, type Plugin, type Router } from "../../types.js"; - -// ============================================================ -// Public Router Filter -// ============================================================ - -const isQueryOrMutation = (procedure: unknown): boolean => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const type = (procedure as any).type; - return type === "query" || type === "mutation"; -}; - -/** - * Filters a router to only include public queries and mutations. - * Internal procedures and unknown types are explicitly excluded. - */ -export const filterPublicRouter = , Ctx>( - router: TRoutes -): PublicRouter => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const result: Record = {}; - - for (const key in router) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const value = (router as Record)[key]; - - // Check procedure FIRST - isRouter returns true for procedure objects too - if (isProcedure(value) && isQueryOrMutation(value)) { - // Only include public queries and mutations - result[key] = value; - } else if (isRouter(value)) { - // Recursively filter nested routers - const filtered = filterPublicRouter(value); - // Only include nested router if it has public procedures - if (Object.keys(filtered).length > 0) { - result[key] = filtered; - } - } - // Explicitly ignore everything else (internal procedures, unknown types) - } - - return result as PublicRouter; -}; - -// ============================================================ -// Public API Creation -// ============================================================ - -export const createAPI = >( - config: { - readonly router: TRoutes; - readonly context?: Ctx; - readonly createContext?: (requestInfo?: RequestInfo) => Ctx; - readonly plugins?: readonly Plugin[]; - readonly middleware?: readonly Middleware[]; - readonly eventEmitter?: EventEmitterAny; - } -): TypedAPIInstance => { - const { - router, - context, - createContext, - plugins = [], - middleware = [], - eventEmitter, - } = config; - - const queue = createPendingEventQueue(); - - // Note: contextFactory is called once at creation. - // For per-request context, use createContext with proper request handling. - const contextFactory = - createContext ?? ((_requestInfo?: RequestInfo) => context as Ctx); - const initialCtx = contextFactory(); - - const state: APIInstanceState = { - router, - ctx: initialCtx, - plugins, - globalMiddleware: middleware, - eventEmitter, - }; - - const proxyCtx: RouterProxyContext = { - router: state.router, - ctx: state.ctx, - globalMiddleware: state.globalMiddleware, - rootRouter: state.router, - eventEmitter, - queue, - plugins: state.plugins, - }; - - const routerProxy = createRouterProxy(proxyCtx); - - // Create a typed Proxy for the API instance - const handler: ProxyHandler> = { - get(target, prop) { - // Handle symbol access for internal properties - if (typeof prop === "symbol") { - if (prop === apiInternalSymbol) { - return { - router: target.router, - ctx: target.ctx, - plugins: target.plugins, - eventEmitter: target.eventEmitter, - }; - } - return undefined; - } - - // Handle root properties (string only) - switch (prop) { - case "router": - return target.router; - case "ctx": - return target.ctx; - case "plugins": - return target.plugins; - case "globalMiddleware": - return target.globalMiddleware; - case "eventEmitter": - return target.eventEmitter; - case "getEvents": - return () => target.eventEmitter?.getEventLog() ?? []; - } - - // Delegate to router proxy for route access - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return (routerProxy as any)[prop]; - }, - }; - - return new Proxy(state, handler) as unknown as TypedAPIInstance; -}; - -/** - * Creates a public-only view of an API by filtering out internal procedures. - * Shares the same queue and event emitter for efficiency. - */ -export const createPublicAPI = >( - api: APIInstance -): TypedAPIInstance> => { - const publicRouter = filterPublicRouter(api.router); - - // Note: createContext is preserved from original API but called once. - // This is a known limitation - per-request context requires architecture change. - return createAPI({ - router: publicRouter as TRoutes, - context: api.ctx, - createContext: undefined, - plugins: api.plugins, - middleware: api.globalMiddleware, - eventEmitter: api.eventEmitter, - }); -}; diff --git a/packages/server/src/api/factory/errors.ts b/packages/server/src/api/factory/errors.ts deleted file mode 100644 index 0a14be3..0000000 --- a/packages/server/src/api/factory/errors.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { type Result } from "@deessejs/fp"; -import { error as errorFn } from "@deessejs/fp"; -import { internalError, serverError } from "../errors.js"; - -// ============================================================ -// L1: Error Creation -// ============================================================ - -export const createInternalErrorResult = (message: string, route: string): Result => - internalError(message).mapErr((e) => - e - .addNotes(`Error in route: ${route}`) - .from( - errorFn({ name: "INTERNAL_ERROR", message: (_: unknown) => message })({ - message, - }) - ) - ); - -export const createServerErrorResult = ( - code: string, - message: string, - route: string -): Result => - serverError(code, message).mapErr((e) => - e - .addNotes(`Route: ${route}`) - .from(errorFn({ name: code, message: (_: unknown) => message })({ message })) - ); diff --git a/packages/server/src/api/factory/index.ts b/packages/server/src/api/factory/index.ts deleted file mode 100644 index 979c2b3..0000000 --- a/packages/server/src/api/factory/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Factory module - decomposed API factory into focused files -// Follows abstraction levels: L1 (atomic) -> L2 (composed) -> L3 (orchestration) - -export { createAPI, createPublicAPI, filterPublicRouter } from "./api.js"; -export { createRouterProxy } from "./proxy.js"; -export { executeRoute } from "./route.js"; -export { executeProcedure } from "./procedure.js"; - -// Context types -export type { - RouterProxyContext, - ExecuteRouteContext, - ExecuteProcedureContext, -} from "../types/internal.js"; diff --git a/packages/server/src/api/factory/plugins.ts b/packages/server/src/api/factory/plugins.ts deleted file mode 100644 index f1eb583..0000000 --- a/packages/server/src/api/factory/plugins.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { type Plugin } from "../../types.js"; - -// ============================================================ -// L1: Plugin Application (Performance Rule) -// ============================================================ - -export const applyPlugins = (ctx: Ctx, plugins: readonly Plugin[]): Ctx => { - if (plugins.length === 0) return ctx; - - // L1: Clone once at start to guarantee immutability of original ctx - const extendedCtx = Object.assign({}, ctx as Record) as Ctx; - - // L2: Apply plugins using Object.assign (performance rule - no intermediate allocations) - for (let i = 0; i < plugins.length; i++) { - const extension = plugins[i].extend(extendedCtx); - Object.assign(extendedCtx as Record, extension); - } - - return extendedCtx; -}; diff --git a/packages/server/src/api/factory/procedure.ts b/packages/server/src/api/factory/procedure.ts deleted file mode 100644 index 59bc6ea..0000000 --- a/packages/server/src/api/factory/procedure.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { type Result } from "@deessejs/fp"; -import { type Middleware, type EventRegistry, type HandlerContext, type Procedure } from "../../types.js"; -import { type ProcedureWithHooks } from "../types/internal.js"; -import { type EventEmitterAny } from "../types/api.js"; -import { type EventQueue } from "../../events/queue.js"; -import { type ExecuteProcedureContext } from "../types/internal.js"; -import { createHandlerContext } from "./send.js"; -import { validationFailed } from "../errors.js"; -import { createInternalErrorResult, createServerErrorResult } from "./errors.js"; -import { ServerException } from "../../errors/server-error.js"; - -// ============================================================ -// L2: Procedure Execution with Hooks -// ============================================================ - -const executeProcedureWithHooks = async ( - ctx: HandlerContext, - args: Args, - hookedProc: ProcedureWithHooks, - procedure: Procedure, - route: string, - queue: EventQueue, - eventEmitter: EventEmitterAny | undefined -): Promise> => { - // L1: Invoke beforeInvoke hook - if (hookedProc._hooks?.beforeInvoke) { - void hookedProc._hooks.beforeInvoke(ctx, args); - } - - try { - const result = await procedure.handler(ctx, args); - - // L1: Invoke afterInvoke hook - if (hookedProc._hooks?.afterInvoke) { - void hookedProc._hooks.afterInvoke(ctx, args, result); - } - - if (result.ok) { - // L1: Invoke onSuccess hook - if (hookedProc._hooks?.onSuccess) { - void hookedProc._hooks.onSuccess(ctx, args, result.value); - } - // L1: Flush queue on success - await queue.flush(eventEmitter); - } else { - // L1: Invoke onError hook - if (hookedProc._hooks?.onError) { - void hookedProc._hooks.onError(ctx, args, result.error); - } - } - - return result; - } catch (error) { - // L1: Invoke onError hook on exception - if (hookedProc._hooks?.onError) { - void hookedProc._hooks.onError(ctx, args, error); - } - return createInternalErrorResult( - error instanceof Error ? error.message : String(error), - route - ); - } -}; - -// ============================================================ -// L2: Middleware Chain Runner (with double-next protection) -// ============================================================ - -const runMiddlewareChain = ( - allMiddleware: readonly Middleware[], - handlerCtx: HandlerContext, - args: Args, - finalInvoke: () => Promise> -): (() => Promise>) => { - let index = -1; - - const next = async (overrides?: { ctx?: Partial }): Promise> => { - // L1: Double-next protection - validate index hasn't been reused - const nextIndex = index + 1; - if (nextIndex <= index) { - throw new Error(`Middleware safety violation: next() called multiple times at index ${index}`); - } - index = nextIndex; - - const currentCtx = overrides?.ctx ? { ...handlerCtx, ...overrides.ctx } : handlerCtx; - - if (index >= allMiddleware.length) { - return finalInvoke(); - } - - const mw = allMiddleware[index]; - return mw.handler(currentCtx, { - next: (innerOverrides?: { ctx?: Partial }) => next(innerOverrides), - args, - meta: {}, - }) as unknown as Promise>; - }; - - return next; -}; - -// ============================================================ -// L3: Execute Procedure (main orchestration) -// ============================================================ - -export const executeProcedure = async ( - ctx: ExecuteProcedureContext -): Promise> => { - const { procedure, ctx: procedureCtx, args, middleware, eventEmitter, queue, route, plugins } = ctx; - const handlerCtx = createHandlerContext(procedureCtx, queue, plugins); - const hookedProc = procedure as unknown as ProcedureWithHooks; - - // L1: Validate args if schema exists - if (hookedProc.argsSchema) { - const parseResult = hookedProc.argsSchema.safeParse(args); - if (!parseResult.success) { - return validationFailed(route, parseResult.error.issues).mapErr((e) => - e.addNotes(`Validation failed for route: ${route}`) - ); - } - } - - const procedureMiddleware: readonly Middleware[] = hookedProc._middleware || []; - const allMiddleware: readonly Middleware[] = [...middleware, ...procedureMiddleware]; - - // L2: Final invoke function - const finalInvoke = (): Promise> => - executeProcedureWithHooks( - handlerCtx, - args, - hookedProc, - procedure, - route, - queue, - eventEmitter - ); - - // L2: Run middleware chain - const runChain = runMiddlewareChain(allMiddleware, handlerCtx, args, finalInvoke); - - try { - return await runChain(); - } catch (error: unknown) { - queue.clear(); - - if (error instanceof ServerException) { - return createServerErrorResult(error.code, error.message, route); - } - - const errToReturn = error instanceof Error ? error : new Error(String(error)); - return createInternalErrorResult(errToReturn.message, route); - } -}; diff --git a/packages/server/src/api/factory/proxy.ts b/packages/server/src/api/factory/proxy.ts deleted file mode 100644 index 860383f..0000000 --- a/packages/server/src/api/factory/proxy.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { none } from "@deessejs/fp"; -import { type Router } from "../../types.js"; -import { isProcedure } from "../../router/index.js"; -import { type ExecuteRouteContext, type RouterProxyContext } from "../types/internal.js"; -import { isValidSymbol, buildFullPath, isNoArgsProcedure } from "./utils.js"; -import { executeRoute } from "./route.js"; - -// ============================================================ -// Router Proxy Creation (Memoized per instance) -// ============================================================ - -export const createRouterProxy = ( - proxyCtx: RouterProxyContext, - path: readonly string[] = [] - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ -): any => { - const { router, ctx, globalMiddleware, rootRouter, eventEmitter, queue, plugins } = proxyCtx; - - // L1: Memoization cache for this proxy instance (stability for React/useEffect) - const cache = new Map(); - - return new Proxy( - {}, - /* eslint-disable @typescript-eslint/consistent-return */ - { - get(target: unknown, prop: string | symbol): unknown { - if (cache.has(prop)) { - return cache.get(prop); - } - - if (!isValidSymbol(prop)) { - return undefined; - } - - if (typeof prop !== "string") { - return none(); - } - - const value = (router as Record)[prop]; - if (value === undefined) { - return none(); - } - - let result: unknown; - - if (isProcedure(value)) { - const fullPath = buildFullPath(path, prop); - - // L2: Create routeCtx with rootRouter for proper procedure lookup - const routeCtx: ExecuteRouteContext = { - router: rootRouter, - ctx, - globalMiddleware, - eventEmitter, - queue, - plugins, - }; - - if (isNoArgsProcedure(value)) { - result = () => executeRoute(fullPath, undefined, routeCtx); - } else { - result = (args: unknown) => executeRoute(fullPath, args, routeCtx); - } - } else if (typeof value === "object" && value !== null) { - // L2: Nested proxy created once per path - result = createRouterProxy( - { ...proxyCtx, router: value as Router }, - [...path, prop] - ); - } else { - result = none(); - } - - // L2: Cache the result for consistent references - cache.set(prop, result); - return result; - }, - } - ); -}; diff --git a/packages/server/src/api/factory/route.ts b/packages/server/src/api/factory/route.ts deleted file mode 100644 index 81b7b14..0000000 --- a/packages/server/src/api/factory/route.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { type Result } from "@deessejs/fp"; -import { type Procedure } from "../../types.js"; -import { type ExecuteRouteContext, type ExecuteProcedureContext } from "../types/internal.js"; -import { splitRoutePath, getProcedureFromPath } from "./utils.js"; -import { routeNotFound } from "../errors.js"; -import { executeProcedure } from "./procedure.js"; - -// ============================================================ -// Route Execution (Performance Rule - Route Memoization) -// ============================================================ - -export const executeRoute = async ( - route: string, - args: unknown, - routeCtx: ExecuteRouteContext -): Promise> => { - const { router, ctx, globalMiddleware, eventEmitter, queue, plugins, routeCache } = routeCtx; - - // L2: Check cache first (O(1) lookup after first resolution) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let procedure: Procedure | undefined; - if (routeCache) { - procedure = routeCache.get(route); - } - - // L2: Resolve and cache if not found - if (!procedure) { - const pathParts = splitRoutePath(route); - procedure = getProcedureFromPath(router, pathParts); - - if (procedure) { - // L2: Cache on first resolution (lazy caching per API instance) - routeCache?.set(route, procedure); - } - } - - if (!procedure) { - return routeNotFound(route); - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const procedureCtx: ExecuteProcedureContext = { - procedure, - ctx, - args, - middleware: globalMiddleware, - eventEmitter, - queue, - route, - plugins, - }; - - return executeProcedure(procedureCtx); -}; diff --git a/packages/server/src/api/factory/send.ts b/packages/server/src/api/factory/send.ts deleted file mode 100644 index b03c635..0000000 --- a/packages/server/src/api/factory/send.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { type Plugin, type EventRegistry, type SendOptions, type HandlerContext } from "../../types.js"; -import { type EventQueue } from "../../events/queue.js"; -import { applyPlugins } from "./plugins.js"; - -// ============================================================ -// Constants -// ============================================================ - -const DEFAULT_NAMESPACE = "default" as const; - -// ============================================================ -// L1: Handler Context Creation -// ============================================================ - -export const createSendFn = ( - queue: EventQueue -) => - ( - name: K, - data: Events[K]["data"], - options?: SendOptions - ): void => { - queue.enqueue({ - name: name as string, - data, - timestamp: new Date().toISOString(), - namespace: options?.namespace ?? DEFAULT_NAMESPACE, - options, - }); - }; - -export const createHandlerContext = ( - ctx: Ctx, - queue: EventQueue, - plugins: readonly Plugin[] -): HandlerContext => { - const send = createSendFn(queue); - const extendedCtx = applyPlugins(ctx, plugins); - - // Use Object.assign to help TypeScript infer the intersection type - return Object.assign(extendedCtx as object, { send }) as HandlerContext; -}; diff --git a/packages/server/src/api/factory/utils.ts b/packages/server/src/api/factory/utils.ts deleted file mode 100644 index cf66016..0000000 --- a/packages/server/src/api/factory/utils.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* eslint-disable @typescript-eslint/consistent-return */ -import { none } from "@deessejs/fp"; -import { type Router, type Procedure } from "../../types.js"; -import { isProcedure } from "../../router/index.js"; - -// ============================================================ -// L1: Atomic Operations -// ============================================================ - -export const splitRoutePath = (route: string): readonly string[] => route.split("."); - -// eslint-disable-next-line @typescript-eslint/consistent-return -export const getProcedureFromPath = ( - router: Router, - pathParts: readonly string[] -): Procedure | undefined => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let current: Record = router as any; - for (let i = 0; i < pathParts.length - 1; i++) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - current = current[pathParts[i]] as any; - if (!current) { - return undefined; - } - } - const procedure = current[pathParts.at(-1)!]; - const procIsProcedure = isProcedure(procedure); - if (!procIsProcedure) { - // eslint-disable-next-line @typescript-eslint/consistent-return - return undefined; - } - return procedure; -}; - -// Invalid symbols that Proxy's get trap will be called with -const INVALID_SYMBOLS = new Set([ - Symbol.toStringTag, - Symbol.iterator, - Symbol.toPrimitive, -]); - -export const isValidSymbol = (prop: string | symbol): boolean => { - // String properties are always valid - if (typeof prop === "string") return true; - // Symbol properties are valid except for special internal ones - return !INVALID_SYMBOLS.has(prop); -}; - -export const getSymbolProperty = (_prop: string | symbol): unknown => { - // eslint-disable-next-line @typescript-eslint/consistent-return -- all branches return - return none(); -}; - -export const buildFullPath = (path: readonly string[], prop: string): string => { - return [...path, prop].join("."); -}; - -export const isNoArgsProcedure = (procedure: unknown): boolean => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return !(procedure as any).argsSchema; -}; diff --git a/packages/server/src/api/index.ts b/packages/server/src/api/index.ts deleted file mode 100644 index 382c028..0000000 --- a/packages/server/src/api/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export type { APIInstance, APIConfig, RequestInfo } from "./types/api.js"; -export type { TypedAPIInstance, PublicRouter, InferArgs, InferOutput, DecoratedProcedure, DecoratedRouter, apiInternalSymbol } from "./types/proxy.js"; -export type { APIInstanceState } from "./types/internal.js"; -export { createAPI, createPublicAPI, filterPublicRouter } from "./factory/index.js"; -export { - RouteNotFoundError, - ValidationError, - MiddlewareError, - InternalError, - ServerError, - routeNotFound, - validationFailed, - serverError, - internalError, -} from "./errors.js"; diff --git a/packages/server/src/api/types/api.ts b/packages/server/src/api/types/api.ts deleted file mode 100644 index dad7b0b..0000000 --- a/packages/server/src/api/types/api.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { type EventEmitter } from "../../events/emitter.js"; -import { type Router } from "../../types.js"; -import { type Plugin, type Middleware } from "../../types.js"; - -/* eslint-disable @typescript-eslint/no-explicit-any */ - -export type EventEmitterAny = EventEmitter; - -export type RequestInfo = Readonly<{ - headers?: Record; - method?: string; - url?: string; - [key: string]: unknown; -}>; - -export type APIInstance> = Readonly<{ - router: TRoutes; - ctx: Ctx; - plugins: readonly Plugin[]; - globalMiddleware: readonly Middleware[]; - eventEmitter?: EventEmitterAny; -}>; - -export type APIConfig> = Readonly<{ - router: TRoutes; - context?: unknown; - /** - * Factory function to create context per request. - * Receives optional RequestInfo (headers, method, url) for per-request context enrichment. - */ - createContext?: (requestInfo?: RequestInfo) => unknown; - plugins: readonly Plugin[]; - middleware: readonly Middleware[]; - eventEmitter?: EventEmitterAny; -}>; diff --git a/packages/server/src/api/types/index.ts b/packages/server/src/api/types/index.ts deleted file mode 100644 index 7dd244f..0000000 --- a/packages/server/src/api/types/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -// API types - public -export type { EventEmitterAny, APIInstance, APIConfig, RequestInfo } from "./api.js"; - -// Proxy types -export type { TypedAPIInstance, PublicRouter, InferArgs, InferOutput, DecoratedProcedure, DecoratedRouter, apiInternalSymbol } from "./proxy.js"; - -// Internal types - for use within the API module -export type { - ProcedureWithHooks, - APIInstanceState, - RouterProxyContext, - ExecuteRouteContext, - ExecuteProcedureContext, -} from "./internal.js"; diff --git a/packages/server/src/api/types/internal.ts b/packages/server/src/api/types/internal.ts deleted file mode 100644 index ca9b928..0000000 --- a/packages/server/src/api/types/internal.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { type Result } from "@deessejs/fp"; -import { type Middleware, type Plugin, type Router, type Procedure, type EventRegistry, type HandlerContext } from "../../types.js"; -import { type EventEmitterAny } from "./api.js"; -import { type EventQueue } from "../../events/queue.js"; - - - -// Procedure augmented with internal hooks and metadata (used internally in API execution) -export type ProcedureWithHooks = Readonly<{ - argsSchema?: Procedure["argsSchema"]; - _middleware?: readonly Middleware[]; - _hooks?: Readonly<{ - beforeInvoke?: (ctx: HandlerContext, args: Args) => void | Promise; - afterInvoke?: (ctx: HandlerContext, args: Args, result: Result) => void | Promise; - onSuccess?: (ctx: HandlerContext, args: Args, data: Output) => void | Promise; - onError?: (ctx: HandlerContext, args: Args, error: unknown) => void | Promise; - }>; - readonly type: Procedure["type"]; - readonly handler: Procedure["handler"]; -}>; - -// Internal state for API instance -export type APIInstanceState> = Readonly<{ - router: TRoutes; - ctx: Ctx; - plugins: readonly Plugin[]; - globalMiddleware: readonly Middleware[]; - eventEmitter?: EventEmitterAny; -}>; - -// Context objects to reduce parameters to max 3 -export type RouterProxyContext = Readonly<{ - readonly router: Router; - readonly ctx: Ctx; - readonly globalMiddleware: readonly Middleware[]; - readonly rootRouter: Router; - readonly eventEmitter: EventEmitterAny | undefined; - readonly queue: EventQueue; - readonly plugins: readonly Plugin[]; - readonly routeCache?: Map>; -}>; - -export type ExecuteRouteContext = Readonly<{ - readonly router: Router; - readonly ctx: Ctx; - readonly globalMiddleware: readonly Middleware[]; - readonly eventEmitter: EventEmitterAny | undefined; - readonly queue: EventQueue; - readonly plugins: readonly Plugin[]; - readonly routeCache?: Map>; -}>; - -export type ExecuteProcedureContext = Readonly<{ - readonly procedure: Procedure; - readonly ctx: Ctx; - readonly args: Args; - readonly middleware: readonly Middleware[]; - readonly eventEmitter: EventEmitterAny | undefined; - readonly queue: EventQueue; - readonly route: string; - readonly plugins: readonly Plugin[]; -}>; diff --git a/packages/server/src/api/types/proxy.ts b/packages/server/src/api/types/proxy.ts deleted file mode 100644 index 849bf4d..0000000 --- a/packages/server/src/api/types/proxy.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { type Result } from "@deessejs/fp"; -import { type AnyProcedure, type Router, type Procedure, type Plugin } from "../../types.js"; -import { type EventEmitterAny } from "./api.js"; - -/* eslint-disable @typescript-eslint/no-explicit-any */ - -// ============================================ -// Symbol for internal API access -// ============================================ - -export const apiInternalSymbol = Symbol.for("deesse.api.internal"); - -// ============================================ -// Helper types for extracting procedure types -// ============================================ - -// Extract input type from procedure using _def.$types -export type InferArgs = T extends { _def: { $types: { input: infer I } } } ? I : never; - -// Extract output type from procedure using _def.$types -export type InferOutput = T extends { _def: { $types: { output: infer O } } } ? O : never; - -// ============================================ -// DecoratedProcedure - callable procedure proxy with proper input/output types -// Uses structural constraint instead of requiring exact AnyProcedure type -// ============================================ - -export type DecoratedProcedure = - [InferArgs] extends [never] - ? () => Promise>> - : (args: InferArgs) => Promise>>; - -// ============================================ -// DecoratedRouter - recursive router decoration (THE KEY TYPE) -// Uses direct recursion without 'any' - no intersection, no APIInstance -// ============================================ - -export type DecoratedRouter, Ctx = any> = { - [K in keyof TRoutes & string]: [TRoutes[K]] extends [{ type: string }] - ? DecoratedProcedure - : [TRoutes[K]] extends [Record] - ? DecoratedRouter - : TRoutes[K]; -} & Record; - -// ============================================ -// TypedAPIInstance - final type using symbol for internal access -// Uses DecoratedRouter directly as mapped type (preserves exact keys via [K in keyof TRoutes]) -// Symbol key for internals - no index signature that creates union -// ============================================ - -export type TypedAPIInstance> = - DecoratedRouter & { - readonly [apiInternalSymbol]: { - router: TRoutes; - ctx: Ctx; - plugins: readonly Plugin[]; - eventEmitter?: EventEmitterAny; - }; - }; - -// ============================================ -// PublicRouter - filters out internal queries and mutations from router type -// ============================================ - -export type PublicRouter> = { - readonly [K in keyof TRoutes as [TRoutes[K]] extends [Procedure] - ? [TRoutes[K]] extends [{ type: "query" | "mutation" }] - ? K - : never - : K]: [TRoutes[K]] extends [Router] - ? PublicRouter - : TRoutes[K]; -}; \ No newline at end of file diff --git a/packages/server/src/context/builder.ts b/packages/server/src/context/builder.ts deleted file mode 100644 index f993861..0000000 --- a/packages/server/src/context/builder.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { type EventRegistry, type Middleware, type Router, type Plugin, type PluginEnrichment } from "../types.js"; -import { QueryBuilder } from "../query/builder.js"; -import { EventEmitter } from "../events/emitter.js"; -import { createAPI } from "../api/factory/index.js"; -import { type TypedAPIInstance } from "../api/types/proxy.js"; -import { type DefineContextConfig } from "./types.js"; - -// ============================================ -// ContextBuilder - builder for context with plugins -// ============================================ - -export class ContextBuilder< - Ctx, - Events extends EventRegistry = EventRegistry, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - Plugins extends Plugin[] = [] -> { - private context?: Ctx; - private createContext?: (requestInfo?: { headers?: Record; method?: string; url?: string }) => Ctx; - private plugins: Plugins; - private events?: Events; - - constructor( - context?: Ctx, - createContext?: (requestInfo?: { headers?: Record; method?: string; url?: string }) => Ctx, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - plugins: Plugins = [] as any, - events?: Events - ) { - this.context = context; - this.createContext = createContext; - this.plugins = plugins; - this.events = events; - } - - /** - * Add a plugin to the context builder. - * Returns a new ContextBuilder with the plugin added. - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - use>(plugin: NewPlugin): ContextBuilder { - return new ContextBuilder( - this.context, - this.createContext, - [...this.plugins, plugin] as [...Plugins, NewPlugin], - this.events - ); - } - - /** - * Set the events registry. - */ - withEvents(events: NewEvents): ContextBuilder { - return new ContextBuilder( - this.context, - this.createContext, - this.plugins, - events - ); - } - - /** - * Build the context with all plugins and their enrichments. - * Returns t (QueryBuilder + enrichments) and createAPI function. - */ - build(): { - t: QueryBuilder; - createAPI: (apiConfig: { router: Router; middleware?: Middleware[]; context?: Ctx }) => TypedAPIInstance>; - } { - const eventEmitter = this.events ? new EventEmitter(this.events) : undefined; - const initialContext = this.createContext ? this.createContext() : this.context; - - /* eslint-disable @typescript-eslint/no-explicit-any */ - const t = new QueryBuilder(initialContext as Ctx, eventEmitter as any) as any; - /* eslint-enable @typescript-eslint/no-explicit-any */ - - // Apply plugin enrichments to t - for (const plugin of this.plugins) { - if (plugin.procedures) { - const enrichment = plugin.procedures(); - for (const namespace of Object.keys(enrichment)) { - if (!t[namespace]) { - (t as any)[namespace] = {}; - } - const ns = (t as any)[namespace]; - for (const methodName of Object.keys(enrichment[namespace])) { - ns[methodName] = enrichment[namespace][methodName]; - } - } - } - } - - // Use initialContext (enriched by plugins) by default, or user-provided context - const createAPIFn = (apiConfig: { router: Router; middleware?: Middleware[]; context?: Ctx }) => { - return createAPI({ - router: apiConfig.router, - context: apiConfig.context ?? initialContext, - plugins: this.plugins as Plugin[], - middleware: apiConfig.middleware, - eventEmitter, - }); - }; - - return { t, createAPI: createAPIFn }; - } -} - -// ============================================ -// createContextBuilder - factory function -// ============================================ - -export function createContextBuilder(): ContextBuilder { - return new ContextBuilder(); -} - -// ============================================ -// defineContext - backward compatible function API -// ============================================ - -export function defineContext< - Ctx, - Events extends EventRegistry = EventRegistry ->( - config: DefineContextConfig -): { - t: QueryBuilder; - createAPI: (apiConfig: { router: Router; middleware?: Middleware[] }) => TypedAPIInstance>; -} { - const { context, createContext, plugins = [], events } = config; - - const eventEmitter = events ? new EventEmitter(events) : undefined; - - const initialContext = createContext ? createContext() : context; - - /* eslint-disable @typescript-eslint/no-explicit-any */ - const t = new QueryBuilder(initialContext as Ctx, eventEmitter as any); - /* eslint-enable @typescript-eslint/no-explicit-any */ - - const createAPIFn = (apiConfig: { router: Router; middleware?: Middleware[] }) => { - return createAPI({ - router: apiConfig.router, - context, - createContext, - plugins, - middleware: apiConfig.middleware, - eventEmitter, - }); - }; - - return { t, createAPI: createAPIFn }; -} diff --git a/packages/server/src/context/index.ts b/packages/server/src/context/index.ts deleted file mode 100644 index ad1fbd4..0000000 --- a/packages/server/src/context/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { DefineContextConfig } from "./types.js"; -export { defineContext, ContextBuilder, createContextBuilder } from "./builder.js"; -export type { PluginEnrichment } from "../types.js"; diff --git a/packages/server/src/context/types.ts b/packages/server/src/context/types.ts deleted file mode 100644 index d5c0eef..0000000 --- a/packages/server/src/context/types.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { type EventRegistry } from "../types.js"; -import { type RequestInfo } from "../api/types/api.js"; -import { type Plugin } from "../types.js"; - -export interface DefineContextConfig { - context?: Ctx; - /** - * Factory function to create context per request. - * Receives optional RequestInfo (headers, method, url) for per-request context enrichment. - * Use this for extracting auth user from headers, request-specific data, etc. - */ - createContext?: (requestInfo?: RequestInfo) => Ctx; - plugins?: Plugin[]; - events?: Events; -} diff --git a/packages/server/src/errors/index.ts b/packages/server/src/errors/index.ts deleted file mode 100644 index 9f28496..0000000 --- a/packages/server/src/errors/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type { ServerError } from "./types.js"; -export { - ok, - err, - ServerException, - NotFoundException, - UnauthorizedException, - ValidationException, - ErrorCodes, - createErrorResult, -} from "./server-error.js"; \ No newline at end of file diff --git a/packages/server/src/errors/server-error.ts b/packages/server/src/errors/server-error.ts deleted file mode 100644 index 3a0a65a..0000000 --- a/packages/server/src/errors/server-error.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { error as errorFn, err as errFn } from "@deessejs/fp"; -import { type Error } from "@deessejs/fp"; -import { type Result } from "@deessejs/fp"; - -export { ok, err } from "@deessejs/fp"; - -export class ServerException extends Error { - public readonly code: string; - public readonly statusCode: number; - public readonly args: Readonly<{ message: string; data?: Record }>; - - constructor(code: string, message: string, statusCode = 500, data?: Record) { - const errData = createError(code, { message, data } as { message: string; data?: Record }); - super(message); - this.name = "ServerException"; - this.code = code; - this.statusCode = statusCode; - this.stack = errData.stack; - this.cause = errData.cause; - this.args = errData.args as Readonly<{ message: string; data?: Record }>; - } -} - -export class NotFoundException extends ServerException { - constructor(message = "Resource not found") { - super("NOT_FOUND", message, 404); - this.name = "NotFoundException"; - } -} - -export class UnauthorizedException extends ServerException { - constructor(message = "Unauthorized") { - super("UNAUTHORIZED", message, 401); - this.name = "UnauthorizedException"; - } -} - -export class ValidationException extends ServerException { - constructor(message: string) { - super("VALIDATION_ERROR", message, 400); - this.name = "ValidationException"; - } -} - -// ============================================ -// Error Codes -// ============================================ - -export const ErrorCodes = { - NOT_FOUND: "NOT_FOUND", - UNAUTHORIZED: "UNAUTHORIZED", - VALIDATION_ERROR: "VALIDATION_ERROR", - FORBIDDEN: "FORBIDDEN", - CONFLICT: "CONFLICT", - INTERNAL_ERROR: "INTERNAL_ERROR", - ROUTE_NOT_FOUND: "ROUTE_NOT_FOUND", - INVALID_ARGS: "INVALID_ARGS", -} as const; - -// ============================================ -// Error Builder Helper -// ============================================ - -const ERROR_BUILDERS = { - NOT_FOUND: errorFn({ - name: "NOT_FOUND", - message: (args: { message: string }) => args.message, - }), - FORBIDDEN: errorFn({ - name: "FORBIDDEN", - message: (args: { message: string }) => args.message, - }), - CONFLICT: errorFn({ - name: "CONFLICT", - message: (args: { message: string }) => args.message, - }), - INTERNAL_ERROR: errorFn({ - name: "INTERNAL_ERROR", - message: (args: { message: string }) => args.message, - }), - ROUTE_NOT_FOUND: errorFn({ - name: "ROUTE_NOT_FOUND", - message: (args: { message: string }) => args.message, - }), - VALIDATION_ERROR: errorFn({ - name: "VALIDATION_ERROR", - message: (args: { message: string }) => args.message, - }), -} as const; - -function createError(name: string, args: { message: string; data?: Record }): Error { - const builder = ERROR_BUILDERS[name as keyof typeof ERROR_BUILDERS]; - if (builder) { - return builder(args) as Error; - } - return errorFn({ name, message: (a: { message: string }) => a.message })(args) as Error; -} - -// Helper to create error result properly typed -export function createErrorResult(code: string, message: string, data?: Record): Result { - const err = createError(code, { message, data } as { message: string; data?: Record }); - return errFn(err); -} diff --git a/packages/server/src/errors/types.ts b/packages/server/src/errors/types.ts deleted file mode 100644 index 13bbcb0..0000000 --- a/packages/server/src/errors/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface ServerError { - code: string; - message: string; - data?: Record; -} \ No newline at end of file diff --git a/packages/server/src/events/dsl.ts b/packages/server/src/events/dsl.ts deleted file mode 100644 index d47228e..0000000 --- a/packages/server/src/events/dsl.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Event DSL (Domain-Specific Language) - * - * This module provides a fluent API for defining events with better type safety - * and namespace support. - */ - -import { z } from "zod"; -import { __deesseEventBrand } from "./emitter.js"; - -/** - * Event definition interface - */ -export interface EventDefinition { - data?: unknown; - response?: unknown; - [__deesseEventBrand]: true; -} - -/** - * Wraps event args in the standard event structure. - * - * @example - * const eventDef = event({ args: z.object({ id: z.number(), name: z.string() }) }); - * // Returns: { data: z.object({ id: z.number(), name: z.string() }), [__deesseEventBrand]: true } - */ -export function event({ args }: { args: z.ZodType }): EventDefinition { - return { data: args, [__deesseEventBrand]: true }; -} - -/** - * Event namespace helper type - represents an event with data - */ -export interface EventWithData { - data: T; -} - -/** - * Groups events under a namespace without prefixing the keys. - * The outer key in defineEvents provides the namespace context. - * - * @example - * defineEvents({ - * user: eventNamespace({ name: "user", events: { - * created: event({ args: { id: number } }), - * updated: event({ args: { id: number, changes: Record } }), - * }), - * email: eventNamespace({ name: "email", events: { - * sent: event({ args: { to: string, template: string, subject: string } }), - * }), - * }); - * - * This produces an event registry with nested access: events.user.created - */ -export function eventNamespace< - N extends string, - Events extends Record ->( - config: { name: N; events: Events } -): Events { - // Simply return the events object - the outer key provides namespace context - return config.events; -} - -/** - * @deprecated Use eventNamespace instead - */ -export const eventsNamespace = eventNamespace; diff --git a/packages/server/src/events/emitter.ts b/packages/server/src/events/emitter.ts deleted file mode 100644 index a28c8bc..0000000 --- a/packages/server/src/events/emitter.ts +++ /dev/null @@ -1,302 +0,0 @@ -import { type EventRegistry, type EventPayload } from "../types.js"; -import { ok, err, unit, error, type Result, type Unit } from "@deessejs/fp"; - -const MAX_EVENT_LOG_SIZE = 1000; - -/** - * Unique symbol to brand event definitions for type-safe detection. - * This avoids magic number/key detection (e.g., Object.keys().length <= 2). - * Follows docs/rules/typing-rule.md - no magic numbers/keys. - */ -export const __deesseEventBrand = Symbol("__deesseEventBrand"); - -/** - * Type guard to check if an object is a properly branded EventDefinition. - * Also supports backward compatibility with plain event definitions that have 'data' property - * but lack the brand symbol. - * - * @param value - The value to check - * @returns True if the value is an EventDefinition with the brand symbol OR - * a backward-compatible event definition with 'data' property - * - * @example - * if (isEventDefinition(value)) { - * // value is typed as EventDefinition here - * } - */ -export function isEventDefinition(value: unknown): value is { data?: unknown; response?: unknown } { - if (typeof value !== "object" || value === null) { - return false; - } - - // Primary check: brand symbol (new style) - if (__deesseEventBrand in value) { - return true; - } - - // Backward compatibility: plain object with 'data' property and <= 2 keys (old style) - // This allows existing code using { "event.name": { data: ... } } to still work - if ("data" in value && Object.keys(value).length <= 2) { - return true; - } - - return false; -} - -export class EventEmitter { - private listeners: Map void | Promise>> = new Map(); - private eventLog: EventPayload[] = []; - // Prefix-based index for wildcard patterns: first segment -> set of patterns - // E.g., "user" -> Set of patterns like "user.*" - private prefixIndex: Map> = new Map(); - - constructor(_events?: Events) { - } - - on( - event: EventName, - handler: (payload: EventPayload) => void | Promise - ): () => void { - const eventStr = event as string; - if (!this.listeners.has(eventStr)) { - this.listeners.set(eventStr, new Set()); - // Index wildcard patterns by their first segment - if (eventStr.endsWith(".*")) { - const firstSegment = eventStr.split(".")[0]; - if (firstSegment && firstSegment !== "*") { - if (!this.prefixIndex.has(firstSegment)) { - this.prefixIndex.set(firstSegment, new Set()); - } - this.prefixIndex.get(firstSegment)!.add(eventStr); - } - } - } - /* eslint-disable @typescript-eslint/no-explicit-any */ - this.listeners.get(eventStr)!.add(handler as any); - /* eslint-enable @typescript-eslint/no-explicit-any */ - - // Return unsubscribe function - return () => { - this.off(event, handler); - }; - } - - off( - event: EventName, - handler: (payload: EventPayload) => void | Promise - ): void { - const eventStr = event as string; - const handlers = this.listeners.get(eventStr); - if (handlers) { - /* eslint-disable @typescript-eslint/no-explicit-any */ - handlers.delete(handler as any); - /* eslint-enable @typescript-eslint/no-explicit-any */ - - // If no more handlers for this pattern, remove from index - if (handlers.size === 0) { - this.listeners.delete(eventStr); - this.removePatternFromIndex(eventStr); - } - } - } - - private removePatternFromIndex(eventStr: string): void { - if (!eventStr.endsWith(".*")) return; - - const firstSegment = eventStr.split(".")[0]; - if (!firstSegment || firstSegment === "*") return; - - const prefixSet = this.prefixIndex.get(firstSegment); - if (!prefixSet) return; - - prefixSet.delete(eventStr); - if (prefixSet.size === 0) { - this.prefixIndex.delete(firstSegment); - } - } - - async emit( - event: EventName, - data: Events[EventName]["data"] - ): Promise>; - async emit(event: string, data: unknown, namespace?: string): Promise>; - async emit( - event: keyof Events | string, - data: unknown, - namespace?: string - ): Promise> { - const eventName = event as string; - const handlers = this.listeners.get(eventName); - const wildcardHandlers = this.getWildcardHandlers(eventName); - - // Merge regular and wildcard handlers - const allHandlers = new Set<((payload: EventPayload) => void | Promise)>(); - if (handlers) { - for (const handler of handlers) { - allHandlers.add(handler); - } - } - for (const handler of wildcardHandlers) { - allHandlers.add(handler); - } - - // Always log the event, even if there are no handlers - const payload: EventPayload = { - name: eventName, - data, - timestamp: new Date().toISOString(), - namespace: namespace ?? "default", - }; - - this.eventLog.push(payload); - if (this.eventLog.length > MAX_EVENT_LOG_SIZE) { - this.eventLog.shift(); - } - - // If no handlers, we're done - if (allHandlers.size === 0) return ok(unit); - - for (const handler of allHandlers) { - try { - const result = handler(payload); - if (result instanceof Promise) { - await result; - } - } catch (error_) { - const errMsg = error_ instanceof Error ? error_.message : String(error_); - const fpErr = error({ name: "INTERNAL_ERROR", message: (_: unknown) => errMsg })({ message: errMsg }); - return err(fpErr); - } - } - - return ok(unit); - } - - getEventLog(): EventPayload[] { - return [...this.eventLog]; - } - - clearEventLog(): void { - this.eventLog = []; - } - - private getWildcardHandlers(eventName: string): Set<(payload: EventPayload) => void | Promise> { - const handlers = new Set<(payload: EventPayload) => void | Promise>(); - - this.addGlobalWildcardHandlers(handlers); - this.addMatchingWildcardHandlers(handlers, eventName); - - return handlers; - } - - private addGlobalWildcardHandlers(handlers: Set<(payload: EventPayload) => void | Promise>): void { - const globalHandlers = this.listeners.get("*"); - if (globalHandlers) { - for (const handler of globalHandlers) { - handlers.add(handler); - } - } - } - - private addMatchingWildcardHandlers(handlers: Set<(payload: EventPayload) => void | Promise>, eventName: string): void { - const eventParts = eventName.split("."); - if (eventParts.length === 0) { - return; - } - - const firstSegment = eventParts[0]; - const candidatePatterns = this.prefixIndex.get(firstSegment); - if (!candidatePatterns) { - return; - } - - for (const pattern of candidatePatterns) { - if (this.isWildcardMatch(eventName, pattern)) { - const wildcardHandlers = this.listeners.get(pattern); - if (wildcardHandlers) { - for (const handler of wildcardHandlers) { - handlers.add(handler); - } - } - } - } - } - - private isWildcardMatch(eventName: string, pattern: string): boolean { - if (pattern === "*") return true; - if (pattern === eventName) return true; - - const eventParts = eventName.split("."); - - // Check if pattern ends with ".*" (suffix wildcard) - if (pattern.endsWith(".*")) { - return this.matchPrefix(eventParts, pattern.slice(0, -2)); - } - - // Check if pattern starts with "*." (leading wildcard) - if (pattern.startsWith("*.")) { - return this.matchSuffix(eventParts, pattern.slice(2)); - } - - return false; - } - - private matchPrefix(eventParts: string[], prefix: string): boolean { - const prefixParts = prefix.split("."); - if (eventParts.length < prefixParts.length) return false; - - for (let i = 0; i < prefixParts.length; i++) { - if (prefixParts[i] !== eventParts[i]) return false; - } - return true; - } - - private matchSuffix(eventParts: string[], suffix: string): boolean { - const suffixParts = suffix.split("."); - if (eventParts.length < suffixParts.length) return false; - - const offset = eventParts.length - suffixParts.length; - for (let i = 0; i < suffixParts.length; i++) { - if (suffixParts[i] !== eventParts[offset + i]) return false; - } - return true; - } -} - -export function defineEvents(events: Record): EventRegistry { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return flattenEvents(events as any); -} - -/** - * Flattens a nested event object into a flat EventRegistry. - * { user: { created: { data: T } } } => { "user.created": { data: T } } - * - * Uses __deesseEventBrand symbol for type-safe detection instead of - * magic key counts (Object.keys().length <= 2). - * - * This is used internally to support the namespace DSL while - * maintaining backward compatibility with nested object access. - */ -export function flattenEvents( - events: Events, - prefix: string = "" -): EventRegistry { - const result: EventRegistry = {}; - for (const key of Object.keys(events)) { - const fullKey = prefix ? `${prefix}.${key}` : key; - const value = events[key] as unknown; - // Use type guard instead of magic key count detection - if (isEventDefinition(value)) { - result[fullKey] = value; - } else if (value && typeof value === "object") { - // This is a namespace (nested object), recurse into it - Object.assign(result, flattenEvents(value as EventRegistry, fullKey)); - } - } - return result; -} - -export type EventHandler = ( - event: { name: EventName; data: Events[EventName]["data"] } -) => void | Promise; diff --git a/packages/server/src/events/index.ts b/packages/server/src/events/index.ts deleted file mode 100644 index 4627420..0000000 --- a/packages/server/src/events/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type { EventPayload } from "./types.js"; -export { EventEmitter, defineEvents, flattenEvents, isEventDefinition, __deesseEventBrand } from "./emitter.js"; -export type { EventHandler } from "./emitter.js"; -export { event, eventNamespace, eventsNamespace } from "./dsl.js"; -export type { PendingEventQueue } from "./queue.js"; -export { createPendingEventQueue } from "./queue.js"; \ No newline at end of file diff --git a/packages/server/src/events/queue.ts b/packages/server/src/events/queue.ts deleted file mode 100644 index f4a2514..0000000 --- a/packages/server/src/events/queue.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { type PendingEvent } from "../types.js"; -import { type EventEmitter } from "./emitter.js"; -import { type Result, type Unit } from "@deessejs/fp"; -import { ok, err, unit, error } from "@deessejs/fp"; - -export interface PendingEventQueue { - enqueue(event: PendingEvent): Result<{ eventName: string; data: unknown; processed: boolean; timestamp: string; namespace: string }>; - flush(emitter: EventEmitter | undefined): Promise>; - clear(): void; - isEmpty(): boolean; - events(): PendingEvent[]; - size(): number; -} - -// Type alias for queue instances -export type EventQueue = PendingEventQueue; - -export const createPendingEventQueue = (): PendingEventQueue => { - let _events: PendingEvent[] = []; - - return { - enqueue: (event: PendingEvent) => { - _events.push(event); - return ok({ - eventName: event.name, - data: event.data, - processed: true, - timestamp: event.timestamp, - namespace: event.namespace, - }); - }, - - flush: async (emitter: EventEmitter | undefined): Promise> => { - if (!emitter || _events.length === 0) { - _events = []; - return ok(unit); - } - let processedCount = 0; - try { - for (const event of _events) { - const result = await emitter.emit(event.name, event.data, event.namespace); - if (!result.ok) { - _events = _events.slice(processedCount); - return result; - } - processedCount++; - } - _events = []; - return ok(unit); - } catch (error_) { - _events = _events.slice(processedCount); - const errMsg = error_ instanceof Error ? error_.message : String(error_); - const fpErr = error({ name: "INTERNAL_ERROR", message: (_: unknown) => errMsg })({ message: errMsg }); - return err(fpErr); - } - }, - - clear: (): void => { - _events = []; - }, - - isEmpty: (): boolean => { - return _events.length === 0; - }, - - events: (): PendingEvent[] => { - return [..._events]; - }, - - size: (): number => { - return _events.length; - }, - }; -}; \ No newline at end of file diff --git a/packages/server/src/events/types.ts b/packages/server/src/events/types.ts deleted file mode 100644 index 87fbc14..0000000 --- a/packages/server/src/events/types.ts +++ /dev/null @@ -1 +0,0 @@ -export type { EventRegistry, EventPayload } from "../types.js"; diff --git a/packages/server/src/hooks/executor.ts b/packages/server/src/hooks/executor.ts deleted file mode 100644 index ec90bc3..0000000 --- a/packages/server/src/hooks/executor.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { type Result } from "@deessejs/fp"; -import { type BeforeInvokeHook } from "../types.js"; -import { type Hooks } from "./types.js"; - -export async function executeHooks( - hooks: Hooks, - ctx: Ctx, - args: Args, - result: Result -): Promise { - // Call afterInvoke first (always runs) - if (hooks.afterInvoke) { - await hooks.afterInvoke(ctx, args, result); - } - - // Then call onSuccess or onError based on result - if (result.ok) { - if (hooks.onSuccess) { - await hooks.onSuccess(ctx, args, result.value); - } - } else { - if (hooks.onError) { - await hooks.onError(ctx, args, result.error); - } - } -} - -export async function executeBeforeInvoke( - hook: BeforeInvokeHook | undefined, - ctx: Ctx, - args: Args -): Promise { - if (hook) { - await hook(ctx, args); - } -} diff --git a/packages/server/src/hooks/index.ts b/packages/server/src/hooks/index.ts deleted file mode 100644 index a893c4b..0000000 --- a/packages/server/src/hooks/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type { Hooks } from "./types.js"; -export { executeHooks, executeBeforeInvoke } from "./executor.js"; \ No newline at end of file diff --git a/packages/server/src/hooks/types.ts b/packages/server/src/hooks/types.ts deleted file mode 100644 index a27f359..0000000 --- a/packages/server/src/hooks/types.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { type BeforeInvokeHook } from "../types.js"; - -export interface Hooks { - beforeInvoke?: BeforeInvokeHook; - afterInvoke?: import("../types.js").AfterInvokeHook; - onSuccess?: import("../types.js").OnSuccessHook; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onError?: import("../types.js").OnErrorHook; -} diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 2372c2a..f660e42 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -1,73 +1,11 @@ -// ============================================ -// Main Exports -// ============================================ +export { query, mutation, defineServices, ValidationError } from './services/index.js'; -// Core functions -export { defineContext } from "./context/index.js"; -export { createAPI, createPublicAPI } from "./api/index.js"; -export { QueryBuilder } from "./query/index.js"; - -// Re-export types from @deessejs/fp -export type { Result } from "@deessejs/fp"; - -// Types from types.ts export type { - Query, - Mutation, - InternalQuery, - InternalMutation, - Procedure, - Router, - Middleware, - Plugin, - BeforeInvokeHook, - AfterInvokeHook, - OnSuccessHook, - OnErrorHook, - EventRegistry, - EventPayload, - SendOptions, - PendingEvent, -} from "./types.js"; - -// Events -export { EventEmitter, defineEvents } from "./events/index.js"; -export type { EventHandler } from "./events/index.js"; -export { event, eventNamespace, eventsNamespace } from "./events/index.js"; - -// Router helpers -export { - isRouter, - isProcedure, - resolvePath, - flattenRouter, - getPublicRoutes, - getInternalRoutes, -} from "./router/index.js"; -export type { RouterConfig, ValidationResult } from "./router/index.js"; - -// Hooks -export { executeHooks, executeBeforeInvoke } from "./hooks/index.js"; - -// Procedures -export { - withMetadata, - type Metadata, -} from "./procedure/index.js"; - -// Middleware -export { createMiddleware } from "./middleware/builder.js"; -export { withQuery, withMutation } from "./middleware/helpers.js"; - -// Also re-export the individual config types from their modules for convenience -export type { QueryConfig } from "./query/types.js"; -export type { MutationConfig } from "./mutation/types.js"; -export type { InternalQueryConfig } from "./internal-query/types.js"; -export type { InternalMutationConfig } from "./internal-mutation/types.js"; - -// API types -export type { RequestInfo } from "./api/types/api.js"; - -// Errors -export { ok, err, ServerException, NotFoundException, UnauthorizedException, ValidationException, ErrorCodes, createErrorResult } from "./errors/index.js"; -export type { ServerError } from "./errors/index.js"; \ No newline at end of file + ServiceConfig, + ServiceInternal, + BoundService, + ServiceFunction, + DefineServicesConfig, + LocalAPI, + ProcedureKind, +} from './types.js'; diff --git a/packages/server/src/internal-mutation/builder.ts b/packages/server/src/internal-mutation/builder.ts deleted file mode 100644 index b9b8830..0000000 --- a/packages/server/src/internal-mutation/builder.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; -import { type InternalMutation, type Middleware } from "../types.js"; -import { type InternalMutationConfig } from "./types.js"; -import { - type BeforeInvokeHook, - type AfterInvokeHook, - type OnSuccessHook, - type OnErrorHook, -} from "../types.js"; - -export type InternalMutationWithHooks = InternalMutation & - HookedProcedureMixin; - -export function createInternalMutationWithHooks( - config: InternalMutationConfig -): InternalMutationWithHooks { - return createHookedProcedure({ - type: "internalMutation", - argsSchema: config.args, - /* eslint-disable @typescript-eslint/no-explicit-any */ - handler: config.handler as any, - /* eslint-enable @typescript-eslint/no-explicit-any */ - }) as InternalMutationWithHooks; -} - -/* eslint-disable @typescript-eslint/no-explicit-any */ -interface HookedProcedureMixin { - type: "query" | "mutation" | "internalQuery" | "internalMutation"; - beforeInvoke(hook: BeforeInvokeHook): this; - afterInvoke(hook: AfterInvokeHook): this; - onSuccess(hook: OnSuccessHook): this; - onError(hook: OnErrorHook): this; - use(middleware: Middleware): this; - _hooks: { - beforeInvoke?: BeforeInvokeHook; - afterInvoke?: AfterInvokeHook; - onSuccess?: OnSuccessHook; - onError?: OnErrorHook; - }; - _middleware: Middleware[]; -} - -interface BaseProc { - type: "query" | "mutation" | "internalQuery" | "internalMutation"; - argsSchema?: ZodType; - handler: (ctx: Ctx, args: Args) => Promise>; -} - -function createHookedProcedure< - Ctx, - Args, - Output, - Proc extends BaseProc, ->(proc: Proc): Proc & HookedProcedureMixin { - const hookedProc: any = { - type: proc.type, - argsSchema: proc.argsSchema, - handler: proc.handler, - _hooks: {}, - _middleware: [], - }; - - hookedProc.beforeInvoke = function(hook: BeforeInvokeHook) { - hookedProc._hooks.beforeInvoke = hook; - return hookedProc; - }; - - hookedProc.afterInvoke = function(hook: AfterInvokeHook) { - hookedProc._hooks.afterInvoke = hook; - return hookedProc; - }; - - hookedProc.onSuccess = function(hook: OnSuccessHook) { - hookedProc._hooks.onSuccess = hook; - return hookedProc; - }; - - hookedProc.onError = function(hook: OnErrorHook) { - hookedProc._hooks.onError = hook; - return hookedProc; - }; - - hookedProc.use = function(middleware: Middleware) { - const newProc: any = { - type: hookedProc.type, - argsSchema: hookedProc.argsSchema, - handler: hookedProc.handler, - _hooks: { ...hookedProc._hooks }, - _middleware: [...hookedProc._middleware, middleware], - }; - - newProc.beforeInvoke = function(hook: BeforeInvokeHook) { - newProc._hooks.beforeInvoke = hook; - return newProc; - }; - - newProc.afterInvoke = function(hook: AfterInvokeHook) { - newProc._hooks.afterInvoke = hook; - return newProc; - }; - - newProc.onSuccess = function(hook: OnSuccessHook) { - newProc._hooks.onSuccess = hook; - return newProc; - }; - - newProc.onError = function(hook: OnErrorHook) { - newProc._hooks.onError = hook; - return newProc; - }; - - newProc.use = function(mw: Middleware) { - const result: any = { - type: newProc.type, - argsSchema: newProc.argsSchema, - handler: newProc.handler, - _hooks: { ...newProc._hooks }, - _middleware: [...newProc._middleware, mw], - }; - - result.beforeInvoke = function(hook: BeforeInvokeHook) { - result._hooks.beforeInvoke = hook; - return result; - }; - - result.afterInvoke = function(hook: AfterInvokeHook) { - result._hooks.afterInvoke = hook; - return result; - }; - - result.onSuccess = function(hook: OnSuccessHook) { - result._hooks.onSuccess = hook; - return result; - }; - - result.onError = function(hook: OnErrorHook) { - result._hooks.onError = hook; - return result; - }; - - result.use = newProc.use; - return result; - }; - - return newProc; - }; - - return hookedProc; -} -/* eslint-enable @typescript-eslint/no-explicit-any */ diff --git a/packages/server/src/internal-mutation/index.ts b/packages/server/src/internal-mutation/index.ts deleted file mode 100644 index 3d418df..0000000 --- a/packages/server/src/internal-mutation/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type { InternalMutationConfig } from "./types.js"; -export { createInternalMutationWithHooks, InternalMutationWithHooks } from "./builder.js"; \ No newline at end of file diff --git a/packages/server/src/internal-mutation/types.ts b/packages/server/src/internal-mutation/types.ts deleted file mode 100644 index 9418b9c..0000000 --- a/packages/server/src/internal-mutation/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; -import { type HandlerContext, type EventRegistry } from "../types.js"; - -export interface InternalMutationConfig { - args?: ZodType; - handler: (ctx: HandlerContext, args: Args) => Promise>; -} diff --git a/packages/server/src/internal-query/builder.ts b/packages/server/src/internal-query/builder.ts deleted file mode 100644 index 922e91a..0000000 --- a/packages/server/src/internal-query/builder.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { type Result } from "@deessejs/fp"; -import { type InternalQuery, type Middleware } from "../types.js"; -import { type InternalQueryConfig } from "./types.js"; -import { - type BeforeInvokeHook, - type AfterInvokeHook, - type OnSuccessHook, - type OnErrorHook, -} from "../types.js"; - -export type InternalQueryWithHooks = InternalQuery & - HookedProcedureMixin; - -/* eslint-disable @typescript-eslint/no-explicit-any */ -export function createInternalQueryWithHooks( - config: InternalQueryConfig -): InternalQueryWithHooks { - return createHookedProcedure({ - type: "internalQuery", - handler: config.handler as any, - }) as InternalQueryWithHooks; -} - -interface HookedProcedureMixin { - type: "query" | "mutation" | "internalQuery" | "internalMutation"; - beforeInvoke(hook: BeforeInvokeHook): this; - afterInvoke(hook: AfterInvokeHook): this; - onSuccess(hook: OnSuccessHook): this; - onError(hook: OnErrorHook): this; - use(middleware: Middleware): this; - _hooks: { - beforeInvoke?: BeforeInvokeHook; - afterInvoke?: AfterInvokeHook; - onSuccess?: OnSuccessHook; - onError?: OnErrorHook; - }; - _middleware: Middleware[]; -} - -interface BaseProc { - type: "query" | "mutation" | "internalQuery" | "internalMutation"; - argsSchema?: any; - handler: (ctx: Ctx, args: Args) => Promise>; -} - -function createHookedProcedure( - proc: BaseProc -): BaseProc & HookedProcedureMixin { - const hookedProc: any = { - type: proc.type, - argsSchema: proc.argsSchema, - handler: proc.handler, - _hooks: {}, - _middleware: [], - }; - - hookedProc.beforeInvoke = function(hook: BeforeInvokeHook) { - hookedProc._hooks.beforeInvoke = hook; - return hookedProc; - }; - - hookedProc.afterInvoke = function(hook: AfterInvokeHook) { - hookedProc._hooks.afterInvoke = hook; - return hookedProc; - }; - - hookedProc.onSuccess = function(hook: OnSuccessHook) { - hookedProc._hooks.onSuccess = hook; - return hookedProc; - }; - - hookedProc.onError = function(hook: OnErrorHook) { - hookedProc._hooks.onError = hook; - return hookedProc; - }; - - hookedProc.use = function(middleware: Middleware) { - const newProc: any = { - type: hookedProc.type, - argsSchema: hookedProc.argsSchema, - handler: hookedProc.handler, - _hooks: { ...hookedProc._hooks }, - _middleware: [...hookedProc._middleware, middleware], - }; - - newProc.beforeInvoke = function(hook: BeforeInvokeHook) { - newProc._hooks.beforeInvoke = hook; - return newProc; - }; - - newProc.afterInvoke = function(hook: AfterInvokeHook) { - newProc._hooks.afterInvoke = hook; - return newProc; - }; - - newProc.onSuccess = function(hook: OnSuccessHook) { - newProc._hooks.onSuccess = hook; - return newProc; - }; - - newProc.onError = function(hook: OnErrorHook) { - newProc._hooks.onError = hook; - return newProc; - }; - - newProc.use = function(mw: Middleware) { - const result: any = { - type: newProc.type, - argsSchema: newProc.argsSchema, - handler: newProc.handler, - _hooks: { ...newProc._hooks }, - _middleware: [...newProc._middleware, mw], - }; - - result.beforeInvoke = function(hook: BeforeInvokeHook) { - result._hooks.beforeInvoke = hook; - return result; - }; - - result.afterInvoke = function(hook: AfterInvokeHook) { - result._hooks.afterInvoke = hook; - return result; - }; - - result.onSuccess = function(hook: OnSuccessHook) { - result._hooks.onSuccess = hook; - return result; - }; - - result.onError = function(hook: OnErrorHook) { - result._hooks.onError = hook; - return result; - }; - - result.use = newProc.use; - return result; - }; - - return newProc; - }; - - return hookedProc; -} -/* eslint-enable @typescript-eslint/no-explicit-any */ diff --git a/packages/server/src/internal-query/index.ts b/packages/server/src/internal-query/index.ts deleted file mode 100644 index 072ca48..0000000 --- a/packages/server/src/internal-query/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type { InternalQueryConfig } from "./types.js"; -export { createInternalQueryWithHooks, InternalQueryWithHooks } from "./builder.js"; \ No newline at end of file diff --git a/packages/server/src/internal-query/types.ts b/packages/server/src/internal-query/types.ts deleted file mode 100644 index 007209d..0000000 --- a/packages/server/src/internal-query/types.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type Result } from "@deessejs/fp"; -import { type HandlerContext, type EventRegistry } from "../types.js"; - -export interface InternalQueryConfig { - handler: (ctx: HandlerContext) => Promise>; -} diff --git a/packages/server/src/middleware/builder.ts b/packages/server/src/middleware/builder.ts deleted file mode 100644 index 161f652..0000000 --- a/packages/server/src/middleware/builder.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { type Middleware } from "../types.js"; - -export function createMiddleware(config: Middleware): Middleware { - return config; -} \ No newline at end of file diff --git a/packages/server/src/middleware/helpers.ts b/packages/server/src/middleware/helpers.ts deleted file mode 100644 index ff8a68f..0000000 --- a/packages/server/src/middleware/helpers.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { type Middleware } from "../types.js"; -import { type QueryWithHooks } from "../query/types.js"; -import { type MutationWithHooks } from "../mutation/builder.js"; - -/** - * Apply middleware to a query - */ -export function withQuery( - query: QueryWithHooks -): QueryWithHooks; - -/** - * Apply middleware to a query - */ -export function withQuery( - query: QueryWithHooks, - middleware: Middleware -): QueryWithHooks; - -/** - * Apply middleware to a query using a function transformer (curried form) - */ -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types -- Curried form requires dynamic type inference */ -export function withQuery( - fn: (q: QueryWithHooks) => QueryWithHooks -): (query: QueryWithHooks) => QueryWithHooks; - -export function withQuery( - queryOrFn: any, - middlewareOrFn?: any -): any { - // Curried form: withQuery((q) => q.use(admin)) - if (typeof queryOrFn === "function" && middlewareOrFn === undefined) { - return queryOrFn; - } - // Middleware function transformer: withQuery(query, (q) => q.use(admin)) - if (typeof middlewareOrFn === "function") { - return middlewareOrFn(queryOrFn); - } - // Middleware: withQuery(query, adminMiddleware) - if (middlewareOrFn) { - return queryOrFn.use(middlewareOrFn); - } - return queryOrFn; -} - -/** - * Apply middleware to a mutation - */ -export function withMutation( - mutation: MutationWithHooks -): MutationWithHooks; - -/** - * Apply middleware to a mutation - */ -export function withMutation( - mutation: MutationWithHooks, - middleware: Middleware -): MutationWithHooks; - -/** - * Apply middleware to a mutation using a function transformer (curried form) - */ -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types -- Curried form requires dynamic type inference */ -export function withMutation( - fn: (m: MutationWithHooks) => MutationWithHooks -): (mutation: MutationWithHooks) => MutationWithHooks; - -export function withMutation( - mutationOrFn: any, - middlewareOrFn?: any -): any { - // Curried form: withMutation((m) => m.use(admin)) - if (typeof mutationOrFn === "function" && middlewareOrFn === undefined) { - return mutationOrFn; - } - // Middleware function transformer: withMutation(mutation, (m) => m.use(admin)) - if (typeof middlewareOrFn === "function") { - return middlewareOrFn(mutationOrFn); - } - // Middleware: withMutation(mutation, adminMiddleware) - if (middlewareOrFn) { - return mutationOrFn.use(middlewareOrFn); - } - return mutationOrFn; -} diff --git a/packages/server/src/middleware/index.ts b/packages/server/src/middleware/index.ts deleted file mode 100644 index 2b336f7..0000000 --- a/packages/server/src/middleware/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type { Middleware } from "./types.js"; -export { createMiddleware } from "./builder.js"; \ No newline at end of file diff --git a/packages/server/src/middleware/types.ts b/packages/server/src/middleware/types.ts deleted file mode 100644 index e8641bf..0000000 --- a/packages/server/src/middleware/types.ts +++ /dev/null @@ -1 +0,0 @@ -export type { Middleware } from "../types.js"; diff --git a/packages/server/src/mutation/builder.ts b/packages/server/src/mutation/builder.ts deleted file mode 100644 index 4ad3490..0000000 --- a/packages/server/src/mutation/builder.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; -import { type Mutation } from "../types.js"; -import { type MutationConfig } from "./types.js"; -import { - type BeforeInvokeHook, - type AfterInvokeHook, - type OnSuccessHook, - type OnErrorHook, - type ProcedureType, - type Middleware, -} from "../types.js"; - -export type MutationWithHooks = Mutation & - HookedProcedureMixin; - -export function createMutationWithHooks( - config: MutationConfig -): MutationWithHooks { - return createHookedProcedure({ - type: "mutation", - argsSchema: config.args, - handler: config.handler, - }) as MutationWithHooks; -} - -/* eslint-disable @typescript-eslint/no-explicit-any */ -interface HookedProcedureMixin { - type: ProcedureType; - beforeInvoke(hook: BeforeInvokeHook): this; - afterInvoke(hook: AfterInvokeHook): this; - onSuccess(hook: OnSuccessHook): this; - onError(hook: OnErrorHook): this; - use(middleware: Middleware): this; - _hooks: { - beforeInvoke?: BeforeInvokeHook; - afterInvoke?: AfterInvokeHook; - onSuccess?: OnSuccessHook; - onError?: OnErrorHook; - }; - _middleware: Middleware[]; -} - -interface BaseProc { - type: ProcedureType; - argsSchema?: ZodType; - handler: (ctx: Ctx, args: Args) => Promise>; -} - -function createHookedProcedure< - Ctx, - Args, - Output, ->(proc: BaseProc): BaseProc & HookedProcedureMixin; -function createHookedProcedure(proc: BaseProc): any { - const hookedProc: any = { - type: proc.type, - argsSchema: proc.argsSchema, - handler: proc.handler, - _hooks: {}, - _middleware: [], - }; - - hookedProc.beforeInvoke = function(hook: BeforeInvokeHook) { - hookedProc._hooks.beforeInvoke = hook; - return hookedProc; - }; - - hookedProc.afterInvoke = function(hook: AfterInvokeHook) { - hookedProc._hooks.afterInvoke = hook; - return hookedProc; - }; - - hookedProc.onSuccess = function(hook: OnSuccessHook) { - hookedProc._hooks.onSuccess = hook; - return hookedProc; - }; - - hookedProc.onError = function(hook: OnErrorHook) { - hookedProc._hooks.onError = hook; - return hookedProc; - }; - - hookedProc.use = function(middleware: Middleware) { - const newProc: any = { - type: hookedProc.type, - argsSchema: hookedProc.argsSchema, - handler: hookedProc.handler, - _hooks: { ...hookedProc._hooks }, - _middleware: [...hookedProc._middleware, middleware], - }; - - newProc.beforeInvoke = function(hook: BeforeInvokeHook) { - newProc._hooks.beforeInvoke = hook; - return newProc; - }; - - newProc.afterInvoke = function(hook: AfterInvokeHook) { - newProc._hooks.afterInvoke = hook; - return newProc; - }; - - newProc.onSuccess = function(hook: OnSuccessHook) { - newProc._hooks.onSuccess = hook; - return newProc; - }; - - newProc.onError = function(hook: OnErrorHook) { - newProc._hooks.onError = hook; - return newProc; - }; - - newProc.use = function(mw: Middleware) { - const result: any = { - type: newProc.type, - argsSchema: newProc.argsSchema, - handler: newProc.handler, - _hooks: { ...newProc._hooks }, - _middleware: [...newProc._middleware, mw], - }; - - result.beforeInvoke = function(hook: BeforeInvokeHook) { - result._hooks.beforeInvoke = hook; - return result; - }; - - result.afterInvoke = function(hook: AfterInvokeHook) { - result._hooks.afterInvoke = hook; - return result; - }; - - result.onSuccess = function(hook: OnSuccessHook) { - result._hooks.onSuccess = hook; - return result; - }; - - result.onError = function(hook: OnErrorHook) { - result._hooks.onError = hook; - return result; - }; - - result.use = newProc.use; - return result; - }; - - return newProc; - }; - - return hookedProc; -} -/* eslint-enable @typescript-eslint/no-explicit-any */ diff --git a/packages/server/src/mutation/index.ts b/packages/server/src/mutation/index.ts deleted file mode 100644 index f244d1c..0000000 --- a/packages/server/src/mutation/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type { MutationConfig } from "./types.js"; -export { createMutationWithHooks, MutationWithHooks } from "./builder.js"; \ No newline at end of file diff --git a/packages/server/src/mutation/types.ts b/packages/server/src/mutation/types.ts deleted file mode 100644 index 6f9f31c..0000000 --- a/packages/server/src/mutation/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; -import { type HandlerContext, type EventRegistry } from "../types.js"; - -export interface MutationConfig { - args?: ZodType; - handler: (ctx: HandlerContext, args: Args) => Promise>; -} diff --git a/packages/server/src/procedure/index.ts b/packages/server/src/procedure/index.ts deleted file mode 100644 index a114490..0000000 --- a/packages/server/src/procedure/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { withMetadata, type Metadata } from "./types.js"; \ No newline at end of file diff --git a/packages/server/src/procedure/types.ts b/packages/server/src/procedure/types.ts deleted file mode 100644 index da1afa8..0000000 --- a/packages/server/src/procedure/types.ts +++ /dev/null @@ -1,15 +0,0 @@ -// ============================================ -// Metadata helpers -// ============================================ - -export interface Metadata { - keys?: string[]; - invalidate?: string[]; -} - -export function withMetadata( - value: Output, - metadata: Metadata -): Output & Metadata { - return Object.assign({}, value, metadata); -} diff --git a/packages/server/src/query/builder.ts b/packages/server/src/query/builder.ts deleted file mode 100644 index eacd172..0000000 --- a/packages/server/src/query/builder.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; -import { type EventRegistry, type Middleware, type Router, type EventPayload } from "../types.js"; -import { type BeforeInvokeHook, type AfterInvokeHook, type OnSuccessHook, type OnErrorHook } from "../types.js"; -import { type EventEmitter } from "../events/emitter.js"; -import { type QueryConfig, type QueryWithHooks } from "./types.js"; -import { type MutationConfig, type MutationWithHooks } from "../mutation/index.js"; -import { type InternalQueryConfig, type InternalQueryWithHooks } from "../internal-query/index.js"; -import { type InternalMutationConfig, type InternalMutationWithHooks } from "../internal-mutation/index.js"; - -export class QueryBuilder { - constructor( - private context: Ctx, - /* eslint-disable @typescript-eslint/no-explicit-any */ - private eventEmitter?: EventEmitter - /* eslint-enable @typescript-eslint/no-explicit-any */ - ) {} - - query(config: QueryConfig): QueryWithHooks { - return createHookedProcedure({ - type: "query", - argsSchema: config.args, - /* eslint-disable @typescript-eslint/no-explicit-any */ - handler: config.handler as any, - /* eslint-enable @typescript-eslint/no-explicit-any */ - }) as QueryWithHooks; - } - - mutation(config: MutationConfig): MutationWithHooks { - return createHookedProcedure({ - type: "mutation", - argsSchema: config.args, - /* eslint-disable @typescript-eslint/no-explicit-any */ - handler: config.handler as any, - /* eslint-enable @typescript-eslint/no-explicit-any */ - }) as MutationWithHooks; - } - - /* eslint-disable @typescript-eslint/no-explicit-any */ - internalQuery(config: InternalQueryConfig): InternalQueryWithHooks { - return createHookedProcedure({ - type: "internalQuery", - handler: config.handler as any, - }) as InternalQueryWithHooks; - } - /* eslint-enable @typescript-eslint/no-explicit-any */ - - internalMutation( - config: InternalMutationConfig - ): InternalMutationWithHooks { - return createHookedProcedure({ - type: "internalMutation", - argsSchema: config.args, - /* eslint-disable @typescript-eslint/no-explicit-any */ - handler: config.handler as any, - /* eslint-enable @typescript-eslint/no-explicit-any */ - }) as InternalMutationWithHooks; - } - - router>(routes: Routes): Routes { - return routes; - } - - middleware(config: Middleware): Middleware { - return config; - } - - on( - event: EventName, - handler: (ctx: Ctx, payload: { name: string; data: Events[EventName]["data"] }) => void | Promise - ): () => void { - if (!this.eventEmitter) { - return () => {}; - } - // Wrap the handler to pass context (this.context) as the first argument - const wrappedHandler = (payload: EventPayload) => { - return handler(this.context, payload); - }; - return this.eventEmitter.on(event, wrappedHandler); - } -} - -export type { QueryWithHooks } from "./types.js"; -export type { MutationWithHooks } from "../mutation/builder.js"; -export type { InternalQueryWithHooks } from "../internal-query/builder.js"; -export type { InternalMutationWithHooks } from "../internal-mutation/builder.js"; - -export function createQueryBuilder( - context: Ctx, - /* eslint-disable @typescript-eslint/no-explicit-any */ - eventEmitter?: EventEmitter - /* eslint-enable @typescript-eslint/no-explicit-any */ -): QueryBuilder { - return new QueryBuilder(context, eventEmitter); -} - -/* eslint-disable @typescript-eslint/no-explicit-any */ -interface HookedProcedureMixin { - beforeInvoke(hook: BeforeInvokeHook): this; - afterInvoke(hook: AfterInvokeHook): this; - onSuccess(hook: OnSuccessHook): this; - onError(hook: OnErrorHook): this; - use(middleware: Middleware): this; - _hooks: { - beforeInvoke?: BeforeInvokeHook; - afterInvoke?: AfterInvokeHook; - onSuccess?: OnSuccessHook; - onError?: OnErrorHook; - }; - _middleware: Middleware[]; -} - -interface BaseProc { - type: "query" | "mutation" | "internalQuery" | "internalMutation"; - argsSchema?: ZodType; - handler: (ctx: Ctx, args: Args) => Promise>; -} - -function createHookedProcedure( - proc: BaseProc -): BaseProc & HookedProcedureMixin { - // Create _def with $types for proper type inference - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const def: any = { - type: proc.type, - $types: { - input: undefined as Args, - output: undefined as Output, - }, - argsSchema: proc.argsSchema, - handler: proc.handler, - name: undefined, - metadata: {}, - }; - - const hookedProc: any = { - type: proc.type, - argsSchema: proc.argsSchema, - handler: proc.handler, - _def: def, - _hooks: {}, - _middleware: [], - }; - - hookedProc.beforeInvoke = function(hook: BeforeInvokeHook) { - hookedProc._hooks.beforeInvoke = hook; - return hookedProc; - }; - - hookedProc.afterInvoke = function(hook: AfterInvokeHook) { - hookedProc._hooks.afterInvoke = hook; - return hookedProc; - }; - - hookedProc.onSuccess = function(hook: OnSuccessHook) { - hookedProc._hooks.onSuccess = hook; - return hookedProc; - }; - - hookedProc.onError = function(hook: OnErrorHook) { - hookedProc._hooks.onError = hook; - return hookedProc; - }; - - hookedProc.use = function(middleware: Middleware) { - const newProc: any = { - type: hookedProc.type, - argsSchema: hookedProc.argsSchema, - handler: hookedProc.handler, - _def: hookedProc._def, - _hooks: { ...hookedProc._hooks }, - _middleware: [...hookedProc._middleware, middleware], - }; - - newProc.beforeInvoke = function(hook: BeforeInvokeHook) { - newProc._hooks.beforeInvoke = hook; - return newProc; - }; - - newProc.afterInvoke = function(hook: AfterInvokeHook) { - newProc._hooks.afterInvoke = hook; - return newProc; - }; - - newProc.onSuccess = function(hook: OnSuccessHook) { - newProc._hooks.onSuccess = hook; - return newProc; - }; - - newProc.onError = function(hook: OnErrorHook) { - newProc._hooks.onError = hook; - return newProc; - }; - - newProc.use = function(mw: Middleware) { - const result: any = { - type: newProc.type, - argsSchema: newProc.argsSchema, - handler: newProc.handler, - _def: newProc._def, - _hooks: { ...newProc._hooks }, - _middleware: [...newProc._middleware, mw], - }; - - result.beforeInvoke = function(hook: BeforeInvokeHook) { - result._hooks.beforeInvoke = hook; - return result; - }; - - result.afterInvoke = function(hook: AfterInvokeHook) { - result._hooks.afterInvoke = hook; - return result; - }; - - result.onSuccess = function(hook: OnSuccessHook) { - result._hooks.onSuccess = hook; - return result; - }; - - result.onError = function(hook: OnErrorHook) { - result._hooks.onError = hook; - return result; - }; - - result.use = newProc.use; - return result; - }; - - return newProc; - }; - - return hookedProc; -} -/* eslint-enable @typescript-eslint/no-explicit-any */ diff --git a/packages/server/src/query/index.ts b/packages/server/src/query/index.ts deleted file mode 100644 index a040978..0000000 --- a/packages/server/src/query/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { QueryConfig, QueryWithHooks, CreateProcedureConfig } from "./types.js"; -export { QueryBuilder, createQueryBuilder } from "./builder.js"; -export { createQuery, createMutation, createInternalQuery, createInternalMutation, createProcedure } from "./types.js"; \ No newline at end of file diff --git a/packages/server/src/query/types.ts b/packages/server/src/query/types.ts deleted file mode 100644 index 8e137b7..0000000 --- a/packages/server/src/query/types.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; -import { type AnyProcedure, type ProcedureType, type BeforeInvokeHook, type AfterInvokeHook, type OnSuccessHook, type OnErrorHook, type Middleware, type ProcedureDef } from "../types.js"; - -export interface QueryConfig { - args?: ZodType; - handler: (ctx: Ctx, args: Args) => Promise>; -} - -export interface MutationConfig { - args?: ZodType; - handler: (ctx: Ctx, args: Args) => Promise>; -} - -export interface InternalQueryConfig { - handler: (ctx: Ctx) => Promise>; -} - -export interface InternalMutationConfig { - args?: ZodType; - handler: (ctx: Ctx, args: Args) => Promise>; -} - -// Factory functions -export function createQuery( - config: QueryConfig -): AnyProcedure { - return createAnyProcedure("query", config.args, config.handler); -} - -export function createMutation( - config: MutationConfig -): AnyProcedure { - return createAnyProcedure("mutation", config.args, config.handler); -} - -export function createInternalQuery( - config: InternalQueryConfig -): AnyProcedure { - return createAnyProcedure("internalQuery", undefined, config.handler as any); -} - -export function createInternalMutation( - config: InternalMutationConfig -): AnyProcedure { - return createAnyProcedure("internalMutation", config.args, config.handler); -} - -// Internal helper -function createAnyProcedure( - type: ProcedureType, - argsSchema: ZodType | undefined, - handler: (ctx: Ctx, args: Args) => Promise> -): AnyProcedure { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return { - _def: { - type, - $types: { - input: argsSchema as unknown as Args, - output: undefined as unknown as Output, - }, - argsSchema, - handler: handler as any, - }, - type, - argsSchema, - handler: handler as any, - beforeInvoke: function(hook: BeforeInvokeHook) { return this; }, - afterInvoke: function(hook: AfterInvokeHook) { return this; }, - onSuccess: function(hook: OnSuccessHook) { return this; }, - onError: function(hook: OnErrorHook) { return this; }, - use: function(middleware: Middleware) { return this; }, - _hooks: {}, - _middleware: [], - } as unknown as AnyProcedure; -} - -// Backward compatibility - keep QueryWithHooks as alias -export type QueryWithHooks = AnyProcedure; -export type MutationWithHooks = AnyProcedure; -export type InternalQueryWithHooks = AnyProcedure; -export type InternalMutationWithHooks = AnyProcedure; - -// ============================================ -// createProcedure - DSL for plugins -// ============================================ - -export interface CreateProcedureConfig { - name?: string; - args?: ZodType; - handler: (ctx: Ctx, args: Args) => Promise>; - metadata?: Record; -} - -/** - * Factory function for creating procedures from plugins. - * Takes a procedure type and configuration, returns an AnyProcedure. - */ -export function createProcedure( - type: ProcedureType, - config: CreateProcedureConfig -): AnyProcedure { - const def: ProcedureDef = { - type, - $types: { - input: config.args as unknown as Args, - output: undefined as unknown as Output, - }, - argsSchema: config.args, - handler: config.handler as (ctx: Ctx, args: Args) => Promise>, - name: config.name, - metadata: config.metadata, - }; - - return { - _def: def, - type, - argsSchema: config.args, - handler: config.handler as (ctx: Ctx, args: Args) => Promise>, - beforeInvoke: function(hook: BeforeInvokeHook) { return this; }, - afterInvoke: function(hook: AfterInvokeHook) { return this; }, - onSuccess: function(hook: OnSuccessHook) { return this; }, - onError: function(hook: OnErrorHook) { return this; }, - use: function(middleware: Middleware) { return this; }, - _hooks: {}, - _middleware: [], - } as unknown as AnyProcedure; -} diff --git a/packages/server/src/router/builder.ts b/packages/server/src/router/builder.ts deleted file mode 100644 index 1b19321..0000000 --- a/packages/server/src/router/builder.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { type Router, type Procedure } from "../types.js"; -import { type Maybe, none, fromNullable } from "@deessejs/fp"; - -/* eslint-disable @typescript-eslint/no-explicit-any */ -export function flattenRouter>( - router: R, - prefix: string[] = [] - // eslint-disable-next-line @typescript-eslint/no-explicit-any -): Array<{ path: string; procedure: Procedure }> { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const result: Array<{ path: string; procedure: Procedure }> = []; - - for (const key in router) { - const value = (router as any)[key]; - const path = [...prefix, key]; - - if (isProcedure(value)) { - result.push({ path: path.join("."), procedure: value }); - } else if (isRouter(value)) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - result.push(...flattenRouter(value as any, path)); - } - } - - return result; -} - -export function getPublicRoutes>( - router: R - // eslint-disable-next-line @typescript-eslint/no-explicit-any -): Array<{ path: string; procedure: Procedure }> { - return flattenRouter(router).filter( - (item) => item.procedure.type === "query" || item.procedure.type === "mutation" - ); -} - -export function getInternalRoutes>( - router: R - // eslint-disable-next-line @typescript-eslint/no-explicit-any -): Array<{ path: string; procedure: Procedure }> { - return flattenRouter(router).filter( - (item) => item.procedure.type === "internalQuery" || item.procedure.type === "internalMutation" - ); -} - -/* eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types -- Type guard must accept any type */ -export function isRouter(obj: any): obj is Router { - if (!obj || typeof obj !== "object") return false; - - // A router is an object whose properties are either: - // 1. Procedures (has 'type' property with procedure value) - // 2. Other routers (nested structure) - // If it has ANY property that is a procedure, it's still a router (just not empty) - const keys = Object.keys(obj); - if (keys.length === 0) return false; - - // Check if at least one property exists (we don't check type here anymore) - // The distinction between procedure and nested router is made at filter time - return true; -} - -/* eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types -- Type guard must accept any type */ -export function isProcedure(obj: any): obj is Procedure { - return ( - obj && - typeof obj === "object" && - "type" in obj && - ["query", "mutation", "internalQuery", "internalMutation"].includes(obj.type) - ); -} - -export function resolvePath>( - router: Router, - path: string -): Maybe | Router> { - let current: any = router; - const parts = path.split("."); - for (const part of parts) { - if (current === null || current === undefined) { - return none(); - } - current = current[part]; - } - return fromNullable(current); -} -/* eslint-enable @typescript-eslint/no-explicit-any */ - -import { type ValidationResult } from "./types.js"; - -/* eslint-disable @typescript-eslint/no-explicit-any */ -export function validateRouter>( - router: R -): ValidationResult { - const errors: string[] = []; - - const validate = (current: any, path: string[]): void => { - for (const key of Object.keys(current)) { - const value = current[key]; - const currentPath = [...path, key]; - - if (isProcedure(value)) { - if (!value.handler) { - errors.push(`Procedure at "${currentPath.join(".")}" missing handler`); - } - } else if (isRouter(value)) { - validate(value, currentPath); - } else if (typeof value === "object" && value !== null) { - validate(value, currentPath); - } - } - }; - - validate(router, []); - return { valid: errors.length === 0, errors }; -} -/* eslint-enable @typescript-eslint/no-explicit-any */ diff --git a/packages/server/src/router/index.ts b/packages/server/src/router/index.ts deleted file mode 100644 index ef8aff6..0000000 --- a/packages/server/src/router/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export type { RouterConfig, ValidationResult } from "./types.js"; -export { - flattenRouter, - getPublicRoutes, - getInternalRoutes, - isRouter, - isProcedure, - resolvePath, - validateRouter, -} from "./builder.js"; \ No newline at end of file diff --git a/packages/server/src/router/types.ts b/packages/server/src/router/types.ts deleted file mode 100644 index ad0d9a0..0000000 --- a/packages/server/src/router/types.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; - -export type { Result } from "@deessejs/fp"; - -export type ProcedureType = "query" | "mutation" | "internalQuery" | "internalMutation"; - -export interface BaseProcedure { - readonly type: ProcedureType; - readonly argsSchema?: ZodType; - readonly handler: (ctx: Ctx, args: Args) => Promise>; - readonly name?: string; -} - -export interface Query extends BaseProcedure { - readonly type: "query"; -} - -export interface Mutation extends BaseProcedure { - readonly type: "mutation"; -} - -export interface InternalQuery extends BaseProcedure { - readonly type: "internalQuery"; -} - -export interface InternalMutation extends BaseProcedure { - readonly type: "internalMutation"; -} - -export type BeforeInvokeHook = (ctx: Ctx, args: Args) => void | Promise; - -export type AfterInvokeHook = ( - ctx: Ctx, - args: Args, - result: Result -) => void | Promise; - -export type OnSuccessHook = (ctx: Ctx, args: Args, data: Output) => void | Promise; - -export type OnErrorHook = (ctx: Ctx, args: Args, error: Error) => void | Promise; - -export interface Middleware { - readonly name: string; - readonly args?: Args; - readonly handler: ( - ctx: Ctx, - opts: { - next: (overrides?: { ctx?: Partial }) => Promise>; - args: Args; - meta: Record; - } - ) => Promise>; -} - -export interface Plugin { - readonly name: string; - readonly extend: (ctx: Ctx) => Partial; -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type Router> = Routes; - -export type Procedure = - | Query - | Mutation - | InternalQuery - | InternalMutation; - -export interface EventRegistry { - [eventName: string]: { - data?: unknown; - response?: unknown; - }; -} - -export interface EventPayload { - name: string; - data: T; - timestamp: string; - namespace: string; - source?: string; -} - -export interface SendOptions { - namespace?: string; - broadcast?: boolean; - delay?: number; -} - -export interface PendingEvent { - name: string; - data: unknown; - timestamp: string; - namespace: string; - options?: SendOptions; -} - -export interface ContextWithSend { - ctx: Ctx; - send: ( - event: EventName, - data: Events[EventName]["data"] - ) => void; -} - -export type HandlerContext = Ctx & { - send: ( - event: EventName, - data: Events[EventName]["data"] - ) => void; -}; - -export type RouterConfig = Record | Record>; - -export interface ValidationResult { - valid: boolean; - errors: string[]; -} diff --git a/packages/server/src/services/api.ts b/packages/server/src/services/api.ts new file mode 100644 index 0000000..9beba3e --- /dev/null +++ b/packages/server/src/services/api.ts @@ -0,0 +1,26 @@ +import { type ServiceInternal, type ServiceFunction, type DefineServicesConfig, type LocalAPI, type BoundService } from './types.js'; + +const defineServices = >( + config: DefineServicesConfig +): LocalAPI => { + // Memoize bound services to avoid recreating them on each access + const boundCache = new Map>(); + + return new Proxy({} as LocalAPI, { + get(_, serviceName: string) { + const service = config.services[serviceName as keyof TServices]; + if (!service) throw new Error(`Service ${String(serviceName)} not found`); + + // Get or create cached bound service + let bound = boundCache.get(serviceName); + if (!bound) { + bound = (service as ServiceInternal).bind(config.context); + boundCache.set(serviceName, bound); + } + + return bound.call as (...args: never[]) => unknown; + }, + }); +}; + +export { defineServices }; diff --git a/packages/server/src/services/index.ts b/packages/server/src/services/index.ts new file mode 100644 index 0000000..48ed726 --- /dev/null +++ b/packages/server/src/services/index.ts @@ -0,0 +1,4 @@ +export { query } from './query.js'; +export { mutation } from './mutation.js'; +export { defineServices } from './api.js'; +export { ValidationError } from './procedure.js'; diff --git a/packages/server/src/services/mutation.ts b/packages/server/src/services/mutation.ts new file mode 100644 index 0000000..072542d --- /dev/null +++ b/packages/server/src/services/mutation.ts @@ -0,0 +1,8 @@ +import { type ServiceConfig, type ServiceInternal } from './types.js'; +import { createProcedure } from './procedure.js'; + +const mutation = ( + config: ServiceConfig +): ServiceInternal => createProcedure('mutation', config); + +export { mutation }; diff --git a/packages/server/src/services/procedure.ts b/packages/server/src/services/procedure.ts new file mode 100644 index 0000000..e05cbdc --- /dev/null +++ b/packages/server/src/services/procedure.ts @@ -0,0 +1,48 @@ +import { type ServiceInternal, type ServiceConfig, type BoundService, type ProcedureKind } from './types.js'; + +// Validation error with issues for better error handling +export class ValidationError extends Error { + constructor(public issues: unknown[]) { + super(`Validation failed: ${JSON.stringify(issues)}`); + this.name = 'ValidationError'; + } +} + +const createProcedure = ( + type: ProcedureKind, + config: ServiceConfig +): ServiceInternal => { + return { + type, + args: config.args, + handler: config.handler, + _args: undefined as unknown as TArgs, + bind: (ctx: TCtx) => ({ + call: async (args: TArgs): Promise> => { + let validatedArgs: TArgs = args; + + if (config.args) { + // Handle async validation (StandardSchemaV1 allows Promise) + const result = config.args['~standard'].validate(args); + const validation = result instanceof Promise ? await result : result; + + if (validation instanceof Error || (validation && 'issues' in validation)) { + const issues = validation instanceof Error + ? [{ message: validation.message }] + : (validation as { issues: unknown }).issues; + throw new ValidationError(issues as unknown[]); + } + + // Use transformed value if schema provides it (e.g., Zod/Valibot transforms) + if ('value' in validation) { + validatedArgs = validation.value as TArgs; + } + } + + return Promise.resolve(config.handler(ctx, validatedArgs)); + }, + }) as BoundService, + }; +}; + +export { createProcedure }; diff --git a/packages/server/src/services/query.ts b/packages/server/src/services/query.ts new file mode 100644 index 0000000..8f3a4ac --- /dev/null +++ b/packages/server/src/services/query.ts @@ -0,0 +1,8 @@ +import { type ServiceConfig, type ServiceInternal } from './types.js'; +import { createProcedure } from './procedure.js'; + +const query = ( + config: ServiceConfig +): ServiceInternal => createProcedure('query', config); + +export { query }; diff --git a/packages/server/src/services/types.ts b/packages/server/src/services/types.ts new file mode 100644 index 0000000..86a2d72 --- /dev/null +++ b/packages/server/src/services/types.ts @@ -0,0 +1,42 @@ +import { type StandardSchemaV1 } from '@standard-schema/spec'; + +// Service procedure kinds +export type ProcedureKind = 'query' | 'mutation'; + +// Configuration for a service +// Handler returns TOutput directly or as Promise - user is free to use Result, Maybe, or direct values +export type ServiceConfig = { + args?: StandardSchemaV1; + handler: (ctx: TCtx, args: TArgs) => TOutput | Promise; +}; + +// Internal service representation +export type ServiceInternal = { + readonly type: ProcedureKind; + readonly args?: StandardSchemaV1; + readonly handler: (ctx: TCtx, args: TArgs) => TOutput | Promise; + readonly _args: TArgs; + bind(ctx: TCtx): BoundService; +}; + +// Result of .bind(ctx) — holds context, awaits .call(args) +export type BoundService = + keyof TArgs extends never + ? { call(): Promise> } + : { call(args: TArgs): Promise> }; + +// ServiceFunction type for defineServices +export type ServiceFunction = ServiceInternal; + +// defineServices input +export type DefineServicesConfig> = { + services: TServices; + context: TCtx; +}; + +// defineServices output — context already bound +export type LocalAPI> = { + [K in keyof TServices]: keyof TServices[K]['_args'] extends never + ? () => Promise>> + : (args: TServices[K]['_args']) => Promise>>; +}; diff --git a/packages/server/src/types.ts b/packages/server/src/types.ts index c8bedeb..b304971 100644 --- a/packages/server/src/types.ts +++ b/packages/server/src/types.ts @@ -1,160 +1,2 @@ -import { type ZodType } from "zod"; -import { type Result } from "@deessejs/fp"; - -export type { Result } from "@deessejs/fp"; - -export type ProcedureType = "query" | "mutation" | "internalQuery" | "internalMutation"; - -// ============================================ -// Procedure definition with _def (like tRPC) -// ============================================ - -export interface ProcedureDef { - readonly type: ProcedureType; - readonly $types: { - readonly input: Args; - readonly output: Output; - }; - readonly argsSchema?: ZodType; - readonly handler: (ctx: Ctx, args: Args) => Promise>; - readonly name?: string; - readonly metadata?: Record; -} - -// All procedure types are now a single interface with _def -export interface AnyProcedure { - readonly _def: ProcedureDef; - readonly type: ProcedureType; - readonly argsSchema?: ZodType; - readonly handler: (ctx: Ctx, args: Args) => Promise>; - // Hook methods - readonly beforeInvoke: (hook: BeforeInvokeHook) => AnyProcedure; - readonly afterInvoke: (hook: AfterInvokeHook) => AnyProcedure; - readonly onSuccess: (hook: OnSuccessHook) => AnyProcedure; - readonly onError: (hook: OnErrorHook) => AnyProcedure; - readonly use: (middleware: Middleware) => AnyProcedure; - // Internal state - readonly _hooks: { - beforeInvoke?: BeforeInvokeHook; - afterInvoke?: AfterInvokeHook; - onSuccess?: OnSuccessHook; - onError?: OnErrorHook; - }; - readonly _middleware: Middleware[]; -} - -// Type aliases for backward compatibility -export type Query = AnyProcedure; -export type Mutation = AnyProcedure; -export type InternalQuery = AnyProcedure; -export type InternalMutation = AnyProcedure; - -// Convenience type for procedures without args -export type NoArgsProcedure = AnyProcedure; - -// Backward compatible Procedure type alias -export type Procedure = AnyProcedure; - -// ============================================ -// Other types (unchanged) -// ============================================ - -export type BeforeInvokeHook = (ctx: Ctx, args: Args) => void | Promise; - -export type AfterInvokeHook = ( - ctx: Ctx, - args: Args, - result: Result -) => void | Promise; - -export type OnSuccessHook = (ctx: Ctx, args: Args, data: Output) => void | Promise; - -export type OnErrorHook = (ctx: Ctx, args: Args, error: Error) => void | Promise; - -export interface Middleware { - readonly name: string; - readonly args?: Args; - readonly handler: ( - ctx: Ctx, - opts: { - next: (overrides?: { ctx?: Partial }) => Promise>; - args: Args; - meta: Record; - } - ) => Promise>; -} - -export interface Plugin { - readonly name: string; - readonly extend: (ctx: Ctx) => Partial; - readonly procedures?: () => PluginEnrichment; -} - -/** - * PluginEnrichment describes how a plugin adds new methods to the t object. - * Each namespace contains methods that create procedures. - */ -export type PluginEnrichment = { - [namespace: string]: { - [methodName: string]: (config: { - name?: string; - args?: ZodType; - handler: (ctx: Ctx, args: unknown) => Promise>; - metadata?: Record; - }) => AnyProcedure; - }; -}; - -// Router type - recursively maps routes using non-distributive conditionals -// Uses [T] instead of T to prevent distribution over union types -export type Router = Record> = { - [K in keyof Routes & string]: [Routes[K]] extends [{ type: string }] - ? Routes[K] - : [Routes[K]] extends [Record] - ? Router - : never; -} & Record; - -export interface EventRegistry { - [eventName: string]: { - data?: unknown; - response?: unknown; - }; -} - -export interface EventPayload { - name: string; - data: T; - timestamp: string; - namespace: string; - source?: string; -} - -export interface SendOptions { - namespace?: string; - broadcast?: boolean; - delay?: number; -} - -export interface PendingEvent { - name: string; - data: unknown; - timestamp: string; - namespace: string; - options?: SendOptions; -} - -export interface ContextWithSend { - ctx: Ctx; - send: ( - event: EventName, - data: Events[EventName]["data"] - ) => void; -} - -export type HandlerContext = Ctx & { - send: ( - event: EventName, - data: Events[EventName]["data"] - ) => void; -}; \ No newline at end of file +// Service types are in services/types.ts +export * from './services/types.js'; diff --git a/packages/server/tests/api-factory.test.ts b/packages/server/tests/api-factory.test.ts deleted file mode 100644 index 75da789..0000000 --- a/packages/server/tests/api-factory.test.ts +++ /dev/null @@ -1,423 +0,0 @@ -import { describe, it, expect } from "vitest"; -import { createAPI, createPublicAPI, filterPublicRouter } from "../src/api/factory/index.js"; -import { createInternalErrorResult, createServerErrorResult } from "../src/api/factory/errors.js"; -import { applyPlugins } from "../src/api/factory/plugins.js"; -import { createQuery, createMutation, createInternalQuery, createInternalMutation } from "../src/query/index.js"; -import { ok, err } from "../src/errors/index.js"; -import { type Plugin } from "../src/types.js"; - -// ============================================================ -// Test Context Setup -// ============================================================ - -interface TestCtx { - db: { - find: () => { id: number; name: string }; - create: (data: unknown) => { id: number }; - }; - name: string; - extra?: string; -} - -const createTestCtx = (): TestCtx => ({ - db: { - find: () => ({ id: 1, name: "test" }), - create: (data) => ({ id: 42, ...(data as object) }), - }, - name: "test-context", -}); - -// ============================================================ -// errors.ts Tests -// ============================================================ - -describe("errors.ts", () => { - describe("createInternalErrorResult", () => { - it("creates an error result with message and route", () => { - const message = "Something went wrong"; - const route = "test.procedure"; - const result = createInternalErrorResult(message, route); - - expect(result.ok).toBe(false); - if (!result.ok) { - // InternalError format is "Internal error: {context}" - expect(result.error.message).toContain(message); - expect(result.error.name).toBe("InternalError"); - } - }); - - it("result contains route information in error notes", () => { - const message = "Internal failure"; - const route = "users.getById"; - const result = createInternalErrorResult(message, route); - - expect(result.ok).toBe(false); - if (!result.ok) { - // The error has notes accessible via getNotes() or similar - // The notes should contain "Error in route: {route}" - expect(result.error).toBeDefined(); - // We can verify the error is created with the correct properties - expect(result.error.name).toBe("InternalError"); - expect(result.error.message).toContain(message); - } - }); - }); - - describe("createServerErrorResult", () => { - it("creates a server error result with code and message", () => { - const code = "VALIDATION_FAILED"; - const message = "Input validation failed"; - const route = "mutation.createUser"; - const result = createServerErrorResult(code, message, route); - - expect(result.ok).toBe(false); - if (!result.ok) { - // ServerError format is "[{code}] {message}" - expect(result.error.message).toContain(message); - expect(result.error.name).toBe("ServerError"); - } - }); - - it("result contains route information", () => { - const code = "NOT_FOUND"; - const message = "Resource not found"; - const route = "query.getPost"; - const result = createServerErrorResult(code, message, route); - - expect(result.ok).toBe(false); - if (!result.ok) { - // Verify the error is created with correct properties - expect(result.error).toBeDefined(); - expect(result.error.name).toBe("ServerError"); - expect(result.error.message).toContain(message); - } - }); - - it("handles different error codes", () => { - const codes = ["UNAUTHORIZED", "FORBIDDEN", "BAD_REQUEST", "INTERNAL_ERROR"]; - - codes.forEach((code) => { - const result = createServerErrorResult(code, "Test message", "test.route"); - expect(result.ok).toBe(false); - if (!result.ok) { - expect(result.error.name).toBe("ServerError"); - } - }); - }); - }); -}); - -// ============================================================ -// plugins.ts Tests -// ============================================================ - -describe("plugins.ts", () => { - describe("applyPlugins", () => { - it("returns original context when no plugins provided", () => { - const ctx = createTestCtx(); - const result = applyPlugins(ctx, []); - - expect(result).toBe(ctx); - }); - - it("extends context with single plugin", () => { - const ctx = createTestCtx(); - const plugin: Plugin = { - name: "test-plugin", - extend: (c) => ({ extra: "plugin-data" }), - }; - - const result = applyPlugins(ctx, [plugin]); - - expect(result.extra).toBe("plugin-data"); - expect(result.name).toBe(ctx.name); // original properties preserved - }); - - it("extends context with multiple plugins", () => { - const ctx = createTestCtx(); - const plugin1: Plugin = { - name: "plugin-1", - extend: () => ({ extra: "from-plugin-1" }), - }; - const plugin2: Plugin = { - name: "plugin-2", - extend: () => ({ extra: "from-plugin-2" }), - }; - - const result = applyPlugins(ctx, [plugin1, plugin2]); - - // Last plugin wins for same property - expect(result.extra).toBe("from-plugin-2"); - }); - - it("does not mutate original context", () => { - const ctx = createTestCtx(); - const originalName = ctx.name; - const plugin: Plugin = { - name: "test-plugin", - extend: () => ({ extra: "plugin-data" }), - }; - - const result = applyPlugins(ctx, [plugin]); - - // Original unchanged - expect(ctx.name).toBe(originalName); - expect(ctx.extra).toBeUndefined(); - // Result has the extension - expect(result.extra).toBe("plugin-data"); - }); - - it("plugin can add multiple properties", () => { - const ctx = createTestCtx(); - const plugin: Plugin = { - name: "multi-extend", - extend: (c) => ({ - extra: "extra-value", - another: "another-value", - }), - }; - - const result = applyPlugins(ctx, [plugin]); - - expect(result.extra).toBe("extra-value"); - expect(result.another).toBe("another-value"); - }); - - it("handles empty plugin extend return", () => { - const ctx = createTestCtx(); - const plugin: Plugin = { - name: "empty-plugin", - extend: () => ({}), - }; - - const result = applyPlugins(ctx, [plugin]); - - expect(result.name).toBe(ctx.name); - expect(result.db).toBe(ctx.db); - }); - }); -}); - -// ============================================================ -// api.ts Tests -// ============================================================ - -describe("api.ts", () => { - describe("createAPI", () => { - it("creates an API instance with router", () => { - const query = createQuery({ - args: {} as any, - handler: async (ctx, args) => ok({ id: args.id, name: ctx.name }), - }); - - const router = { getUser: query }; - const api = createAPI({ router }); - - expect(api).toBeDefined(); - expect(api.router).toBe(router); - }); - - it("creates an API instance with context", () => { - const ctx = createTestCtx(); - const api = createAPI({ router: {}, context: ctx }); - - expect(api.ctx).toBe(ctx); - }); - - it("creates an API instance with plugins", () => { - const ctx = createTestCtx(); - const plugin: Plugin = { - name: "test-plugin", - extend: () => ({ extra: "plugin-data" }), - }; - - const api = createAPI({ - router: {}, - context: ctx, - plugins: [plugin], - }); - - expect(api.plugins).toHaveLength(1); - expect(api.plugins[0].name).toBe("test-plugin"); - }); - - it("creates an API with no plugins when none provided", () => { - const api = createAPI({ router: {} }); - - expect(api.plugins).toEqual([]); - }); - - it("API instance exposes router, ctx, and plugins", () => { - const ctx = createTestCtx(); - const plugin: Plugin = { - name: "test-plugin", - extend: () => ({ extra: "plugin-data" }), - }; - const query = createQuery({ - handler: async (c) => ok({ greeting: `Hello, ${c.name}` }), - }); - const router = { hello: query }; - - const api = createAPI({ - router, - context: ctx, - plugins: [plugin], - }); - - expect(api.router).toBe(router); - expect(api.ctx).toBe(ctx); - expect(api.plugins).toHaveLength(1); - }); - }); - - describe("filterPublicRouter", () => { - it("filters out internalQuery procedures when used directly", () => { - // Create a router where procedures are NOT nested inside another router object - // This tests the procedure filtering directly - const query = createQuery({ - handler: async () => ok({ message: "public" }), - }); - const internalQuery = createInternalQuery({ - handler: async () => ok({ secret: "hidden" }), - }); - - // Test that internalQuery has type internalQuery - expect(internalQuery.type).toBe("internalQuery"); - expect(query.type).toBe("query"); - - // Test isQueryOrMutation logic - internalQuery should be filtered - // Note: Due to isRouter being true for procedure objects, the behavior - // when procedures are direct values may differ from expected - const isQuery = (proc: any) => proc.type === "query" || proc.type === "mutation"; - expect(isQuery(query)).toBe(true); - expect(isQuery(internalQuery)).toBe(false); - }); - - it("filters nested routers and returns a result object", () => { - const query = createQuery({ - handler: async () => ok({ x: 1 }), - }); - - // Create a nested router structure - // Note: Due to isRouter returning true for procedure objects, - // the filtering behavior may differ from expected - const nestedRouter = { - publicApi: { - getInfo: query, - }, - }; - - const filtered = filterPublicRouter(nestedRouter); - - // The function should return an object - expect(filtered).toBeDefined(); - expect(typeof filtered).toBe("object"); - }); - - it("filterPublicRouter is callable and returns an object", () => { - const router = {}; - const result = filterPublicRouter(router); - - expect(result).toBeDefined(); - expect(typeof result).toBe("object"); - }); - - it("filterPublicRouter processes nested routers", () => { - const query = createQuery({ - handler: async () => ok({ value: "test" }), - }); - - const nestedRouter = { - nested: { - child: query, - }, - }; - - const filtered = filterPublicRouter(nestedRouter); - - // Should have processed the nested structure - expect((filtered as any).nested).toBeDefined(); - }); - }); - - describe("createPublicAPI", () => { - it("creates a public API from a full API", () => { - const ctx = createTestCtx(); - const query = createQuery({ - args: {} as any, - handler: async (c, a) => ok({ user: { id: a.id, name: c.name } }), - }); - const internalQuery = createInternalQuery({ - handler: async () => ok({ secret: "hidden" }), - }); - - const router = { - getUser: query, - getSecret: internalQuery, - }; - - const api = createAPI({ - router, - context: ctx, - }); - - const publicApi = createPublicAPI(api); - - expect(publicApi).toBeDefined(); - expect(publicApi.ctx).toBe(ctx); - }); - - it("public API has filtered router", () => { - const query = createQuery({ - handler: async () => ok({ public: "data" }), - }); - const internalMutation = createInternalMutation({ - handler: async () => ok({ internal: true }), - }); - - const router = { - publicData: query, - internalAction: internalMutation, - }; - - const api = createAPI({ router }); - const publicApi = createPublicAPI(api); - - // The publicApi should be created and have access to router - expect(publicApi).toBeDefined(); - expect(publicApi.router).toBeDefined(); - }); - - it("preserves plugins from original API", () => { - const ctx = createTestCtx(); - const plugin: Plugin = { - name: "preserved-plugin", - extend: () => ({ extra: "preserved" }), - }; - - const api = createAPI({ - router: {}, - context: ctx, - plugins: [plugin], - }); - - const publicApi = createPublicAPI(api); - - expect(publicApi.plugins).toHaveLength(1); - expect(publicApi.plugins[0].name).toBe("preserved-plugin"); - }); - - it("preserves context from original API", () => { - const ctx = createTestCtx(); - - const api = createAPI({ - router: {}, - context: ctx, - }); - - const publicApi = createPublicAPI(api); - - expect(publicApi.ctx).toBe(ctx); - }); - }); -}); diff --git a/packages/server/tests/context-builder.test.ts b/packages/server/tests/context-builder.test.ts deleted file mode 100644 index 8655524..0000000 --- a/packages/server/tests/context-builder.test.ts +++ /dev/null @@ -1,404 +0,0 @@ -/** - * ContextBuilder and Plugin System Tests - * - * Tests for: - * 1. createContextBuilder() returns a ContextBuilder - * 2. use() adds a plugin and returns new builder - * 3. withEvents() sets events registry - * 4. build() returns t and createAPI - * 5. Plugin with procedures adds methods to t - * 6. Multiple plugins can be chained with use() - * 7. defineContext() backward compatible API still works - */ - -import { describe, it, expect, vi } from "vitest"; -import { createContextBuilder, defineContext, ContextBuilder } from "../src/context/index.js"; -import { z } from "zod"; -import type { Plugin, PluginEnrichment } from "../src/types.js"; - -describe("ContextBuilder", () => { - describe("createContextBuilder", () => { - it("should return a ContextBuilder instance", () => { - const builder = createContextBuilder(); - expect(builder).toBeInstanceOf(ContextBuilder); - }); - - it("should create builder without initial context", () => { - const builder = createContextBuilder(); - expect(builder).toBeDefined(); - }); - }); - - describe("use()", () => { - it("should add a plugin and return a new builder", () => { - const builder = createContextBuilder(); - const plugin: Plugin = { - name: "test-plugin", - extend: (ctx) => ({ ...ctx, extended: true }), - }; - - const newBuilder = builder.use(plugin); - - // Should return a new builder instance - expect(newBuilder).toBeInstanceOf(ContextBuilder); - expect(newBuilder).not.toBe(builder); - }); - - it("should preserve existing plugins when adding new one", () => { - const builder = createContextBuilder(); - const plugin1: Plugin = { - name: "plugin-1", - extend: (ctx) => ({ ...ctx, p1: true }), - }; - const plugin2: Plugin = { - name: "plugin-2", - extend: (ctx) => ({ ...ctx, p2: true }), - }; - - const builderWithBoth = builder.use(plugin1).use(plugin2); - expect(builderWithBoth).toBeInstanceOf(ContextBuilder); - }); - }); - - describe("withEvents()", () => { - it("should set events registry and return new builder", () => { - const builder = createContextBuilder(); - - const events = { - "user.created": { data: {} as { id: string; name: string } }, - }; - - const newBuilder = builder.withEvents(events as any); - - expect(newBuilder).toBeInstanceOf(ContextBuilder); - expect(newBuilder).not.toBe(builder); - }); - - it("should preserve plugins when setting events", () => { - const builder = createContextBuilder(); - const plugin: Plugin = { - name: "test-plugin", - extend: (ctx) => ({ ...ctx, extended: true }), - }; - - const builderWithPlugin = builder.use(plugin); - const events = { - "user.created": { data: {} as { id: string; name: string } }, - }; - - const builderWithEvents = builderWithPlugin.withEvents(events as any); - expect(builderWithEvents).toBeInstanceOf(ContextBuilder); - }); - }); - - describe("build()", () => { - it("should return t and createAPI", () => { - const builder = createContextBuilder<{ name: string }>(); - const { t, createAPI } = builder.build(); - - expect(t).toBeDefined(); - expect(typeof t.query).toBe("function"); - expect(typeof t.mutation).toBe("function"); - expect(typeof t.router).toBe("function"); - expect(typeof createAPI).toBe("function"); - }); - - it("should build with context", () => { - const builder = createContextBuilder<{ db: { find: () => { id: number } } }>(); - const { t, createAPI } = builder.build(); - - const getUser = t.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - const user = ctx.db.find(); - return { ok: true, value: user } as const; - }, - }); - - const api = createAPI({ - router: t.router({ - users: { get: getUser }, - }), - }); - - expect(api).toBeDefined(); - }); - - it("should apply plugin extend function to context", () => { - interface PluginCtx { - name: string; - pluginData?: string; - } - - const plugin: Plugin = { - name: "test-plugin", - extend: (ctx) => ({ ...ctx, pluginData: "extended" }), - }; - - const builder = createContextBuilder().use(plugin); - const { t, createAPI } = builder.build(); - - const getData = t.query({ - args: z.object({}), - handler: async (ctx, _args) => { - return { ok: true, value: ctx.pluginData } as const; - }, - }); - - const api = createAPI({ - router: t.router({ - data: { get: getData }, - }), - }); - - expect(api).toBeDefined(); - }); - }); - - describe("plugin with procedures", () => { - it("should add namespace methods to t from plugin procedures", () => { - interface Ctx { - db: { users: { findAll: () => { id: string; name: string }[] } }; - } - - const userPlugin: Plugin = { - name: "user-plugin", - extend: (ctx) => ctx, - procedures: (): PluginEnrichment => ({ - users: { - list: ({ handler }) => - handler as any, - }, - }), - }; - - const builder = createContextBuilder().use(userPlugin); - const { t } = builder.build(); - - // The plugin should have added a `users` namespace to t - expect((t as any).users).toBeDefined(); - expect((t as any).users.list).toBeDefined(); - }); - - it("should allow multiple plugins to add namespaces", () => { - interface Ctx { - db: { data: string }; - } - - const plugin1: Plugin = { - name: "plugin-1", - extend: (ctx) => ctx, - procedures: (): PluginEnrichment => ({ - ns1: { - method1: ({ handler }) => handler as any, - }, - }), - }; - - const plugin2: Plugin = { - name: "plugin-2", - extend: (ctx) => ctx, - procedures: (): PluginEnrichment => ({ - ns2: { - method2: ({ handler }) => handler as any, - }, - }), - }; - - const builder = createContextBuilder().use(plugin1).use(plugin2); - const { t } = builder.build(); - - expect((t as any).ns1).toBeDefined(); - expect((t as any).ns1.method1).toBeDefined(); - expect((t as any).ns2).toBeDefined(); - expect((t as any).ns2.method2).toBeDefined(); - }); - - it("should allow multiple methods in same namespace", () => { - interface Ctx { - db: { data: string }; - } - - const plugin: Plugin = { - name: "multi-method-plugin", - extend: (ctx) => ctx, - procedures: (): PluginEnrichment => ({ - calculator: { - add: ({ handler }) => handler as any, - subtract: ({ handler }) => handler as any, - multiply: ({ handler }) => handler as any, - }, - }), - }; - - const builder = createContextBuilder().use(plugin); - const { t } = builder.build(); - - expect((t as any).calculator).toBeDefined(); - expect((t as any).calculator.add).toBeDefined(); - expect((t as any).calculator.subtract).toBeDefined(); - expect((t as any).calculator.multiply).toBeDefined(); - }); - }); - - describe("multiple plugins chained with use()", () => { - it("should chain multiple plugins sequentially", () => { - const plugin1: Plugin<{ count: number }> = { - name: "plugin-1", - extend: (ctx) => ({ count: ctx.count + 1 }), - }; - - const plugin2: Plugin<{ count: number }> = { - name: "plugin-2", - extend: (ctx) => ({ count: ctx.count + 10 }), - }; - - const plugin3: Plugin<{ count: number }> = { - name: "plugin-3", - extend: (ctx) => ({ count: ctx.count + 100 }), - }; - - const builder = createContextBuilder<{ count: number }>() - .use(plugin1) - .use(plugin2) - .use(plugin3); - - const { t, createAPI } = builder.build(); - expect(t).toBeDefined(); - expect(createAPI).toBeDefined(); - }); - - it("should handle plugins with and without procedures", () => { - const pluginWithProcedures: Plugin<{ name: string }> = { - name: "with-procedures", - extend: (ctx) => ctx, - procedures: (): PluginEnrichment<{ name: string }> => ({ - extra: { - method: ({ handler }) => handler as any, - }, - }), - }; - - const pluginWithoutProcedures: Plugin<{ name: string }> = { - name: "without-procedures", - extend: (ctx) => ({ name: ctx.name + "-extended" }), - }; - - const builder = createContextBuilder<{ name: string }>() - .use(pluginWithProcedures) - .use(pluginWithoutProcedures); - - const { t } = builder.build(); - - expect((t as any).extra).toBeDefined(); - expect((t as any).extra.method).toBeDefined(); - }); - }); -}); - -describe("defineContext (backward compatible API)", () => { - it("should still work as before", () => { - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - expect(t).toBeDefined(); - expect(typeof t.query).toBe("function"); - expect(typeof t.mutation).toBe("function"); - expect(typeof createAPI).toBe("function"); - }); - - it("should create queries and mutations", async () => { - const { t, createAPI } = defineContext({ - context: { db: { find: () => ({ id: 1, name: "test" }) } }, - }); - - const getUser = t.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - const user = ctx.db.find(); - return { ok: true, value: user } as const; - }, - }); - - const api = createAPI({ - router: t.router({ - users: { get: getUser }, - }), - }); - - const result = await api.users.get({ id: 1 }); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toEqual({ id: 1, name: "test" }); - } - }); - - it("should support events", () => { - const { t, createAPI } = defineContext({ - context: { db: { create: (data: any) => ({ id: 1, ...data }) } }, - events: { - "user.created": { data: {} as { id: number; name: string } }, - } as any, - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.create(args); - ctx.send("user.created", { id: user.id, name: user.name }); - return { ok: true, value: user } as const; - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - }), - }); - - expect(api).toBeDefined(); - }); - - it("should support plugins in config", () => { - const plugin: Plugin<{ name: string }> = { - name: "test-plugin", - extend: (ctx) => ({ name: ctx.name + "-extended" }), - }; - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - plugins: [plugin], - }); - - expect(t).toBeDefined(); - expect(createAPI).toBeDefined(); - }); - - it("should support createContext function", () => { - const { t, createAPI } = defineContext({ - createContext: () => ({ db: { find: () => ({ id: 42 }) } }), - }); - - expect(t).toBeDefined(); - expect(createAPI).toBeDefined(); - }); -}); - -describe("ContextBuilder vs defineContext parity", () => { - it("both should produce equivalent t and createAPI", () => { - // Using defineContext - const { t: t1, createAPI: createAPI1 } = defineContext({ - context: { name: "test" }, - }); - - // Using ContextBuilder - const { t: t2, createAPI: createAPI2 } = createContextBuilder<{ name: string }>().build(); - - // Both should have the same methods available - expect(typeof t1.query).toBe(typeof t2.query); - expect(typeof t1.mutation).toBe(typeof t2.mutation); - expect(typeof t1.router).toBe(typeof t2.router); - expect(typeof createAPI1).toBe(typeof createAPI2); - }); -}); diff --git a/packages/server/tests/events.test.ts b/packages/server/tests/events.test.ts deleted file mode 100644 index f496a67..0000000 --- a/packages/server/tests/events.test.ts +++ /dev/null @@ -1,628 +0,0 @@ -import { describe, it, expect, vi, beforeEach } from "vitest"; -import { EventEmitter, defineEvents } from "../src/events/emitter"; -import { event, eventNamespace } from "../src/events/index"; -import { createPendingEventQueue } from "../src/events/queue"; -import type { EventRegistry, EventPayload } from "../src/types"; - -describe("EventEmitter", () => { - let emitter: EventEmitter; - - beforeEach(() => { - emitter = new EventEmitter(); - }); - - describe("basic functionality", () => { - it("should create an EventEmitter instance", () => { - expect(emitter).toBeDefined(); - expect(typeof emitter.on).toBe("function"); - expect(typeof emitter.emit).toBe("function"); - expect(typeof emitter.getEventLog).toBe("function"); - }); - - it("should subscribe to an event with on()", () => { - const handler = vi.fn(); - const unsubscribe = emitter.on("test.event", handler); - - expect(typeof unsubscribe).toBe("function"); - }); - - it("should call handler when event is emitted", async () => { - const handler = vi.fn(); - emitter.on("test.event", handler); - - await emitter.emit("test.event", { id: 1 }); - - expect(handler).toHaveBeenCalledTimes(1); - }); - - it("should pass correct payload to handler", async () => { - const handler = vi.fn(); - emitter.on("user.created", handler); - - const eventData = { id: 42, name: "John" }; - await emitter.emit("user.created", eventData); - - expect(handler).toHaveBeenCalledWith( - expect.objectContaining({ - name: "user.created", - data: eventData, - namespace: "default", - }) - ); - }); - - it("should support multiple handlers on same event", async () => { - const handler1 = vi.fn(); - const handler2 = vi.fn(); - const handler3 = vi.fn(); - - emitter.on("user.created", handler1); - emitter.on("user.created", handler2); - emitter.on("user.created", handler3); - - await emitter.emit("user.created", { id: 1 }); - - expect(handler1).toHaveBeenCalledTimes(1); - expect(handler2).toHaveBeenCalledTimes(1); - expect(handler3).toHaveBeenCalledTimes(1); - }); - - it("should call handler with different data for different events", async () => { - const handler = vi.fn(); - emitter.on("test", handler); - - await emitter.emit("test", { value: "first" }); - await emitter.emit("test", { value: "second" }); - - expect(handler).toHaveBeenCalledTimes(2); - expect(handler).toHaveBeenNthCalledWith(1, expect.objectContaining({ data: { value: "first" } })); - expect(handler).toHaveBeenNthCalledWith(2, expect.objectContaining({ data: { value: "second" } })); - }); - }); - - describe("getEventLog()", () => { - it("should return empty array initially", () => { - const log = emitter.getEventLog(); - expect(log).toEqual([]); - }); - - it("should return all emitted events", async () => { - emitter.on("event1", () => {}); - emitter.on("event2", () => {}); - - await emitter.emit("event1", { id: 1 }); - await emitter.emit("event2", { id: 2 }); - - const log = emitter.getEventLog(); - expect(log).toHaveLength(2); - }); - - it("should include event name, data, and timestamp in log entries", async () => { - emitter.on("user.created", () => {}); - - await emitter.emit("user.created", { id: 42, name: "Jane" }); - - const log = emitter.getEventLog(); - expect(log).toHaveLength(1); - - const entry = log[0]; - expect(entry.name).toBe("user.created"); - expect(entry.data).toEqual({ id: 42, name: "Jane" }); - expect(entry.timestamp).toBeDefined(); - expect(typeof entry.timestamp).toBe("string"); - // Should be valid ISO string - expect(new Date(entry.timestamp).toISOString()).toBe(entry.timestamp); - }); - - it("should log events even if no handler is subscribed", async () => { - // No subscription, just emit - await emitter.emit("unobserved.event", { data: 123 }); - - const log = emitter.getEventLog(); - expect(log).toHaveLength(1); - expect(log[0].name).toBe("unobserved.event"); - }); - - it("should clear event log with clearEventLog()", async () => { - emitter.on("event", () => {}); - - await emitter.emit("event", { id: 1 }); - await emitter.emit("event", { id: 2 }); - - expect(emitter.getEventLog()).toHaveLength(2); - - emitter.clearEventLog(); - - expect(emitter.getEventLog()).toEqual([]); - }); - - it("should maintain event log order", async () => { - emitter.on("e1", () => {}); - emitter.on("e2", () => {}); - - await emitter.emit("e1", { order: 1 }); - await emitter.emit("e2", { order: 2 }); - await emitter.emit("e1", { order: 3 }); - - const log = emitter.getEventLog(); - expect(log[0].name).toBe("e1"); - expect(log[0].data).toEqual({ order: 1 }); - expect(log[1].name).toBe("e2"); - expect(log[1].data).toEqual({ order: 2 }); - expect(log[2].name).toBe("e1"); - expect(log[2].data).toEqual({ order: 3 }); - }); - }); - - describe("namespaces", () => { - it("should use default namespace when none provided", async () => { - const handler = vi.fn(); - emitter.on("test", handler); - - await emitter.emit("test", { value: 1 }); - - expect(handler).toHaveBeenCalledWith( - expect.objectContaining({ namespace: "default" }) - ); - }); - - it("should use custom namespace when provided", async () => { - const handler = vi.fn(); - emitter.on("test", handler); - - await emitter.emit("test", { value: 1 }, "customNamespace"); - - expect(handler).toHaveBeenCalledWith( - expect.objectContaining({ namespace: "customNamespace" }) - ); - }); - - it("should log namespace in event payload", async () => { - emitter.on("test", () => {}); - - await emitter.emit("test", { data: true }, "myNamespace"); - - const log = emitter.getEventLog(); - expect(log[0].namespace).toBe("myNamespace"); - }); - - it("should use different namespaces for different events", async () => { - const handler1 = vi.fn(); - const handler2 = vi.fn(); - - emitter.on("event1", handler1); - emitter.on("event2", handler2); - - await emitter.emit("event1", { ns: "namespace1" }, "ns1"); - await emitter.emit("event2", { ns: "namespace2" }, "ns2"); - - expect(handler1).toHaveBeenCalledWith(expect.objectContaining({ namespace: "ns1" })); - expect(handler2).toHaveBeenCalledWith(expect.objectContaining({ namespace: "ns2" })); - }); - }); - - describe("unsubscribe", () => { - it("should return unsubscribe function from on()", () => { - const handler = vi.fn(); - const unsubscribe = emitter.on("test", handler); - - expect(typeof unsubscribe).toBe("function"); - }); - - it("should stop calling handler after unsubscribe", async () => { - const handler = vi.fn(); - const unsubscribe = emitter.on("test", handler); - - await emitter.emit("test", { id: 1 }); - expect(handler).toHaveBeenCalledTimes(1); - - unsubscribe(); - - await emitter.emit("test", { id: 2 }); - expect(handler).toHaveBeenCalledTimes(1); // Still 1, not 2 - }); - - it("should support off() method for unsubscribing", async () => { - const handler = vi.fn(); - emitter.on("test", handler); - - await emitter.emit("test", { id: 1 }); - expect(handler).toHaveBeenCalledTimes(1); - - emitter.off("test", handler); - - await emitter.emit("test", { id: 2 }); - expect(handler).toHaveBeenCalledTimes(1); - }); - - it("should handle unsubscribe from multiple handlers", async () => { - const handler1 = vi.fn(); - const handler2 = vi.fn(); - const handler3 = vi.fn(); - - const unsub1 = emitter.on("test", handler1); - emitter.on("test", handler2); - const unsub3 = emitter.on("test", handler3); - - await emitter.emit("test", { id: 1 }); - expect(handler1).toHaveBeenCalledTimes(1); - expect(handler2).toHaveBeenCalledTimes(1); - expect(handler3).toHaveBeenCalledTimes(1); - - unsub1(); - unsub3(); - - await emitter.emit("test", { id: 2 }); - expect(handler1).toHaveBeenCalledTimes(1); // Not called again - expect(handler2).toHaveBeenCalledTimes(2); - expect(handler3).toHaveBeenCalledTimes(1); // Not called again - }); - - it("should not affect other handlers when one unsubscribes", async () => { - const handler1 = vi.fn(); - const handler2 = vi.fn(); - - emitter.on("test", handler1); - emitter.on("test", handler2); - - await emitter.emit("test", { id: 1 }); - expect(handler1).toHaveBeenCalledTimes(1); - expect(handler2).toHaveBeenCalledTimes(1); - - emitter.off("test", handler1); - - await emitter.emit("test", { id: 2 }); - expect(handler1).toHaveBeenCalledTimes(1); // Unsubscribed - expect(handler2).toHaveBeenCalledTimes(2); // Still active - }); - }); - - describe("wildcard patterns", () => { - it("should support prefix wildcard pattern user.*", async () => { - const handler = vi.fn(); - emitter.on("user.*", handler); - - await emitter.emit("user.created", { id: 1 }); - await emitter.emit("user.updated", { id: 1 }); - await emitter.emit("user.deleted", { id: 1 }); - await emitter.emit("post.created", { id: 1 }); // Should not trigger - - expect(handler).toHaveBeenCalledTimes(3); - }); - - it("should support global wildcard pattern *", async () => { - const handler = vi.fn(); - emitter.on("*", handler); - - await emitter.emit("event1", { id: 1 }); - await emitter.emit("event2", { id: 2 }); - await emitter.emit("anything", { id: 3 }); - - expect(handler).toHaveBeenCalledTimes(3); - }); - - it("should call both specific and wildcard handlers", async () => { - const specificHandler = vi.fn(); - const wildcardHandler = vi.fn(); - - emitter.on("user.created", specificHandler); - emitter.on("user.*", wildcardHandler); - - await emitter.emit("user.created", { id: 1 }); - - expect(specificHandler).toHaveBeenCalledTimes(1); - expect(wildcardHandler).toHaveBeenCalledTimes(1); - }); - }); - - describe("emit return value", () => { - it("should return ok result on successful emit", async () => { - emitter.on("test", () => {}); - - const result = await emitter.emit("test", { data: 1 }); - - expect(result.ok).toBe(true); - }); - - it("should return ok result even with no handlers", async () => { - const result = await emitter.emit("unobserved", { data: 1 }); - - expect(result.ok).toBe(true); - }); - - it("should return err result when handler throws", async () => { - const errorHandler = vi.fn(() => { - throw new Error("Handler error"); - }); - emitter.on("test", errorHandler); - - const result = await emitter.emit("test", { data: 1 }); - - expect(result.ok).toBe(false); - if (!result.ok) { - expect(result.error.message).toBe("Handler error"); - } - }); - - it("should stop emitting after handler throws", async () => { - const errorHandler = vi.fn(() => { - throw new Error("Stop here"); - }); - const secondHandler = vi.fn(); - - emitter.on("test", errorHandler); - emitter.on("test", secondHandler); - - await emitter.emit("test", { data: 1 }); - - expect(errorHandler).toHaveBeenCalledTimes(1); - expect(secondHandler).not.toHaveBeenCalled(); - }); - }); - - describe("async handlers", () => { - it("should await async handlers", async () => { - const asyncHandler = vi.fn().mockImplementation(async () => { - await new Promise((resolve) => setTimeout(resolve, 10)); - }); - - emitter.on("test", asyncHandler); - - const emitPromise = emitter.emit("test", { id: 1 }); - - // Handler should not have been called yet (still awaiting) - // But since emit awaits all handlers, it should complete - await emitPromise; - - expect(asyncHandler).toHaveBeenCalled(); - }); - - it("should handle mix of sync and async handlers", async () => { - const syncHandler = vi.fn(); - const asyncHandler = vi.fn().mockImplementation(async () => {}); - - emitter.on("test", syncHandler); - emitter.on("test", asyncHandler); - - await emitter.emit("test", { id: 1 }); - - expect(syncHandler).toHaveBeenCalled(); - expect(asyncHandler).toHaveBeenCalled(); - }); - }); - - describe("event payload structure", () => { - it("should have all required fields in event payload", async () => { - const handler = vi.fn(); - emitter.on("user.updated", handler); - - await emitter.emit("user.updated", { id: 42, changes: { name: "New Name" } }, "custom"); - - const payload = handler.mock.calls[0][0]; - - expect(payload).toHaveProperty("name"); - expect(payload).toHaveProperty("data"); - expect(payload).toHaveProperty("timestamp"); - expect(payload).toHaveProperty("namespace"); - }); - - it("should include source field when provided", async () => { - const handler = vi.fn(); - emitter.on("test", handler); - - await emitter.emit("test", { value: 1 }, "default"); - - const payload = handler.mock.calls[0][0]; - // source is optional, might not be present - expect(payload.source).toBeUndefined(); // Not set in basic emit - }); - }); -}); - -describe("defineEvents", () => { - it("should flatten nested events with namespaces", () => { - const events = defineEvents({ - user: { - created: event({ args: { id: 1, name: "string" } as any }), - updated: event({ args: { id: 1, changes: {} } as any }), - }, - post: { - created: event({ args: { title: "string" } as any }), - }, - }); - - expect(events).toHaveProperty("user.created"); - expect(events).toHaveProperty("user.updated"); - expect(events).toHaveProperty("post.created"); - }); - - it("should preserve event definition structure", () => { - const userEvent = event({ args: { id: 1 } as any }); - const events = defineEvents({ - user: { - created: userEvent, - }, - }); - - expect(events["user.created"]).toBe(userEvent); - }); -}); - -describe("eventNamespace", () => { - it("should group events under a namespace", () => { - const events = { - user: eventNamespace({ - name: "user", - events: { - created: event({ args: { id: 1 } as any }), - deleted: event({ args: { id: 1 } as any }), - }, - }), - }; - - const registry = defineEvents(events); - - expect(registry).toHaveProperty("user.created"); - expect(registry).toHaveProperty("user.deleted"); - }); -}); - -describe("PendingEventQueue", () => { - let queue: ReturnType; - - beforeEach(() => { - queue = createPendingEventQueue(); - }); - - it("should enqueue events", () => { - const result = queue.enqueue({ - name: "test.event", - data: { id: 1 }, - timestamp: new Date().toISOString(), - namespace: "default", - }); - - expect(result.ok).toBe(true); - expect(queue.size()).toBe(1); - }); - - it("should return false for isEmpty when events exist", () => { - queue.enqueue({ - name: "test.event", - data: { id: 1 }, - timestamp: new Date().toISOString(), - namespace: "default", - }); - - expect(queue.isEmpty()).toBe(false); - }); - - it("should clear all events", () => { - queue.enqueue({ - name: "test.event", - data: { id: 1 }, - timestamp: new Date().toISOString(), - namespace: "default", - }); - - queue.clear(); - - expect(queue.isEmpty()).toBe(true); - expect(queue.size()).toBe(0); - }); - - it("should flush events to emitter", async () => { - const emitter = new EventEmitter(); - const handler = vi.fn(); - emitter.on("test.event", handler); - - queue.enqueue({ - name: "test.event", - data: { id: 42 }, - timestamp: new Date().toISOString(), - namespace: "default", - }); - - const result = await queue.flush(emitter); - - expect(result.ok).toBe(true); - expect(handler).toHaveBeenCalledTimes(1); - expect(handler).toHaveBeenCalledWith( - expect.objectContaining({ - name: "test.event", - data: { id: 42 }, - }) - ); - expect(queue.isEmpty()).toBe(true); - }); - - it("should flush multiple events in order", async () => { - const emitter = new EventEmitter(); - const handler = vi.fn(); - emitter.on("test.event", handler); - - queue.enqueue({ - name: "test.event", - data: { order: 1 }, - timestamp: new Date().toISOString(), - namespace: "default", - }); - queue.enqueue({ - name: "test.event", - data: { order: 2 }, - timestamp: new Date().toISOString(), - namespace: "default", - }); - queue.enqueue({ - name: "test.event", - data: { order: 3 }, - timestamp: new Date().toISOString(), - namespace: "default", - }); - - await queue.flush(emitter); - - expect(handler).toHaveBeenCalledTimes(3); - expect(handler).toHaveBeenNthCalledWith(1, expect.objectContaining({ data: { order: 1 } })); - expect(handler).toHaveBeenNthCalledWith(2, expect.objectContaining({ data: { order: 2 } })); - expect(handler).toHaveBeenNthCalledWith(3, expect.objectContaining({ data: { order: 3 } })); - }); - - it("should return error when emitter emit fails during flush", async () => { - const emitter = new EventEmitter(); - const errorHandler = vi.fn(() => { - throw new Error("Emit failed"); - }); - emitter.on("test.event", errorHandler); - - queue.enqueue({ - name: "test.event", - data: { id: 1 }, - timestamp: new Date().toISOString(), - namespace: "default", - }); - queue.enqueue({ - name: "test.event", - data: { id: 2 }, - timestamp: new Date().toISOString(), - namespace: "default", - }); - - const result = await queue.flush(emitter); - - expect(result.ok).toBe(false); - // First event should have been processed - expect(errorHandler).toHaveBeenCalledTimes(1); - }); - - it("should handle flush with undefined emitter", async () => { - queue.enqueue({ - name: "test.event", - data: { id: 1 }, - timestamp: new Date().toISOString(), - namespace: "default", - }); - - const result = await queue.flush(undefined); - - expect(result.ok).toBe(true); - expect(queue.isEmpty()).toBe(true); - }); - - it("should return events() with copy of pending events", () => { - queue.enqueue({ - name: "test.event", - data: { id: 1 }, - timestamp: new Date().toISOString(), - namespace: "default", - }); - - const events = queue.events(); - expect(events).toHaveLength(1); - expect(events[0].name).toBe("test.event"); - - // Modifying returned array should not affect queue - events.push({} as any); - expect(queue.size()).toBe(1); - }); -}); diff --git a/packages/server/tests/factory-functions.test.ts b/packages/server/tests/factory-functions.test.ts deleted file mode 100644 index 1e38de6..0000000 --- a/packages/server/tests/factory-functions.test.ts +++ /dev/null @@ -1,421 +0,0 @@ -import { describe, it, expect } from "vitest"; -import { createQuery, createMutation, createInternalQuery, createInternalMutation, createProcedure } from "../src/query/index.js"; -import { QueryBuilder } from "../src/query/builder.js"; -import { z } from "zod"; -import { ok, err } from "../src/errors/index.js"; - -describe("Factory Functions", () => { - // Test context type - interface TestCtx { - db: { - find: () => { id: number; name: string }; - create: (data: unknown) => { id: number }; - }; - name: string; - } - - const testCtx: TestCtx = { - db: { - find: () => ({ id: 1, name: "test" }), - create: (data) => ({ id: 42, ...(data as object) }), - }, - name: "test-context", - }; - - describe("createQuery", () => { - it("creates a procedure with type 'query'", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, name: ctx.name }); - }, - }); - - expect(query.type).toBe("query"); - }); - - it("creates a procedure with correct _def", () => { - const argsSchema = z.object({ id: z.number() }); - const query = createQuery({ - args: argsSchema, - handler: async (ctx, args) => { - return ok({ id: args.id, name: ctx.name }); - }, - }); - - expect(query._def.type).toBe("query"); - expect(query._def.argsSchema).toBe(argsSchema); - expect(query._def.$types.input).toBeDefined(); - // $types.output is intentionally undefined at runtime (type-level placeholder) - expect(query._def.$types.output).toBeUndefined(); - }); - - it("creates a query without args", () => { - const query = createQuery({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - expect(query.type).toBe("query"); - expect(query._def.argsSchema).toBeUndefined(); - }); - }); - - describe("createMutation", () => { - it("creates a procedure with type 'mutation'", () => { - const mutation = createMutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - return ok({ id: 1, name: args.name }); - }, - }); - - expect(mutation.type).toBe("mutation"); - }); - - it("creates a procedure with correct _def", () => { - const argsSchema = z.object({ name: z.string() }); - const mutation = createMutation({ - args: argsSchema, - handler: async (ctx, args) => { - return ok({ id: 1, name: args.name }); - }, - }); - - expect(mutation._def.type).toBe("mutation"); - expect(mutation._def.argsSchema).toBe(argsSchema); - expect(mutation._def.$types.input).toBeDefined(); - // $types.output is intentionally undefined at runtime (type-level placeholder) - expect(mutation._def.$types.output).toBeUndefined(); - }); - }); - - describe("createInternalQuery", () => { - it("creates a procedure with type 'internalQuery'", () => { - const internalQuery = createInternalQuery({ - handler: async (ctx) => { - return ok({ id: ctx.db.find().id }); - }, - }); - - expect(internalQuery.type).toBe("internalQuery"); - }); - - it("creates a procedure with correct _def", () => { - const internalQuery = createInternalQuery({ - handler: async (ctx) => { - return ok({ id: ctx.db.find().id }); - }, - }); - - expect(internalQuery._def.type).toBe("internalQuery"); - expect(internalQuery._def.argsSchema).toBeUndefined(); - // For createInternalQuery, argsSchema is undefined so $types.input is also undefined - expect(internalQuery._def.$types.input).toBeUndefined(); - // $types.output is intentionally undefined at runtime (type-level placeholder) - expect(internalQuery._def.$types.output).toBeUndefined(); - }); - }); - - describe("createInternalMutation", () => { - it("creates a procedure with type 'internalMutation'", () => { - const internalMutation = createInternalMutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - return ok(ctx.db.create({ name: args.name }) as { id: number }); - }, - }); - - expect(internalMutation.type).toBe("internalMutation"); - }); - - it("creates a procedure with correct _def", () => { - const argsSchema = z.object({ name: z.string() }); - const internalMutation = createInternalMutation({ - args: argsSchema, - handler: async (ctx, args) => { - return ok(ctx.db.create({ name: args.name }) as { id: number }); - }, - }); - - expect(internalMutation._def.type).toBe("internalMutation"); - expect(internalMutation._def.argsSchema).toBe(argsSchema); - expect(internalMutation._def.$types.input).toBeDefined(); - // $types.output is intentionally undefined at runtime (type-level placeholder) - expect(internalMutation._def.$types.output).toBeUndefined(); - }); - }); - - describe("createProcedure", () => { - it("creates a query procedure", () => { - const procedure = createProcedure( - "query", - { - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, name: ctx.name }); - }, - } - ); - - expect(procedure.type).toBe("query"); - expect(procedure._def.type).toBe("query"); - }); - - it("creates a mutation procedure", () => { - const procedure = createProcedure( - "mutation", - { - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - return ok(ctx.db.create({ name: args.name }) as { id: number }); - }, - } - ); - - expect(procedure.type).toBe("mutation"); - expect(procedure._def.type).toBe("mutation"); - }); - - it("creates an internalQuery procedure", () => { - const procedure = createProcedure( - "internalQuery", - { - handler: async (ctx) => { - return ok({ id: ctx.db.find().id }); - }, - } - ); - - expect(procedure.type).toBe("internalQuery"); - expect(procedure._def.type).toBe("internalQuery"); - }); - - it("creates an internalMutation procedure", () => { - const procedure = createProcedure( - "internalMutation", - { - args: z.object({ data: z.string() }), - handler: async (ctx, args) => { - return ok({ success: true }); - }, - } - ); - - expect(procedure.type).toBe("internalMutation"); - expect(procedure._def.type).toBe("internalMutation"); - }); - - it("creates a procedure with metadata", () => { - const procedure = createProcedure( - "query", - { - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - metadata: { version: "1.0.0" }, - } - ); - - expect(procedure._def.metadata).toEqual({ version: "1.0.0" }); - }); - }); - - describe("Procedure methods", () => { - it("procedure has beforeInvoke method", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - expect(typeof query.beforeInvoke).toBe("function"); - }); - - it("procedure has afterInvoke method", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - expect(typeof query.afterInvoke).toBe("function"); - }); - - it("procedure has onSuccess method", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - expect(typeof query.onSuccess).toBe("function"); - }); - - it("procedure has onError method", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - expect(typeof query.onError).toBe("function"); - }); - - it("procedure has use method", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - expect(typeof query.use).toBe("function"); - }); - - it("procedure has _hooks object", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - expect(query._hooks).toBeDefined(); - expect(typeof query._hooks).toBe("object"); - }); - - it("procedure has _middleware array", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - expect(query._middleware).toBeDefined(); - expect(Array.isArray(query._middleware)).toBe(true); - }); - }); - - describe("Procedure chaining", () => { - it("beforeInvoke returns the same procedure type", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - const chained = query.beforeInvoke((ctx, args) => { - // before hook - }); - - // Should return same type (AnyProcedure) - expect(chained).toBeDefined(); - expect(chained.type).toBe("query"); - }); - - it("onSuccess returns the same procedure type", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - const chained = query.onSuccess((ctx, args, data) => { - // success hook - }); - - expect(chained.type).toBe("query"); - }); - - it("use returns the same procedure type", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - const middleware = { - name: "test-middleware", - handler: async (ctx: TestCtx, opts: { next: () => Promise; args: unknown; meta: Record }) => { - return opts.next(); - }, - }; - - const chained = query.use(middleware); - - expect(chained.type).toBe("query"); - }); - - it("multiple hooks can be chained", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - const middleware = { - name: "test-middleware", - handler: async (ctx: TestCtx, opts: { next: () => Promise; args: unknown; meta: Record }) => { - return opts.next(); - }, - }; - - const chained = query - .beforeInvoke((ctx, args) => {}) - .afterInvoke((ctx, args, result) => {}) - .onSuccess((ctx, args, data) => {}) - .onError((ctx, args, error) => {}) - .use(middleware); - - expect(chained.type).toBe("query"); - // Note: Factory function's `use` returns `this` without adding to _middleware - // The _middleware array remains empty for factory-created procedures - expect(chained._middleware).toHaveLength(0); - }); - }); - - describe("Procedures with QueryBuilder (integration)", () => { - it("procedures created by factory functions are compatible with QueryBuilder router", () => { - const query = createQuery({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, name: ctx.name }); - }, - }); - - const mutation = createMutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - return ok(ctx.db.create({ name: args.name }) as { id: number }); - }, - }); - - // Use QueryBuilder to create a router with the procedures - const builder = new QueryBuilder(testCtx); - - const router = builder.router({ - queries: { - getUser: query, - }, - mutations: { - createUser: mutation, - }, - }); - - expect(router.queries.getUser).toBeDefined(); - expect(router.mutations.createUser).toBeDefined(); - }); - }); -}); diff --git a/packages/server/tests/index.test.ts b/packages/server/tests/index.test.ts deleted file mode 100644 index 44129e3..0000000 --- a/packages/server/tests/index.test.ts +++ /dev/null @@ -1,618 +0,0 @@ -import { describe, it, expect } from "vitest"; -import { defineContext, defineEvents, ok, err } from "../src/index"; -import { z } from "zod"; - -describe("defineContext", () => { - it("should create t query builder", () => { - const { t } = defineContext({ - context: { name: "test" }, - }); - - expect(t).toBeDefined(); - expect(typeof t.query).toBe("function"); - expect(typeof t.mutation).toBe("function"); - expect(typeof t.router).toBe("function"); - }); - - it("should create createAPI function", () => { - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - expect(typeof createAPI).toBe("function"); - }); - - it("should support chained hooks", () => { - const { t } = defineContext({ - context: { name: "test" }, - }); - - const myQuery = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, name: ctx.name }); - }, - }) - .beforeInvoke((ctx, args) => { - // before hook - }) - .onSuccess((ctx, args, data) => { - // success hook - }); - - expect(myQuery.type).toBe("query"); - expect(typeof myQuery.beforeInvoke).toBe("function"); - expect(typeof myQuery.onSuccess).toBe("function"); - }); - - it("should create API with router", async () => { - const { t, createAPI } = defineContext({ - context: { db: { find: () => ({ id: 1, name: "test" }) } }, - }); - - const getUser = t.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - const user = ctx.db.find(); - return ok(user); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { - get: getUser, - }, - }), - }); - - expect(api).toBeDefined(); - expect(api.router).toBeDefined(); - }); -}); - -describe("createAPI", () => { - it("should execute a query using proxy access", async () => { - const { t, createAPI } = defineContext({ - context: { db: { find: () => ({ id: 1, name: "test" }) } }, - }); - - const getUser = t.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, name: "test" }); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { - get: getUser, - }, - }), - }); - - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toEqual({ id: 1, name: "test" }); - } - }); - - it("should execute a query using direct proxy access", async () => { - const { t, createAPI } = defineContext({ - context: { db: { find: () => ({ id: 1, name: "test" }) } }, - }); - - const getUser = t.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, name: "test" }); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { - get: getUser, - }, - }), - }); - - // New direct syntax: api.users.get({}) - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toEqual({ id: 1, name: "test" }); - } - }); - - it("should return error for unknown route", async () => { - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const api = createAPI({ - router: t.router({}), - }); - - // execute removed - unknown route returns undefined with direct access - const unknownFn = (api as any).unknown?.route; - const result = unknownFn ? await unknownFn({}) : { ok: false }; - - expect(result.ok).toBe(false); - }); - - it("should return error for unknown route via direct access", async () => { - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const api = createAPI({ - router: t.router({}), - }); - - // Accessing a non-existent route should return undefined function - const unknownRoute = (api as any).unknown?.route; - expect(unknownRoute).toBeUndefined(); - }); - - it("should execute query without args using no-args call", async () => { - const { t, createAPI } = defineContext({ - context: { db: { find: () => ({ id: 1, name: "test" }) }, name: "test" }, - }); - - const getUser = t.query({ - handler: async (ctx: any) => { - return ok({ id: 1, name: ctx.name }); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { - get: getUser, - }, - }), - }); - - // New syntax: call without {} - const result = await api.users.get(); - - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toEqual({ id: 1, name: "test" }); - } - }); - - it("should execute query without args using empty {} for backwards compat", async () => { - const { t, createAPI } = defineContext({ - context: { db: { find: () => ({ id: 1, name: "test" }) }, name: "test" }, - }); - - const getUser = t.query({ - handler: async (ctx: any) => { - return ok({ id: 1, name: ctx.name }); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { - get: getUser, - }, - }), - }); - - // Backwards compatible: still works with {} - const result = await api.users.get({}); - - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toEqual({ id: 1, name: "test" }); - } - }); - - it("should execute mutation without args using no-args call", async () => { - const { t, createAPI } = defineContext({ - context: { db: { create: () => ({ id: 42 }) }, name: "test" }, - }); - - const resetDb = t.mutation({ - handler: async (ctx: any) => { - return ok({ success: true, dbName: ctx.name }); - }, - }); - - const api = createAPI({ - router: t.router({ - admin: { - reset: resetDb, - }, - }), - }); - - // New syntax: call without {} - const result = await api.admin.reset(); - - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toEqual({ success: true, dbName: "test" }); - } - }); - - it("should still require args for procedures with args defined", async () => { - const { t, createAPI } = defineContext({ - context: { db: { find: () => ({ id: 1, name: "test" }) } }, - }); - - const getUser = t.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, name: "test" }); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { - get: getUser, - }, - }), - }); - - // With args defined, must pass args - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toEqual({ id: 1, name: "test" }); - } - }); -}); - -describe("ctx.send", () => { - it("should emit events after successful handler execution", async () => { - const { t, createAPI } = defineContext({ - context: { db: { create: (data: any) => ({ id: 1, ...data }) } }, - events: { - "user.created": { data: {} as { id: number; name: string } }, - } as any, - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.create(args); - ctx.send("user.created", { id: user.id, name: user.name }); - return ok(user); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - }), - }); - - const executor = api; - const result = await executor.users.create({ name: "John" }); - - expect(result.ok).toBe(true); - const events = executor.getEvents(); - expect(events).toHaveLength(1); - expect(events[0].name).toBe("user.created"); - expect(events[0].data).toEqual({ id: 1, name: "John" }); - expect(events[0].namespace).toBe("default"); - expect(events[0].timestamp).toBeDefined(); - }); - - it("should discard events when handler fails", async () => { - const { t, createAPI } = defineContext({ - context: { db: { create: (data: any) => ({ id: 1, ...data }) } }, - events: { - "user.created": { data: {} as { id: number; name: string } }, - } as any, - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - ctx.send("user.created", { id: 1, name: args.name }); - return err("USER_CREATION_FAILED" as any, "Failed to create user"); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - }), - }); - - const executor = api; - const result = await executor.users.create({ name: "John" }); - - expect(result.ok).toBe(false); - const events = executor.getEvents(); - expect(events).toHaveLength(0); - }); - - it("should discard events when handler throws", async () => { - const { t, createAPI } = defineContext({ - context: { db: { create: (data: any) => ({ id: 1, ...data }) } }, - events: { - "user.created": { data: {} as { id: number; name: string } }, - } as any, - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - ctx.send("user.created", { id: 1, name: args.name }); - throw new Error("Database error"); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - }), - }); - - const executor = api; - const result = await executor.users.create({ name: "John" }); - - expect(result.ok).toBe(false); - const events = executor.getEvents(); - expect(events).toHaveLength(0); - }); - - it("should emit multiple events", async () => { - const { t, createAPI } = defineContext({ - context: { db: { create: (data: any) => ({ id: 1, ...data }) } }, - events: { - "user.created": { data: {} as { id: number } }, - "email.sent": { data: {} as { to: string } }, - } as any, - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string(), email: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.create(args); - ctx.send("user.created", { id: user.id }); - ctx.send("email.sent", { to: args.email }); - return ok(user); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - }), - }); - - const executor = api; - await executor.users.create({ name: "John", email: "john@example.com" }); - - const events = executor.getEvents(); - expect(events).toHaveLength(2); - expect(events[0].name).toBe("user.created"); - expect(events[1].name).toBe("email.sent"); - }); - - it("should support namespace option", async () => { - const { t, createAPI } = defineContext({ - context: { db: { create: (data: any) => ({ id: 1, ...data }) } }, - events: { - "order.created": { data: {} as { id: number } }, - } as any, - }); - - const createOrder = t.mutation({ - args: z.object({ item: z.string() }), - handler: async (ctx, args) => { - const order = ctx.db.create(args); - ctx.send("order.created", { id: order.id }, { namespace: "ecommerce" }); - return ok(order); - }, - }); - - const api = createAPI({ - router: t.router({ - orders: { create: createOrder }, - }), - }); - - const executor = api; - await executor.orders.create({ item: "Widget" }); - - const events = executor.getEvents(); - expect(events).toHaveLength(1); - expect(events[0].namespace).toBe("ecommerce"); - }); -}); - -describe("t.on", () => { - it("should register global event listener", async () => { - const { t, createAPI } = defineContext({ - context: { db: { create: (data: any) => ({ id: 1, ...data }) } }, - events: { - "user.created": { data: {} as { id: number } }, - } as any, - }); - - const receivedEvents: any[] = []; - const unsubscribe = t.on("user.created" as any, (_ctx, event) => { - receivedEvents.push(event); - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.create(args); - ctx.send("user.created", { id: user.id }); - return ok(user); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - }), - }); - - await api.users.create({ name: "John" }); - - expect(receivedEvents).toHaveLength(1); - expect(receivedEvents[0].name).toBe("user.created"); - expect(receivedEvents[0].data).toEqual({ id: 1 }); - - unsubscribe(); - }); - - it("should return unsubscribe function", async () => { - const { t, createAPI } = defineContext({ - context: { db: { create: (data: any) => ({ id: 1, ...data }) } }, - events: { - "user.created": { data: {} as { id: number } }, - } as any, - }); - - const receivedEvents: any[] = []; - const unsubscribe = t.on("user.created" as any, (_ctx, event) => { - receivedEvents.push(event); - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.create(args); - ctx.send("user.created", { id: user.id }); - return ok(user); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - }), - }); - - await api.users.create({ name: "John" }); - expect(receivedEvents).toHaveLength(1); - - // Unsubscribe - unsubscribe(); - - await api.users.create({ name: "Jane" }); - expect(receivedEvents).toHaveLength(1); // Still 1, not 2 - }); - - it("should support wildcard pattern user.*", async () => { - const { t, createAPI } = defineContext({ - context: { db: { create: (data: any) => ({ id: 1, ...data }) } }, - events: { - "user.created": { data: {} as { id: number } }, - "user.updated": { data: {} as { id: number } }, - "user.deleted": { data: {} as { id: number } }, - "post.created": { data: {} as { id: number } }, - } as any, - }); - - const receivedEvents: any[] = []; - t.on("user.*" as any, (_ctx, event) => { - receivedEvents.push(event); - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.create(args); - ctx.send("user.created", { id: user.id }); - return ok(user); - }, - }); - - const updateUser = t.mutation({ - args: z.object({ id: z.number(), name: z.string() }), - handler: async (ctx, args) => { - ctx.send("user.updated", { id: args.id }); - return ok({ id: args.id, name: args.name }); - }, - }); - - const createPost = t.mutation({ - args: z.object({ title: z.string() }), - handler: async (ctx, args) => { - const post = ctx.db.create(args); - ctx.send("post.created", { id: post.id }); - return ok(post); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser, update: updateUser }, - posts: { create: createPost }, - }), - }); - - await api.users.create({ name: "John" }); - await api.users.update({ id: 1, name: "Jane" }); - await api.posts.create({ title: "Hello" }); - - // Should only receive user.* events, not post.* - expect(receivedEvents).toHaveLength(2); - expect(receivedEvents[0].name).toBe("user.created"); - expect(receivedEvents[1].name).toBe("user.updated"); - }); - - it("should support wildcard pattern *", async () => { - const { t, createAPI } = defineContext({ - context: { db: { create: (data: any) => ({ id: 1, ...data }) } }, - events: { - "user.created": { data: {} as { id: number } }, - "post.created": { data: {} as { id: number } }, - } as any, - }); - - const receivedEvents: any[] = []; - t.on("*" as any, (_ctx, event) => { - receivedEvents.push(event); - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.create(args); - ctx.send("user.created", { id: user.id }); - return ok(user); - }, - }); - - const createPost = t.mutation({ - args: z.object({ title: z.string() }), - handler: async (ctx, args) => { - const post = ctx.db.create(args); - ctx.send("post.created", { id: post.id }); - return ok(post); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - posts: { create: createPost }, - }), - }); - - await api.users.create({ name: "John" }); - await api.posts.create({ title: "Hello" }); - - expect(receivedEvents).toHaveLength(2); - }); -}); \ No newline at end of file diff --git a/packages/server/tests/middleware-hooks.test.ts b/packages/server/tests/middleware-hooks.test.ts deleted file mode 100644 index 78f88de..0000000 --- a/packages/server/tests/middleware-hooks.test.ts +++ /dev/null @@ -1,913 +0,0 @@ -import { describe, it, expect, vi } from "vitest"; -import { defineContext, createAPI, createMiddleware, withQuery, withMutation, ok, err } from "../src/index"; -import { z } from "zod"; - -describe("Middleware", () => { - describe("createMiddleware", () => { - it("creates a middleware with name and handler", () => { - const middleware = createMiddleware({ - name: "test-middleware", - handler: async (ctx, opts) => { - return opts.next(); - }, - }); - - expect(middleware.name).toBe("test-middleware"); - expect(typeof middleware.handler).toBe("function"); - }); - - it("creates a middleware with args", () => { - const middleware = createMiddleware({ - name: "auth-middleware", - args: { requiredRole: "admin" }, - handler: async (ctx, opts) => { - return opts.next(); - }, - }); - - expect(middleware.name).toBe("auth-middleware"); - expect(middleware.args).toEqual({ requiredRole: "admin" }); - }); - }); - - describe("middleware execution via API", () => { - it("middleware receives ctx, args, and opts with next function", async () => { - const ctxValues = { - ctx: null as unknown, - args: null as unknown, - opts: null as { next: () => Promise; args: unknown; meta: Record } | null, - }; - - const testMiddleware = createMiddleware({ - name: "capture-context", - handler: async (ctx, opts) => { - ctxValues.ctx = ctx; - ctxValues.args = opts.args; - ctxValues.opts = opts; - return opts.next(); - }, - }); - - const { t, createAPI } = defineContext({ - context: { userId: 1, name: "test" }, - }); - - const getUser = t.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, userId: ctx.userId, name: ctx.name }); - }, - }).use(testMiddleware); - - const api = createAPI({ - router: t.router({ - users: { get: getUser }, - }), - }); - - const result = await api.users.get({ id: 42 }); - - expect(result.ok).toBe(true); - expect(ctxValues.ctx).toMatchObject({ userId: 1, name: "test" }); - expect(ctxValues.args).toEqual({ id: 42 }); - expect(ctxValues.opts).not.toBeNull(); - expect(typeof ctxValues.opts!.next).toBe("function"); - expect(ctxValues.opts!.meta).toEqual({}); - }); - - it("calling next() proceeds to next handler", async () => { - const executionOrder: string[] = []; - - const firstMiddleware = createMiddleware({ - name: "first", - handler: async (ctx, opts) => { - executionOrder.push("first-before"); - const result = await opts.next(); - executionOrder.push("first-after"); - return result; - }, - }); - - const secondMiddleware = createMiddleware({ - name: "second", - handler: async (ctx, opts) => { - executionOrder.push("second-before"); - const result = await opts.next(); - executionOrder.push("second-after"); - return result; - }, - }); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const getUser = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - executionOrder.push("handler"); - return ok({ id: args.id, name: ctx.name }); - }, - }) - .use(firstMiddleware) - .use(secondMiddleware); - - const api = createAPI({ - router: t.router({ - users: { get: getUser }, - }), - }); - - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(true); - expect(executionOrder).toEqual([ - "first-before", - "second-before", - "handler", - "second-after", - "first-after", - ]); - }); - - it("middleware can modify ctx via overrides", async () => { - const { t, createAPI } = defineContext({ - context: { userId: 1, name: "original" }, - }); - - const ctxModifier = createMiddleware({ - name: "ctx-modifier", - handler: async (ctx, opts) => { - // Note: opts.next({ ctx }) override may not be supported - // Just verify middleware runs and next is called - return opts.next(); - }, - }); - - const getUser = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, userId: ctx.userId, name: ctx.name }); - }, - }) - .use(ctxModifier); - - const api = createAPI({ - router: t.router({ - users: { get: getUser }, - }), - }); - - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(true); - if (result.ok) { - // Middleware runs but ctx override may not work - test actual behavior - expect(result.value).toMatchObject({ id: 1, userId: 1, name: "original" }); - } - }); - - it("middleware can short-circuit by not calling next", async () => { - const handlerCalled = { value: false }; - - const shortCircuitMiddleware = createMiddleware({ - name: "short-circuit", - handler: async (ctx, opts) => { - // Don't call next - short circuit the chain - return ok({ shortCircuited: true, middleware: "short-circuit" }); - }, - }); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const getUser = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - handlerCalled.value = true; - return ok({ id: args.id, name: ctx.name }); - }, - }) - .use(shortCircuitMiddleware); - - const api = createAPI({ - router: t.router({ - users: { get: getUser }, - }), - }); - - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toEqual({ shortCircuited: true, middleware: "short-circuit" }); - } - expect(handlerCalled.value).toBe(false); // Handler should not have been called - }); - - it("multiple middlewares can be chained", async () => { - const log: string[] = []; - - const mw1 = createMiddleware({ - name: "mw1", - handler: async (ctx, opts) => { - log.push("mw1-enter"); - const result = await opts.next(); - log.push("mw1-exit"); - return result; - }, - }); - - const mw2 = createMiddleware({ - name: "mw2", - handler: async (ctx, opts) => { - log.push("mw2-enter"); - const result = await opts.next(); - log.push("mw2-exit"); - return result; - }, - }); - - const mw3 = createMiddleware({ - name: "mw3", - handler: async (ctx, opts) => { - log.push("mw3-enter"); - const result = await opts.next(); - log.push("mw3-exit"); - return result; - }, - }); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - // Apply middlewares individually - const getUser = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - log.push("handler"); - return ok({ id: args.id }); - }, - }) - .use(mw1); - - const getUser2 = getUser.use(mw2); - const getUser3 = getUser2.use(mw3); - - const api = createAPI({ - router: t.router({ - users: { get: getUser3 }, - }), - }); - - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(true); - // Middleware execution order - verify basic behavior - expect(log).toContain("handler"); - expect(log.length).toBeGreaterThan(0); - }); - }); - - describe("withQuery and withMutation helpers", () => { - it("withQuery applies middleware to a query", async () => { - const log: string[] = []; - - const testMiddleware = createMiddleware({ - name: "test", - handler: async (ctx, opts) => { - log.push("middleware"); - return opts.next(); - }, - }); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const baseQuery = t.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, name: ctx.name }); - }, - }); - - const wrappedQuery = withQuery(baseQuery, testMiddleware); - - const api = createAPI({ - router: t.router({ - users: { get: wrappedQuery }, - }), - }); - - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(true); - expect(log).toContain("middleware"); - }); - - it("withMutation applies middleware to a mutation", async () => { - const log: string[] = []; - - const testMiddleware = createMiddleware({ - name: "test", - handler: async (ctx, opts) => { - log.push("middleware"); - return opts.next(); - }, - }); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const baseMutation = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - return ok({ created: args.name }); - }, - }); - - const wrappedMutation = withMutation(baseMutation, testMiddleware); - - const api = createAPI({ - router: t.router({ - users: { create: wrappedMutation }, - }), - }); - - const result = await api.users.create({ name: "John" }); - - expect(result.ok).toBe(true); - expect(log).toContain("middleware"); - }); - - it("withQuery supports curried form", async () => { - const log: string[] = []; - - const testMiddleware = createMiddleware({ - name: "test", - handler: async (ctx, opts) => { - log.push("middleware"); - return opts.next(); - }, - }); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - const wrappedQuery = withQuery((q) => q.use(testMiddleware))(query); - - const api = createAPI({ - router: t.router({ - users: { get: wrappedQuery }, - }), - }); - - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(true); - expect(log).toContain("middleware"); - }); - }); -}); - -describe("Hooks", () => { - describe("BeforeInvokeHook", () => { - it("is called before procedure handler", async () => { - const callOrder: string[] = []; - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - callOrder.push("handler"); - return ok({ id: args.id }); - }, - }) - .beforeInvoke(() => { - callOrder.push("beforeInvoke"); - }); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - await api.users.get({ id: 1 }); - - expect(callOrder).toEqual(["beforeInvoke", "handler"]); - }); - - it("receives ctx and args", async () => { - let receivedCtx: unknown; - let receivedArgs: unknown; - - const { t, createAPI } = defineContext({ - context: { userId: 42, name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }) - .beforeInvoke((ctx, args) => { - receivedCtx = ctx; - receivedArgs = args; - }); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - await api.users.get({ id: 123 }); - - expect(receivedCtx).toMatchObject({ userId: 42, name: "test" }); - expect(receivedArgs).toEqual({ id: 123 }); - }); - - it("can be async", async () => { - const asyncHook = vi.fn().mockResolvedValue(undefined); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }) - .beforeInvoke(asyncHook); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(true); - expect(asyncHook).toHaveBeenCalled(); - }); - }); - - describe("AfterInvokeHook", () => { - it("is called after procedure handler regardless of success or failure", async () => { - const callOrder: string[] = []; - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - callOrder.push("handler"); - return ok({ id: args.id }); - }, - }) - .afterInvoke(() => { - callOrder.push("afterInvoke"); - }); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - await api.users.get({ id: 1 }); - - expect(callOrder).toEqual(["handler", "afterInvoke"]); - }); - - it("receives ctx, args, and result", async () => { - let receivedResult: unknown; - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, doubled: args.id * 2 }); - }, - }) - .afterInvoke((ctx, args, result) => { - receivedResult = result; - }); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - await api.users.get({ id: 21 }); - - // Result contains ok: true and value: {...} plus fp Result methods - expect(receivedResult).toMatchObject({ ok: true, value: { id: 21, doubled: 42 } }); - }); - }); - - describe("OnSuccessHook", () => { - it("is called when handler returns ok result", async () => { - const successHook = vi.fn(); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, name: ctx.name }); - }, - }) - .onSuccess(successHook); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(true); - expect(successHook).toHaveBeenCalledWith( - expect.objectContaining({ name: "test" }), - { id: 1 }, - { id: 1, name: "test" } - ); - }); - - it("is not called when handler returns error", async () => { - const successHook = vi.fn(); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return err("NOT_FOUND", `User ${args.id} not found`); - }, - }) - .onSuccess(successHook); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - const result = await api.users.get({ id: 999 }); - - expect(result.ok).toBe(false); - expect(successHook).not.toHaveBeenCalled(); - }); - }); - - describe("OnErrorHook", () => { - it("is called when handler returns error result", async () => { - const errorHook = vi.fn(); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return err("NOT_FOUND", `User ${args.id} not found`); - }, - }) - .onError(errorHook); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - const result = await api.users.get({ id: 999 }); - - expect(result.ok).toBe(false); - expect(errorHook).toHaveBeenCalled(); - }); - - it("is called when handler throws", async () => { - const errorHook = vi.fn(); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - throw new Error("Unexpected error"); - }, - }) - .onError(errorHook); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(false); - expect(errorHook).toHaveBeenCalled(); - }); - - it("receives ctx, args, and error", async () => { - let receivedError: unknown; - - const { t, createAPI } = defineContext({ - context: { userId: 42, name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return err("FORBIDDEN", "Access denied"); - }, - }) - .onError((ctx, args, error) => { - receivedError = error; - }); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - await api.users.get({ id: 1 }); - - // The error is the error code string (first arg to err()) - expect(receivedError).toBe("FORBIDDEN"); - }); - - it("is not called when handler returns ok result", async () => { - const errorHook = vi.fn(); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }) - .onError(errorHook); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - const result = await api.users.get({ id: 1 }); - - expect(result.ok).toBe(true); - expect(errorHook).not.toHaveBeenCalled(); - }); - }); - - describe("hook chaining", () => { - it("multiple hooks are called in correct order", async () => { - const callOrder: string[] = []; - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - callOrder.push("handler"); - return ok({ id: args.id }); - }, - }) - .beforeInvoke(() => { - callOrder.push("beforeInvoke"); - }) - .afterInvoke(() => { - callOrder.push("afterInvoke"); - }) - .onSuccess(() => { - callOrder.push("onSuccess"); - }); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - await api.users.get({ id: 1 }); - - expect(callOrder).toEqual(["beforeInvoke", "handler", "afterInvoke", "onSuccess"]); - }); - - it("afterInvoke is called even when handler errors", async () => { - const callOrder: string[] = []; - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - callOrder.push("handler"); - return err("ERROR", "Something went wrong"); - }, - }) - .afterInvoke(() => { - callOrder.push("afterInvoke"); - }) - .onError(() => { - callOrder.push("onError"); - }); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - await api.users.get({ id: 1 }); - - expect(callOrder).toEqual(["handler", "afterInvoke", "onError"]); - }); - }); - - describe("hooks with middleware", () => { - it("middleware and hooks work together", async () => { - const log: string[] = []; - - const testMiddleware = createMiddleware({ - name: "test", - handler: async (ctx, opts) => { - log.push("middleware"); - return opts.next(); - }, - }); - - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const query = t - .query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - log.push("handler"); - return ok({ id: args.id }); - }, - }) - .use(testMiddleware) - .beforeInvoke(() => { - log.push("beforeInvoke"); - }) - .onSuccess(() => { - log.push("onSuccess"); - }); - - const api = createAPI({ - router: t.router({ - users: { get: query }, - }), - }); - - await api.users.get({ id: 1 }); - - expect(log).toEqual(["middleware", "beforeInvoke", "handler", "onSuccess"]); - }); - }); -}); - -describe("executeHooks and executeBeforeInvoke", () => { - it("executeBeforeInvoke calls the hook with ctx and args", async () => { - const { executeBeforeInvoke } = await import("../src/hooks/index.js"); - - let receivedCtx: unknown; - let receivedArgs: unknown; - - const hook = (ctx: { userId: number }, args: { id: number }) => { - receivedCtx = ctx; - receivedArgs = args; - }; - - await executeBeforeInvoke(hook, { userId: 42 }, { id: 123 }); - - expect(receivedCtx).toEqual({ userId: 42 }); - expect(receivedArgs).toEqual({ id: 123 }); - }); - - it("executeBeforeInvoke handles async hooks", async () => { - const { executeBeforeInvoke } = await import("../src/hooks/index.js"); - - const hook = async (ctx: { name: string }, args: { id: number }) => { - await new Promise((resolve) => setTimeout(resolve, 1)); - return; - }; - - await expect( - executeBeforeInvoke(hook, { name: "test" }, { id: 1 }) - ).resolves.not.toThrow(); - }); - - it("executeBeforeInvoke does nothing when hook is undefined", async () => { - const { executeBeforeInvoke } = await import("../src/hooks/index.js"); - - await expect( - executeBeforeInvoke(undefined, { name: "test" }, { id: 1 }) - ).resolves.toBeUndefined(); - }); - - it("executeHooks calls afterInvoke and onSuccess for ok results", async () => { - const { executeHooks } = await import("../src/hooks/index.js"); - - const hooks = { - afterInvoke: vi.fn(), - onSuccess: vi.fn(), - onError: vi.fn(), - }; - - const result = ok({ id: 42, name: "test" }); - - await executeHooks(hooks, { userId: 1 }, { id: 42 }, result); - - expect(hooks.afterInvoke).toHaveBeenCalledWith({ userId: 1 }, { id: 42 }, result); - expect(hooks.onSuccess).toHaveBeenCalledWith({ userId: 1 }, { id: 42 }, { id: 42, name: "test" }); - expect(hooks.onError).not.toHaveBeenCalled(); - }); - - it("executeHooks calls afterInvoke and onError for err results", async () => { - const { executeHooks } = await import("../src/hooks/index.js"); - - const hooks = { - afterInvoke: vi.fn(), - onSuccess: vi.fn(), - onError: vi.fn(), - }; - - const result = err("NOT_FOUND", "User not found"); - - await executeHooks(hooks, { userId: 1 }, { id: 42 }, result); - - expect(hooks.afterInvoke).toHaveBeenCalledWith({ userId: 1 }, { id: 42 }, result); - // The error is the first argument to err() - just the code string - expect(hooks.onError).toHaveBeenCalledWith({ userId: 1 }, { id: 42 }, "NOT_FOUND"); - expect(hooks.onSuccess).not.toHaveBeenCalled(); - }); -}); diff --git a/packages/server/tests/mutation-internal.test.ts b/packages/server/tests/mutation-internal.test.ts deleted file mode 100644 index 9fb89ff..0000000 --- a/packages/server/tests/mutation-internal.test.ts +++ /dev/null @@ -1,509 +0,0 @@ -import { describe, it, expect } from "vitest"; -import { createMutationWithHooks } from "../src/mutation/builder"; -import { createInternalMutationWithHooks } from "../src/internal-mutation/builder"; -import { createInternalQueryWithHooks } from "../src/internal-query/builder"; -import { z } from "zod"; -import { ok, err } from "../src/errors"; - -describe("Mutation Builder", () => { - interface TestCtx { - name: string; - } - - const testCtx: TestCtx = { name: "test-context" }; - - describe("createMutationWithHooks", () => { - it("creates a mutation procedure with type 'mutation'", () => { - const mutation = createMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ name: ctx.name }); - }, - }); - - expect(mutation.type).toBe("mutation"); - }); - - it("creates a mutation with correct type and argsSchema", () => { - const argsSchema = z.object({ id: z.number() }); - const mutation = createMutationWithHooks({ - args: argsSchema, - handler: async (ctx, args) => { - return ok({ name: ctx.name }); - }, - }); - - expect(mutation.type).toBe("mutation"); - expect(mutation.argsSchema).toBe(argsSchema); - }); - - it("handler receives (ctx, args)", async () => { - let receivedCtx: unknown; - let receivedArgs: unknown; - - const mutation = createMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - receivedCtx = ctx; - receivedArgs = args; - return ok({ name: ctx.name }); - }, - }); - - await mutation.handler(testCtx, { id: 42 }); - - expect(receivedCtx).toBe(testCtx); - expect(receivedArgs).toEqual({ id: 42 }); - }); - - it("has _hooks object", () => { - const mutation = createMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - expect(mutation._hooks).toBeDefined(); - expect(typeof mutation._hooks).toBe("object"); - }); - - it("has _middleware array", () => { - const mutation = createMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - expect(mutation._middleware).toBeDefined(); - expect(Array.isArray(mutation._middleware)).toBe(true); - }); - - it("beforeInvoke hook method works", () => { - const mutation = createMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - const hooked = mutation.beforeInvoke((ctx, args) => { - // before hook - }); - - expect(hooked._hooks.beforeInvoke).toBeDefined(); - }); - - it("afterInvoke hook method works", () => { - const mutation = createMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - const hooked = mutation.afterInvoke((ctx, args, result) => { - // after hook - }); - - expect(hooked._hooks.afterInvoke).toBeDefined(); - }); - - it("onSuccess hook method works", () => { - const mutation = createMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - const hooked = mutation.onSuccess((ctx, args, data) => { - // success hook - }); - - expect(hooked._hooks.onSuccess).toBeDefined(); - }); - - it("onError hook method works", () => { - const mutation = createMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - const hooked = mutation.onError((ctx, args, error) => { - // error hook - }); - - expect(hooked._hooks.onError).toBeDefined(); - }); - - it("use middleware method works", () => { - const mutation = createMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - const middleware = { - name: "test-middleware", - handler: async (ctx: TestCtx, opts: { next: () => Promise; args: unknown; meta: Record }) => { - return opts.next(); - }, - }; - - const withMiddleware = mutation.use(middleware); - - expect(withMiddleware._middleware).toHaveLength(1); - expect(withMiddleware._middleware[0]).toBe(middleware); - }); - - it("multiple hooks can be chained", () => { - const middleware = { - name: "test-middleware", - handler: async (ctx: TestCtx, opts: { next: () => Promise; args: unknown; meta: Record }) => { - return opts.next(); - }, - }; - - const mutation = createMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - const chained = mutation - .beforeInvoke((ctx, args) => {}) - .afterInvoke((ctx, args, result) => {}) - .onSuccess((ctx, args, data) => {}) - .onError((ctx, args, error) => {}) - .use(middleware); - - expect(chained._hooks.beforeInvoke).toBeDefined(); - expect(chained._hooks.afterInvoke).toBeDefined(); - expect(chained._hooks.onSuccess).toBeDefined(); - expect(chained._hooks.onError).toBeDefined(); - expect(chained._middleware).toHaveLength(1); - }); - }); -}); - -describe("InternalMutation Builder", () => { - interface TestCtx { - name: string; - } - - const testCtx: TestCtx = { name: "test-context" }; - - describe("createInternalMutationWithHooks", () => { - it("creates a procedure with type 'internalMutation'", () => { - const internalMutation = createInternalMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ name: ctx.name }); - }, - }); - - expect(internalMutation.type).toBe("internalMutation"); - }); - - it("creates an internalMutation with correct type and argsSchema", () => { - const argsSchema = z.object({ id: z.number() }); - const internalMutation = createInternalMutationWithHooks({ - args: argsSchema, - handler: async (ctx, args) => { - return ok({ name: ctx.name }); - }, - }); - - expect(internalMutation.type).toBe("internalMutation"); - expect(internalMutation.argsSchema).toBe(argsSchema); - }); - - it("handler receives (ctx, args)", async () => { - let receivedCtx: unknown; - let receivedArgs: unknown; - - const internalMutation = createInternalMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - receivedCtx = ctx; - receivedArgs = args; - return ok({ name: ctx.name }); - }, - }); - - await internalMutation.handler(testCtx, { id: 42 }); - - expect(receivedCtx).toBe(testCtx); - expect(receivedArgs).toEqual({ id: 42 }); - }); - - it("has _hooks object", () => { - const internalMutation = createInternalMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - expect(internalMutation._hooks).toBeDefined(); - expect(typeof internalMutation._hooks).toBe("object"); - }); - - it("has _middleware array", () => { - const internalMutation = createInternalMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - expect(internalMutation._middleware).toBeDefined(); - expect(Array.isArray(internalMutation._middleware)).toBe(true); - }); - - it("beforeInvoke hook method works", () => { - const internalMutation = createInternalMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - const hooked = internalMutation.beforeInvoke((ctx, args) => { - // before hook - }); - - expect(hooked._hooks.beforeInvoke).toBeDefined(); - }); - - it("afterInvoke hook method works", () => { - const internalMutation = createInternalMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - const hooked = internalMutation.afterInvoke((ctx, args, result) => { - // after hook - }); - - expect(hooked._hooks.afterInvoke).toBeDefined(); - }); - - it("onSuccess hook method works", () => { - const internalMutation = createInternalMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - const hooked = internalMutation.onSuccess((ctx, args, data) => { - // success hook - }); - - expect(hooked._hooks.onSuccess).toBeDefined(); - }); - - it("onError hook method works", () => { - const internalMutation = createInternalMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - const hooked = internalMutation.onError((ctx, args, error) => { - // error hook - }); - - expect(hooked._hooks.onError).toBeDefined(); - }); - - it("use middleware method works", () => { - const internalMutation = createInternalMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - const middleware = { - name: "test-middleware", - handler: async (ctx: TestCtx, opts: { next: () => Promise; args: unknown; meta: Record }) => { - return opts.next(); - }, - }; - - const withMiddleware = internalMutation.use(middleware); - - expect(withMiddleware._middleware).toHaveLength(1); - expect(withMiddleware._middleware[0]).toBe(middleware); - }); - - it("multiple hooks can be chained", () => { - const middleware = { - name: "test-middleware", - handler: async (ctx: TestCtx, opts: { next: () => Promise; args: unknown; meta: Record }) => { - return opts.next(); - }, - }; - - const internalMutation = createInternalMutationWithHooks({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => ok({ name: ctx.name }), - }); - - const chained = internalMutation - .beforeInvoke((ctx, args) => {}) - .afterInvoke((ctx, args, result) => {}) - .onSuccess((ctx, args, data) => {}) - .onError((ctx, args, error) => {}) - .use(middleware); - - expect(chained._hooks.beforeInvoke).toBeDefined(); - expect(chained._hooks.afterInvoke).toBeDefined(); - expect(chained._hooks.onSuccess).toBeDefined(); - expect(chained._hooks.onError).toBeDefined(); - expect(chained._middleware).toHaveLength(1); - }); - }); -}); - -describe("InternalQuery Builder", () => { - interface TestCtx { - name: string; - } - - const testCtx: TestCtx = { name: "test-context" }; - - describe("createInternalQueryWithHooks", () => { - it("creates a procedure with type 'internalQuery'", () => { - const internalQuery = createInternalQueryWithHooks({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - expect(internalQuery.type).toBe("internalQuery"); - }); - - it("creates an internalQuery with correct type and no argsSchema", () => { - const internalQuery = createInternalQueryWithHooks({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - expect(internalQuery.type).toBe("internalQuery"); - expect(internalQuery.argsSchema).toBeUndefined(); - }); - - it("handler receives only (ctx) - no args", async () => { - let receivedCtx: unknown; - let receivedArgs: unknown = "NOT_CALLED"; - - const internalQuery = createInternalQueryWithHooks({ - handler: async (ctx) => { - receivedCtx = ctx; - // Note: InternalQuery handler only receives ctx, no args parameter - return ok({ name: ctx.name }); - }, - }); - - // InternalQuery handler signature is (ctx) only, not (ctx, args) - await internalQuery.handler(testCtx); - - expect(receivedCtx).toBe(testCtx); - expect(receivedArgs).toBe("NOT_CALLED"); - }); - - it("has _hooks object", () => { - const internalQuery = createInternalQueryWithHooks({ - handler: async (ctx) => ok({ name: ctx.name }), - }); - - expect(internalQuery._hooks).toBeDefined(); - expect(typeof internalQuery._hooks).toBe("object"); - }); - - it("has _middleware array", () => { - const internalQuery = createInternalQueryWithHooks({ - handler: async (ctx) => ok({ name: ctx.name }), - }); - - expect(internalQuery._middleware).toBeDefined(); - expect(Array.isArray(internalQuery._middleware)).toBe(true); - }); - - it("beforeInvoke hook method works", () => { - const internalQuery = createInternalQueryWithHooks({ - handler: async (ctx) => ok({ name: ctx.name }), - }); - - // InternalQuery hooks have void args since there's no args - const hooked = internalQuery.beforeInvoke((ctx, args) => { - // before hook - args is void - }); - - expect(hooked._hooks.beforeInvoke).toBeDefined(); - }); - - it("afterInvoke hook method works", () => { - const internalQuery = createInternalQueryWithHooks({ - handler: async (ctx) => ok({ name: ctx.name }), - }); - - const hooked = internalQuery.afterInvoke((ctx, args, result) => { - // after hook - }); - - expect(hooked._hooks.afterInvoke).toBeDefined(); - }); - - it("onSuccess hook method works", () => { - const internalQuery = createInternalQueryWithHooks({ - handler: async (ctx) => ok({ name: ctx.name }), - }); - - const hooked = internalQuery.onSuccess((ctx, args, data) => { - // success hook - }); - - expect(hooked._hooks.onSuccess).toBeDefined(); - }); - - it("onError hook method works", () => { - const internalQuery = createInternalQueryWithHooks({ - handler: async (ctx) => ok({ name: ctx.name }), - }); - - const hooked = internalQuery.onError((ctx, args, error) => { - // error hook - }); - - expect(hooked._hooks.onError).toBeDefined(); - }); - - it("use middleware method works", () => { - const internalQuery = createInternalQueryWithHooks({ - handler: async (ctx) => ok({ name: ctx.name }), - }); - - const middleware = { - name: "test-middleware", - handler: async (ctx: TestCtx, opts: { next: () => Promise; args: unknown; meta: Record }) => { - return opts.next(); - }, - }; - - const withMiddleware = internalQuery.use(middleware); - - expect(withMiddleware._middleware).toHaveLength(1); - expect(withMiddleware._middleware[0]).toBe(middleware); - }); - - it("multiple hooks can be chained", () => { - const middleware = { - name: "test-middleware", - handler: async (ctx: TestCtx, opts: { next: () => Promise; args: unknown; meta: Record }) => { - return opts.next(); - }, - }; - - const internalQuery = createInternalQueryWithHooks({ - handler: async (ctx) => ok({ name: ctx.name }), - }); - - const chained = internalQuery - .beforeInvoke((ctx, args) => {}) - .afterInvoke((ctx, args, result) => {}) - .onSuccess((ctx, args, data) => {}) - .onError((ctx, args, error) => {}) - .use(middleware); - - expect(chained._hooks.beforeInvoke).toBeDefined(); - expect(chained._hooks.afterInvoke).toBeDefined(); - expect(chained._hooks.onSuccess).toBeDefined(); - expect(chained._hooks.onError).toBeDefined(); - expect(chained._middleware).toHaveLength(1); - }); - }); -}); diff --git a/packages/server/tests/router-builder.test.ts b/packages/server/tests/router-builder.test.ts deleted file mode 100644 index 4b2cb6a..0000000 --- a/packages/server/tests/router-builder.test.ts +++ /dev/null @@ -1,552 +0,0 @@ -import { describe, it, expect } from "vitest"; -import { QueryBuilder } from "../src/query/builder.js"; -import { z } from "zod"; -import { ok } from "../src/errors/index.js"; -import { EventEmitter } from "../src/events/emitter.js"; - -describe("RouterBuilder (QueryBuilder)", () => { - // Test context type - interface TestCtx { - db: { - find: () => { id: number; name: string }; - create: (data: unknown) => { id: number }; - }; - name: string; - } - - const testCtx: TestCtx = { - db: { - find: () => ({ id: 1, name: "test" }), - create: (data) => ({ id: 42, ...(data as object) }), - }, - name: "test-context", - }; - - describe("query()", () => { - it("creates a procedure with type 'query'", () => { - const builder = new QueryBuilder(testCtx); - const query = builder.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, name: ctx.name }); - }, - }); - - expect(query.type).toBe("query"); - }); - - it("creates a query with correct args schema", () => { - const builder = new QueryBuilder(testCtx); - const argsSchema = z.object({ id: z.number() }); - const query = builder.query({ - args: argsSchema, - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - expect(query._def.argsSchema).toBe(argsSchema); - expect(query._def.type).toBe("query"); - }); - - it("creates a query without args", () => { - const builder = new QueryBuilder(testCtx); - const query = builder.query({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - expect(query.type).toBe("query"); - expect(query._def.argsSchema).toBeUndefined(); - }); - }); - - describe("mutation()", () => { - it("creates a procedure with type 'mutation'", () => { - const builder = new QueryBuilder(testCtx); - const mutation = builder.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - return ok({ id: 1, name: args.name }); - }, - }); - - expect(mutation.type).toBe("mutation"); - }); - - it("creates a mutation with correct args schema", () => { - const builder = new QueryBuilder(testCtx); - const argsSchema = z.object({ name: z.string() }); - const mutation = builder.mutation({ - args: argsSchema, - handler: async (ctx, args) => { - return ok({ id: 1, name: args.name }); - }, - }); - - expect(mutation._def.argsSchema).toBe(argsSchema); - expect(mutation._def.type).toBe("mutation"); - }); - }); - - describe("internalQuery()", () => { - it("creates a procedure with type 'internalQuery'", () => { - const builder = new QueryBuilder(testCtx); - const internalQuery = builder.internalQuery({ - handler: async (ctx) => { - return ok({ id: ctx.db.find().id }); - }, - }); - - expect(internalQuery.type).toBe("internalQuery"); - }); - - it("creates an internalQuery without args", () => { - const builder = new QueryBuilder(testCtx); - const internalQuery = builder.internalQuery({ - handler: async (ctx) => { - return ok({ id: ctx.db.find().id }); - }, - }); - - expect(internalQuery.type).toBe("internalQuery"); - expect(internalQuery._def.argsSchema).toBeUndefined(); - }); - }); - - describe("internalMutation()", () => { - it("creates a procedure with type 'internalMutation'", () => { - const builder = new QueryBuilder(testCtx); - const internalMutation = builder.internalMutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - return ok(ctx.db.create({ name: args.name }) as { id: number }); - }, - }); - - expect(internalMutation.type).toBe("internalMutation"); - }); - - it("creates an internalMutation with correct args schema", () => { - const builder = new QueryBuilder(testCtx); - const argsSchema = z.object({ name: z.string() }); - const internalMutation = builder.internalMutation({ - args: argsSchema, - handler: async (ctx, args) => { - return ok(ctx.db.create({ name: args.name }) as { id: number }); - }, - }); - - expect(internalMutation._def.argsSchema).toBe(argsSchema); - expect(internalMutation._def.type).toBe("internalMutation"); - }); - }); - - describe("router()", () => { - it("creates a router with queries and mutations", () => { - const builder = new QueryBuilder(testCtx); - - const router = builder.router({ - queries: { - getUser: builder.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, name: ctx.name }); - }, - }), - }, - mutations: { - createUser: builder.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - return ok({ id: 1, name: args.name }); - }, - }), - }, - }); - - expect(router.queries.getUser).toBeDefined(); - expect(router.queries.getUser.type).toBe("query"); - expect(router.mutations.createUser).toBeDefined(); - expect(router.mutations.createUser.type).toBe("mutation"); - }); - - it("creates nested routers", () => { - const builder = new QueryBuilder(testCtx); - - const router = builder.router({ - users: builder.router({ - queries: { - getUser: builder.query({ - handler: async (ctx) => { - return ok({ id: 1, name: ctx.name }); - }, - }), - }, - }), - }); - - expect(router.users).toBeDefined(); - expect(router.users.queries.getUser).toBeDefined(); - expect(router.users.queries.getUser.type).toBe("query"); - }); - }); - - describe("middleware()", () => { - it("creates a middleware", () => { - const builder = new QueryBuilder(testCtx); - const middleware = builder.middleware({ - name: "test-middleware", - handler: async (ctx, opts) => { - return opts.next(); - }, - }); - - expect(middleware.name).toBe("test-middleware"); - expect(typeof middleware.handler).toBe("function"); - }); - - it("creates middleware with args schema", () => { - const builder = new QueryBuilder(testCtx); - const middleware = builder.middleware({ - name: "auth-middleware", - args: z.object({ token: z.string() }), - handler: async (ctx, opts) => { - return opts.next(); - }, - }); - - expect(middleware.name).toBe("auth-middleware"); - expect(middleware.args).toBeDefined(); - }); - }); - - describe("procedure hooks", () => { - it("query has beforeInvoke method", () => { - const builder = new QueryBuilder(testCtx); - const query = builder.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - expect(typeof query.beforeInvoke).toBe("function"); - }); - - it("query has afterInvoke method", () => { - const builder = new QueryBuilder(testCtx); - const query = builder.query({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - expect(typeof query.afterInvoke).toBe("function"); - }); - - it("query has onSuccess method", () => { - const builder = new QueryBuilder(testCtx); - const query = builder.query({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - expect(typeof query.onSuccess).toBe("function"); - }); - - it("query has onError method", () => { - const builder = new QueryBuilder(testCtx); - const query = builder.query({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - expect(typeof query.onError).toBe("function"); - }); - - it("query has use method for middleware", () => { - const builder = new QueryBuilder(testCtx); - const query = builder.query({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - expect(typeof query.use).toBe("function"); - }); - - it("mutation has all hook methods", () => { - const builder = new QueryBuilder(testCtx); - const mutation = builder.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - return ok({ id: 1, name: args.name }); - }, - }); - - expect(typeof mutation.beforeInvoke).toBe("function"); - expect(typeof mutation.afterInvoke).toBe("function"); - expect(typeof mutation.onSuccess).toBe("function"); - expect(typeof mutation.onError).toBe("function"); - expect(typeof mutation.use).toBe("function"); - }); - - it("internalQuery has all hook methods", () => { - const builder = new QueryBuilder(testCtx); - const internalQuery = builder.internalQuery({ - handler: async (ctx) => { - return ok({ id: ctx.db.find().id }); - }, - }); - - expect(typeof internalQuery.beforeInvoke).toBe("function"); - expect(typeof internalQuery.afterInvoke).toBe("function"); - expect(typeof internalQuery.onSuccess).toBe("function"); - expect(typeof internalQuery.onError).toBe("function"); - expect(typeof internalQuery.use).toBe("function"); - }); - - it("internalMutation has all hook methods", () => { - const builder = new QueryBuilder(testCtx); - const internalMutation = builder.internalMutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - return ok(ctx.db.create({ name: args.name }) as { id: number }); - }, - }); - - expect(typeof internalMutation.beforeInvoke).toBe("function"); - expect(typeof internalMutation.afterInvoke).toBe("function"); - expect(typeof internalMutation.onSuccess).toBe("function"); - expect(typeof internalMutation.onError).toBe("function"); - expect(typeof internalMutation.use).toBe("function"); - }); - }); - - describe("middleware chaining with use()", () => { - it("applies middleware to query via use()", () => { - const builder = new QueryBuilder(testCtx); - const middleware = { - name: "test-middleware", - handler: async (ctx: TestCtx, opts: { next: () => Promise; args: unknown; meta: Record }) => { - return opts.next(); - }, - }; - - const query = builder.query({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - const withMiddleware = query.use(middleware); - - expect(withMiddleware._middleware).toHaveLength(1); - expect(withMiddleware._middleware[0]).toBe(middleware); - }); - - it("use() returns procedure with updated middleware array", () => { - const builder = new QueryBuilder(testCtx); - const middleware1 = { - name: "middleware-1", - handler: async (ctx: TestCtx, opts: { next: () => Promise; args: unknown; meta: Record }) => { - return opts.next(); - }, - }; - const middleware2 = { - name: "middleware-2", - handler: async (ctx: TestCtx, opts: { next: () => Promise; args: unknown; meta: Record }) => { - return opts.next(); - }, - }; - - const query = builder.query({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - const withMiddleware = query.use(middleware1).use(middleware2); - - expect(withMiddleware._middleware).toHaveLength(2); - expect(withMiddleware._middleware[0]).toBe(middleware1); - expect(withMiddleware._middleware[1]).toBe(middleware2); - }); - - it("beforeInvoke returns same procedure type", () => { - const builder = new QueryBuilder(testCtx); - const query = builder.query({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - const chained = query.beforeInvoke((ctx, args) => {}); - - expect(chained.type).toBe("query"); - }); - }); - - describe("on() event handling", () => { - it("registers an event handler", () => { - interface TestEvents { - "user.created": { id: number; name: string }; - } - - const eventEmitter = new EventEmitter(); - const builder = new QueryBuilder(testCtx, eventEmitter); - - const unsubscribe = builder.on("user.created", (ctx, payload) => { - // Handle event - }); - - expect(typeof unsubscribe).toBe("function"); - }); - - it("returns a no-op unsubscribe function when no event emitter", () => { - interface TestEvents { - "user.created": { id: number; name: string }; - } - - const builder = new QueryBuilder(testCtx); - - const unsubscribe = builder.on("user.created", (ctx, payload) => { - // Handle event - }); - - expect(typeof unsubscribe).toBe("function"); - unsubscribe(); // Should not throw - }); - }); - - describe("nested routers with procedures", () => { - it("creates deeply nested router structure", () => { - const builder = new QueryBuilder(testCtx); - - const router = builder.router({ - api: builder.router({ - v1: builder.router({ - users: builder.router({ - queries: { - getUser: builder.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id, name: ctx.name }); - }, - }), - listUsers: builder.query({ - handler: async (ctx) => { - return ok([{ id: 1, name: ctx.name }]); - }, - }), - }, - mutations: { - createUser: builder.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - return ok({ id: 1, name: args.name }); - }, - }), - }, - }), - }), - }), - }); - - expect(router.api).toBeDefined(); - expect(router.api.v1).toBeDefined(); - expect(router.api.v1.users).toBeDefined(); - expect(router.api.v1.users.queries.getUser).toBeDefined(); - expect(router.api.v1.users.queries.getUser.type).toBe("query"); - expect(router.api.v1.users.queries.listUsers).toBeDefined(); - expect(router.api.v1.users.mutations.createUser).toBeDefined(); - expect(router.api.v1.users.mutations.createUser.type).toBe("mutation"); - }); - - it("mixes internal and public procedures in nested router", () => { - const builder = new QueryBuilder(testCtx); - - const router = builder.router({ - queries: { - publicQuery: builder.query({ - handler: async (ctx) => { - return ok({ data: "public" }); - }, - }), - }, - internalQueries: { - internalQuery: builder.internalQuery({ - handler: async (ctx) => { - return ok({ data: "internal" }); - }, - }), - }, - mutations: { - publicMutation: builder.mutation({ - args: z.object({ data: z.string() }), - handler: async (ctx, args) => { - return ok({ success: true }); - }, - }), - }, - internalMutations: { - internalMutation: builder.internalMutation({ - args: z.object({ data: z.string() }), - handler: async (ctx, args) => { - return ok({ success: true }); - }, - }), - }, - }); - - expect(router.queries.publicQuery.type).toBe("query"); - expect(router.internalQueries.internalQuery.type).toBe("internalQuery"); - expect(router.mutations.publicMutation.type).toBe("mutation"); - expect(router.internalMutations.internalMutation.type).toBe("internalMutation"); - }); - }); - - describe("procedure metadata", () => { - it("procedures have _def with metadata", () => { - const builder = new QueryBuilder(testCtx); - const query = builder.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - return ok({ id: args.id }); - }, - }); - - expect(query._def).toBeDefined(); - expect(query._def.metadata).toBeDefined(); - expect(typeof query._def.metadata).toBe("object"); - }); - - it("procedures have _hooks object", () => { - const builder = new QueryBuilder(testCtx); - const query = builder.query({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - expect(query._hooks).toBeDefined(); - expect(typeof query._hooks).toBe("object"); - }); - - it("procedures have _middleware array", () => { - const builder = new QueryBuilder(testCtx); - const query = builder.query({ - handler: async (ctx) => { - return ok({ name: ctx.name }); - }, - }); - - expect(query._middleware).toBeDefined(); - expect(Array.isArray(query._middleware)).toBe(true); - }); - }); -}); diff --git a/packages/server/tests/router-utils.test.ts b/packages/server/tests/router-utils.test.ts deleted file mode 100644 index 36a6caa..0000000 --- a/packages/server/tests/router-utils.test.ts +++ /dev/null @@ -1,320 +0,0 @@ -import { describe, it, expect } from "vitest"; -import { ok } from "@deessejs/fp"; -import { - flattenRouter, - getPublicRoutes, - getInternalRoutes, - isRouter, - isProcedure, - resolvePath, - validateRouter, -} from "../src/router/builder.js"; -import type { Procedure } from "../src/types.js"; -import { createQuery, createMutation, createInternalQuery, createInternalMutation } from "../src/query/index.js"; - -// Real procedure factory using factory functions -const createMockQuery = () => createQuery({ handler: async () => ok({}) }); -const createMockMutation = () => createMutation({ handler: async () => ok({}) }); -const createMockInternalQuery = () => createInternalQuery({ handler: async () => ok({}) }); -const createMockInternalMutation = () => createInternalMutation({ handler: async () => ok({}) }); - -describe("router/builder", () => { - describe("isProcedure", () => { - it("returns true for valid procedure with query type", () => { - const proc = createMockQuery(); - expect(isProcedure(proc)).toBe(true); - }); - - it("returns true for valid procedure with mutation type", () => { - const proc = createMockMutation(); - expect(isProcedure(proc)).toBe(true); - }); - - it("returns true for internalQuery procedure", () => { - const proc = createMockInternalQuery(); - expect(isProcedure(proc)).toBe(true); - }); - - it("returns true for internalMutation procedure", () => { - const proc = createMockInternalMutation(); - expect(isProcedure(proc)).toBe(true); - }); - - it("returns null/falsy for null", () => { - // isProcedure returns falsy value for null due to early return - expect(isProcedure(null)).toBeFalsy(); - }); - - it("returns null/falsy for undefined", () => { - expect(isProcedure(undefined)).toBeFalsy(); - }); - - it("returns false for plain object without type", () => { - expect(isProcedure({ foo: "bar" })).toBe(false); - }); - - it("returns false for object with invalid type", () => { - expect(isProcedure({ type: "invalid" })).toBe(false); - }); - - it("returns false for string", () => { - expect(isProcedure("procedure")).toBe(false); - }); - - it("returns false for function", () => { - expect(isProcedure(() => {})).toBe(false); - }); - }); - - describe("isRouter", () => { - it("returns true for object with nested procedures", () => { - const router = { - users: createMockQuery(), - }; - expect(isRouter(router)).toBe(true); - }); - - it("returns true for nested router", () => { - const router = { - api: { - users: createMockQuery(), - }, - }; - expect(isRouter(router)).toBe(true); - }); - - it("returns false for empty object (no properties)", () => { - // isRouter returns false for empty object - expect(isRouter({})).toBe(false); - }); - - it("returns falsy for null", () => { - expect(isRouter(null)).toBeFalsy(); - }); - - it("returns falsy for undefined", () => { - expect(isRouter(undefined)).toBeFalsy(); - }); - - it("returns false for primitive", () => { - expect(isRouter("string")).toBe(false); - expect(isRouter(123)).toBe(false); - }); - }); - - describe("flattenRouter", () => { - it("flattens a flat router with single procedure", () => { - const router = { - getUser: createMockQuery(), - }; - const result = flattenRouter(router); - expect(result).toEqual([{ path: "getUser", procedure: router.getUser }]); - }); - - it("flattens router with multiple procedures", () => { - const router = { - getUser: createMockQuery(), - createUser: createMockMutation(), - }; - const result = flattenRouter(router); - expect(result).toHaveLength(2); - expect(result[0].path).toBe("getUser"); - expect(result[1].path).toBe("createUser"); - }); - - it("flattens nested routers with prefix", () => { - const router = { - users: { - get: createMockQuery(), - create: createMockMutation(), - }, - }; - const result = flattenRouter(router); - expect(result).toHaveLength(2); - expect(result[0].path).toBe("users.get"); - expect(result[1].path).toBe("users.create"); - }); - - it("handles deeply nested routers", () => { - const router = { - api: { - v1: { - users: { - list: createMockQuery(), - }, - }, - }, - }; - const result = flattenRouter(router); - expect(result).toHaveLength(1); - expect(result[0].path).toBe("api.v1.users.list"); - }); - - it("handles custom prefix", () => { - const router = { - get: createMockQuery(), - }; - const result = flattenRouter(router, ["prefix"]); - expect(result[0].path).toBe("prefix.get"); - }); - - it("returns empty array for empty router", () => { - const result = flattenRouter({}); - expect(result).toEqual([]); - }); - - it("skips non-procedure/non-router values", () => { - const router = { - get: createMockQuery(), - data: { some: "value" }, - }; - const result = flattenRouter(router); - expect(result).toHaveLength(1); - expect(result[0].path).toBe("get"); - }); - }); - - describe("getPublicRoutes", () => { - it("returns only public procedures", () => { - const router = { - getUser: createMockQuery(), - createUser: createMockMutation(), - internalGet: createMockInternalQuery(), - internalCreate: createMockInternalMutation(), - }; - const result = getPublicRoutes(router); - expect(result).toHaveLength(2); - expect(result.every((r) => r.procedure.type === "query" || r.procedure.type === "mutation")).toBe(true); - }); - - it("filters nested public procedures", () => { - const router = { - users: { - list: createMockQuery(), - internalRefresh: createMockInternalQuery(), - }, - }; - const result = getPublicRoutes(router); - expect(result).toHaveLength(1); - expect(result[0].path).toBe("users.list"); - }); - }); - - describe("getInternalRoutes", () => { - it("returns only internal procedures", () => { - const router = { - getUser: createMockQuery(), - internalGet: createMockInternalQuery(), - internalCreate: createMockInternalMutation(), - }; - const result = getInternalRoutes(router); - expect(result).toHaveLength(2); - expect(result.every((r) => r.procedure.type === "internalQuery" || r.procedure.type === "internalMutation")).toBe(true); - }); - }); - - describe("resolvePath", () => { - it("resolves simple path", () => { - const router = { - users: createMockQuery(), - }; - const result = resolvePath(router, "users"); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toBe(router.users); - } - }); - - it("resolves nested path", () => { - const router = { - api: { - users: createMockQuery(), - }, - }; - const result = resolvePath(router, "api.users"); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toBe(router.api.users); - } - }); - - it("returns none for non-existent path", () => { - const router = { - users: createMockQuery(), - }; - const result = resolvePath(router, "posts"); - expect(result.ok).toBe(false); - }); - - it("returns none for partial path in nested structure", () => { - const router = { - api: { - users: createMockQuery(), - }, - }; - const result = resolvePath(router, "api"); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toEqual(router.api); - } - }); - - it("returns none for empty router", () => { - const result = resolvePath({}, "users"); - expect(result.ok).toBe(false); - }); - }); - - describe("validateRouter", () => { - it("returns valid for empty router", () => { - const result = validateRouter({}); - expect(result.valid).toBe(true); - expect(result.errors).toEqual([]); - }); - - it("returns valid for router with valid procedures", () => { - const router = { - getUser: createMockQuery(), - createUser: createMockMutation(), - }; - const result = validateRouter(router); - expect(result.valid).toBe(true); - }); - - it("returns error for procedure missing handler", () => { - const router = { - getUser: { type: "query" } as Procedure, - }; - const result = validateRouter(router); - expect(result.valid).toBe(false); - expect(result.errors).toContain('Procedure at "getUser" missing handler'); - }); - - it("validates nested routers recursively", () => { - const router = { - api: { - users: { - get: createMockQuery(), - broken: { type: "query" } as Procedure, - }, - }, - }; - const result = validateRouter(router); - expect(result.valid).toBe(false); - expect(result.errors).toContain('Procedure at "api.users.broken" missing handler'); - }); - - it("returns valid for mixed nested router with valid procedures", () => { - const router = { - api: { - v1: { - users: createMockQuery(), - }, - }, - public: createMockMutation(), - }; - const result = validateRouter(router); - expect(result.valid).toBe(true); - }); - }); -}); diff --git a/packages/server/tests/services.test.ts b/packages/server/tests/services.test.ts new file mode 100644 index 0000000..43a8535 --- /dev/null +++ b/packages/server/tests/services.test.ts @@ -0,0 +1,307 @@ +import { describe, it, expect } from 'vitest'; +import { query, mutation, defineServices, ValidationError } from '../src/index.js'; +import { z } from 'zod'; +import * as v from 'valibot'; + +describe('query', () => { + it('invokes handler with bound context and args', async () => { + const service = query({ + args: z.object({ id: z.number() }), + handler: async (ctx: { db: string }, args: { id: number }) => + ({ id: args.id, db: ctx.db }), + }); + + const ctx = { db: 'my-database' }; + const bound = service.bind(ctx); + const result = await bound.call({ id: 42 }); + + expect(result).toEqual({ id: 42, db: 'my-database' }); + }); + + it('handler receives fresh args on each call', async () => { + const service = query({ + handler: async (ctx: { counter: number }, args: { increment: number }) => + ({ counter: ctx.counter + args.increment }), + }); + + const ctx = { counter: 10 }; + const bound = service.bind(ctx); + + const result1 = await bound.call({ increment: 5 }); + const result2 = await bound.call({ increment: 3 }); + + expect(result1).toEqual({ counter: 15 }); + expect(result2).toEqual({ counter: 13 }); + }); +}); + +describe('mutation', () => { + it('invokes handler and returns result', async () => { + const service = mutation({ + handler: async (ctx: { db: string }) => ({ success: true, db: ctx.db }), + }); + + const bound = service.bind({ db: 'test' }); + const result = await bound.call({}); + + expect(result).toEqual({ success: true, db: 'test' }); + }); +}); + +describe('bind', () => { + it('preserves context across calls', async () => { + const service = query({ + handler: async (ctx: { value: string }) => ctx.value, + }); + + const ctx = { value: 'preserved' }; + const bound = service.bind(ctx); + + const result = await bound.call({}); + + expect(result).toBe('preserved'); + }); +}); + +describe('defineServices', () => { + it('binds context automatically on each call', async () => { + const db = { data: 'test-data' }; + const listQuery = query({ + handler: async (ctx: { db: typeof db }) => [ctx.db.data], + }); + + const deleteMutation = mutation({ + handler: async (ctx: { db: typeof db }, args: { id: string }) => + ({ deleted: args.id, from: ctx.db.data }), + }); + + const api = defineServices({ + services: { listQuery, deleteMutation }, + context: { db }, + }); + + const listResult = await api.listQuery(); + const deleteResult = await api.deleteMutation({ id: '123' }); + + expect(listResult).toEqual(['test-data']); + expect(deleteResult).toEqual({ deleted: '123', from: 'test-data' }); + }); + + it('can call service without args without passing {}', async () => { + const counter = { value: 10 }; + const increment = query({ + handler: async (ctx: { counter: typeof counter }) => + ({ value: ctx.counter.value + 1 }), + }); + + const api = defineServices({ + services: { increment }, + context: { counter }, + }); + + const result = await api.increment(); + + expect(result).toEqual({ value: 11 }); + }); + + it('throws error for unknown service', () => { + const api = defineServices({ + services: {}, + context: {}, + }); + + expect(() => (api as any).unknownService).toThrow('Service unknownService not found'); + }); + + it('memoizes bound services (same reference)', () => { + const service = query({ + handler: async () => 'done', + }); + + const api = defineServices({ + services: { test: service }, + context: {}, + }); + + // Accessing same service twice should return same function reference + const ref1 = api.test; + const ref2 = api.test; + expect(ref1).toBe(ref2); + }); +}); + +describe('validation with Zod', () => { + it('throws ValidationError when Zod validation fails', async () => { + const service = query({ + args: z.object({ email: z.string().email() }), + handler: async () => 'created', + }); + + const api = defineServices({ + services: { create: service }, + context: {}, + }); + + await expect(api.create({ email: 'not-an-email' })).rejects.toThrow(); + await expect(api.create({ email: 'not-an-email' })).rejects.toBeInstanceOf(ValidationError); + }); + + it('passes valid data to handler', async () => { + const service = query({ + args: z.object({ id: z.number().min(1) }), + handler: async (_, args) => ({ id: args.id }), + }); + + const bound = service.bind({}); + const result = await bound.call({ id: 42 }); + + expect(result).toEqual({ id: 42 }); + }); + + it('throws for wrong type in Zod schema', async () => { + const service = query({ + args: z.object({ count: z.number() }), + handler: async () => 'ok', + }); + + const bound = service.bind({}); + + await expect(bound.call({ count: 'not-a-number' })).rejects.toBeInstanceOf(ValidationError); + }); + + it('ValidationError contains issues array', async () => { + const service = query({ + args: z.object({ email: z.string().email() }), + handler: async () => 'ok', + }); + + const api = defineServices({ + services: { test: service }, + context: {}, + }); + + try { + await api.test({ email: 'invalid' }); + expect.fail('Should have thrown'); + } catch (e) { + expect(e).toBeInstanceOf(ValidationError); + expect((e as ValidationError).issues).toBeDefined(); + expect(Array.isArray((e as ValidationError).issues)).toBe(true); + } + }); +}); + +describe('validation with Valibot', () => { + it('throws ValidationError when Valibot validation fails', async () => { + const service = query({ + args: v.object({ email: v.string() }), + handler: async () => 'created', + }); + + const api = defineServices({ + services: { create: service }, + context: {}, + }); + + await expect(api.create({})).rejects.toBeInstanceOf(ValidationError); + }); + + it('passes valid data to handler with Valibot', async () => { + const service = query({ + args: v.object({ name: v.string() }), + handler: async (_, args) => ({ name: args.name }), + }); + + const bound = service.bind({}); + const result = await bound.call({ name: 'test' }); + + expect(result).toEqual({ name: 'test' }); + }); +}); + +describe('async validation', () => { + it('handles async validation with Valibot', async () => { + // Valibot's pipeAsync allows async checks + const service = query({ + args: v.pipeAsync( + v.string(), + v.checkAsync(async (input) => { + await new Promise(r => setTimeout(r, 10)); + return input.length > 0; + }) + ), + handler: async (_, args) => ({ valid: true, value: args }), + }); + + const bound = service.bind({}); + const result = await bound.call('hello'); + + expect(result).toEqual({ valid: true, value: 'hello' }); + }); + + it('rejects async validation failure', async () => { + const service = query({ + args: v.pipeAsync( + v.string(), + v.checkAsync(async () => { + await new Promise(r => setTimeout(r, 10)); + return false; // Always fails + }) + ), + handler: async () => 'ok', + }); + + const bound = service.bind({}); + + await expect(bound.call('test')).rejects.toBeInstanceOf(ValidationError); + }); +}); + +describe('handler errors', () => { + it('propagates errors from handler that throws', async () => { + const service = query({ + handler: async () => { + throw new Error('Handler crashed'); + }, + }); + + const bound = service.bind({}); + + await expect(bound.call({})).rejects.toThrow('Handler crashed'); + }); + + it('handler can return value directly (sync)', async () => { + const service = query({ + handler: (ctx: { x: number }) => ctx.x * 2, + }); + + const bound = service.bind({ x: 5 }); + const result = await bound.call({}); + + expect(result).toBe(10); + }); +}); + +describe('edge cases', () => { + it('handles empty object args when schema expects nothing', async () => { + const service = query({ + handler: async (ctx: { x: number }) => ctx.x, + }); + + const bound = service.bind({ x: 1 }); + + const result = await bound.call({}); + expect(result).toBe(1); + }); + + it('service with no args can still be called with empty object via bind', async () => { + const service = query({ + handler: async (ctx: { name: string }) => `Hello ${ctx.name}`, + }); + + const bound = service.bind({ name: 'World' }); + const result = await bound.call({}); + + expect(result).toBe('Hello World'); + }); +}); diff --git a/packages/server/tests/type-check.test.ts b/packages/server/tests/type-check.test.ts deleted file mode 100644 index 6036116..0000000 --- a/packages/server/tests/type-check.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { describe, it } from "vitest"; -import { defineContext } from "../src/index.js"; -import { ok } from "@deessejs/fp"; -import { z } from "zod"; - -type IsProcedure = T extends { type: "query" | "mutation" | "internalQuery" | "internalMutation" } ? T : never; - -// Debug: check if QueryWithHooks extends { type: ProcedureType } -type Test1 = { type: "query" | "mutation" | "internalQuery" | "internalMutation" }; -type Check1 = QueryWithHooks extends Test1 ? "yes" : "no"; - -describe("type check", () => { - it("check QueryWithHooks type", () => { - const { t } = defineContext({ - context: { db: {} as { users: any[] }, logger: console }, - }); - - const listUsers = t.query({ - handler: async (ctx) => ok(ctx.db.users), - }); - - // What is the type of listUsers.type? - type T = typeof listUsers; - type TypeProp = T["type"]; - - // Is it assignable to ProcedureType? - const typeCheck: TypeProp extends "query" | "mutation" | "internalQuery" | "internalMutation" ? true : false = true; - console.log(typeCheck); - }); -}); diff --git a/packages/server/tests/type-check2.test.ts b/packages/server/tests/type-check2.test.ts deleted file mode 100644 index 9acc723..0000000 --- a/packages/server/tests/type-check2.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { describe, it } from "vitest"; -import { defineContext } from "../src/index.js"; -import { ok } from "@deessejs/fp"; -import { z } from "zod"; - -describe("type check 2", () => { - it("check router type structure", () => { - const { t } = defineContext({ - context: { db: {} as { users: any[] }, logger: console }, - }); - - const listUsers = t.query({ - handler: async (ctx) => ok(ctx.db.users), - }); - - // Inner router - const usersRouter = t.router({ - list: listUsers, - }); - - // What is the type of usersRouter? - type U = typeof usersRouter; - - // Is it never? - type IsNever = U extends never ? "yes" : "no"; - const check1: IsNever = "no"; - - // Outer router - const appRouter = t.router({ - users: usersRouter, - }); - - type A = typeof appRouter; - type IsAppRouterNever = A extends never ? "yes" : "no"; - const check2: IsAppRouterNever = "no"; - - console.log("usersRouter is not never:", check1); - console.log("appRouter is not never:", check2); - }); -}); diff --git a/packages/server/tests/type-check3.test.ts b/packages/server/tests/type-check3.test.ts deleted file mode 100644 index 8f147b1..0000000 --- a/packages/server/tests/type-check3.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { describe, it } from "vitest"; -import { defineContext } from "../src/index.js"; -import { ok } from "@deessejs/fp"; - -describe("type check 3", () => { - it("flat router (no nesting)", () => { - const { t } = defineContext({ - context: { db: {} as { users: any[] }, logger: console }, - }); - - const listUsers = t.query({ - handler: async (ctx) => ok(ctx.db.users), - }); - - // Flat router - no nesting - const appRouter = t.router({ - list: listUsers, - }); - - type A = typeof appRouter; - const check: A["list"] = listUsers; - console.log(check); - }); -}); diff --git a/packages/server/tests/type-debug3.test.ts b/packages/server/tests/type-debug3.test.ts deleted file mode 100644 index 5c796d3..0000000 --- a/packages/server/tests/type-debug3.test.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { describe, it, expectType } from "vitest"; -import { defineContext, createAPI } from "../src/index.js"; -import { ok } from "@deessejs/fp"; -import { z } from "zod"; - -describe("type debug 3", () => { - it("full example pattern", () => { - const NotFoundError = { name: "NotFoundError", message: (args: { resource: string; id: number }) => `${args.resource} ${args.id} not found` }; - - interface User { - id: number; - name: string; - email: string; - } - - const db = { - users: [ - { id: 1, name: "Alice", email: "alice@example.com" }, - { id: 2, name: "Bob", email: "bob@example.com" }, - ] as User[], - nextId: 3, - }; - - const { t, createAPI } = defineContext({ - context: { - db, - logger: console, - }, - }); - - const listUsers = t.query({ - handler: async (ctx) => ok(ctx.db.users), - }); - - const getUser = t.query({ - args: z.object({ id: z.number() }), - handler: async (ctx, args) => { - const user = ctx.db.users.find((u) => u.id === args.id); - if (!user) return { ok: false, error: NotFoundError, cause: undefined, isSome: undefined, isNone: undefined, equals: undefined, filter: undefined, flatMap: undefined, getOrElse: undefined, getOrElseThrow: undefined, map: undefined, mapError: undefined, orElse: undefined, toMaybe: undefined, toUndefined: undefined, toJSON: undefined } as any; - return ok(user); - }, - }); - - const createUser = t.mutation({ - args: z.object({ - name: z.string().min(1), - email: z.string(), - }), - handler: async (ctx, args) => { - const user: User = { id: ctx.db.nextId++, ...args }; - ctx.db.users.push(user); - return ok(user); - }, - }); - - const getUserCount = t.internalQuery({ - handler: async (ctx) => ok({ count: ctx.db.users.length }), - }); - - const appRouter = t.router({ - users: t.router({ - list: listUsers, - get: getUser, - create: createUser, - count: getUserCount, - }), - }); - - // Does createAPI accept this router? - const api = createAPI({ - router: appRouter, - }); - - // Can we access api.users.list? - const result = api.users.list(); - console.log(result); - }); -}); diff --git a/packages/server/tests/type-safety.test.ts b/packages/server/tests/type-safety.test.ts deleted file mode 100644 index 87f5632..0000000 --- a/packages/server/tests/type-safety.test.ts +++ /dev/null @@ -1,496 +0,0 @@ -/** - * Type Safety Tests - * - * These tests verify compile-time type safety for: - * 1. Event typing: ctx.send() should only accept valid events from EventRegistry - * 2. API type inference: api.users.list({}) should return Result, not Result - * - * NOTE: These tests use TypeScript's type system to verify correctness. - * The commented sections below demonstrate what WOULD fail to compile if uncommented. - */ - -import { describe, it, expect } from "vitest"; -import { defineContext, ok } from "../src/index"; -import { z } from "zod"; - -// Define custom event registry for testing -interface TestEvents { - "user.created": { data: { id: string; name: string } }; - "user.updated": { data: { id: string; name: string } }; - "email.sent": { data: { to: string; subject: string } }; -} - -// Define User type for type inference testing -interface User { - id: string; - name: string; - email: string; -} - -describe("Type Safety - Event Typing", () => { - it("should compile when sending correctly typed events", () => { - // This should compile when events are correctly defined - const { t, createAPI } = defineContext< - { db: { create: (data: any) => User } }, - TestEvents - >({ - context: { db: { create: (data: any) => ({ id: "1", ...data }) } }, - events: { - "user.created": { data: { id: "", name: "" } }, - "user.updated": { data: { id: "", name: "" } }, - "email.sent": { data: { to: "", subject: "" } }, - }, - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string(), email: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.create(args); - // This should compile - "user.created" is in TestEvents - ctx.send("user.created", { id: user.id, name: user.name }); - return ok(user); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - }), - }); - - expect(api).toBeDefined(); - }); - - it("should compile when sending events with correct data shape", () => { - const { t, createAPI } = defineContext< - { db: { create: (data: any) => User } }, - TestEvents - >({ - context: { db: { create: (data: any) => ({ id: "1", ...data }) } }, - events: { - "user.created": { data: { id: "", name: "" } }, - }, - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.create(args); - // Correct event name and correct data shape - ctx.send("user.created", { id: user.id, name: user.name }); - return ok(user); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - }), - }); - - expect(api).toBeDefined(); - }); - - it("should infer proper types for send function in handler context", () => { - // Verify that the send function accepts only valid event names from registry - const { t, createAPI } = defineContext< - { db: { create: (data: any) => User } }, - TestEvents - >({ - context: { db: { create: (data: any) => ({ id: "1", ...data }) } }, - events: { - "user.created": { data: { id: "", name: "" } }, - "email.sent": { data: { to: "", subject: "" } }, - }, - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string(), email: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.create(args); - // Both of these should compile - both events are in TestEvents - ctx.send("user.created", { id: user.id, name: user.name }); - ctx.send("email.sent", { to: args.email, subject: "Welcome" }); - return ok(user); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - }), - }); - - expect(api).toBeDefined(); - }); - - /** - * COMPILE-TIME TYPE TEST - Uncommenting should cause TypeScript error - * - * This tests that sending a non-existent event fails to compile. - * If you uncomment the line below, TypeScript should report an error because - * "nonexistent.event" is not in TestEvents. - */ - it("should fail to compile when sending unregistered event", () => { - const { t, createAPI } = defineContext< - { db: { create: (data: any) => User } }, - TestEvents - >({ - context: { db: { create: (data: any) => ({ id: "1", ...data }) } }, - events: { - "user.created": { data: { id: "", name: "" } }, - }, - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.create(args); - ctx.send("user.created", { id: user.id, name: user.name }); - // UNCOMMENT TO TEST: This should cause a compile error - // ctx.send("nonexistent.event", {}); - return ok(user); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - }), - }); - - expect(api).toBeDefined(); - }); - - /** - * COMPILE-TIME TYPE TEST - Uncommenting should cause TypeScript error - * - * This tests that sending an event with wrong data shape fails to compile. - * If you uncomment the line below, TypeScript should report an error because - * "user.created" expects { id: string; name: string } but we pass { id: number }. - */ - it("should fail to compile when sending event with wrong data shape", () => { - const { t, createAPI } = defineContext< - { db: { create: (data: any) => User } }, - TestEvents - >({ - context: { db: { create: (data: any) => ({ id: "1", ...data }) } }, - events: { - "user.created": { data: { id: "", name: "" } }, - }, - }); - - const createUser = t.mutation({ - args: z.object({ name: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.create(args); - ctx.send("user.created", { id: user.id, name: user.name }); - // UNCOMMENT TO TEST: This should cause a compile error - // ctx.send("user.created", { id: 123 }); // id should be string, not number - return ok(user); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { create: createUser }, - }), - }); - - expect(api).toBeDefined(); - }); -}); - -describe("Type Safety - API Type Inference", () => { - it("should infer return type as Result, not Result", async () => { - interface ListUsersResult { - users: User[]; - total: number; - } - - const { t, createAPI } = defineContext({ - context: { - db: { - findAll: (): User[] => [ - { id: "1", name: "Alice", email: "alice@example.com" }, - ], - }, - }, - }); - - const listUsers = t.query({ - args: z.object({ limit: z.number().optional() }), - handler: async (ctx, _args) => { - const users = ctx.db.findAll(); - return ok({ users, total: users.length } as ListUsersResult); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { - list: listUsers, - }, - }), - }); - - // Test that the direct proxy access works and returns typed result - const result = await api.users.list({}); - - // The result should be typed as Result, not Result - expect(result.ok).toBe(true); - if (result.ok) { - // If types are correct, this should have proper type inference - const value = result.value as ListUsersResult; - expect(value.users).toBeDefined(); - expect(value.total).toBeDefined(); - expect(Array.isArray(value.users)).toBe(true); - } - }); - - it("should infer types for nested routers", async () => { - interface Post { - id: string; - title: string; - content: string; - } - - const { t, createAPI } = defineContext({ - context: { - db: { - posts: { - findAll: (): Post[] => [{ id: "1", title: "Hello", content: "World" }], - }, - }, - }, - }); - - const listPosts = t.query({ - args: z.object({}), - handler: async (ctx, _args) => { - const posts = ctx.db.posts.findAll(); - return ok(posts); - }, - }); - - const api = createAPI({ - router: t.router({ - posts: { - list: listPosts, - }, - }), - }); - - // Test nested router access - const result = await api.posts.list({}); - - expect(result.ok).toBe(true); - if (result.ok) { - // If types are correct, result.value should be Post[], not any[] - const posts = result.value as Post[]; - expect(posts[0].id).toBe("1"); - expect(posts[0].title).toBe("Hello"); - } - }); - - it("should preserve type safety across multiple procedure calls", async () => { - const { t, createAPI } = defineContext({ - context: { - db: { - users: { - findById: (id: string): User | undefined => - id === "1" ? { id: "1", name: "Bob", email: "bob@example.com" } : undefined, - }, - }, - }, - }); - - const getUser = t.query({ - args: z.object({ id: z.string() }), - handler: async (ctx, args) => { - const user = ctx.db.users.findById(args.id); - if (!user) { - return ok(null); - } - return ok(user); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { - get: getUser, - }, - }), - }); - - // Call the same procedure multiple times - types should remain consistent - const result1 = await api.users.get({ id: "1" }); - const result2 = await api.users.get({ id: "999" }); - - expect(result1.ok).toBe(true); - expect(result2.ok).toBe(true); - - if (result1.ok) { - const user = result1.value as User | null; - if (user !== null) { - expect(user.id).toBe("1"); - } - } - }); - - it("should type execute method similarly to direct proxy access", async () => { - const { t, createAPI } = defineContext({ - context: { name: "test" }, - }); - - const getUser = t.query({ - args: z.object({ id: z.string() }), - handler: async (_ctx, args) => { - return ok({ id: args.id, name: "Test User" }); - }, - }); - - const api = createAPI({ - router: t.router({ - users: { - get: getUser, - }, - }), - }); - - // Both execute() and direct proxy should return Result<{ id: string; name: string }> - const executeResult = await api.users.get({ id: "1" }); - const proxyResult = await api.users.get({ id: "1" }); - - expect(executeResult.ok).toBe(true); - expect(proxyResult.ok).toBe(true); - - if (executeResult.ok && proxyResult.ok) { - const execValue = executeResult.value as { id: string; name: string }; - const proxyValue = proxyResult.value as { id: string; name: string }; - expect(execValue.id).toBe(proxyValue.id); - } - }); -}); - -describe("Type Safety - Complex Type Scenarios", () => { - it("should handle events with no payload", () => { - interface NoPayloadEvents { - "app.started": { data: never }; - "app.stopped": { data: never }; - } - - const { t, createAPI } = defineContext<{ name: string }, NoPayloadEvents>({ - context: { name: "test" }, - events: { - "app.started": { data: undefined as never }, - "app.stopped": { data: undefined as never }, - }, - }); - - const startApp = t.mutation({ - args: z.object({}), - handler: async (ctx, _args) => { - // Events with no data should still compile - ctx.send("app.started", {}); - return ok({ status: "started" }); - }, - }); - - const api = createAPI({ - router: t.router({ - app: { start: startApp }, - }), - }); - - expect(api).toBeDefined(); - }); - - it("should handle events with complex nested data types", () => { - interface ComplexEvents { - "order.processed": { - data: { - orderId: string; - items: Array<{ sku: string; quantity: number }>; - shippingAddress: { - street: string; - city: string; - zip: string; - }; - }; - }; - } - - const { t, createAPI } = defineContext<{ db: any }, ComplexEvents>({ - context: { db: {} }, - events: { - "order.processed": { - data: { - orderId: "", - items: [{ sku: "", quantity: 0 }], - shippingAddress: { street: "", city: "", zip: "" }, - }, - }, - }, - }); - - const processOrder = t.mutation({ - args: z.object({ orderId: z.string() }), - handler: async (ctx, args) => { - const order = ctx.db.findOrder(args.orderId); - // Complex nested data should type-check correctly - ctx.send("order.processed", { - orderId: order.id, - items: order.items.map((item: any) => ({ sku: item.sku, quantity: item.qty })), - shippingAddress: order.address, - }); - return ok(order); - }, - }); - - const api = createAPI({ - router: t.router({ - orders: { process: processOrder }, - }), - }); - - expect(api).toBeDefined(); - }); - - it("should support union event names for flexible typing", () => { - type FlexibleEventName = "user.action" | "system.event" | "custom.event"; - - interface FlexibleEvents { - "user.action": { data: { action: string; userId: string } }; - "system.event": { data: { code: number } }; - "custom.event": { data: { key: string; value: unknown } }; - } - - const { t, createAPI } = defineContext<{ name: string }, FlexibleEvents>({ - context: { name: "test" }, - events: { - "user.action": { data: { action: "", userId: "" } }, - "system.event": { data: { code: 0 } }, - "custom.event": { data: { key: "", value: undefined } }, - }, - }); - - const trackAction = t.mutation({ - args: z.object({ action: z.string() }), - handler: async (ctx, args) => { - // Should compile - user.action is in FlexibleEvents - ctx.send("user.action", { action: args.action, userId: "123" }); - return ok({ tracked: true }); - }, - }); - - const api = createAPI({ - router: t.router({ - events: { track: trackAction }, - }), - }); - - expect(api).toBeDefined(); - }); -});