@sequenceholdings/orm 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +11 -1
  2. package/dist/authoring.cjs +1066 -59
  3. package/dist/authoring.cjs.map +1 -1
  4. package/dist/authoring.d.cts +289 -24
  5. package/dist/authoring.d.ts +289 -24
  6. package/dist/authoring.js +1056 -60
  7. package/dist/authoring.js.map +1 -1
  8. package/dist/canonical.cjs +415 -9
  9. package/dist/canonical.cjs.map +1 -1
  10. package/dist/canonical.d.cts +235 -1
  11. package/dist/canonical.d.ts +235 -1
  12. package/dist/canonical.js +411 -10
  13. package/dist/canonical.js.map +1 -1
  14. package/dist/cli.cjs +1764 -225
  15. package/dist/cli.cjs.map +1 -1
  16. package/dist/cli.js +1765 -226
  17. package/dist/cli.js.map +1 -1
  18. package/dist/client.cjs.map +1 -1
  19. package/dist/client.d.cts +1 -1
  20. package/dist/client.d.ts +1 -1
  21. package/dist/client.js.map +1 -1
  22. package/dist/compiler.cjs +506 -54
  23. package/dist/compiler.cjs.map +1 -1
  24. package/dist/compiler.d.cts +39 -231
  25. package/dist/compiler.d.ts +39 -231
  26. package/dist/compiler.js +504 -55
  27. package/dist/compiler.js.map +1 -1
  28. package/dist/drizzle.cjs +14 -0
  29. package/dist/drizzle.cjs.map +1 -0
  30. package/dist/drizzle.d.cts +1 -0
  31. package/dist/drizzle.d.ts +1 -0
  32. package/dist/drizzle.js +3 -0
  33. package/dist/drizzle.js.map +1 -0
  34. package/dist/dynamic-input.cjs +391 -0
  35. package/dist/dynamic-input.cjs.map +1 -0
  36. package/dist/dynamic-input.d.cts +111 -0
  37. package/dist/dynamic-input.d.ts +111 -0
  38. package/dist/dynamic-input.js +380 -0
  39. package/dist/dynamic-input.js.map +1 -0
  40. package/dist/index.cjs +2223 -219
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.cts +125 -9
  43. package/dist/index.d.ts +125 -9
  44. package/dist/index.js +2199 -220
  45. package/dist/index.js.map +1 -1
  46. package/dist/ir.cjs +249 -14
  47. package/dist/ir.cjs.map +1 -1
  48. package/dist/ir.d.cts +20 -80
  49. package/dist/ir.d.ts +20 -80
  50. package/dist/ir.js +249 -14
  51. package/dist/ir.js.map +1 -1
  52. package/dist/predicate-v2.cjs +1093 -0
  53. package/dist/predicate-v2.cjs.map +1 -0
  54. package/dist/predicate-v2.d.cts +139 -0
  55. package/dist/predicate-v2.d.ts +139 -0
  56. package/dist/predicate-v2.js +1083 -0
  57. package/dist/predicate-v2.js.map +1 -0
  58. package/dist/sdl.cjs +344 -55
  59. package/dist/sdl.cjs.map +1 -1
  60. package/dist/sdl.d.cts +1 -3
  61. package/dist/sdl.d.ts +1 -3
  62. package/dist/sdl.js +344 -55
  63. package/dist/sdl.js.map +1 -1
  64. package/package.json +16 -1
  65. package/templates/orm-namespace/CLAUDE.md +6 -5
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/client/transport.ts","../src/client/query-builder.ts","../src/client/operations.ts","../src/client/index.ts"],"names":[],"mappings":"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","file":"client.cjs","sourcesContent":["/** Namespace names become Postgres identifiers (`orm_<ns>` schema, `orm_<ns>_consumer` role) — the tight grammar is a security control, not cosmetics. */\nexport const NAMESPACE_PATTERN = /^[a-z][a-z0-9_]{0,40}$/\n\nexport const IDENTIFIER_PATTERN = /^[a-z][a-z0-9_]*$/\nexport const MAX_IDENTIFIER_LENGTH = 63\n\n/**\n * The Data API carries a delegated, attenuated data token on this header (not\n * `Authorization`, which stays the app-user/session bearer). One definition\n * shared by the client transport, the server's caller resolver, and the\n * function-invoke minter, so all three agree.\n */\nexport const ORM_DATA_TOKEN_HEADER = 'x-sequence-data-token'\n\n/**\n * The SEPARATE header the invoke proxy uses to hand a managed function its\n * *service* data token — the escalation path. A function receives BOTH this and\n * `ORM_DATA_TOKEN_HEADER`; the default `createOrmClient` reads the user token,\n * the deliberately-named `createServiceOrmClient` reads THIS one. Two distinct\n * headers so reaching for the service identity is always an explicit act, never\n * an accidental default. Both are sent to the Data API on `ORM_DATA_TOKEN_HEADER`\n * — the server stays mode-agnostic and resolves whatever sub the token carries.\n */\nexport const ORM_SERVICE_DATA_TOKEN_HEADER = 'x-sequence-data-token-service'\n\n/**\n * Custom Roles & Capabilities claim keys as policies reference them: a\n * host-scoped registry key, or an org pin's `org/<key>`. Matches the registry\n * key grammar EXACTLY (`[a-z0-9-]`, 1–64 chars, no `_` — the FGA object-id\n * delimiter) so any capability that's declarable/attachable in namespace.yaml\n * can also be referenced here — a stricter pattern would let a valid key\n * register yet fail at apply (e.g. `org/2fa`, a one-char or digit-led key).\n */\nexport const CAPABILITY_KEY_PATTERN = /^(?:org\\/)?[a-z0-9-]{1,64}$/\n\nexport const CLAIM_KEY_PATTERN = /^[a-z][a-z0-9_]*$/\n\n/** Qualified reference to a table outside the defining file: `<schema>.<table>`. */\nexport const QUALIFIED_TABLE_PATTERN = /^[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*$/\n\n/** Synced reflected sources are restricted to the gold layer. */\nexport const SYNCED_SOURCE_PATTERN = /^gold\\.[a-z][a-z0-9_]*$/\n\nexport const ORM_SCHEMA_PREFIX = 'orm_'\nexport const CONSUMER_ROLE_SUFFIX = '_consumer'\n\nexport const ormSchemaName = (namespace: string): string => `${ORM_SCHEMA_PREFIX}${namespace}`\nexport const consumerRoleName = (namespace: string): string =>\n `${ORM_SCHEMA_PREFIX}${namespace}${CONSUMER_ROLE_SUFFIX}`\n\nexport const DEFINITION_FILE_EXTENSIONS = ['.yml', '.yaml'] as const\n\n/** Reserved basenames for the namespace-level config file (description, org capability pins). */\nexport const NAMESPACE_CONFIG_FILENAMES = new Set(['namespace.yaml', 'namespace.yml'])\n\nexport const HASH_DOMAIN = 'sequence-orm-definitions\\0'\n\n/**\n * The one size guard the package owns: a per-file byte cap where the loader\n * reads untrusted YAML into memory — a real failure mode, not a product\n * limit. Counts of tables/indexes/params and policy/SQL lengths are\n * deliberately uncapped; Postgres enforces its own limits loudly at apply.\n */\nexport const MAX_DEFINITION_FILE_BYTES = 1024 * 1024\n\n/** `/api/data/<ns>/actions/…` and `/api/data/<ns>/query` share the table path segment. */\nexport const RESERVED_TABLE_NAMES = new Set(['actions', 'query'])\n\n/**\n * The Data API's query-string grammar owns these parameter names — a column\n * with one of them could never be filtered over the wire, so definitions\n * refuse it up front (\"validate rejects only what can never work\").\n */\nexport const RESERVED_COLUMN_NAMES = new Set(['select', 'order', 'limit', 'offset'])\n","/**\n * Fetch-based transport for the Data API. Deliberately free of node builtins\n * so the client runs anywhere a `fetch` exists — browsers, artifact bridges,\n * Cloud Functions, `node:vm` sandboxes.\n */\nimport { ORM_DATA_TOKEN_HEADER } from '../constants.js'\n\nexport class OrmClientError extends Error {\n // Widened to `string` so subclasses (e.g. OrmOperationError) can rename.\n override readonly name: string = 'OrmClientError'\n\n constructor(\n message: string,\n readonly status: number | null = null,\n ) {\n super(message)\n }\n}\n\nexport interface OrmTransport {\n get(path: string, params: URLSearchParams): Promise<unknown>\n post(path: string, body: unknown): Promise<unknown>\n}\n\nexport function createFetchTransport({\n baseUrl,\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: {\n baseUrl: string\n /** App-user / session bearer → `Authorization: Bearer`. */\n getToken?: () => Promise<string | null> | string | null\n /** Delegated, attenuated function token → the `ORM_DATA_TOKEN_HEADER`. */\n getDataToken?: () => Promise<string | null> | string | null\n fetchImpl?: typeof globalThis.fetch\n}): OrmTransport {\n if (!fetchImpl) throw new OrmClientError('no fetch implementation available')\n if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {\n throw new OrmClientError('provide exactly one of getToken (bearer) or getDataToken (delegated)')\n }\n const root = baseUrl.replace(/\\/+$/, '')\n\n const request = async (path: string, init: Omit<RequestInit, 'headers'>): Promise<unknown> => {\n const token = await (getDataToken ?? getToken)!()\n if (!token) throw new OrmClientError('not authenticated — no token available')\n // The delegated token rides its own header; the app-user bearer rides Authorization.\n const auth: Record<string, string> = getDataToken\n ? { [ORM_DATA_TOKEN_HEADER]: token }\n : { Authorization: `Bearer ${token}` }\n\n const response = await fetchImpl(`${root}${path}`, {\n ...init,\n headers: { ...auth, 'Content-Type': 'application/json' },\n })\n const payload: unknown = await response.json().catch(() => null)\n if (!response.ok) {\n const detail =\n payload && typeof payload === 'object' && 'detail' in payload\n ? String((payload as { detail: unknown }).detail)\n : `HTTP ${response.status}`\n throw new OrmClientError(detail, response.status)\n }\n return payload\n }\n\n return {\n get: (path, params) => {\n // Not params.size — that's Node 19.8+/2023-browser surface, newer than\n // the fetch this module documents as its only requirement.\n const serialized = params.toString()\n return request(serialized === '' ? path : `${path}?${serialized}`, {})\n },\n post: (path, body) => request(path, { method: 'POST', body: JSON.stringify(body ?? {}) }),\n }\n}\n","import { OrmClientError, type OrmTransport } from './transport.js'\n\n/**\n * Fluent read query over one table. Serializes to exactly the PostgREST\n * subset the Data API's query parser accepts — the round-trip contract is\n * asserted server-side (builder output → parseReadQuery) so the two ends\n * can't drift apart silently.\n *\n * IMMUTABLE: every method returns a new query, so narrowing `select()` can\n * never leave an alias holding a stale wider row type, and a base query can\n * be safely forked into variants.\n */\n\nexport type FilterValue = string | number | boolean\n\nexport interface ReadResponse<Row> {\n readonly rows: readonly Row[]\n readonly limit: number\n readonly offset: number\n}\n\n/** Characters the in-list grammar cannot carry — there is no escaping, so the builder hard-fails. */\nconst IN_LIST_UNREPRESENTABLE = /[,()]/\n\ninterface QueryState {\n readonly filters: ReadonlyArray<[column: string, expression: string]>\n readonly orderings: readonly string[]\n readonly selection: readonly string[] | null\n readonly limitValue: number | null\n readonly offsetValue: number | null\n}\n\nconst EMPTY_STATE: QueryState = {\n filters: [],\n orderings: [],\n selection: null,\n limitValue: null,\n offsetValue: null,\n}\n\n/**\n * `Row` is the TABLE's row (filters and order always accept every column);\n * `Result` is what rows() yields — narrowed by select(), re-widenable by a\n * later select() since keys always come from Row.\n */\nexport class TableQuery<Row extends Record<string, unknown>, Result = Row> {\n constructor(\n private readonly transport: OrmTransport,\n private readonly namespace: string,\n private readonly table: string,\n private readonly state: QueryState = EMPTY_STATE,\n ) {}\n\n private with(patch: Partial<QueryState>): TableQuery<Row, Result> {\n return new TableQuery(this.transport, this.namespace, this.table, { ...this.state, ...patch })\n }\n\n select<K extends keyof Row & string>(...columns: [K, ...K[]]): TableQuery<Row, Pick<Row, K>> {\n return new TableQuery<Row, Pick<Row, K>>(this.transport, this.namespace, this.table, {\n ...this.state,\n selection: columns,\n })\n }\n\n eq<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'eq', value)\n }\n\n ne<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'ne', value)\n }\n\n gt<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'gt', value)\n }\n\n gte<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'gte', value)\n }\n\n lt<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'lt', value)\n }\n\n lte<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'lte', value)\n }\n\n like<K extends keyof Row & string>(column: K, pattern: string): TableQuery<Row, Result> {\n return this.filter(column, 'like', pattern)\n }\n\n ilike<K extends keyof Row & string>(column: K, pattern: string): TableQuery<Row, Result> {\n return this.filter(column, 'ilike', pattern)\n }\n\n in<K extends keyof Row & string>(column: K, values: readonly FilterValue[]): TableQuery<Row, Result> {\n // An empty list is representable — `in.()` matches nothing, the same\n // semantics the server executes. Blank entries are legitimate values in\n // multi-entry lists (`in.(a,)` carries ['a','']), but a LONE '' renders\n // as `in.()` and silently becomes the empty list — unrepresentable.\n // Beyond that only characters the grammar can't escape, and whitespace\n // padding the server-side split would silently swallow, are refused.\n const rendered = values.map((value) => {\n const text = String(value)\n if (IN_LIST_UNREPRESENTABLE.test(text) || text !== text.trim()) {\n throw new OrmClientError(`in() value '${text}' cannot be represented — the list grammar has no escaping`)\n }\n return text\n })\n if (rendered.length === 1 && rendered[0] === '') {\n throw new OrmClientError(\"in() with a lone '' cannot be represented — it would read as the empty list\")\n }\n return this.with({ filters: [...this.state.filters, [column, `in.(${rendered.join(',')})`]] })\n }\n\n is<K extends keyof Row & string>(column: K, value: null | boolean): TableQuery<Row, Result> {\n return this.with({\n filters: [...this.state.filters, [column, `is.${value === null ? 'null' : value}`]],\n })\n }\n\n order<K extends keyof Row & string>(column: K, direction: 'asc' | 'desc' = 'asc'): TableQuery<Row, Result> {\n return this.with({ orderings: [...this.state.orderings, `${column}.${direction}`] })\n }\n\n limit(value: number): TableQuery<Row, Result> {\n return this.with({ limitValue: value })\n }\n\n offset(value: number): TableQuery<Row, Result> {\n return this.with({ offsetValue: value })\n }\n\n /** The exact query string sent to the Data API — exposed for debugging and the grammar contract test. */\n searchParams(): URLSearchParams {\n const params = new URLSearchParams()\n for (const [column, expression] of this.state.filters) params.append(column, expression)\n if (this.state.orderings.length > 0) params.set('order', this.state.orderings.join(','))\n if (this.state.selection) params.set('select', this.state.selection.join(','))\n if (this.state.limitValue !== null) params.set('limit', String(this.state.limitValue))\n if (this.state.offsetValue !== null) params.set('offset', String(this.state.offsetValue))\n return params\n }\n\n async rows(): Promise<Result[]> {\n const payload = await this.transport.get(\n `/api/data/${this.namespace}/${this.table}`,\n this.searchParams(),\n )\n if (!payload || typeof payload !== 'object' || !Array.isArray((payload as { rows?: unknown }).rows)) {\n throw new OrmClientError('unexpected Data API response shape — missing rows array')\n }\n return (payload as { rows: Result[] }).rows\n }\n\n private filter(column: string, op: string, value: FilterValue): TableQuery<Row, Result> {\n return this.with({ filters: [...this.state.filters, [column, `${op}.${String(value)}`]] })\n }\n}\n","/**\n * Persisted-operation client for the v2 data plane. The wire carries only\n * `{ op: <hash>, variables }` — never GraphQL text, never SQL. Like the rest\n * of `./client`, this module is deliberately free of node builtins and third-\n * party deps (no @apollo/client import): Apollo integration happens through a\n * fetch-compatible shim (`createOrmFetch`) handed to `HttpLink({ fetch })`.\n */\nimport { OrmClientError } from './transport.js'\nimport { ORM_DATA_TOKEN_HEADER } from '../constants.js'\n\n/** One entry of `operations.manifest.json` (generated by `orm generate`). */\nexport interface ManifestOperation {\n readonly hash: string\n readonly kind: 'query' | 'mutation' | 'action'\n readonly requires: { readonly capability?: string; readonly role?: string } | null\n}\n\nexport interface OperationsManifest {\n readonly schemaHash: string\n readonly opsHash?: string\n readonly operations: Readonly<Record<string, ManifestOperation>>\n}\n\n/** GraphQL-spec error envelope the data plane returns. */\nexport interface OperationErrorEntry {\n readonly message: string\n readonly extensions?: { readonly code?: string }\n}\n\nexport class OrmOperationError extends OrmClientError {\n override readonly name = 'OrmOperationError'\n\n constructor(\n message: string,\n status: number | null,\n readonly code: string | null,\n readonly errors: readonly OperationErrorEntry[] = [],\n ) {\n super(message, status)\n }\n}\n\nexport interface OperationExecutorConfig {\n /** Deployment host root, e.g. `https://atlas.seqholdings.com`. */\n baseUrl: string\n namespace: string\n manifest: OperationsManifest\n /** App-user / session bearer → `Authorization: Bearer`. */\n getToken?: () => Promise<string | null> | string | null\n /** Delegated, attenuated function token → the `ORM_DATA_TOKEN_HEADER`. */\n getDataToken?: () => Promise<string | null> | string | null\n fetchImpl?: typeof globalThis.fetch\n}\n\nexport interface OperationExecutor {\n /** Execute a manifest operation by name (or a raw `sha256:` hash). */\n execute<TData = Record<string, unknown>>(\n op: string,\n variables?: Record<string, unknown>,\n ): Promise<TData>\n}\n\nconst dataPlanePath = (namespace: string): string => `/_data/v2/${namespace}`\n\nfunction resolveOpHash(manifest: OperationsManifest, op: string): string {\n if (op.startsWith('sha256:')) return op\n const entry = manifest.operations[op]\n if (!entry) {\n const known = Object.keys(manifest.operations).sort()\n throw new OrmClientError(\n `unknown operation \"${op}\" — not in the manifest (${known.length} known). ` +\n 'Re-run `seq-studio orm generate` after editing graphql documents.',\n )\n }\n return entry.hash\n}\n\nexport function createOperationExecutor({\n baseUrl,\n namespace,\n manifest,\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: OperationExecutorConfig): OperationExecutor {\n if (!fetchImpl) throw new OrmClientError('no fetch implementation available')\n if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {\n throw new OrmClientError('provide exactly one of getToken (bearer) or getDataToken (delegated)')\n }\n const root = baseUrl.replace(/\\/+$/, '')\n\n return {\n async execute<TData = Record<string, unknown>>(\n op: string,\n variables: Record<string, unknown> = {},\n ): Promise<TData> {\n const hash = resolveOpHash(manifest, op)\n const token = await (getDataToken ?? getToken)!()\n if (!token) throw new OrmClientError('not authenticated — no token available')\n const auth: Record<string, string> = getDataToken\n ? { [ORM_DATA_TOKEN_HEADER]: token }\n : { Authorization: `Bearer ${token}` }\n\n const response = await fetchImpl(`${root}${dataPlanePath(namespace)}`, {\n method: 'POST',\n headers: { ...auth, 'Content-Type': 'application/json' },\n body: JSON.stringify({ op: hash, variables }),\n })\n const payload = (await response.json().catch(() => null)) as\n | { data?: TData | null; errors?: OperationErrorEntry[] }\n | null\n\n const errors = payload?.errors ?? []\n if (!response.ok || errors.length > 0) {\n const first = errors[0]\n throw new OrmOperationError(\n first?.message ?? `HTTP ${response.status}`,\n response.status,\n first?.extensions?.code ?? null,\n errors,\n )\n }\n if (!payload || payload.data === undefined || payload.data === null) {\n throw new OrmOperationError('malformed response: missing data', response.status, null)\n }\n return payload.data\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level convenience for generated server functions (`db<Name>`)\n// ---------------------------------------------------------------------------\n\nlet configured: OperationExecutor | null = null\n\n/**\n * Configure the process-wide executor the generated `db<Name>` server\n * functions call through. Call once at startup (server-side); browser apps\n * should prefer Apollo + `createOrmFetch` or an explicit executor.\n */\nexport function configureOrmOperations(config: OperationExecutorConfig): OperationExecutor {\n configured = createOperationExecutor(config)\n return configured\n}\n\n/** Used by generated code: `executeOperation({ op: 'getOpenDeals', variables })`. */\nexport async function executeOperation<TData = Record<string, unknown>>({\n op,\n variables,\n}: {\n op: string\n variables?: Record<string, unknown>\n}): Promise<TData> {\n if (!configured) {\n throw new OrmClientError(\n 'ORM operations client not configured — call configureOrmOperations({ baseUrl, namespace, manifest, getToken }) at startup',\n )\n }\n return configured.execute<TData>(op, variables)\n}\n\n// ---------------------------------------------------------------------------\n// Apollo integration without an @apollo/client dependency\n// ---------------------------------------------------------------------------\n\n/**\n * A fetch-compatible function for `new HttpLink({ uri: '/unused', fetch: createOrmFetch(...) })`.\n * Intercepts Apollo's GraphQL POST, swaps the body for the persisted-op\n * envelope (`{ op: <hash>, variables }`) resolved via the manifest's\n * operationName, rewrites the URL to the data plane, and attaches auth.\n * The GraphQL-spec response body passes through untouched, so InMemoryCache\n * and error links behave exactly as they do against a GraphQL server.\n */\nexport function createOrmFetch({\n baseUrl,\n namespace,\n manifest,\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: OperationExecutorConfig): typeof globalThis.fetch {\n if (!fetchImpl) throw new OrmClientError('no fetch implementation available')\n if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {\n throw new OrmClientError('provide exactly one of getToken (bearer) or getDataToken (delegated)')\n }\n const root = baseUrl.replace(/\\/+$/, '')\n const url = `${root}${dataPlanePath(namespace)}`\n\n // Derived from `globalThis.fetch` rather than naming `RequestInfo` (a DOM-lib\n // global this module compiles without). The input is ignored — Apollo's\n // HttpLink calls the injected fetch with a string URI, and the real target\n // URL is fixed at `url` above.\n return async (_input: Parameters<typeof globalThis.fetch>[0], init?: RequestInit): Promise<Response> => {\n const raw = typeof init?.body === 'string' ? init.body : null\n const parsed = raw\n ? (JSON.parse(raw) as { operationName?: string; variables?: Record<string, unknown> })\n : {}\n const name = parsed.operationName\n if (!name) {\n throw new OrmClientError(\n 'createOrmFetch requires named operations (Apollo sends operationName for named documents)',\n )\n }\n const hash = resolveOpHash(manifest, name)\n const token = await (getDataToken ?? getToken)!()\n if (!token) throw new OrmClientError('not authenticated — no token available')\n const auth: Record<string, string> = getDataToken\n ? { [ORM_DATA_TOKEN_HEADER]: token }\n : { Authorization: `Bearer ${token}` }\n\n return fetchImpl(url, {\n method: 'POST',\n headers: { ...auth, 'Content-Type': 'application/json' },\n body: JSON.stringify({ op: hash, variables: parsed.variables ?? {} }),\n })\n }\n}\n","import { OrmClientError, createFetchTransport, type OrmTransport } from './transport.js'\nimport { TableQuery } from './query-builder.js'\n\n/** Bindable scalar for `query()` placeholders ($1, $2, …). */\nexport type QueryParam = string | number | boolean | null\n\n/** Shape of one action in the generated `<Ns>Actions` map — params in, result out. */\nexport interface OrmActionShape {\n readonly params?: Record<string, unknown>\n readonly result: unknown\n}\n\n/** The generated `<Ns>Actions` map: action name → its param and result shapes. */\nexport type OrmActions = Record<string, OrmActionShape>\n\n/**\n * `action()`'s argument list: `params` is required when the action declares a\n * required field, optional otherwise. The empty-object type is assignable to\n * the params shape only when every field is optional, so that assignability is\n * the discriminant.\n */\ntype ActionArgs<Action extends OrmActionShape> =\n Record<string, never> extends NonNullable<Action['params']>\n ? [params?: NonNullable<Action['params']>]\n : [params: NonNullable<Action['params']>]\n\n/**\n * Typed read client for one namespace's Data API. `Tables` comes from\n * `types.gen.ts` (wire types the apply refreshes from the YAML definitions),\n * so column names and row shapes are checked at compile time; the server\n * re-validates everything and Postgres RLS decides row visibility.\n *\n * ```ts\n * const client = createOrmClient<LendingTables>({ namespace: 'lending', baseUrl, getToken })\n * const rows = await client.table('loans').select('id', 'balance').gte('balance', 1000).rows()\n * const top = await client.query<{ officer: string; total: string }>(\n * 'select officer, sum(balance) as total from loans group by officer order by total desc limit $1',\n * [5],\n * )\n * ```\n */\nexport interface OrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n> {\n table<Name extends keyof Tables & string>(name: Name): TableQuery<Tables[Name]>\n /**\n * Raw read-only SQL for everything the filter grammar can't say —\n * aggregates, joins, OR, expressions, CTEs. The same sandbox as every\n * read: the namespace consumer role (grants stop at the namespace schema),\n * Postgres RLS over the caller's claims, and a READ ONLY transaction —\n * Postgres itself rejects writes, which stay on declared actions. Values\n * bind as $1, $2, … placeholders; never interpolate them into the string.\n */\n query<Row = Record<string, unknown>>(sql: string, params?: readonly QueryParam[]): Promise<Row[]>\n /**\n * Invoke a declared action — the only write path the Data API exposes. The\n * params and result are typed from the namespace's `<Ns>Actions`: an action\n * with `returns:` resolves to `{ rows: Row[] }`, a count action to\n * `{ rowsAffected: number }`.\n */\n action<Name extends keyof Actions & string>(\n name: Name,\n ...args: ActionArgs<Actions[Name]>\n ): Promise<Actions[Name]['result']>\n}\n\nexport function createOrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n>({\n namespace,\n baseUrl,\n getToken,\n fetchImpl,\n transport,\n dataToken,\n}: {\n namespace: string\n baseUrl?: string\n /** App-user / session bearer (CLI, browser). Mutually exclusive with dataToken. */\n getToken?: () => Promise<string | null> | string | null\n /**\n * Delegated function data token — the inbound `ORM_DATA_TOKEN_HEADER` value a\n * managed function receives. Pass it and the client authenticates as the\n * invoking user, scoped to the function's declared refs; no manual transport.\n */\n dataToken?: string | (() => Promise<string | null> | string | null)\n fetchImpl?: typeof globalThis.fetch\n /** Injected transport (tests, bridges); overrides baseUrl/getToken/dataToken. */\n transport?: OrmTransport\n}): OrmClient<Tables, Actions> {\n const resolved =\n transport ??\n createFetchTransport({\n baseUrl: requireOption(baseUrl, 'baseUrl'),\n ...(dataToken !== undefined\n ? { getDataToken: typeof dataToken === 'function' ? dataToken : () => dataToken }\n : { getToken: requireOption(getToken, 'getToken') }),\n fetchImpl,\n })\n\n return buildOrmClient<Tables, Actions>(resolved, namespace)\n}\n\n/**\n * The ESCALATION path — use only deliberately. A managed function receives a\n * separate *service* data token on `ORM_SERVICE_DATA_TOKEN_HEADER`; pass that\n * value here and the client authenticates as the function's SERVICE IDENTITY,\n * not the invoking user. Reads run with the service identity's grants (clamped\n * to the function's declared refs), NOT the caller's — so the caller's own row\n * visibility does not apply. The invoking user is still recorded for audit.\n *\n * Default to `createOrmClient` (acts as the invoking user, full per-user RLS).\n * Reach for this only when the function must intentionally act beyond the\n * caller — e.g. enforcing per-user rules in code over a coarse upstream that\n * has no granular permissions of its own. The distinct name is the guardrail:\n * choosing the service identity is always explicit and greppable.\n *\n * ```ts\n * const client = createServiceOrmClient<LendingTables>({\n * namespace: 'lending',\n * baseUrl,\n * serviceDataToken: req.headers['x-sequence-data-token-service'],\n * })\n * ```\n */\nexport function createServiceOrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n>({\n namespace,\n baseUrl,\n serviceDataToken,\n fetchImpl,\n transport,\n}: {\n namespace: string\n baseUrl?: string\n /** The inbound `ORM_SERVICE_DATA_TOKEN_HEADER` value — the function's service token. */\n serviceDataToken?: string | (() => Promise<string | null> | string | null)\n fetchImpl?: typeof globalThis.fetch\n /** Injected transport (tests, bridges); overrides baseUrl/serviceDataToken. */\n transport?: OrmTransport\n}): OrmClient<Tables, Actions> {\n const resolved =\n transport ??\n createFetchTransport({\n baseUrl: requireOption(baseUrl, 'baseUrl'),\n getDataToken:\n typeof serviceDataToken === 'function'\n ? serviceDataToken\n : () => requireOption(serviceDataToken, 'serviceDataToken'),\n fetchImpl,\n })\n\n return buildOrmClient<Tables, Actions>(resolved, namespace)\n}\n\n/** Shared client surface over a resolved transport — the token/identity choice is made by the factory above. */\nfunction buildOrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n>(resolved: OrmTransport, namespace: string): OrmClient<Tables, Actions> {\n return {\n table(name) {\n return new TableQuery(resolved, namespace, name)\n },\n async query(sql, params) {\n const payload = await resolved.post(`/api/data/${namespace}/query`, {\n sql,\n ...(params ? { params: [...params] } : {}),\n })\n if (!payload || typeof payload !== 'object' || !Array.isArray((payload as { rows?: unknown }).rows)) {\n throw new OrmClientError('unexpected Data API response shape — missing rows array')\n }\n return (payload as { rows: never[] }).rows\n },\n async action(name, ...args) {\n const payload = await resolved.post(`/api/data/${namespace}/actions/${name}`, args[0] ?? {})\n if (payload && typeof payload === 'object') {\n // A returns action responds with `rows`; a count action with\n // `rows_affected` (mapped to `rowsAffected` for the client).\n if (Array.isArray((payload as { rows?: unknown }).rows)) {\n return { rows: (payload as { rows: unknown[] }).rows } as Awaited<ReturnType<OrmClient<Tables, Actions>['action']>>\n }\n if ('rows_affected' in payload) {\n const rowsAffected = Number((payload as { rows_affected: unknown }).rows_affected)\n if (!Number.isNaN(rowsAffected)) {\n return { rowsAffected } as Awaited<ReturnType<OrmClient<Tables, Actions>['action']>>\n }\n }\n }\n throw new OrmClientError('unexpected action response shape — expected rows or rows_affected')\n },\n }\n}\n\nfunction requireOption<T>(value: T | undefined, name: string): T {\n if (value === undefined) throw new Error(`createOrmClient requires ${name} when no transport is injected`)\n return value\n}\n\nexport { TableQuery, type FilterValue, type ReadResponse } from './query-builder.js'\nexport { createFetchTransport, OrmClientError, type OrmTransport } from './transport.js'\n\nexport {\n OrmOperationError,\n configureOrmOperations,\n createOperationExecutor,\n createOrmFetch,\n executeOperation,\n} from './operations.js'\nexport type {\n ManifestOperation,\n OperationErrorEntry,\n OperationExecutor,\n OperationExecutorConfig,\n OperationsManifest,\n} from './operations.js'\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/client/transport.ts","../src/client/query-builder.ts","../src/client/operations.ts","../src/client/index.ts"],"names":[],"mappings":"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","file":"client.cjs","sourcesContent":["/** Namespace names become Postgres identifiers (`orm_<ns>` schema, `orm_<ns>_consumer` role) — the tight grammar is a security control, not cosmetics. */\nexport const NAMESPACE_PATTERN = /^[a-z][a-z0-9_]{0,40}$/\n\nexport const IDENTIFIER_PATTERN = /^[a-z][a-z0-9_]*$/\nexport const MAX_IDENTIFIER_LENGTH = 63\n\n/**\n * The Data API carries a delegated, attenuated data token on this header (not\n * `Authorization`, which stays the app-user/session bearer). One definition\n * shared by the client transport, the server's caller resolver, and the\n * function-invoke minter, so all three agree.\n */\nexport const ORM_DATA_TOKEN_HEADER = 'x-sequence-data-token'\n\n/**\n * The SEPARATE header the invoke proxy uses to hand a managed function its\n * *service* data token — the escalation path. A function receives BOTH this and\n * `ORM_DATA_TOKEN_HEADER`; the default `createOrmClient` reads the user token,\n * the deliberately-named `createServiceOrmClient` reads THIS one. Two distinct\n * headers so reaching for the service identity is always an explicit act, never\n * an accidental default. Both are sent to the Data API on `ORM_DATA_TOKEN_HEADER`\n * — the server stays mode-agnostic and resolves whatever sub the token carries.\n */\nexport const ORM_SERVICE_DATA_TOKEN_HEADER = 'x-sequence-data-token-service'\n\n/**\n * Custom Roles & Capabilities claim keys as policies reference them: a\n * host-scoped registry key, or an org pin's `org/<key>`. Matches the registry\n * key grammar EXACTLY (`[a-z0-9-]`, 1–64 chars, no `_` — the FGA object-id\n * delimiter) so any capability that's declarable/attachable in namespace.yaml\n * can also be referenced here — a stricter pattern would let a valid key\n * register yet fail at apply (e.g. `org/2fa`, a one-char or digit-led key).\n */\nexport const CAPABILITY_KEY_PATTERN = /^(?:org\\/)?[a-z0-9-]{1,64}$/\n\nexport const CLAIM_KEY_PATTERN = /^[a-z][a-z0-9_]*$/\n\n/** Qualified reference to a table outside the defining file: `<schema>.<table>`. */\nexport const QUALIFIED_TABLE_PATTERN = /^[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*$/\n\n/** Synced reflected sources are restricted to the gold layer. */\nexport const SYNCED_SOURCE_PATTERN = /^gold\\.[a-z][a-z0-9_]*$/\n\nexport const ORM_SCHEMA_PREFIX = 'orm_'\nexport const CONSUMER_ROLE_SUFFIX = '_consumer'\n\nexport const ormSchemaName = (namespace: string): string => `${ORM_SCHEMA_PREFIX}${namespace}`\nexport const consumerRoleName = (namespace: string): string =>\n `${ORM_SCHEMA_PREFIX}${namespace}${CONSUMER_ROLE_SUFFIX}`\n\nexport const DEFINITION_FILE_EXTENSIONS = ['.yml', '.yaml'] as const\n\n/** Reserved basenames for the namespace-level config file (description, org capability pins). */\nexport const NAMESPACE_CONFIG_FILENAMES = new Set(['namespace.yaml', 'namespace.yml'])\n\nexport const HASH_DOMAIN = 'sequence-orm-definitions\\0'\n\n/**\n * The one size guard the package owns: a per-file byte cap where the loader\n * reads untrusted YAML into memory — a real failure mode, not a product\n * limit. Counts of tables/indexes/params and policy/SQL lengths are\n * deliberately uncapped; Postgres enforces its own limits loudly at apply.\n */\nexport const MAX_DEFINITION_FILE_BYTES = 1024 * 1024\n\n/** `/api/data/<ns>/actions/…` and `/api/data/<ns>/query` share the table path segment. */\nexport const RESERVED_TABLE_NAMES = new Set(['actions', 'query'])\n\n/**\n * The Data API's query-string grammar owns these parameter names — a column\n * with one of them could never be filtered over the wire, so definitions\n * refuse it up front (\"validate rejects only what can never work\").\n */\nexport const RESERVED_COLUMN_NAMES = new Set(['select', 'order', 'limit', 'offset'])\n","/**\n * Fetch-based transport for the Data API. Deliberately free of node builtins\n * so the client runs anywhere a `fetch` exists — browsers, artifact bridges,\n * Cloud Functions, `node:vm` sandboxes.\n */\nimport { ORM_DATA_TOKEN_HEADER } from '../constants.js'\n\nexport class OrmClientError extends Error {\n // Widened to `string` so subclasses (e.g. OrmOperationError) can rename.\n override readonly name: string = 'OrmClientError'\n\n constructor(\n message: string,\n readonly status: number | null = null,\n ) {\n super(message)\n }\n}\n\nexport interface OrmTransport {\n get(path: string, params: URLSearchParams): Promise<unknown>\n post(path: string, body: unknown): Promise<unknown>\n}\n\nexport function createFetchTransport({\n baseUrl,\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: {\n baseUrl: string\n /** App-user / session bearer → `Authorization: Bearer`. */\n getToken?: () => Promise<string | null> | string | null\n /** Delegated, attenuated function token → the `ORM_DATA_TOKEN_HEADER`. */\n getDataToken?: () => Promise<string | null> | string | null\n fetchImpl?: typeof globalThis.fetch\n}): OrmTransport {\n if (!fetchImpl) throw new OrmClientError('no fetch implementation available')\n if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {\n throw new OrmClientError('provide exactly one of getToken (bearer) or getDataToken (delegated)')\n }\n const root = baseUrl.replace(/\\/+$/, '')\n\n const request = async (path: string, init: Omit<RequestInit, 'headers'>): Promise<unknown> => {\n const token = await (getDataToken ?? getToken)!()\n if (!token) throw new OrmClientError('not authenticated — no token available')\n // The delegated token rides its own header; the app-user bearer rides Authorization.\n const auth: Record<string, string> = getDataToken\n ? { [ORM_DATA_TOKEN_HEADER]: token }\n : { Authorization: `Bearer ${token}` }\n\n const response = await fetchImpl(`${root}${path}`, {\n ...init,\n headers: { ...auth, 'Content-Type': 'application/json' },\n })\n const payload: unknown = await response.json().catch(() => null)\n if (!response.ok) {\n const detail =\n payload && typeof payload === 'object' && 'detail' in payload\n ? String((payload as { detail: unknown }).detail)\n : `HTTP ${response.status}`\n throw new OrmClientError(detail, response.status)\n }\n return payload\n }\n\n return {\n get: (path, params) => {\n // Not params.size — that's Node 19.8+/2023-browser surface, newer than\n // the fetch this module documents as its only requirement.\n const serialized = params.toString()\n return request(serialized === '' ? path : `${path}?${serialized}`, {})\n },\n post: (path, body) => request(path, { method: 'POST', body: JSON.stringify(body ?? {}) }),\n }\n}\n","import { OrmClientError, type OrmTransport } from './transport.js'\n\n/**\n * Fluent read query over one table. Serializes to exactly the PostgREST\n * subset the Data API's query parser accepts — the round-trip contract is\n * asserted server-side (builder output → parseReadQuery) so the two ends\n * can't drift apart silently.\n *\n * IMMUTABLE: every method returns a new query, so narrowing `select()` can\n * never leave an alias holding a stale wider row type, and a base query can\n * be safely forked into variants.\n */\n\nexport type FilterValue = string | number | boolean\n\nexport interface ReadResponse<Row> {\n readonly rows: readonly Row[]\n readonly limit: number\n readonly offset: number\n}\n\n/** Characters the in-list grammar cannot carry — there is no escaping, so the builder hard-fails. */\nconst IN_LIST_UNREPRESENTABLE = /[,()]/\n\ninterface QueryState {\n readonly filters: ReadonlyArray<[column: string, expression: string]>\n readonly orderings: readonly string[]\n readonly selection: readonly string[] | null\n readonly limitValue: number | null\n readonly offsetValue: number | null\n}\n\nconst EMPTY_STATE: QueryState = {\n filters: [],\n orderings: [],\n selection: null,\n limitValue: null,\n offsetValue: null,\n}\n\n/**\n * `Row` is the TABLE's row (filters and order always accept every column);\n * `Result` is what rows() yields — narrowed by select(), re-widenable by a\n * later select() since keys always come from Row.\n */\nexport class TableQuery<Row extends Record<string, unknown>, Result = Row> {\n constructor(\n private readonly transport: OrmTransport,\n private readonly namespace: string,\n private readonly table: string,\n private readonly state: QueryState = EMPTY_STATE,\n ) {}\n\n private with(patch: Partial<QueryState>): TableQuery<Row, Result> {\n return new TableQuery(this.transport, this.namespace, this.table, { ...this.state, ...patch })\n }\n\n select<K extends keyof Row & string>(...columns: [K, ...K[]]): TableQuery<Row, Pick<Row, K>> {\n return new TableQuery<Row, Pick<Row, K>>(this.transport, this.namespace, this.table, {\n ...this.state,\n selection: columns,\n })\n }\n\n eq<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'eq', value)\n }\n\n ne<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'ne', value)\n }\n\n gt<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'gt', value)\n }\n\n gte<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'gte', value)\n }\n\n lt<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'lt', value)\n }\n\n lte<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'lte', value)\n }\n\n like<K extends keyof Row & string>(column: K, pattern: string): TableQuery<Row, Result> {\n return this.filter(column, 'like', pattern)\n }\n\n ilike<K extends keyof Row & string>(column: K, pattern: string): TableQuery<Row, Result> {\n return this.filter(column, 'ilike', pattern)\n }\n\n in<K extends keyof Row & string>(column: K, values: readonly FilterValue[]): TableQuery<Row, Result> {\n // An empty list is representable — `in.()` matches nothing, the same\n // semantics the server executes. Blank entries are legitimate values in\n // multi-entry lists (`in.(a,)` carries ['a','']), but a LONE '' renders\n // as `in.()` and silently becomes the empty list — unrepresentable.\n // Beyond that only characters the grammar can't escape, and whitespace\n // padding the server-side split would silently swallow, are refused.\n const rendered = values.map((value) => {\n const text = String(value)\n if (IN_LIST_UNREPRESENTABLE.test(text) || text !== text.trim()) {\n throw new OrmClientError(`in() value '${text}' cannot be represented — the list grammar has no escaping`)\n }\n return text\n })\n if (rendered.length === 1 && rendered[0] === '') {\n throw new OrmClientError(\"in() with a lone '' cannot be represented — it would read as the empty list\")\n }\n return this.with({ filters: [...this.state.filters, [column, `in.(${rendered.join(',')})`]] })\n }\n\n is<K extends keyof Row & string>(column: K, value: null | boolean): TableQuery<Row, Result> {\n return this.with({\n filters: [...this.state.filters, [column, `is.${value === null ? 'null' : value}`]],\n })\n }\n\n order<K extends keyof Row & string>(column: K, direction: 'asc' | 'desc' = 'asc'): TableQuery<Row, Result> {\n return this.with({ orderings: [...this.state.orderings, `${column}.${direction}`] })\n }\n\n limit(value: number): TableQuery<Row, Result> {\n return this.with({ limitValue: value })\n }\n\n offset(value: number): TableQuery<Row, Result> {\n return this.with({ offsetValue: value })\n }\n\n /** The exact query string sent to the Data API — exposed for debugging and the grammar contract test. */\n searchParams(): URLSearchParams {\n const params = new URLSearchParams()\n for (const [column, expression] of this.state.filters) params.append(column, expression)\n if (this.state.orderings.length > 0) params.set('order', this.state.orderings.join(','))\n if (this.state.selection) params.set('select', this.state.selection.join(','))\n if (this.state.limitValue !== null) params.set('limit', String(this.state.limitValue))\n if (this.state.offsetValue !== null) params.set('offset', String(this.state.offsetValue))\n return params\n }\n\n async rows(): Promise<Result[]> {\n const payload = await this.transport.get(\n `/api/data/${this.namespace}/${this.table}`,\n this.searchParams(),\n )\n if (!payload || typeof payload !== 'object' || !Array.isArray((payload as { rows?: unknown }).rows)) {\n throw new OrmClientError('unexpected Data API response shape — missing rows array')\n }\n return (payload as { rows: Result[] }).rows\n }\n\n private filter(column: string, op: string, value: FilterValue): TableQuery<Row, Result> {\n return this.with({ filters: [...this.state.filters, [column, `${op}.${String(value)}`]] })\n }\n}\n","/**\n * Persisted-operation client for the v2 data plane. The wire carries only\n * `{ op: <hash>, variables }` — never GraphQL text, never SQL. Like the rest\n * of `./client`, this module is deliberately free of node builtins and third-\n * party deps (no @apollo/client import): Apollo integration happens through a\n * fetch-compatible shim (`createOrmFetch`) handed to `HttpLink({ fetch })`.\n */\nimport { OrmClientError } from './transport.js'\nimport { ORM_DATA_TOKEN_HEADER } from '../constants.js'\n\n/** One entry of `operations.manifest.json` (generated by `orm generate`). */\nexport interface ManifestOperation {\n readonly hash: string\n readonly kind: 'query' | 'mutation'\n readonly requires: { readonly capability?: string; readonly role?: string } | null\n}\n\nexport interface OperationsManifest {\n readonly schemaHash: string\n readonly opsHash?: string\n readonly operations: Readonly<Record<string, ManifestOperation>>\n}\n\n/** GraphQL-spec error envelope the data plane returns. */\nexport interface OperationErrorEntry {\n readonly message: string\n readonly extensions?: { readonly code?: string }\n}\n\nexport class OrmOperationError extends OrmClientError {\n override readonly name = 'OrmOperationError'\n\n constructor(\n message: string,\n status: number | null,\n readonly code: string | null,\n readonly errors: readonly OperationErrorEntry[] = [],\n ) {\n super(message, status)\n }\n}\n\nexport interface OperationExecutorConfig {\n /** Deployment host root, e.g. `https://atlas.seqholdings.com`. */\n baseUrl: string\n namespace: string\n manifest: OperationsManifest\n /** App-user / session bearer → `Authorization: Bearer`. */\n getToken?: () => Promise<string | null> | string | null\n /** Delegated, attenuated function token → the `ORM_DATA_TOKEN_HEADER`. */\n getDataToken?: () => Promise<string | null> | string | null\n fetchImpl?: typeof globalThis.fetch\n}\n\nexport interface OperationExecutor {\n /** Execute a manifest operation by name (or a raw `sha256:` hash). */\n execute<TData = Record<string, unknown>>(\n op: string,\n variables?: Record<string, unknown>,\n ): Promise<TData>\n}\n\nconst dataPlanePath = (namespace: string): string => `/_data/v2/${namespace}`\n\nfunction resolveOpHash(manifest: OperationsManifest, op: string): string {\n if (op.startsWith('sha256:')) return op\n const entry = manifest.operations[op]\n if (!entry) {\n const known = Object.keys(manifest.operations).sort()\n throw new OrmClientError(\n `unknown operation \"${op}\" — not in the manifest (${known.length} known). ` +\n 'Re-run `seq-studio orm generate` after editing graphql documents.',\n )\n }\n return entry.hash\n}\n\nexport function createOperationExecutor({\n baseUrl,\n namespace,\n manifest,\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: OperationExecutorConfig): OperationExecutor {\n if (!fetchImpl) throw new OrmClientError('no fetch implementation available')\n if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {\n throw new OrmClientError('provide exactly one of getToken (bearer) or getDataToken (delegated)')\n }\n const root = baseUrl.replace(/\\/+$/, '')\n\n return {\n async execute<TData = Record<string, unknown>>(\n op: string,\n variables: Record<string, unknown> = {},\n ): Promise<TData> {\n const hash = resolveOpHash(manifest, op)\n const token = await (getDataToken ?? getToken)!()\n if (!token) throw new OrmClientError('not authenticated — no token available')\n const auth: Record<string, string> = getDataToken\n ? { [ORM_DATA_TOKEN_HEADER]: token }\n : { Authorization: `Bearer ${token}` }\n\n const response = await fetchImpl(`${root}${dataPlanePath(namespace)}`, {\n method: 'POST',\n headers: { ...auth, 'Content-Type': 'application/json' },\n body: JSON.stringify({ op: hash, variables }),\n })\n const payload = (await response.json().catch(() => null)) as\n | { data?: TData | null; errors?: OperationErrorEntry[] }\n | null\n\n const errors = payload?.errors ?? []\n if (!response.ok || errors.length > 0) {\n const first = errors[0]\n throw new OrmOperationError(\n first?.message ?? `HTTP ${response.status}`,\n response.status,\n first?.extensions?.code ?? null,\n errors,\n )\n }\n if (!payload || payload.data === undefined || payload.data === null) {\n throw new OrmOperationError('malformed response: missing data', response.status, null)\n }\n return payload.data\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level convenience for generated server functions (`db<Name>`)\n// ---------------------------------------------------------------------------\n\nlet configured: OperationExecutor | null = null\n\n/**\n * Configure the process-wide executor the generated `db<Name>` server\n * functions call through. Call once at startup (server-side); browser apps\n * should prefer Apollo + `createOrmFetch` or an explicit executor.\n */\nexport function configureOrmOperations(config: OperationExecutorConfig): OperationExecutor {\n configured = createOperationExecutor(config)\n return configured\n}\n\n/** Used by generated code: `executeOperation({ op: 'getOpenDeals', variables })`. */\nexport async function executeOperation<TData = Record<string, unknown>>({\n op,\n variables,\n}: {\n op: string\n variables?: Record<string, unknown>\n}): Promise<TData> {\n if (!configured) {\n throw new OrmClientError(\n 'ORM operations client not configured — call configureOrmOperations({ baseUrl, namespace, manifest, getToken }) at startup',\n )\n }\n return configured.execute<TData>(op, variables)\n}\n\n// ---------------------------------------------------------------------------\n// Apollo integration without an @apollo/client dependency\n// ---------------------------------------------------------------------------\n\n/**\n * A fetch-compatible function for `new HttpLink({ uri: '/unused', fetch: createOrmFetch(...) })`.\n * Intercepts Apollo's GraphQL POST, swaps the body for the persisted-op\n * envelope (`{ op: <hash>, variables }`) resolved via the manifest's\n * operationName, rewrites the URL to the data plane, and attaches auth.\n * The GraphQL-spec response body passes through untouched, so InMemoryCache\n * and error links behave exactly as they do against a GraphQL server.\n */\nexport function createOrmFetch({\n baseUrl,\n namespace,\n manifest,\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: OperationExecutorConfig): typeof globalThis.fetch {\n if (!fetchImpl) throw new OrmClientError('no fetch implementation available')\n if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {\n throw new OrmClientError('provide exactly one of getToken (bearer) or getDataToken (delegated)')\n }\n const root = baseUrl.replace(/\\/+$/, '')\n const url = `${root}${dataPlanePath(namespace)}`\n\n // Derived from `globalThis.fetch` rather than naming `RequestInfo` (a DOM-lib\n // global this module compiles without). The input is ignored — Apollo's\n // HttpLink calls the injected fetch with a string URI, and the real target\n // URL is fixed at `url` above.\n return async (_input: Parameters<typeof globalThis.fetch>[0], init?: RequestInit): Promise<Response> => {\n const raw = typeof init?.body === 'string' ? init.body : null\n const parsed = raw\n ? (JSON.parse(raw) as { operationName?: string; variables?: Record<string, unknown> })\n : {}\n const name = parsed.operationName\n if (!name) {\n throw new OrmClientError(\n 'createOrmFetch requires named operations (Apollo sends operationName for named documents)',\n )\n }\n const hash = resolveOpHash(manifest, name)\n const token = await (getDataToken ?? getToken)!()\n if (!token) throw new OrmClientError('not authenticated — no token available')\n const auth: Record<string, string> = getDataToken\n ? { [ORM_DATA_TOKEN_HEADER]: token }\n : { Authorization: `Bearer ${token}` }\n\n return fetchImpl(url, {\n method: 'POST',\n headers: { ...auth, 'Content-Type': 'application/json' },\n body: JSON.stringify({ op: hash, variables: parsed.variables ?? {} }),\n })\n }\n}\n","import { OrmClientError, createFetchTransport, type OrmTransport } from './transport.js'\nimport { TableQuery } from './query-builder.js'\n\n/** Bindable scalar for `query()` placeholders ($1, $2, …). */\nexport type QueryParam = string | number | boolean | null\n\n/** Shape of one action in the generated `<Ns>Actions` map — params in, result out. */\nexport interface OrmActionShape {\n readonly params?: Record<string, unknown>\n readonly result: unknown\n}\n\n/** The generated `<Ns>Actions` map: action name → its param and result shapes. */\nexport type OrmActions = Record<string, OrmActionShape>\n\n/**\n * `action()`'s argument list: `params` is required when the action declares a\n * required field, optional otherwise. The empty-object type is assignable to\n * the params shape only when every field is optional, so that assignability is\n * the discriminant.\n */\ntype ActionArgs<Action extends OrmActionShape> =\n Record<string, never> extends NonNullable<Action['params']>\n ? [params?: NonNullable<Action['params']>]\n : [params: NonNullable<Action['params']>]\n\n/**\n * Typed read client for one namespace's Data API. `Tables` comes from\n * `types.gen.ts` (wire types the apply refreshes from the YAML definitions),\n * so column names and row shapes are checked at compile time; the server\n * re-validates everything and Postgres RLS decides row visibility.\n *\n * ```ts\n * const client = createOrmClient<LendingTables>({ namespace: 'lending', baseUrl, getToken })\n * const rows = await client.table('loans').select('id', 'balance').gte('balance', 1000).rows()\n * const top = await client.query<{ officer: string; total: string }>(\n * 'select officer, sum(balance) as total from loans group by officer order by total desc limit $1',\n * [5],\n * )\n * ```\n */\nexport interface OrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n> {\n table<Name extends keyof Tables & string>(name: Name): TableQuery<Tables[Name]>\n /**\n * Raw read-only SQL for everything the filter grammar can't say —\n * aggregates, joins, OR, expressions, CTEs. The same sandbox as every\n * read: the namespace consumer role (grants stop at the namespace schema),\n * Postgres RLS over the caller's claims, and a READ ONLY transaction —\n * Postgres itself rejects writes, which stay on declared actions. Values\n * bind as $1, $2, … placeholders; never interpolate them into the string.\n */\n query<Row = Record<string, unknown>>(sql: string, params?: readonly QueryParam[]): Promise<Row[]>\n /**\n * Invoke a declared action — the only write path the Data API exposes. The\n * params and result are typed from the namespace's `<Ns>Actions`: an action\n * with `returns:` resolves to `{ rows: Row[] }`, a count action to\n * `{ rowsAffected: number }`.\n */\n action<Name extends keyof Actions & string>(\n name: Name,\n ...args: ActionArgs<Actions[Name]>\n ): Promise<Actions[Name]['result']>\n}\n\nexport function createOrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n>({\n namespace,\n baseUrl,\n getToken,\n fetchImpl,\n transport,\n dataToken,\n}: {\n namespace: string\n baseUrl?: string\n /** App-user / session bearer (CLI, browser). Mutually exclusive with dataToken. */\n getToken?: () => Promise<string | null> | string | null\n /**\n * Delegated function data token — the inbound `ORM_DATA_TOKEN_HEADER` value a\n * managed function receives. Pass it and the client authenticates as the\n * invoking user, scoped to the function's declared refs; no manual transport.\n */\n dataToken?: string | (() => Promise<string | null> | string | null)\n fetchImpl?: typeof globalThis.fetch\n /** Injected transport (tests, bridges); overrides baseUrl/getToken/dataToken. */\n transport?: OrmTransport\n}): OrmClient<Tables, Actions> {\n const resolved =\n transport ??\n createFetchTransport({\n baseUrl: requireOption(baseUrl, 'baseUrl'),\n ...(dataToken !== undefined\n ? { getDataToken: typeof dataToken === 'function' ? dataToken : () => dataToken }\n : { getToken: requireOption(getToken, 'getToken') }),\n fetchImpl,\n })\n\n return buildOrmClient<Tables, Actions>(resolved, namespace)\n}\n\n/**\n * The ESCALATION path — use only deliberately. A managed function receives a\n * separate *service* data token on `ORM_SERVICE_DATA_TOKEN_HEADER`; pass that\n * value here and the client authenticates as the function's SERVICE IDENTITY,\n * not the invoking user. Reads run with the service identity's grants (clamped\n * to the function's declared refs), NOT the caller's — so the caller's own row\n * visibility does not apply. The invoking user is still recorded for audit.\n *\n * Default to `createOrmClient` (acts as the invoking user, full per-user RLS).\n * Reach for this only when the function must intentionally act beyond the\n * caller — e.g. enforcing per-user rules in code over a coarse upstream that\n * has no granular permissions of its own. The distinct name is the guardrail:\n * choosing the service identity is always explicit and greppable.\n *\n * ```ts\n * const client = createServiceOrmClient<LendingTables>({\n * namespace: 'lending',\n * baseUrl,\n * serviceDataToken: req.headers['x-sequence-data-token-service'],\n * })\n * ```\n */\nexport function createServiceOrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n>({\n namespace,\n baseUrl,\n serviceDataToken,\n fetchImpl,\n transport,\n}: {\n namespace: string\n baseUrl?: string\n /** The inbound `ORM_SERVICE_DATA_TOKEN_HEADER` value — the function's service token. */\n serviceDataToken?: string | (() => Promise<string | null> | string | null)\n fetchImpl?: typeof globalThis.fetch\n /** Injected transport (tests, bridges); overrides baseUrl/serviceDataToken. */\n transport?: OrmTransport\n}): OrmClient<Tables, Actions> {\n const resolved =\n transport ??\n createFetchTransport({\n baseUrl: requireOption(baseUrl, 'baseUrl'),\n getDataToken:\n typeof serviceDataToken === 'function'\n ? serviceDataToken\n : () => requireOption(serviceDataToken, 'serviceDataToken'),\n fetchImpl,\n })\n\n return buildOrmClient<Tables, Actions>(resolved, namespace)\n}\n\n/** Shared client surface over a resolved transport — the token/identity choice is made by the factory above. */\nfunction buildOrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n>(resolved: OrmTransport, namespace: string): OrmClient<Tables, Actions> {\n return {\n table(name) {\n return new TableQuery(resolved, namespace, name)\n },\n async query(sql, params) {\n const payload = await resolved.post(`/api/data/${namespace}/query`, {\n sql,\n ...(params ? { params: [...params] } : {}),\n })\n if (!payload || typeof payload !== 'object' || !Array.isArray((payload as { rows?: unknown }).rows)) {\n throw new OrmClientError('unexpected Data API response shape — missing rows array')\n }\n return (payload as { rows: never[] }).rows\n },\n async action(name, ...args) {\n const payload = await resolved.post(`/api/data/${namespace}/actions/${name}`, args[0] ?? {})\n if (payload && typeof payload === 'object') {\n // A returns action responds with `rows`; a count action with\n // `rows_affected` (mapped to `rowsAffected` for the client).\n if (Array.isArray((payload as { rows?: unknown }).rows)) {\n return { rows: (payload as { rows: unknown[] }).rows } as Awaited<ReturnType<OrmClient<Tables, Actions>['action']>>\n }\n if ('rows_affected' in payload) {\n const rowsAffected = Number((payload as { rows_affected: unknown }).rows_affected)\n if (!Number.isNaN(rowsAffected)) {\n return { rowsAffected } as Awaited<ReturnType<OrmClient<Tables, Actions>['action']>>\n }\n }\n }\n throw new OrmClientError('unexpected action response shape — expected rows or rows_affected')\n },\n }\n}\n\nfunction requireOption<T>(value: T | undefined, name: string): T {\n if (value === undefined) throw new Error(`createOrmClient requires ${name} when no transport is injected`)\n return value\n}\n\nexport { TableQuery, type FilterValue, type ReadResponse } from './query-builder.js'\nexport { createFetchTransport, OrmClientError, type OrmTransport } from './transport.js'\n\nexport {\n OrmOperationError,\n configureOrmOperations,\n createOperationExecutor,\n createOrmFetch,\n executeOperation,\n} from './operations.js'\nexport type {\n ManifestOperation,\n OperationErrorEntry,\n OperationExecutor,\n OperationExecutorConfig,\n OperationsManifest,\n} from './operations.js'\n"]}
package/dist/client.d.cts CHANGED
@@ -82,7 +82,7 @@ declare class TableQuery<Row extends Record<string, unknown>, Result = Row> {
82
82
  /** One entry of `operations.manifest.json` (generated by `orm generate`). */
83
83
  interface ManifestOperation {
84
84
  readonly hash: string;
85
- readonly kind: 'query' | 'mutation' | 'action';
85
+ readonly kind: 'query' | 'mutation';
86
86
  readonly requires: {
87
87
  readonly capability?: string;
88
88
  readonly role?: string;
package/dist/client.d.ts CHANGED
@@ -82,7 +82,7 @@ declare class TableQuery<Row extends Record<string, unknown>, Result = Row> {
82
82
  /** One entry of `operations.manifest.json` (generated by `orm generate`). */
83
83
  interface ManifestOperation {
84
84
  readonly hash: string;
85
- readonly kind: 'query' | 'mutation' | 'action';
85
+ readonly kind: 'query' | 'mutation';
86
86
  readonly requires: {
87
87
  readonly capability?: string;
88
88
  readonly role?: string;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/client/transport.ts","../src/client/query-builder.ts","../src/client/operations.ts","../src/client/index.ts"],"names":[],"mappings":"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","file":"client.js","sourcesContent":["/** Namespace names become Postgres identifiers (`orm_<ns>` schema, `orm_<ns>_consumer` role) — the tight grammar is a security control, not cosmetics. */\nexport const NAMESPACE_PATTERN = /^[a-z][a-z0-9_]{0,40}$/\n\nexport const IDENTIFIER_PATTERN = /^[a-z][a-z0-9_]*$/\nexport const MAX_IDENTIFIER_LENGTH = 63\n\n/**\n * The Data API carries a delegated, attenuated data token on this header (not\n * `Authorization`, which stays the app-user/session bearer). One definition\n * shared by the client transport, the server's caller resolver, and the\n * function-invoke minter, so all three agree.\n */\nexport const ORM_DATA_TOKEN_HEADER = 'x-sequence-data-token'\n\n/**\n * The SEPARATE header the invoke proxy uses to hand a managed function its\n * *service* data token — the escalation path. A function receives BOTH this and\n * `ORM_DATA_TOKEN_HEADER`; the default `createOrmClient` reads the user token,\n * the deliberately-named `createServiceOrmClient` reads THIS one. Two distinct\n * headers so reaching for the service identity is always an explicit act, never\n * an accidental default. Both are sent to the Data API on `ORM_DATA_TOKEN_HEADER`\n * — the server stays mode-agnostic and resolves whatever sub the token carries.\n */\nexport const ORM_SERVICE_DATA_TOKEN_HEADER = 'x-sequence-data-token-service'\n\n/**\n * Custom Roles & Capabilities claim keys as policies reference them: a\n * host-scoped registry key, or an org pin's `org/<key>`. Matches the registry\n * key grammar EXACTLY (`[a-z0-9-]`, 1–64 chars, no `_` — the FGA object-id\n * delimiter) so any capability that's declarable/attachable in namespace.yaml\n * can also be referenced here — a stricter pattern would let a valid key\n * register yet fail at apply (e.g. `org/2fa`, a one-char or digit-led key).\n */\nexport const CAPABILITY_KEY_PATTERN = /^(?:org\\/)?[a-z0-9-]{1,64}$/\n\nexport const CLAIM_KEY_PATTERN = /^[a-z][a-z0-9_]*$/\n\n/** Qualified reference to a table outside the defining file: `<schema>.<table>`. */\nexport const QUALIFIED_TABLE_PATTERN = /^[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*$/\n\n/** Synced reflected sources are restricted to the gold layer. */\nexport const SYNCED_SOURCE_PATTERN = /^gold\\.[a-z][a-z0-9_]*$/\n\nexport const ORM_SCHEMA_PREFIX = 'orm_'\nexport const CONSUMER_ROLE_SUFFIX = '_consumer'\n\nexport const ormSchemaName = (namespace: string): string => `${ORM_SCHEMA_PREFIX}${namespace}`\nexport const consumerRoleName = (namespace: string): string =>\n `${ORM_SCHEMA_PREFIX}${namespace}${CONSUMER_ROLE_SUFFIX}`\n\nexport const DEFINITION_FILE_EXTENSIONS = ['.yml', '.yaml'] as const\n\n/** Reserved basenames for the namespace-level config file (description, org capability pins). */\nexport const NAMESPACE_CONFIG_FILENAMES = new Set(['namespace.yaml', 'namespace.yml'])\n\nexport const HASH_DOMAIN = 'sequence-orm-definitions\\0'\n\n/**\n * The one size guard the package owns: a per-file byte cap where the loader\n * reads untrusted YAML into memory — a real failure mode, not a product\n * limit. Counts of tables/indexes/params and policy/SQL lengths are\n * deliberately uncapped; Postgres enforces its own limits loudly at apply.\n */\nexport const MAX_DEFINITION_FILE_BYTES = 1024 * 1024\n\n/** `/api/data/<ns>/actions/…` and `/api/data/<ns>/query` share the table path segment. */\nexport const RESERVED_TABLE_NAMES = new Set(['actions', 'query'])\n\n/**\n * The Data API's query-string grammar owns these parameter names — a column\n * with one of them could never be filtered over the wire, so definitions\n * refuse it up front (\"validate rejects only what can never work\").\n */\nexport const RESERVED_COLUMN_NAMES = new Set(['select', 'order', 'limit', 'offset'])\n","/**\n * Fetch-based transport for the Data API. Deliberately free of node builtins\n * so the client runs anywhere a `fetch` exists — browsers, artifact bridges,\n * Cloud Functions, `node:vm` sandboxes.\n */\nimport { ORM_DATA_TOKEN_HEADER } from '../constants.js'\n\nexport class OrmClientError extends Error {\n // Widened to `string` so subclasses (e.g. OrmOperationError) can rename.\n override readonly name: string = 'OrmClientError'\n\n constructor(\n message: string,\n readonly status: number | null = null,\n ) {\n super(message)\n }\n}\n\nexport interface OrmTransport {\n get(path: string, params: URLSearchParams): Promise<unknown>\n post(path: string, body: unknown): Promise<unknown>\n}\n\nexport function createFetchTransport({\n baseUrl,\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: {\n baseUrl: string\n /** App-user / session bearer → `Authorization: Bearer`. */\n getToken?: () => Promise<string | null> | string | null\n /** Delegated, attenuated function token → the `ORM_DATA_TOKEN_HEADER`. */\n getDataToken?: () => Promise<string | null> | string | null\n fetchImpl?: typeof globalThis.fetch\n}): OrmTransport {\n if (!fetchImpl) throw new OrmClientError('no fetch implementation available')\n if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {\n throw new OrmClientError('provide exactly one of getToken (bearer) or getDataToken (delegated)')\n }\n const root = baseUrl.replace(/\\/+$/, '')\n\n const request = async (path: string, init: Omit<RequestInit, 'headers'>): Promise<unknown> => {\n const token = await (getDataToken ?? getToken)!()\n if (!token) throw new OrmClientError('not authenticated — no token available')\n // The delegated token rides its own header; the app-user bearer rides Authorization.\n const auth: Record<string, string> = getDataToken\n ? { [ORM_DATA_TOKEN_HEADER]: token }\n : { Authorization: `Bearer ${token}` }\n\n const response = await fetchImpl(`${root}${path}`, {\n ...init,\n headers: { ...auth, 'Content-Type': 'application/json' },\n })\n const payload: unknown = await response.json().catch(() => null)\n if (!response.ok) {\n const detail =\n payload && typeof payload === 'object' && 'detail' in payload\n ? String((payload as { detail: unknown }).detail)\n : `HTTP ${response.status}`\n throw new OrmClientError(detail, response.status)\n }\n return payload\n }\n\n return {\n get: (path, params) => {\n // Not params.size — that's Node 19.8+/2023-browser surface, newer than\n // the fetch this module documents as its only requirement.\n const serialized = params.toString()\n return request(serialized === '' ? path : `${path}?${serialized}`, {})\n },\n post: (path, body) => request(path, { method: 'POST', body: JSON.stringify(body ?? {}) }),\n }\n}\n","import { OrmClientError, type OrmTransport } from './transport.js'\n\n/**\n * Fluent read query over one table. Serializes to exactly the PostgREST\n * subset the Data API's query parser accepts — the round-trip contract is\n * asserted server-side (builder output → parseReadQuery) so the two ends\n * can't drift apart silently.\n *\n * IMMUTABLE: every method returns a new query, so narrowing `select()` can\n * never leave an alias holding a stale wider row type, and a base query can\n * be safely forked into variants.\n */\n\nexport type FilterValue = string | number | boolean\n\nexport interface ReadResponse<Row> {\n readonly rows: readonly Row[]\n readonly limit: number\n readonly offset: number\n}\n\n/** Characters the in-list grammar cannot carry — there is no escaping, so the builder hard-fails. */\nconst IN_LIST_UNREPRESENTABLE = /[,()]/\n\ninterface QueryState {\n readonly filters: ReadonlyArray<[column: string, expression: string]>\n readonly orderings: readonly string[]\n readonly selection: readonly string[] | null\n readonly limitValue: number | null\n readonly offsetValue: number | null\n}\n\nconst EMPTY_STATE: QueryState = {\n filters: [],\n orderings: [],\n selection: null,\n limitValue: null,\n offsetValue: null,\n}\n\n/**\n * `Row` is the TABLE's row (filters and order always accept every column);\n * `Result` is what rows() yields — narrowed by select(), re-widenable by a\n * later select() since keys always come from Row.\n */\nexport class TableQuery<Row extends Record<string, unknown>, Result = Row> {\n constructor(\n private readonly transport: OrmTransport,\n private readonly namespace: string,\n private readonly table: string,\n private readonly state: QueryState = EMPTY_STATE,\n ) {}\n\n private with(patch: Partial<QueryState>): TableQuery<Row, Result> {\n return new TableQuery(this.transport, this.namespace, this.table, { ...this.state, ...patch })\n }\n\n select<K extends keyof Row & string>(...columns: [K, ...K[]]): TableQuery<Row, Pick<Row, K>> {\n return new TableQuery<Row, Pick<Row, K>>(this.transport, this.namespace, this.table, {\n ...this.state,\n selection: columns,\n })\n }\n\n eq<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'eq', value)\n }\n\n ne<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'ne', value)\n }\n\n gt<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'gt', value)\n }\n\n gte<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'gte', value)\n }\n\n lt<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'lt', value)\n }\n\n lte<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'lte', value)\n }\n\n like<K extends keyof Row & string>(column: K, pattern: string): TableQuery<Row, Result> {\n return this.filter(column, 'like', pattern)\n }\n\n ilike<K extends keyof Row & string>(column: K, pattern: string): TableQuery<Row, Result> {\n return this.filter(column, 'ilike', pattern)\n }\n\n in<K extends keyof Row & string>(column: K, values: readonly FilterValue[]): TableQuery<Row, Result> {\n // An empty list is representable — `in.()` matches nothing, the same\n // semantics the server executes. Blank entries are legitimate values in\n // multi-entry lists (`in.(a,)` carries ['a','']), but a LONE '' renders\n // as `in.()` and silently becomes the empty list — unrepresentable.\n // Beyond that only characters the grammar can't escape, and whitespace\n // padding the server-side split would silently swallow, are refused.\n const rendered = values.map((value) => {\n const text = String(value)\n if (IN_LIST_UNREPRESENTABLE.test(text) || text !== text.trim()) {\n throw new OrmClientError(`in() value '${text}' cannot be represented — the list grammar has no escaping`)\n }\n return text\n })\n if (rendered.length === 1 && rendered[0] === '') {\n throw new OrmClientError(\"in() with a lone '' cannot be represented — it would read as the empty list\")\n }\n return this.with({ filters: [...this.state.filters, [column, `in.(${rendered.join(',')})`]] })\n }\n\n is<K extends keyof Row & string>(column: K, value: null | boolean): TableQuery<Row, Result> {\n return this.with({\n filters: [...this.state.filters, [column, `is.${value === null ? 'null' : value}`]],\n })\n }\n\n order<K extends keyof Row & string>(column: K, direction: 'asc' | 'desc' = 'asc'): TableQuery<Row, Result> {\n return this.with({ orderings: [...this.state.orderings, `${column}.${direction}`] })\n }\n\n limit(value: number): TableQuery<Row, Result> {\n return this.with({ limitValue: value })\n }\n\n offset(value: number): TableQuery<Row, Result> {\n return this.with({ offsetValue: value })\n }\n\n /** The exact query string sent to the Data API — exposed for debugging and the grammar contract test. */\n searchParams(): URLSearchParams {\n const params = new URLSearchParams()\n for (const [column, expression] of this.state.filters) params.append(column, expression)\n if (this.state.orderings.length > 0) params.set('order', this.state.orderings.join(','))\n if (this.state.selection) params.set('select', this.state.selection.join(','))\n if (this.state.limitValue !== null) params.set('limit', String(this.state.limitValue))\n if (this.state.offsetValue !== null) params.set('offset', String(this.state.offsetValue))\n return params\n }\n\n async rows(): Promise<Result[]> {\n const payload = await this.transport.get(\n `/api/data/${this.namespace}/${this.table}`,\n this.searchParams(),\n )\n if (!payload || typeof payload !== 'object' || !Array.isArray((payload as { rows?: unknown }).rows)) {\n throw new OrmClientError('unexpected Data API response shape — missing rows array')\n }\n return (payload as { rows: Result[] }).rows\n }\n\n private filter(column: string, op: string, value: FilterValue): TableQuery<Row, Result> {\n return this.with({ filters: [...this.state.filters, [column, `${op}.${String(value)}`]] })\n }\n}\n","/**\n * Persisted-operation client for the v2 data plane. The wire carries only\n * `{ op: <hash>, variables }` — never GraphQL text, never SQL. Like the rest\n * of `./client`, this module is deliberately free of node builtins and third-\n * party deps (no @apollo/client import): Apollo integration happens through a\n * fetch-compatible shim (`createOrmFetch`) handed to `HttpLink({ fetch })`.\n */\nimport { OrmClientError } from './transport.js'\nimport { ORM_DATA_TOKEN_HEADER } from '../constants.js'\n\n/** One entry of `operations.manifest.json` (generated by `orm generate`). */\nexport interface ManifestOperation {\n readonly hash: string\n readonly kind: 'query' | 'mutation' | 'action'\n readonly requires: { readonly capability?: string; readonly role?: string } | null\n}\n\nexport interface OperationsManifest {\n readonly schemaHash: string\n readonly opsHash?: string\n readonly operations: Readonly<Record<string, ManifestOperation>>\n}\n\n/** GraphQL-spec error envelope the data plane returns. */\nexport interface OperationErrorEntry {\n readonly message: string\n readonly extensions?: { readonly code?: string }\n}\n\nexport class OrmOperationError extends OrmClientError {\n override readonly name = 'OrmOperationError'\n\n constructor(\n message: string,\n status: number | null,\n readonly code: string | null,\n readonly errors: readonly OperationErrorEntry[] = [],\n ) {\n super(message, status)\n }\n}\n\nexport interface OperationExecutorConfig {\n /** Deployment host root, e.g. `https://atlas.seqholdings.com`. */\n baseUrl: string\n namespace: string\n manifest: OperationsManifest\n /** App-user / session bearer → `Authorization: Bearer`. */\n getToken?: () => Promise<string | null> | string | null\n /** Delegated, attenuated function token → the `ORM_DATA_TOKEN_HEADER`. */\n getDataToken?: () => Promise<string | null> | string | null\n fetchImpl?: typeof globalThis.fetch\n}\n\nexport interface OperationExecutor {\n /** Execute a manifest operation by name (or a raw `sha256:` hash). */\n execute<TData = Record<string, unknown>>(\n op: string,\n variables?: Record<string, unknown>,\n ): Promise<TData>\n}\n\nconst dataPlanePath = (namespace: string): string => `/_data/v2/${namespace}`\n\nfunction resolveOpHash(manifest: OperationsManifest, op: string): string {\n if (op.startsWith('sha256:')) return op\n const entry = manifest.operations[op]\n if (!entry) {\n const known = Object.keys(manifest.operations).sort()\n throw new OrmClientError(\n `unknown operation \"${op}\" — not in the manifest (${known.length} known). ` +\n 'Re-run `seq-studio orm generate` after editing graphql documents.',\n )\n }\n return entry.hash\n}\n\nexport function createOperationExecutor({\n baseUrl,\n namespace,\n manifest,\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: OperationExecutorConfig): OperationExecutor {\n if (!fetchImpl) throw new OrmClientError('no fetch implementation available')\n if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {\n throw new OrmClientError('provide exactly one of getToken (bearer) or getDataToken (delegated)')\n }\n const root = baseUrl.replace(/\\/+$/, '')\n\n return {\n async execute<TData = Record<string, unknown>>(\n op: string,\n variables: Record<string, unknown> = {},\n ): Promise<TData> {\n const hash = resolveOpHash(manifest, op)\n const token = await (getDataToken ?? getToken)!()\n if (!token) throw new OrmClientError('not authenticated — no token available')\n const auth: Record<string, string> = getDataToken\n ? { [ORM_DATA_TOKEN_HEADER]: token }\n : { Authorization: `Bearer ${token}` }\n\n const response = await fetchImpl(`${root}${dataPlanePath(namespace)}`, {\n method: 'POST',\n headers: { ...auth, 'Content-Type': 'application/json' },\n body: JSON.stringify({ op: hash, variables }),\n })\n const payload = (await response.json().catch(() => null)) as\n | { data?: TData | null; errors?: OperationErrorEntry[] }\n | null\n\n const errors = payload?.errors ?? []\n if (!response.ok || errors.length > 0) {\n const first = errors[0]\n throw new OrmOperationError(\n first?.message ?? `HTTP ${response.status}`,\n response.status,\n first?.extensions?.code ?? null,\n errors,\n )\n }\n if (!payload || payload.data === undefined || payload.data === null) {\n throw new OrmOperationError('malformed response: missing data', response.status, null)\n }\n return payload.data\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level convenience for generated server functions (`db<Name>`)\n// ---------------------------------------------------------------------------\n\nlet configured: OperationExecutor | null = null\n\n/**\n * Configure the process-wide executor the generated `db<Name>` server\n * functions call through. Call once at startup (server-side); browser apps\n * should prefer Apollo + `createOrmFetch` or an explicit executor.\n */\nexport function configureOrmOperations(config: OperationExecutorConfig): OperationExecutor {\n configured = createOperationExecutor(config)\n return configured\n}\n\n/** Used by generated code: `executeOperation({ op: 'getOpenDeals', variables })`. */\nexport async function executeOperation<TData = Record<string, unknown>>({\n op,\n variables,\n}: {\n op: string\n variables?: Record<string, unknown>\n}): Promise<TData> {\n if (!configured) {\n throw new OrmClientError(\n 'ORM operations client not configured — call configureOrmOperations({ baseUrl, namespace, manifest, getToken }) at startup',\n )\n }\n return configured.execute<TData>(op, variables)\n}\n\n// ---------------------------------------------------------------------------\n// Apollo integration without an @apollo/client dependency\n// ---------------------------------------------------------------------------\n\n/**\n * A fetch-compatible function for `new HttpLink({ uri: '/unused', fetch: createOrmFetch(...) })`.\n * Intercepts Apollo's GraphQL POST, swaps the body for the persisted-op\n * envelope (`{ op: <hash>, variables }`) resolved via the manifest's\n * operationName, rewrites the URL to the data plane, and attaches auth.\n * The GraphQL-spec response body passes through untouched, so InMemoryCache\n * and error links behave exactly as they do against a GraphQL server.\n */\nexport function createOrmFetch({\n baseUrl,\n namespace,\n manifest,\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: OperationExecutorConfig): typeof globalThis.fetch {\n if (!fetchImpl) throw new OrmClientError('no fetch implementation available')\n if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {\n throw new OrmClientError('provide exactly one of getToken (bearer) or getDataToken (delegated)')\n }\n const root = baseUrl.replace(/\\/+$/, '')\n const url = `${root}${dataPlanePath(namespace)}`\n\n // Derived from `globalThis.fetch` rather than naming `RequestInfo` (a DOM-lib\n // global this module compiles without). The input is ignored — Apollo's\n // HttpLink calls the injected fetch with a string URI, and the real target\n // URL is fixed at `url` above.\n return async (_input: Parameters<typeof globalThis.fetch>[0], init?: RequestInit): Promise<Response> => {\n const raw = typeof init?.body === 'string' ? init.body : null\n const parsed = raw\n ? (JSON.parse(raw) as { operationName?: string; variables?: Record<string, unknown> })\n : {}\n const name = parsed.operationName\n if (!name) {\n throw new OrmClientError(\n 'createOrmFetch requires named operations (Apollo sends operationName for named documents)',\n )\n }\n const hash = resolveOpHash(manifest, name)\n const token = await (getDataToken ?? getToken)!()\n if (!token) throw new OrmClientError('not authenticated — no token available')\n const auth: Record<string, string> = getDataToken\n ? { [ORM_DATA_TOKEN_HEADER]: token }\n : { Authorization: `Bearer ${token}` }\n\n return fetchImpl(url, {\n method: 'POST',\n headers: { ...auth, 'Content-Type': 'application/json' },\n body: JSON.stringify({ op: hash, variables: parsed.variables ?? {} }),\n })\n }\n}\n","import { OrmClientError, createFetchTransport, type OrmTransport } from './transport.js'\nimport { TableQuery } from './query-builder.js'\n\n/** Bindable scalar for `query()` placeholders ($1, $2, …). */\nexport type QueryParam = string | number | boolean | null\n\n/** Shape of one action in the generated `<Ns>Actions` map — params in, result out. */\nexport interface OrmActionShape {\n readonly params?: Record<string, unknown>\n readonly result: unknown\n}\n\n/** The generated `<Ns>Actions` map: action name → its param and result shapes. */\nexport type OrmActions = Record<string, OrmActionShape>\n\n/**\n * `action()`'s argument list: `params` is required when the action declares a\n * required field, optional otherwise. The empty-object type is assignable to\n * the params shape only when every field is optional, so that assignability is\n * the discriminant.\n */\ntype ActionArgs<Action extends OrmActionShape> =\n Record<string, never> extends NonNullable<Action['params']>\n ? [params?: NonNullable<Action['params']>]\n : [params: NonNullable<Action['params']>]\n\n/**\n * Typed read client for one namespace's Data API. `Tables` comes from\n * `types.gen.ts` (wire types the apply refreshes from the YAML definitions),\n * so column names and row shapes are checked at compile time; the server\n * re-validates everything and Postgres RLS decides row visibility.\n *\n * ```ts\n * const client = createOrmClient<LendingTables>({ namespace: 'lending', baseUrl, getToken })\n * const rows = await client.table('loans').select('id', 'balance').gte('balance', 1000).rows()\n * const top = await client.query<{ officer: string; total: string }>(\n * 'select officer, sum(balance) as total from loans group by officer order by total desc limit $1',\n * [5],\n * )\n * ```\n */\nexport interface OrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n> {\n table<Name extends keyof Tables & string>(name: Name): TableQuery<Tables[Name]>\n /**\n * Raw read-only SQL for everything the filter grammar can't say —\n * aggregates, joins, OR, expressions, CTEs. The same sandbox as every\n * read: the namespace consumer role (grants stop at the namespace schema),\n * Postgres RLS over the caller's claims, and a READ ONLY transaction —\n * Postgres itself rejects writes, which stay on declared actions. Values\n * bind as $1, $2, … placeholders; never interpolate them into the string.\n */\n query<Row = Record<string, unknown>>(sql: string, params?: readonly QueryParam[]): Promise<Row[]>\n /**\n * Invoke a declared action — the only write path the Data API exposes. The\n * params and result are typed from the namespace's `<Ns>Actions`: an action\n * with `returns:` resolves to `{ rows: Row[] }`, a count action to\n * `{ rowsAffected: number }`.\n */\n action<Name extends keyof Actions & string>(\n name: Name,\n ...args: ActionArgs<Actions[Name]>\n ): Promise<Actions[Name]['result']>\n}\n\nexport function createOrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n>({\n namespace,\n baseUrl,\n getToken,\n fetchImpl,\n transport,\n dataToken,\n}: {\n namespace: string\n baseUrl?: string\n /** App-user / session bearer (CLI, browser). Mutually exclusive with dataToken. */\n getToken?: () => Promise<string | null> | string | null\n /**\n * Delegated function data token — the inbound `ORM_DATA_TOKEN_HEADER` value a\n * managed function receives. Pass it and the client authenticates as the\n * invoking user, scoped to the function's declared refs; no manual transport.\n */\n dataToken?: string | (() => Promise<string | null> | string | null)\n fetchImpl?: typeof globalThis.fetch\n /** Injected transport (tests, bridges); overrides baseUrl/getToken/dataToken. */\n transport?: OrmTransport\n}): OrmClient<Tables, Actions> {\n const resolved =\n transport ??\n createFetchTransport({\n baseUrl: requireOption(baseUrl, 'baseUrl'),\n ...(dataToken !== undefined\n ? { getDataToken: typeof dataToken === 'function' ? dataToken : () => dataToken }\n : { getToken: requireOption(getToken, 'getToken') }),\n fetchImpl,\n })\n\n return buildOrmClient<Tables, Actions>(resolved, namespace)\n}\n\n/**\n * The ESCALATION path — use only deliberately. A managed function receives a\n * separate *service* data token on `ORM_SERVICE_DATA_TOKEN_HEADER`; pass that\n * value here and the client authenticates as the function's SERVICE IDENTITY,\n * not the invoking user. Reads run with the service identity's grants (clamped\n * to the function's declared refs), NOT the caller's — so the caller's own row\n * visibility does not apply. The invoking user is still recorded for audit.\n *\n * Default to `createOrmClient` (acts as the invoking user, full per-user RLS).\n * Reach for this only when the function must intentionally act beyond the\n * caller — e.g. enforcing per-user rules in code over a coarse upstream that\n * has no granular permissions of its own. The distinct name is the guardrail:\n * choosing the service identity is always explicit and greppable.\n *\n * ```ts\n * const client = createServiceOrmClient<LendingTables>({\n * namespace: 'lending',\n * baseUrl,\n * serviceDataToken: req.headers['x-sequence-data-token-service'],\n * })\n * ```\n */\nexport function createServiceOrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n>({\n namespace,\n baseUrl,\n serviceDataToken,\n fetchImpl,\n transport,\n}: {\n namespace: string\n baseUrl?: string\n /** The inbound `ORM_SERVICE_DATA_TOKEN_HEADER` value — the function's service token. */\n serviceDataToken?: string | (() => Promise<string | null> | string | null)\n fetchImpl?: typeof globalThis.fetch\n /** Injected transport (tests, bridges); overrides baseUrl/serviceDataToken. */\n transport?: OrmTransport\n}): OrmClient<Tables, Actions> {\n const resolved =\n transport ??\n createFetchTransport({\n baseUrl: requireOption(baseUrl, 'baseUrl'),\n getDataToken:\n typeof serviceDataToken === 'function'\n ? serviceDataToken\n : () => requireOption(serviceDataToken, 'serviceDataToken'),\n fetchImpl,\n })\n\n return buildOrmClient<Tables, Actions>(resolved, namespace)\n}\n\n/** Shared client surface over a resolved transport — the token/identity choice is made by the factory above. */\nfunction buildOrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n>(resolved: OrmTransport, namespace: string): OrmClient<Tables, Actions> {\n return {\n table(name) {\n return new TableQuery(resolved, namespace, name)\n },\n async query(sql, params) {\n const payload = await resolved.post(`/api/data/${namespace}/query`, {\n sql,\n ...(params ? { params: [...params] } : {}),\n })\n if (!payload || typeof payload !== 'object' || !Array.isArray((payload as { rows?: unknown }).rows)) {\n throw new OrmClientError('unexpected Data API response shape — missing rows array')\n }\n return (payload as { rows: never[] }).rows\n },\n async action(name, ...args) {\n const payload = await resolved.post(`/api/data/${namespace}/actions/${name}`, args[0] ?? {})\n if (payload && typeof payload === 'object') {\n // A returns action responds with `rows`; a count action with\n // `rows_affected` (mapped to `rowsAffected` for the client).\n if (Array.isArray((payload as { rows?: unknown }).rows)) {\n return { rows: (payload as { rows: unknown[] }).rows } as Awaited<ReturnType<OrmClient<Tables, Actions>['action']>>\n }\n if ('rows_affected' in payload) {\n const rowsAffected = Number((payload as { rows_affected: unknown }).rows_affected)\n if (!Number.isNaN(rowsAffected)) {\n return { rowsAffected } as Awaited<ReturnType<OrmClient<Tables, Actions>['action']>>\n }\n }\n }\n throw new OrmClientError('unexpected action response shape — expected rows or rows_affected')\n },\n }\n}\n\nfunction requireOption<T>(value: T | undefined, name: string): T {\n if (value === undefined) throw new Error(`createOrmClient requires ${name} when no transport is injected`)\n return value\n}\n\nexport { TableQuery, type FilterValue, type ReadResponse } from './query-builder.js'\nexport { createFetchTransport, OrmClientError, type OrmTransport } from './transport.js'\n\nexport {\n OrmOperationError,\n configureOrmOperations,\n createOperationExecutor,\n createOrmFetch,\n executeOperation,\n} from './operations.js'\nexport type {\n ManifestOperation,\n OperationErrorEntry,\n OperationExecutor,\n OperationExecutorConfig,\n OperationsManifest,\n} from './operations.js'\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/client/transport.ts","../src/client/query-builder.ts","../src/client/operations.ts","../src/client/index.ts"],"names":[],"mappings":"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","file":"client.js","sourcesContent":["/** Namespace names become Postgres identifiers (`orm_<ns>` schema, `orm_<ns>_consumer` role) — the tight grammar is a security control, not cosmetics. */\nexport const NAMESPACE_PATTERN = /^[a-z][a-z0-9_]{0,40}$/\n\nexport const IDENTIFIER_PATTERN = /^[a-z][a-z0-9_]*$/\nexport const MAX_IDENTIFIER_LENGTH = 63\n\n/**\n * The Data API carries a delegated, attenuated data token on this header (not\n * `Authorization`, which stays the app-user/session bearer). One definition\n * shared by the client transport, the server's caller resolver, and the\n * function-invoke minter, so all three agree.\n */\nexport const ORM_DATA_TOKEN_HEADER = 'x-sequence-data-token'\n\n/**\n * The SEPARATE header the invoke proxy uses to hand a managed function its\n * *service* data token — the escalation path. A function receives BOTH this and\n * `ORM_DATA_TOKEN_HEADER`; the default `createOrmClient` reads the user token,\n * the deliberately-named `createServiceOrmClient` reads THIS one. Two distinct\n * headers so reaching for the service identity is always an explicit act, never\n * an accidental default. Both are sent to the Data API on `ORM_DATA_TOKEN_HEADER`\n * — the server stays mode-agnostic and resolves whatever sub the token carries.\n */\nexport const ORM_SERVICE_DATA_TOKEN_HEADER = 'x-sequence-data-token-service'\n\n/**\n * Custom Roles & Capabilities claim keys as policies reference them: a\n * host-scoped registry key, or an org pin's `org/<key>`. Matches the registry\n * key grammar EXACTLY (`[a-z0-9-]`, 1–64 chars, no `_` — the FGA object-id\n * delimiter) so any capability that's declarable/attachable in namespace.yaml\n * can also be referenced here — a stricter pattern would let a valid key\n * register yet fail at apply (e.g. `org/2fa`, a one-char or digit-led key).\n */\nexport const CAPABILITY_KEY_PATTERN = /^(?:org\\/)?[a-z0-9-]{1,64}$/\n\nexport const CLAIM_KEY_PATTERN = /^[a-z][a-z0-9_]*$/\n\n/** Qualified reference to a table outside the defining file: `<schema>.<table>`. */\nexport const QUALIFIED_TABLE_PATTERN = /^[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*$/\n\n/** Synced reflected sources are restricted to the gold layer. */\nexport const SYNCED_SOURCE_PATTERN = /^gold\\.[a-z][a-z0-9_]*$/\n\nexport const ORM_SCHEMA_PREFIX = 'orm_'\nexport const CONSUMER_ROLE_SUFFIX = '_consumer'\n\nexport const ormSchemaName = (namespace: string): string => `${ORM_SCHEMA_PREFIX}${namespace}`\nexport const consumerRoleName = (namespace: string): string =>\n `${ORM_SCHEMA_PREFIX}${namespace}${CONSUMER_ROLE_SUFFIX}`\n\nexport const DEFINITION_FILE_EXTENSIONS = ['.yml', '.yaml'] as const\n\n/** Reserved basenames for the namespace-level config file (description, org capability pins). */\nexport const NAMESPACE_CONFIG_FILENAMES = new Set(['namespace.yaml', 'namespace.yml'])\n\nexport const HASH_DOMAIN = 'sequence-orm-definitions\\0'\n\n/**\n * The one size guard the package owns: a per-file byte cap where the loader\n * reads untrusted YAML into memory — a real failure mode, not a product\n * limit. Counts of tables/indexes/params and policy/SQL lengths are\n * deliberately uncapped; Postgres enforces its own limits loudly at apply.\n */\nexport const MAX_DEFINITION_FILE_BYTES = 1024 * 1024\n\n/** `/api/data/<ns>/actions/…` and `/api/data/<ns>/query` share the table path segment. */\nexport const RESERVED_TABLE_NAMES = new Set(['actions', 'query'])\n\n/**\n * The Data API's query-string grammar owns these parameter names — a column\n * with one of them could never be filtered over the wire, so definitions\n * refuse it up front (\"validate rejects only what can never work\").\n */\nexport const RESERVED_COLUMN_NAMES = new Set(['select', 'order', 'limit', 'offset'])\n","/**\n * Fetch-based transport for the Data API. Deliberately free of node builtins\n * so the client runs anywhere a `fetch` exists — browsers, artifact bridges,\n * Cloud Functions, `node:vm` sandboxes.\n */\nimport { ORM_DATA_TOKEN_HEADER } from '../constants.js'\n\nexport class OrmClientError extends Error {\n // Widened to `string` so subclasses (e.g. OrmOperationError) can rename.\n override readonly name: string = 'OrmClientError'\n\n constructor(\n message: string,\n readonly status: number | null = null,\n ) {\n super(message)\n }\n}\n\nexport interface OrmTransport {\n get(path: string, params: URLSearchParams): Promise<unknown>\n post(path: string, body: unknown): Promise<unknown>\n}\n\nexport function createFetchTransport({\n baseUrl,\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: {\n baseUrl: string\n /** App-user / session bearer → `Authorization: Bearer`. */\n getToken?: () => Promise<string | null> | string | null\n /** Delegated, attenuated function token → the `ORM_DATA_TOKEN_HEADER`. */\n getDataToken?: () => Promise<string | null> | string | null\n fetchImpl?: typeof globalThis.fetch\n}): OrmTransport {\n if (!fetchImpl) throw new OrmClientError('no fetch implementation available')\n if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {\n throw new OrmClientError('provide exactly one of getToken (bearer) or getDataToken (delegated)')\n }\n const root = baseUrl.replace(/\\/+$/, '')\n\n const request = async (path: string, init: Omit<RequestInit, 'headers'>): Promise<unknown> => {\n const token = await (getDataToken ?? getToken)!()\n if (!token) throw new OrmClientError('not authenticated — no token available')\n // The delegated token rides its own header; the app-user bearer rides Authorization.\n const auth: Record<string, string> = getDataToken\n ? { [ORM_DATA_TOKEN_HEADER]: token }\n : { Authorization: `Bearer ${token}` }\n\n const response = await fetchImpl(`${root}${path}`, {\n ...init,\n headers: { ...auth, 'Content-Type': 'application/json' },\n })\n const payload: unknown = await response.json().catch(() => null)\n if (!response.ok) {\n const detail =\n payload && typeof payload === 'object' && 'detail' in payload\n ? String((payload as { detail: unknown }).detail)\n : `HTTP ${response.status}`\n throw new OrmClientError(detail, response.status)\n }\n return payload\n }\n\n return {\n get: (path, params) => {\n // Not params.size — that's Node 19.8+/2023-browser surface, newer than\n // the fetch this module documents as its only requirement.\n const serialized = params.toString()\n return request(serialized === '' ? path : `${path}?${serialized}`, {})\n },\n post: (path, body) => request(path, { method: 'POST', body: JSON.stringify(body ?? {}) }),\n }\n}\n","import { OrmClientError, type OrmTransport } from './transport.js'\n\n/**\n * Fluent read query over one table. Serializes to exactly the PostgREST\n * subset the Data API's query parser accepts — the round-trip contract is\n * asserted server-side (builder output → parseReadQuery) so the two ends\n * can't drift apart silently.\n *\n * IMMUTABLE: every method returns a new query, so narrowing `select()` can\n * never leave an alias holding a stale wider row type, and a base query can\n * be safely forked into variants.\n */\n\nexport type FilterValue = string | number | boolean\n\nexport interface ReadResponse<Row> {\n readonly rows: readonly Row[]\n readonly limit: number\n readonly offset: number\n}\n\n/** Characters the in-list grammar cannot carry — there is no escaping, so the builder hard-fails. */\nconst IN_LIST_UNREPRESENTABLE = /[,()]/\n\ninterface QueryState {\n readonly filters: ReadonlyArray<[column: string, expression: string]>\n readonly orderings: readonly string[]\n readonly selection: readonly string[] | null\n readonly limitValue: number | null\n readonly offsetValue: number | null\n}\n\nconst EMPTY_STATE: QueryState = {\n filters: [],\n orderings: [],\n selection: null,\n limitValue: null,\n offsetValue: null,\n}\n\n/**\n * `Row` is the TABLE's row (filters and order always accept every column);\n * `Result` is what rows() yields — narrowed by select(), re-widenable by a\n * later select() since keys always come from Row.\n */\nexport class TableQuery<Row extends Record<string, unknown>, Result = Row> {\n constructor(\n private readonly transport: OrmTransport,\n private readonly namespace: string,\n private readonly table: string,\n private readonly state: QueryState = EMPTY_STATE,\n ) {}\n\n private with(patch: Partial<QueryState>): TableQuery<Row, Result> {\n return new TableQuery(this.transport, this.namespace, this.table, { ...this.state, ...patch })\n }\n\n select<K extends keyof Row & string>(...columns: [K, ...K[]]): TableQuery<Row, Pick<Row, K>> {\n return new TableQuery<Row, Pick<Row, K>>(this.transport, this.namespace, this.table, {\n ...this.state,\n selection: columns,\n })\n }\n\n eq<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'eq', value)\n }\n\n ne<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'ne', value)\n }\n\n gt<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'gt', value)\n }\n\n gte<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'gte', value)\n }\n\n lt<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'lt', value)\n }\n\n lte<K extends keyof Row & string>(column: K, value: FilterValue): TableQuery<Row, Result> {\n return this.filter(column, 'lte', value)\n }\n\n like<K extends keyof Row & string>(column: K, pattern: string): TableQuery<Row, Result> {\n return this.filter(column, 'like', pattern)\n }\n\n ilike<K extends keyof Row & string>(column: K, pattern: string): TableQuery<Row, Result> {\n return this.filter(column, 'ilike', pattern)\n }\n\n in<K extends keyof Row & string>(column: K, values: readonly FilterValue[]): TableQuery<Row, Result> {\n // An empty list is representable — `in.()` matches nothing, the same\n // semantics the server executes. Blank entries are legitimate values in\n // multi-entry lists (`in.(a,)` carries ['a','']), but a LONE '' renders\n // as `in.()` and silently becomes the empty list — unrepresentable.\n // Beyond that only characters the grammar can't escape, and whitespace\n // padding the server-side split would silently swallow, are refused.\n const rendered = values.map((value) => {\n const text = String(value)\n if (IN_LIST_UNREPRESENTABLE.test(text) || text !== text.trim()) {\n throw new OrmClientError(`in() value '${text}' cannot be represented — the list grammar has no escaping`)\n }\n return text\n })\n if (rendered.length === 1 && rendered[0] === '') {\n throw new OrmClientError(\"in() with a lone '' cannot be represented — it would read as the empty list\")\n }\n return this.with({ filters: [...this.state.filters, [column, `in.(${rendered.join(',')})`]] })\n }\n\n is<K extends keyof Row & string>(column: K, value: null | boolean): TableQuery<Row, Result> {\n return this.with({\n filters: [...this.state.filters, [column, `is.${value === null ? 'null' : value}`]],\n })\n }\n\n order<K extends keyof Row & string>(column: K, direction: 'asc' | 'desc' = 'asc'): TableQuery<Row, Result> {\n return this.with({ orderings: [...this.state.orderings, `${column}.${direction}`] })\n }\n\n limit(value: number): TableQuery<Row, Result> {\n return this.with({ limitValue: value })\n }\n\n offset(value: number): TableQuery<Row, Result> {\n return this.with({ offsetValue: value })\n }\n\n /** The exact query string sent to the Data API — exposed for debugging and the grammar contract test. */\n searchParams(): URLSearchParams {\n const params = new URLSearchParams()\n for (const [column, expression] of this.state.filters) params.append(column, expression)\n if (this.state.orderings.length > 0) params.set('order', this.state.orderings.join(','))\n if (this.state.selection) params.set('select', this.state.selection.join(','))\n if (this.state.limitValue !== null) params.set('limit', String(this.state.limitValue))\n if (this.state.offsetValue !== null) params.set('offset', String(this.state.offsetValue))\n return params\n }\n\n async rows(): Promise<Result[]> {\n const payload = await this.transport.get(\n `/api/data/${this.namespace}/${this.table}`,\n this.searchParams(),\n )\n if (!payload || typeof payload !== 'object' || !Array.isArray((payload as { rows?: unknown }).rows)) {\n throw new OrmClientError('unexpected Data API response shape — missing rows array')\n }\n return (payload as { rows: Result[] }).rows\n }\n\n private filter(column: string, op: string, value: FilterValue): TableQuery<Row, Result> {\n return this.with({ filters: [...this.state.filters, [column, `${op}.${String(value)}`]] })\n }\n}\n","/**\n * Persisted-operation client for the v2 data plane. The wire carries only\n * `{ op: <hash>, variables }` — never GraphQL text, never SQL. Like the rest\n * of `./client`, this module is deliberately free of node builtins and third-\n * party deps (no @apollo/client import): Apollo integration happens through a\n * fetch-compatible shim (`createOrmFetch`) handed to `HttpLink({ fetch })`.\n */\nimport { OrmClientError } from './transport.js'\nimport { ORM_DATA_TOKEN_HEADER } from '../constants.js'\n\n/** One entry of `operations.manifest.json` (generated by `orm generate`). */\nexport interface ManifestOperation {\n readonly hash: string\n readonly kind: 'query' | 'mutation'\n readonly requires: { readonly capability?: string; readonly role?: string } | null\n}\n\nexport interface OperationsManifest {\n readonly schemaHash: string\n readonly opsHash?: string\n readonly operations: Readonly<Record<string, ManifestOperation>>\n}\n\n/** GraphQL-spec error envelope the data plane returns. */\nexport interface OperationErrorEntry {\n readonly message: string\n readonly extensions?: { readonly code?: string }\n}\n\nexport class OrmOperationError extends OrmClientError {\n override readonly name = 'OrmOperationError'\n\n constructor(\n message: string,\n status: number | null,\n readonly code: string | null,\n readonly errors: readonly OperationErrorEntry[] = [],\n ) {\n super(message, status)\n }\n}\n\nexport interface OperationExecutorConfig {\n /** Deployment host root, e.g. `https://atlas.seqholdings.com`. */\n baseUrl: string\n namespace: string\n manifest: OperationsManifest\n /** App-user / session bearer → `Authorization: Bearer`. */\n getToken?: () => Promise<string | null> | string | null\n /** Delegated, attenuated function token → the `ORM_DATA_TOKEN_HEADER`. */\n getDataToken?: () => Promise<string | null> | string | null\n fetchImpl?: typeof globalThis.fetch\n}\n\nexport interface OperationExecutor {\n /** Execute a manifest operation by name (or a raw `sha256:` hash). */\n execute<TData = Record<string, unknown>>(\n op: string,\n variables?: Record<string, unknown>,\n ): Promise<TData>\n}\n\nconst dataPlanePath = (namespace: string): string => `/_data/v2/${namespace}`\n\nfunction resolveOpHash(manifest: OperationsManifest, op: string): string {\n if (op.startsWith('sha256:')) return op\n const entry = manifest.operations[op]\n if (!entry) {\n const known = Object.keys(manifest.operations).sort()\n throw new OrmClientError(\n `unknown operation \"${op}\" — not in the manifest (${known.length} known). ` +\n 'Re-run `seq-studio orm generate` after editing graphql documents.',\n )\n }\n return entry.hash\n}\n\nexport function createOperationExecutor({\n baseUrl,\n namespace,\n manifest,\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: OperationExecutorConfig): OperationExecutor {\n if (!fetchImpl) throw new OrmClientError('no fetch implementation available')\n if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {\n throw new OrmClientError('provide exactly one of getToken (bearer) or getDataToken (delegated)')\n }\n const root = baseUrl.replace(/\\/+$/, '')\n\n return {\n async execute<TData = Record<string, unknown>>(\n op: string,\n variables: Record<string, unknown> = {},\n ): Promise<TData> {\n const hash = resolveOpHash(manifest, op)\n const token = await (getDataToken ?? getToken)!()\n if (!token) throw new OrmClientError('not authenticated — no token available')\n const auth: Record<string, string> = getDataToken\n ? { [ORM_DATA_TOKEN_HEADER]: token }\n : { Authorization: `Bearer ${token}` }\n\n const response = await fetchImpl(`${root}${dataPlanePath(namespace)}`, {\n method: 'POST',\n headers: { ...auth, 'Content-Type': 'application/json' },\n body: JSON.stringify({ op: hash, variables }),\n })\n const payload = (await response.json().catch(() => null)) as\n | { data?: TData | null; errors?: OperationErrorEntry[] }\n | null\n\n const errors = payload?.errors ?? []\n if (!response.ok || errors.length > 0) {\n const first = errors[0]\n throw new OrmOperationError(\n first?.message ?? `HTTP ${response.status}`,\n response.status,\n first?.extensions?.code ?? null,\n errors,\n )\n }\n if (!payload || payload.data === undefined || payload.data === null) {\n throw new OrmOperationError('malformed response: missing data', response.status, null)\n }\n return payload.data\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level convenience for generated server functions (`db<Name>`)\n// ---------------------------------------------------------------------------\n\nlet configured: OperationExecutor | null = null\n\n/**\n * Configure the process-wide executor the generated `db<Name>` server\n * functions call through. Call once at startup (server-side); browser apps\n * should prefer Apollo + `createOrmFetch` or an explicit executor.\n */\nexport function configureOrmOperations(config: OperationExecutorConfig): OperationExecutor {\n configured = createOperationExecutor(config)\n return configured\n}\n\n/** Used by generated code: `executeOperation({ op: 'getOpenDeals', variables })`. */\nexport async function executeOperation<TData = Record<string, unknown>>({\n op,\n variables,\n}: {\n op: string\n variables?: Record<string, unknown>\n}): Promise<TData> {\n if (!configured) {\n throw new OrmClientError(\n 'ORM operations client not configured — call configureOrmOperations({ baseUrl, namespace, manifest, getToken }) at startup',\n )\n }\n return configured.execute<TData>(op, variables)\n}\n\n// ---------------------------------------------------------------------------\n// Apollo integration without an @apollo/client dependency\n// ---------------------------------------------------------------------------\n\n/**\n * A fetch-compatible function for `new HttpLink({ uri: '/unused', fetch: createOrmFetch(...) })`.\n * Intercepts Apollo's GraphQL POST, swaps the body for the persisted-op\n * envelope (`{ op: <hash>, variables }`) resolved via the manifest's\n * operationName, rewrites the URL to the data plane, and attaches auth.\n * The GraphQL-spec response body passes through untouched, so InMemoryCache\n * and error links behave exactly as they do against a GraphQL server.\n */\nexport function createOrmFetch({\n baseUrl,\n namespace,\n manifest,\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: OperationExecutorConfig): typeof globalThis.fetch {\n if (!fetchImpl) throw new OrmClientError('no fetch implementation available')\n if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {\n throw new OrmClientError('provide exactly one of getToken (bearer) or getDataToken (delegated)')\n }\n const root = baseUrl.replace(/\\/+$/, '')\n const url = `${root}${dataPlanePath(namespace)}`\n\n // Derived from `globalThis.fetch` rather than naming `RequestInfo` (a DOM-lib\n // global this module compiles without). The input is ignored — Apollo's\n // HttpLink calls the injected fetch with a string URI, and the real target\n // URL is fixed at `url` above.\n return async (_input: Parameters<typeof globalThis.fetch>[0], init?: RequestInit): Promise<Response> => {\n const raw = typeof init?.body === 'string' ? init.body : null\n const parsed = raw\n ? (JSON.parse(raw) as { operationName?: string; variables?: Record<string, unknown> })\n : {}\n const name = parsed.operationName\n if (!name) {\n throw new OrmClientError(\n 'createOrmFetch requires named operations (Apollo sends operationName for named documents)',\n )\n }\n const hash = resolveOpHash(manifest, name)\n const token = await (getDataToken ?? getToken)!()\n if (!token) throw new OrmClientError('not authenticated — no token available')\n const auth: Record<string, string> = getDataToken\n ? { [ORM_DATA_TOKEN_HEADER]: token }\n : { Authorization: `Bearer ${token}` }\n\n return fetchImpl(url, {\n method: 'POST',\n headers: { ...auth, 'Content-Type': 'application/json' },\n body: JSON.stringify({ op: hash, variables: parsed.variables ?? {} }),\n })\n }\n}\n","import { OrmClientError, createFetchTransport, type OrmTransport } from './transport.js'\nimport { TableQuery } from './query-builder.js'\n\n/** Bindable scalar for `query()` placeholders ($1, $2, …). */\nexport type QueryParam = string | number | boolean | null\n\n/** Shape of one action in the generated `<Ns>Actions` map — params in, result out. */\nexport interface OrmActionShape {\n readonly params?: Record<string, unknown>\n readonly result: unknown\n}\n\n/** The generated `<Ns>Actions` map: action name → its param and result shapes. */\nexport type OrmActions = Record<string, OrmActionShape>\n\n/**\n * `action()`'s argument list: `params` is required when the action declares a\n * required field, optional otherwise. The empty-object type is assignable to\n * the params shape only when every field is optional, so that assignability is\n * the discriminant.\n */\ntype ActionArgs<Action extends OrmActionShape> =\n Record<string, never> extends NonNullable<Action['params']>\n ? [params?: NonNullable<Action['params']>]\n : [params: NonNullable<Action['params']>]\n\n/**\n * Typed read client for one namespace's Data API. `Tables` comes from\n * `types.gen.ts` (wire types the apply refreshes from the YAML definitions),\n * so column names and row shapes are checked at compile time; the server\n * re-validates everything and Postgres RLS decides row visibility.\n *\n * ```ts\n * const client = createOrmClient<LendingTables>({ namespace: 'lending', baseUrl, getToken })\n * const rows = await client.table('loans').select('id', 'balance').gte('balance', 1000).rows()\n * const top = await client.query<{ officer: string; total: string }>(\n * 'select officer, sum(balance) as total from loans group by officer order by total desc limit $1',\n * [5],\n * )\n * ```\n */\nexport interface OrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n> {\n table<Name extends keyof Tables & string>(name: Name): TableQuery<Tables[Name]>\n /**\n * Raw read-only SQL for everything the filter grammar can't say —\n * aggregates, joins, OR, expressions, CTEs. The same sandbox as every\n * read: the namespace consumer role (grants stop at the namespace schema),\n * Postgres RLS over the caller's claims, and a READ ONLY transaction —\n * Postgres itself rejects writes, which stay on declared actions. Values\n * bind as $1, $2, … placeholders; never interpolate them into the string.\n */\n query<Row = Record<string, unknown>>(sql: string, params?: readonly QueryParam[]): Promise<Row[]>\n /**\n * Invoke a declared action — the only write path the Data API exposes. The\n * params and result are typed from the namespace's `<Ns>Actions`: an action\n * with `returns:` resolves to `{ rows: Row[] }`, a count action to\n * `{ rowsAffected: number }`.\n */\n action<Name extends keyof Actions & string>(\n name: Name,\n ...args: ActionArgs<Actions[Name]>\n ): Promise<Actions[Name]['result']>\n}\n\nexport function createOrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n>({\n namespace,\n baseUrl,\n getToken,\n fetchImpl,\n transport,\n dataToken,\n}: {\n namespace: string\n baseUrl?: string\n /** App-user / session bearer (CLI, browser). Mutually exclusive with dataToken. */\n getToken?: () => Promise<string | null> | string | null\n /**\n * Delegated function data token — the inbound `ORM_DATA_TOKEN_HEADER` value a\n * managed function receives. Pass it and the client authenticates as the\n * invoking user, scoped to the function's declared refs; no manual transport.\n */\n dataToken?: string | (() => Promise<string | null> | string | null)\n fetchImpl?: typeof globalThis.fetch\n /** Injected transport (tests, bridges); overrides baseUrl/getToken/dataToken. */\n transport?: OrmTransport\n}): OrmClient<Tables, Actions> {\n const resolved =\n transport ??\n createFetchTransport({\n baseUrl: requireOption(baseUrl, 'baseUrl'),\n ...(dataToken !== undefined\n ? { getDataToken: typeof dataToken === 'function' ? dataToken : () => dataToken }\n : { getToken: requireOption(getToken, 'getToken') }),\n fetchImpl,\n })\n\n return buildOrmClient<Tables, Actions>(resolved, namespace)\n}\n\n/**\n * The ESCALATION path — use only deliberately. A managed function receives a\n * separate *service* data token on `ORM_SERVICE_DATA_TOKEN_HEADER`; pass that\n * value here and the client authenticates as the function's SERVICE IDENTITY,\n * not the invoking user. Reads run with the service identity's grants (clamped\n * to the function's declared refs), NOT the caller's — so the caller's own row\n * visibility does not apply. The invoking user is still recorded for audit.\n *\n * Default to `createOrmClient` (acts as the invoking user, full per-user RLS).\n * Reach for this only when the function must intentionally act beyond the\n * caller — e.g. enforcing per-user rules in code over a coarse upstream that\n * has no granular permissions of its own. The distinct name is the guardrail:\n * choosing the service identity is always explicit and greppable.\n *\n * ```ts\n * const client = createServiceOrmClient<LendingTables>({\n * namespace: 'lending',\n * baseUrl,\n * serviceDataToken: req.headers['x-sequence-data-token-service'],\n * })\n * ```\n */\nexport function createServiceOrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n>({\n namespace,\n baseUrl,\n serviceDataToken,\n fetchImpl,\n transport,\n}: {\n namespace: string\n baseUrl?: string\n /** The inbound `ORM_SERVICE_DATA_TOKEN_HEADER` value — the function's service token. */\n serviceDataToken?: string | (() => Promise<string | null> | string | null)\n fetchImpl?: typeof globalThis.fetch\n /** Injected transport (tests, bridges); overrides baseUrl/serviceDataToken. */\n transport?: OrmTransport\n}): OrmClient<Tables, Actions> {\n const resolved =\n transport ??\n createFetchTransport({\n baseUrl: requireOption(baseUrl, 'baseUrl'),\n getDataToken:\n typeof serviceDataToken === 'function'\n ? serviceDataToken\n : () => requireOption(serviceDataToken, 'serviceDataToken'),\n fetchImpl,\n })\n\n return buildOrmClient<Tables, Actions>(resolved, namespace)\n}\n\n/** Shared client surface over a resolved transport — the token/identity choice is made by the factory above. */\nfunction buildOrmClient<\n Tables extends Record<string, Record<string, unknown>>,\n Actions extends OrmActions = OrmActions,\n>(resolved: OrmTransport, namespace: string): OrmClient<Tables, Actions> {\n return {\n table(name) {\n return new TableQuery(resolved, namespace, name)\n },\n async query(sql, params) {\n const payload = await resolved.post(`/api/data/${namespace}/query`, {\n sql,\n ...(params ? { params: [...params] } : {}),\n })\n if (!payload || typeof payload !== 'object' || !Array.isArray((payload as { rows?: unknown }).rows)) {\n throw new OrmClientError('unexpected Data API response shape — missing rows array')\n }\n return (payload as { rows: never[] }).rows\n },\n async action(name, ...args) {\n const payload = await resolved.post(`/api/data/${namespace}/actions/${name}`, args[0] ?? {})\n if (payload && typeof payload === 'object') {\n // A returns action responds with `rows`; a count action with\n // `rows_affected` (mapped to `rowsAffected` for the client).\n if (Array.isArray((payload as { rows?: unknown }).rows)) {\n return { rows: (payload as { rows: unknown[] }).rows } as Awaited<ReturnType<OrmClient<Tables, Actions>['action']>>\n }\n if ('rows_affected' in payload) {\n const rowsAffected = Number((payload as { rows_affected: unknown }).rows_affected)\n if (!Number.isNaN(rowsAffected)) {\n return { rowsAffected } as Awaited<ReturnType<OrmClient<Tables, Actions>['action']>>\n }\n }\n }\n throw new OrmClientError('unexpected action response shape — expected rows or rows_affected')\n },\n }\n}\n\nfunction requireOption<T>(value: T | undefined, name: string): T {\n if (value === undefined) throw new Error(`createOrmClient requires ${name} when no transport is injected`)\n return value\n}\n\nexport { TableQuery, type FilterValue, type ReadResponse } from './query-builder.js'\nexport { createFetchTransport, OrmClientError, type OrmTransport } from './transport.js'\n\nexport {\n OrmOperationError,\n configureOrmOperations,\n createOperationExecutor,\n createOrmFetch,\n executeOperation,\n} from './operations.js'\nexport type {\n ManifestOperation,\n OperationErrorEntry,\n OperationExecutor,\n OperationExecutorConfig,\n OperationsManifest,\n} from './operations.js'\n"]}