@sequenceholdings/orm 2.5.0 → 2.6.1
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.
- package/README.md +23 -0
- package/dist/cli.cjs +23 -11
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +23 -11
- package/dist/cli.js.map +1 -1
- package/dist/client.cjs +10 -5
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +37 -30
- package/dist/client.d.ts +37 -30
- package/dist/client.js +10 -6
- package/dist/client.js.map +1 -1
- package/dist/compiler.cjs +127 -9
- package/dist/compiler.cjs.map +1 -1
- package/dist/compiler.d.cts +25 -2
- package/dist/compiler.d.ts +25 -2
- package/dist/compiler.js +125 -10
- package/dist/compiler.js.map +1 -1
- package/dist/index.cjs +260 -138
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -3
- package/dist/index.d.ts +25 -3
- package/dist/index.js +260 -139
- package/dist/index.js.map +1 -1
- package/dist/ir.cjs +5 -1
- package/dist/ir.cjs.map +1 -1
- package/dist/ir.js +5 -1
- package/dist/ir.js.map +1 -1
- package/dist/predicate-v2.cjs +5 -1
- package/dist/predicate-v2.cjs.map +1 -1
- package/dist/predicate-v2.js +5 -1
- package/dist/predicate-v2.js.map +1 -1
- package/dist/sdl.cjs +7 -1
- package/dist/sdl.cjs.map +1 -1
- package/dist/sdl.js +7 -1
- package/dist/sdl.js.map +1 -1
- package/package.json +1 -1
- package/templates/orm-namespace/package.json +2 -0
- package/templates/orm-namespace/schema/tables.ts +7 -3
package/dist/client.js
CHANGED
|
@@ -192,6 +192,9 @@ function readOperationResponse({
|
|
|
192
192
|
return payload.data;
|
|
193
193
|
}
|
|
194
194
|
|
|
195
|
+
// src/client/sql.ts
|
|
196
|
+
var BUILTIN_SQL_READ_HASH = "sha256:a50c477c952a5e0fe68ed158a4530e4aab573c09bcbb1a8ac454dc88a39a6258";
|
|
197
|
+
|
|
195
198
|
// src/client/operations.ts
|
|
196
199
|
function validateIdempotencyKey(key) {
|
|
197
200
|
if (key !== void 0 && !/^[A-Za-z0-9._:-]{1,128}$/.test(key)) {
|
|
@@ -213,7 +216,7 @@ function resolveOpHash(manifest, op) {
|
|
|
213
216
|
function createOperationExecutor({
|
|
214
217
|
baseUrl,
|
|
215
218
|
namespace,
|
|
216
|
-
manifest,
|
|
219
|
+
manifest = { schemaHash: "builtin", operations: {} },
|
|
217
220
|
getToken,
|
|
218
221
|
getDataToken,
|
|
219
222
|
fetchImpl = globalThis.fetch
|
|
@@ -241,7 +244,7 @@ function createOperationExecutor({
|
|
|
241
244
|
body: await response.json().catch(() => null)
|
|
242
245
|
});
|
|
243
246
|
}
|
|
244
|
-
return { execute };
|
|
247
|
+
return { execute, sql: (variables) => execute(BUILTIN_SQL_READ_HASH, variables) };
|
|
245
248
|
}
|
|
246
249
|
var configured = null;
|
|
247
250
|
function configureOrmOperations(config) {
|
|
@@ -268,6 +271,7 @@ function createOrmFetch({
|
|
|
268
271
|
getDataToken,
|
|
269
272
|
fetchImpl = globalThis.fetch
|
|
270
273
|
}) {
|
|
274
|
+
if (!manifest) throw new OrmClientError("createOrmFetch requires an operations manifest");
|
|
271
275
|
if (!fetchImpl) throw new OrmClientError("no fetch implementation available");
|
|
272
276
|
if ((getToken ? 1 : 0) + (getDataToken ? 1 : 0) !== 1) {
|
|
273
277
|
throw new OrmClientError("provide exactly one of getToken (bearer) or getDataToken (delegated)");
|
|
@@ -315,13 +319,13 @@ function readManifestHashes(manifest) {
|
|
|
315
319
|
}
|
|
316
320
|
function createOperationExecutorWithTransport({ namespace, manifest, transport }) {
|
|
317
321
|
if (typeof namespace !== "string" || !NAMESPACE_PATTERN.test(namespace)) throw new OrmClientError("invalid ORM namespace \u2014 expected a lowercase identifier of at most 41 characters");
|
|
318
|
-
const hashes = readManifestHashes(manifest);
|
|
322
|
+
const hashes = manifest === void 0 ? /* @__PURE__ */ new Map() : readManifestHashes(manifest);
|
|
319
323
|
const knownHashes = new Set(hashes.values());
|
|
320
324
|
async function execute(op, variables = {}, options = {}) {
|
|
321
325
|
validateIdempotencyKey(options.idempotencyKey);
|
|
322
326
|
if (typeof op !== "string" && op.namespace !== namespace) throw new OrmClientError("operation belongs to a different namespace");
|
|
323
327
|
const selector = typeof op === "string" ? op : op.hash;
|
|
324
|
-
const hash = hashes.get(selector) ?? (knownHashes.has(selector) ? selector : void 0);
|
|
328
|
+
const hash = selector === BUILTIN_SQL_READ_HASH ? selector : hashes.get(selector) ?? (knownHashes.has(selector) ? selector : void 0);
|
|
325
329
|
if (!hash) throw new OrmClientError(`unknown operation "${op}" \u2014 not in the manifest (${hashes.size} known). Re-run seq-studio orm generate.`);
|
|
326
330
|
if (!isRecord(variables)) throw new OrmClientError("operation variables must be an object");
|
|
327
331
|
const response = await transport({
|
|
@@ -335,7 +339,7 @@ function createOperationExecutorWithTransport({ namespace, manifest, transport }
|
|
|
335
339
|
}
|
|
336
340
|
return readOperationResponse(response);
|
|
337
341
|
}
|
|
338
|
-
return { execute };
|
|
342
|
+
return { execute, sql: (variables) => execute(BUILTIN_SQL_READ_HASH, variables) };
|
|
339
343
|
}
|
|
340
344
|
|
|
341
345
|
// src/client/index.ts
|
|
@@ -405,6 +409,6 @@ function requireOption(value, name) {
|
|
|
405
409
|
return value;
|
|
406
410
|
}
|
|
407
411
|
|
|
408
|
-
export { NAMESPACE_PATTERN, ORM_DATA_TOKEN_HEADER, ORM_SERVICE_DATA_TOKEN_HEADER, OrmClientError, OrmOperationError, TableQuery, configureOrmOperations, createFetchTransport, createOperationExecutor, createOperationExecutorWithTransport, createOrmClient, createOrmFetch, createServiceOrmClient, executeOperation };
|
|
412
|
+
export { BUILTIN_SQL_READ_HASH, NAMESPACE_PATTERN, ORM_DATA_TOKEN_HEADER, ORM_SERVICE_DATA_TOKEN_HEADER, OrmClientError, OrmOperationError, TableQuery, configureOrmOperations, createFetchTransport, createOperationExecutor, createOperationExecutorWithTransport, createOrmClient, createOrmFetch, createServiceOrmClient, executeOperation };
|
|
409
413
|
//# sourceMappingURL=client.js.map
|
|
410
414
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/client/errors.ts","../src/client/transport.ts","../src/client/query-builder.ts","../src/client/response.ts","../src/client/operations.ts","../src/client/transport-executor.ts","../src/client/index.ts"],"names":[],"mappings":"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","file":"client.js","sourcesContent":["/** Shared grammar for namespace identifiers; never interpolate arbitrary paths.\n * orm_events and orm_native_sources are migration-owned control-plane schemas,\n * not builder namespaces. Exclude their suffixes at every API/authoring entry.\n */\nexport const NAMESPACE_PATTERN = /^(?!(?:events|native_sources)$)[a-z][a-z0-9_]{0,40}$/\n\n/** Caller-scoped delegated data credential, supplied by an authenticated host. */\nexport const ORM_DATA_TOKEN_HEADER = 'x-sequence-data-token'\n\n/** Separate service-identity credential; never used as an implicit fallback. */\nexport const ORM_SERVICE_DATA_TOKEN_HEADER = 'x-sequence-data-token-service'\n\nexport const IDENTIFIER_PATTERN = /^[a-z][a-z0-9_]*$/\n/** Native source columns may have one leading underscore; relation names may not. */\nexport const COLUMN_IDENTIFIER_PATTERN = /^_?[a-z][a-z0-9_]*$/\nexport const MAX_IDENTIFIER_LENGTH = 63\n\n/**\n * Custom Roles & Capabilities claim keys as policies reference them: a\n * host-scoped registry key, an org pin's `org/<key>`, or an Application\n * capability pin's `app/<application-id>/<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\\/|app\\/[a-z][a-z0-9-]{0,63}\\/)?[a-z0-9-]{1,64}$/\n\n/** Hard ceiling for an explicitly authored flat persisted GraphQL read. */\nexport const MAX_PERSISTED_READ_ROWS = 50_001\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_]{0,62}\\.[a-z][a-z0-9_]{0,62}$/\n\n/** Qualified source syntax only; the serving installation controls authorized backing. */\nexport const SYNCED_SOURCE_PATTERN = QUALIFIED_TABLE_PATTERN\n\nexport const ORM_SCHEMA_PREFIX = 'orm_'\nexport const CONSUMER_ROLE_SUFFIX = '_consumer'\n\nexport const ormSchemaName = (namespace: string): string => {\n if (!NAMESPACE_PATTERN.test(namespace)) throw new Error(`invalid or reserved ORM namespace '${namespace}'`)\n return `${ORM_SCHEMA_PREFIX}${namespace}`\n}\nexport const consumerRoleName = (namespace: string): string =>\n `${ormSchemaName(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 * A per-file byte cap where the loader 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/** Generated SDL aggregates every table/view; it is not an individual source file. */\nexport const MAX_GENERATED_SDL_BYTES = 16 * 1024 * 1024\n\n/** Registration and reviewed exports carry SDL, canonical metadata, snapshots and migrations. */\nexport const ORM_REGISTRATION_MAX_BYTES = 64 * 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/**\n * Per-cell metadata (`cellMetadata: true`, and every resolved-table source) is\n * stored as typed system columns beside each tracked column `c`:\n *\n * - `c__at` timestamptz — when the cell was last written (NULL: never / no opinion)\n * - `c__by` text — who wrote it\n * - `c__rev` uuid — a resolved table's manual source only: the edit's\n * identity, so an async writeback confirmation clears\n * only the exact edit it delivered\n *\n * A resolved view additionally exposes, per resolved column, the winner's\n * `c__src` (source name) and `c__lost` (newer candidates that lost, jsonb).\n * None of these are GraphQL columns: they surface through the typed `cells`\n * object and are never client-writable.\n */\nexport const CELL_PARTS = ['at', 'by', 'rev', 'source', 'conflicts'] as const\nexport type CellPart = (typeof CELL_PARTS)[number]\nexport const CELL_PART_SUFFIX: Readonly<Record<CellPart, string>> = {\n at: '__at', by: '__by', rev: '__rev', source: '__src', conflicts: '__lost',\n}\n/** Longest physical column name that can carry cell parts (63 minus the longest suffix). */\nexport const MAX_TRACKED_COLUMN_NAME = MAX_IDENTIFIER_LENGTH - 6\n/** GraphQL field carrying a row's per-cell metadata object. */\nexport const CELLS_FIELD = 'cells'\n\n/** Physical (and logical) name of one cell part of a column. */\nexport function cellColumnName(column: string, part: CellPart): string {\n return `${column}${CELL_PART_SUFFIX[part]}`\n}\n\n/**\n * Actor recorded when the data plane computes a materialized resolved table's\n * rows for every caller. Its claims are what the compute view's synced\n * sources see (materialized ETL sources must be readable by anyone).\n */\nexport const MATERIALIZE_ACTOR = 'orm:materialize'\nexport const MATERIALIZE_CLAIMS_JSON = JSON.stringify({ sub: MATERIALIZE_ACTOR, org: null, roles: [], capabilities: [] })\n\n/**\n * Apply-generated function that reconciles a materialized resolved table with\n * its compute view: `SELECT * FROM orm_<ns>.\"<table>__refresh\"(wait)` returns\n * `(upserted, deleted, locked)`; without `wait` it skips when another refresh\n * holds the table's lock. The one refresh implementation — the Atlas\n * reconcile, the post-ETL hook, and an operator in psql all call it.\n */\nexport function materializedRefreshFunctionName(table: string): string {\n return `${table}__refresh`\n}\n\n/**\n * Advisory-lock key serializing a materialized table's refreshes (hashed with\n * `hashtext`). A full refresh holds it exclusively and every ORM write's\n * per-row refresh holds it shared, both before reading the compute view — so\n * a full refresh never reads a snapshot older than a write it then overwrites.\n */\nexport function materializeLockKey(schema: string, table: string): string {\n return `orm:materialize:${schema}.${table}`\n}\n","export class OrmClientError extends Error {\n override readonly name: string = 'OrmClientError'\n\n constructor(message: string, readonly status: number | null = null) {\n super(message)\n }\n}\n\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","/**\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\nimport { OrmClientError } from './errors.js'\nexport { OrmClientError } from './errors.js'\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","import { OrmOperationError, type OperationErrorEntry } from './errors.js'\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isOperationError(value: unknown): value is OperationErrorEntry {\n if (!isRecord(value) || typeof value.message !== 'string') return false\n if (value.extensions === undefined) return true\n return isRecord(value.extensions) && (value.extensions.code === undefined || typeof value.extensions.code === 'string')\n}\n\nexport function readOperationResponse<TData>({\n ok, status, body,\n}: { ok: boolean; status: number; body: unknown }): TData {\n const payload = isRecord(body) ? body : null\n const rawErrors = payload?.errors\n if (rawErrors !== undefined && (!Array.isArray(rawErrors) || !rawErrors.every(isOperationError))) {\n throw new OrmOperationError('malformed response: invalid errors', status, null)\n }\n const errors: OperationErrorEntry[] = rawErrors ?? []\n if (!ok || errors.length > 0) {\n const first = errors[0]\n throw new OrmOperationError(first?.message ?? `HTTP ${status}`, status, first?.extensions?.code ?? null, errors)\n }\n if (!payload || payload.data === undefined || payload.data === null) {\n throw new OrmOperationError('malformed response: missing data', status, null)\n }\n if (!isRecord(payload.data)) {\n throw new OrmOperationError('malformed response: data must be an object', status, null)\n }\n // Generated consumer types describe operation data; envelope validation\n // cannot prove an application's selection-specific TData at runtime.\n return payload.data as TData\n}\n","/**\n * Persisted-operation client for the v2 data plane. The wire carries only\n * `{ op: <hash>, variables, idempotencyKey? }`. Runtime SQL contracts accept SQL in variables;\n * GraphQL and fixed SQL operations keep their documents server-side. This runtime\n * 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 './errors.js'\nimport { readOperationResponse } from './response.js'\nimport { ORM_DATA_TOKEN_HEADER } from '../constants.js'\n\nexport { OrmOperationError, type OperationErrorEntry } from './errors.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\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 OperationExecutionOptions {\n /** Reuse only when retrying the same logical mutation. */\n idempotencyKey?: string\n}\n\nexport function validateIdempotencyKey(key: string | undefined): void {\n if (key !== undefined && !/^[A-Za-z0-9._:-]{1,128}$/.test(key)) {\n throw new OrmClientError('idempotencyKey must be 1–128 letters, digits, dots, underscores, colons or hyphens')\n }\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 options?: OperationExecutionOptions,\n ): Promise<TData>\n}\n\n/** Additive factory result; existing host wrappers implementing OperationExecutor remain valid. */\nexport interface TypedOperationExecutor extends OperationExecutor {\n execute<TVariables extends Record<string, unknown>, TData>(op: OperationReference<TVariables, TData>, variables: TVariables, options?: OperationExecutionOptions): Promise<TData>\n execute<TData = Record<string, unknown>>(op: string, variables?: Record<string, unknown>, options?: OperationExecutionOptions): Promise<TData>\n}\n\nconst dataPlanePath = (namespace: string): string => `/_data/v2/${namespace}`\n\n/** Generated handle identifies the registered contract; optional types are phantom. */\nexport interface OperationReference<TVariables extends Record<string, unknown>, TData> {\n readonly namespace: string\n readonly hash: string\n readonly variables?: TVariables\n readonly result?: TData\n}\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): TypedOperationExecutor {\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 function execute<TVariables extends Record<string, unknown>, TData>(op: OperationReference<TVariables, TData>, variables: TVariables, options?: OperationExecutionOptions): Promise<TData>\n function execute<TData = Record<string, unknown>>(op: string, variables?: Record<string, unknown>, options?: OperationExecutionOptions): Promise<TData>\n async function execute<TData = Record<string, unknown>>(\n op: string | OperationReference<Record<string, unknown>, TData>,\n variables: Record<string, unknown> = {},\n options: OperationExecutionOptions = {},\n ): Promise<TData> {\n validateIdempotencyKey(options.idempotencyKey)\n if (typeof op !== 'string' && op.namespace !== namespace) throw new OrmClientError('operation belongs to a different namespace')\n const hash = typeof op === 'string' ? resolveOpHash(manifest, op) : op.hash\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, idempotencyKey: options.idempotencyKey }),\n })\n return readOperationResponse<TData>({\n ok: response.ok,\n status: response.status,\n body: await response.json().catch(() => null),\n })\n }\n return { execute }\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 idempotencyKey,\n}: {\n op: string\n variables?: Record<string, unknown>\n idempotencyKey?: string\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, idempotencyKey === undefined ? {} : { idempotencyKey })\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 idempotencyKey = new Headers(init?.headers).get('Idempotency-Key') ?? undefined\n validateIdempotencyKey(idempotencyKey)\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 ?? {}, idempotencyKey }),\n ...(init?.signal ? { signal: init.signal } : {}),\n })\n }\n}\n","import { NAMESPACE_PATTERN } from '../constants.js'\nimport { OrmClientError, OrmOperationError } from './errors.js'\nimport { validateIdempotencyKey, type TypedOperationExecutor, type OperationReference, type OperationExecutionOptions } from './operations.js'\nimport { isRecord, readOperationResponse } from './response.js'\n\nexport interface OperationTransportRequest {\n namespace: string\n op: string\n variables: Record<string, unknown>\n idempotencyKey?: string\n}\n\nexport interface OperationTransportResponse {\n ok: boolean\n status: number\n body: unknown\n}\n\nexport type OperationTransport = (request: OperationTransportRequest) => Promise<OperationTransportResponse>\n\nconst operationHash = /^sha256:[a-f0-9]{64}$/\n\nfunction readManifestHashes(manifest: unknown): ReadonlyMap<string, string> {\n if (!isRecord(manifest) || typeof manifest.schemaHash !== 'string' || !manifest.schemaHash || !isRecord(manifest.operations)) {\n throw new OrmClientError('invalid operations manifest — use operations.manifest.json from seq-studio orm generate')\n }\n const hashes = new Map<string, string>()\n for (const [name, entry] of Object.entries(manifest.operations)) {\n if (!/^[_A-Za-z][_0-9A-Za-z]*$/.test(name) || !isRecord(entry) || typeof entry.hash !== 'string' || !operationHash.test(entry.hash)\n || (entry.kind !== 'query' && entry.kind !== 'mutation')) {\n throw new OrmClientError(`invalid operations manifest entry \"${name}\" — regenerate the manifest`)\n }\n hashes.set(name, entry.hash)\n }\n return hashes\n}\n\n/**\n * Execute generated operations through a host-owned authenticated transport.\n * No credential handling, retries, or global configuration. The manifest is\n * validated once and copied, so later caller mutation cannot alter the target.\n */\nexport function createOperationExecutorWithTransport({ namespace, manifest, transport }: {\n namespace: string\n /** Accept generated JSON imports directly; validate them at construction. */\n manifest: unknown\n transport: OperationTransport\n}): TypedOperationExecutor {\n if (typeof namespace !== 'string' || !NAMESPACE_PATTERN.test(namespace)) throw new OrmClientError('invalid ORM namespace — expected a lowercase identifier of at most 41 characters')\n const hashes = readManifestHashes(manifest)\n const knownHashes = new Set(hashes.values())\n function execute<TVariables extends Record<string, unknown>, TData>(op: OperationReference<TVariables, TData>, variables: TVariables, options?: OperationExecutionOptions): Promise<TData>\n function execute<TData = Record<string, unknown>>(op: string, variables?: Record<string, unknown>, options?: OperationExecutionOptions): Promise<TData>\n async function execute<TData = Record<string, unknown>>(op: string | OperationReference<Record<string, unknown>, TData>, variables: Record<string, unknown> = {}, options: OperationExecutionOptions = {}): Promise<TData> {\n validateIdempotencyKey(options.idempotencyKey)\n if (typeof op !== 'string' && op.namespace !== namespace) throw new OrmClientError('operation belongs to a different namespace')\n const selector = typeof op === 'string' ? op : op.hash\n const hash = hashes.get(selector) ?? (knownHashes.has(selector) ? selector : undefined)\n if (!hash) throw new OrmClientError(`unknown operation \"${op}\" — not in the manifest (${hashes.size} known). Re-run seq-studio orm generate.`)\n if (!isRecord(variables)) throw new OrmClientError('operation variables must be an object')\n const response = await transport({ namespace, op: hash, variables,\n ...(options.idempotencyKey === undefined ? {} : { idempotencyKey: options.idempotencyKey }),\n })\n if (!response || typeof response.ok !== 'boolean' || !Number.isInteger(response.status) || response.status < 100 || response.status > 599\n || response.ok !== (response.status >= 200 && response.status < 300)) {\n throw new OrmOperationError('malformed transport response', null, null)\n }\n return readOperationResponse<TData>(response)\n }\n return { execute }\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 OperationReference,\n TypedOperationExecutor,\n OperationExecutorConfig,\n OperationsManifest,\n} from './operations.js'\n\nexport { NAMESPACE_PATTERN, ORM_DATA_TOKEN_HEADER, ORM_SERVICE_DATA_TOKEN_HEADER } from '../constants.js'\nexport type { SqlQueryParameter, SqlQueryVariables, SqlQueryResult } from './sql.js'\nexport {\n createOperationExecutorWithTransport,\n type OperationTransport, type OperationTransportRequest, type OperationTransportResponse,\n} from './transport-executor.js'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/client/errors.ts","../src/client/transport.ts","../src/client/query-builder.ts","../src/client/response.ts","../src/client/sql.ts","../src/client/operations.ts","../src/client/transport-executor.ts","../src/client/index.ts"],"names":[],"mappings":"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","file":"client.js","sourcesContent":["/** Shared grammar for namespace identifiers; never interpolate arbitrary paths.\n * orm_events and orm_native_sources are migration-owned control-plane schemas,\n * not builder namespaces. Exclude their suffixes at every API/authoring entry.\n */\nexport const NAMESPACE_PATTERN = /^(?!(?:events|native_sources)$)[a-z][a-z0-9_]{0,40}$/\n\n/** Caller-scoped delegated data credential, supplied by an authenticated host. */\nexport const ORM_DATA_TOKEN_HEADER = 'x-sequence-data-token'\n\n/** Separate service-identity credential; never used as an implicit fallback. */\nexport const ORM_SERVICE_DATA_TOKEN_HEADER = 'x-sequence-data-token-service'\n\nexport const IDENTIFIER_PATTERN = /^[a-z][a-z0-9_]*$/\n/** Native source columns may have one leading underscore; relation names may not. */\nexport const COLUMN_IDENTIFIER_PATTERN = /^_?[a-z][a-z0-9_]*$/\nexport const MAX_IDENTIFIER_LENGTH = 63\n\n/**\n * Custom Roles & Capabilities claim keys as policies reference them: a\n * host-scoped registry key, an org pin's `org/<key>`, or an Application\n * capability pin's `app/<application-id>/<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\\/|app\\/[a-z][a-z0-9-]{0,63}\\/)?[a-z0-9-]{1,64}$/\n\n/** Hard ceiling for an explicitly authored flat persisted GraphQL read. */\nexport const MAX_PERSISTED_READ_ROWS = 50_001\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_]{0,62}\\.[a-z][a-z0-9_]{0,62}$/\n\n/** Qualified source syntax only; the serving installation controls authorized backing. */\nexport const SYNCED_SOURCE_PATTERN = QUALIFIED_TABLE_PATTERN\n\nexport const ORM_SCHEMA_PREFIX = 'orm_'\nexport const CONSUMER_ROLE_SUFFIX = '_consumer'\n\nexport const ormSchemaName = (namespace: string): string => {\n if (!NAMESPACE_PATTERN.test(namespace)) throw new Error(`invalid or reserved ORM namespace '${namespace}'`)\n return `${ORM_SCHEMA_PREFIX}${namespace}`\n}\nexport const consumerRoleName = (namespace: string): string =>\n `${ormSchemaName(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 * A per-file byte cap where the loader 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/** Generated SDL aggregates every table/view; it is not an individual source file. */\nexport const MAX_GENERATED_SDL_BYTES = 16 * 1024 * 1024\n\n/** Registration and reviewed exports carry SDL, canonical metadata, snapshots and migrations. */\nexport const ORM_REGISTRATION_MAX_BYTES = 64 * 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/**\n * Per-cell metadata (`cellMetadata: true`, and every resolved-table source) is\n * stored as typed system columns beside each tracked column `c`:\n *\n * - `c__at` timestamptz — when the cell was last written (NULL: never / no opinion)\n * - `c__by` text — who wrote it\n * - `c__rev` uuid — a resolved table's manual source only: the edit's\n * identity, so an async writeback confirmation clears\n * only the exact edit it delivered\n *\n * A resolved view additionally exposes, per resolved column, the winner's\n * `c__src` (source name) and `c__lost` (newer candidates that lost, jsonb).\n * None of these are GraphQL columns: they surface through the typed `cells`\n * object and are never client-writable.\n */\nexport const CELL_PARTS = ['at', 'by', 'rev', 'source', 'conflicts'] as const\nexport type CellPart = (typeof CELL_PARTS)[number]\nexport const CELL_PART_SUFFIX: Readonly<Record<CellPart, string>> = {\n at: '__at', by: '__by', rev: '__rev', source: '__src', conflicts: '__lost',\n}\n/** Longest physical column name that can carry cell parts (63 minus the longest suffix). */\nexport const MAX_TRACKED_COLUMN_NAME = MAX_IDENTIFIER_LENGTH - 6\n/** GraphQL field carrying a row's per-cell metadata object. */\nexport const CELLS_FIELD = 'cells'\n\n/** Physical (and logical) name of one cell part of a column. */\nexport function cellColumnName(column: string, part: CellPart): string {\n return `${column}${CELL_PART_SUFFIX[part]}`\n}\n\n/**\n * Actor recorded when the data plane computes a materialized resolved table's\n * rows for every caller. Its claims are what the compute view's synced\n * sources see (materialized ETL sources must be readable by anyone).\n */\nexport const MATERIALIZE_ACTOR = 'orm:materialize'\nexport const MATERIALIZE_CLAIMS_JSON = JSON.stringify({ sub: MATERIALIZE_ACTOR, org: null, roles: [], capabilities: [] })\n\n/**\n * Apply-generated function that reconciles a materialized resolved table with\n * its compute view: `SELECT * FROM orm_<ns>.\"<table>__refresh\"(wait)` returns\n * `(upserted, deleted, locked)`; without `wait` it skips when another refresh\n * holds the table's lock. The one refresh implementation — the Atlas\n * reconcile, the post-ETL hook, and an operator in psql all call it.\n */\nexport function materializedRefreshFunctionName(table: string): string {\n return `${table}__refresh`\n}\n\n/**\n * Advisory-lock key serializing a materialized table's refreshes (hashed with\n * `hashtext`). A full refresh holds it exclusively and every ORM write's\n * per-row refresh holds it shared, both before reading the compute view — so\n * a full refresh never reads a snapshot older than a write it then overwrites.\n */\nexport function materializeLockKey(schema: string, table: string): string {\n return `orm:materialize:${schema}.${table}`\n}\n","export class OrmClientError extends Error {\n override readonly name: string = 'OrmClientError'\n\n constructor(message: string, readonly status: number | null = null) {\n super(message)\n }\n}\n\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","/**\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\nimport { OrmClientError } from './errors.js'\nexport { OrmClientError } from './errors.js'\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","import { OrmOperationError, type OperationErrorEntry } from './errors.js'\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isOperationError(value: unknown): value is OperationErrorEntry {\n if (!isRecord(value) || typeof value.message !== 'string') return false\n if (value.extensions === undefined) return true\n return isRecord(value.extensions) && (value.extensions.code === undefined || typeof value.extensions.code === 'string')\n}\n\nexport function readOperationResponse<TData>({\n ok, status, body,\n}: { ok: boolean; status: number; body: unknown }): TData {\n const payload = isRecord(body) ? body : null\n const rawErrors = payload?.errors\n if (rawErrors !== undefined && (!Array.isArray(rawErrors) || !rawErrors.every(isOperationError))) {\n throw new OrmOperationError('malformed response: invalid errors', status, null)\n }\n const errors: OperationErrorEntry[] = rawErrors ?? []\n if (!ok || errors.length > 0) {\n const first = errors[0]\n throw new OrmOperationError(first?.message ?? `HTTP ${status}`, status, first?.extensions?.code ?? null, errors)\n }\n if (!payload || payload.data === undefined || payload.data === null) {\n throw new OrmOperationError('malformed response: missing data', status, null)\n }\n if (!isRecord(payload.data)) {\n throw new OrmOperationError('malformed response: data must be an object', status, null)\n }\n // Generated consumer types describe operation data; envelope validation\n // cannot prove an application's selection-specific TData at runtime.\n return payload.data as TData\n}\n","/** Runtime SQL inputs are values, never interpolated into the submitted SQL. */\n// SHA-256 of \"sequence-orm-builtin-sql-read-v1\". This identifies server-owned\n// behavior, independent of a namespace's authored operation manifest.\nexport const BUILTIN_SQL_READ_HASH = 'sha256:a50c477c952a5e0fe68ed158a4530e4aab573c09bcbb1a8ac454dc88a39a6258'\n\nexport type SqlQueryParameter =\n | { type: 'text' | 'uuid' | 'date' | 'timestamptz' | 'numeric' | 'bigint'; value: string | null }\n | { type: 'integer' | 'double'; value: number | null }\n | { type: 'boolean'; value: boolean | null }\n\nexport type SqlQueryVariables = {\n sql: string\n parameters?: Record<string, SqlQueryParameter>\n}\n\nexport interface SqlQueryResult {\n columns: Array<{ name: string; type: string; nullable: boolean }>\n rows: Array<Array<string | number | boolean | null>>\n truncated: boolean\n}\n","/**\n * Persisted-operation client for the v2 data plane. The wire carries only\n * `{ op: <hash>, variables, idempotencyKey? }`. Runtime SQL contracts accept SQL in variables;\n * GraphQL and fixed SQL operations keep their documents server-side. This runtime\n * 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 './errors.js'\nimport { readOperationResponse } from './response.js'\nimport { ORM_DATA_TOKEN_HEADER } from '../constants.js'\nimport { BUILTIN_SQL_READ_HASH, type SqlQueryVariables, type SqlQueryResult } from './sql.js'\n\nexport { OrmOperationError, type OperationErrorEntry } from './errors.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\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 OperationExecutionOptions {\n /** Reuse only when retrying the same logical mutation. */\n idempotencyKey?: string\n}\n\nexport function validateIdempotencyKey(key: string | undefined): void {\n if (key !== undefined && !/^[A-Za-z0-9._:-]{1,128}$/.test(key)) {\n throw new OrmClientError('idempotencyKey must be 1–128 letters, digits, dots, underscores, colons or hyphens')\n }\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 options?: OperationExecutionOptions,\n ): Promise<TData>\n}\n\n/** Additive factory result; existing host wrappers implementing OperationExecutor remain valid. */\nexport interface SqlOperationExecutor extends OperationExecutor {\n /** Default read-only ontology SQL; no authored operation or manifest needed. */\n sql(variables: SqlQueryVariables): Promise<SqlQueryResult>\n}\n\nexport interface TypedOperationExecutor extends OperationExecutor {\n execute<TVariables extends Record<string, unknown>, TData>(op: OperationReference<TVariables, TData>, variables: TVariables, options?: OperationExecutionOptions): Promise<TData>\n execute<TData = Record<string, unknown>>(op: string, variables?: Record<string, unknown>, options?: OperationExecutionOptions): Promise<TData>\n}\n\n/** Factory result adds SQL without requiring it on existing typed host wrappers. */\nexport type TypedSqlOperationExecutor = TypedOperationExecutor & SqlOperationExecutor\n\nconst dataPlanePath = (namespace: string): string => `/_data/v2/${namespace}`\n\n/** Generated handle identifies the registered contract; optional types are phantom. */\nexport interface OperationReference<TVariables extends Record<string, unknown>, TData> {\n readonly namespace: string\n readonly hash: string\n readonly variables?: TVariables\n readonly result?: TData\n}\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 = { schemaHash: 'builtin', operations: {} },\n getToken,\n getDataToken,\n fetchImpl = globalThis.fetch,\n}: OperationExecutorConfig): TypedSqlOperationExecutor {\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 function execute<TVariables extends Record<string, unknown>, TData>(op: OperationReference<TVariables, TData>, variables: TVariables, options?: OperationExecutionOptions): Promise<TData>\n function execute<TData = Record<string, unknown>>(op: string, variables?: Record<string, unknown>, options?: OperationExecutionOptions): Promise<TData>\n async function execute<TData = Record<string, unknown>>(\n op: string | OperationReference<Record<string, unknown>, TData>,\n variables: Record<string, unknown> = {},\n options: OperationExecutionOptions = {},\n ): Promise<TData> {\n validateIdempotencyKey(options.idempotencyKey)\n if (typeof op !== 'string' && op.namespace !== namespace) throw new OrmClientError('operation belongs to a different namespace')\n const hash = typeof op === 'string' ? resolveOpHash(manifest, op) : op.hash\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, idempotencyKey: options.idempotencyKey }),\n })\n return readOperationResponse<TData>({\n ok: response.ok,\n status: response.status,\n body: await response.json().catch(() => null),\n })\n }\n return { execute, sql: variables => execute<SqlQueryResult>(BUILTIN_SQL_READ_HASH, variables) }\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 idempotencyKey,\n}: {\n op: string\n variables?: Record<string, unknown>\n idempotencyKey?: string\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, idempotencyKey === undefined ? {} : { idempotencyKey })\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 (!manifest) throw new OrmClientError('createOrmFetch requires an operations manifest')\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 idempotencyKey = new Headers(init?.headers).get('Idempotency-Key') ?? undefined\n validateIdempotencyKey(idempotencyKey)\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 ?? {}, idempotencyKey }),\n ...(init?.signal ? { signal: init.signal } : {}),\n })\n }\n}\n","import { NAMESPACE_PATTERN } from '../constants.js'\nimport { OrmClientError, OrmOperationError } from './errors.js'\nimport { validateIdempotencyKey, type TypedSqlOperationExecutor, type OperationReference, type OperationExecutionOptions } from './operations.js'\nimport { isRecord, readOperationResponse } from './response.js'\nimport { BUILTIN_SQL_READ_HASH, type SqlQueryResult } from './sql.js'\n\nexport interface OperationTransportRequest {\n namespace: string\n op: string\n variables: Record<string, unknown>\n idempotencyKey?: string\n}\n\nexport interface OperationTransportResponse {\n ok: boolean\n status: number\n body: unknown\n}\n\nexport type OperationTransport = (request: OperationTransportRequest) => Promise<OperationTransportResponse>\n\nconst operationHash = /^sha256:[a-f0-9]{64}$/\n\nfunction readManifestHashes(manifest: unknown): ReadonlyMap<string, string> {\n if (!isRecord(manifest) || typeof manifest.schemaHash !== 'string' || !manifest.schemaHash || !isRecord(manifest.operations)) {\n throw new OrmClientError('invalid operations manifest — use operations.manifest.json from seq-studio orm generate')\n }\n const hashes = new Map<string, string>()\n for (const [name, entry] of Object.entries(manifest.operations)) {\n if (!/^[_A-Za-z][_0-9A-Za-z]*$/.test(name) || !isRecord(entry) || typeof entry.hash !== 'string' || !operationHash.test(entry.hash)\n || (entry.kind !== 'query' && entry.kind !== 'mutation')) {\n throw new OrmClientError(`invalid operations manifest entry \"${name}\" — regenerate the manifest`)\n }\n hashes.set(name, entry.hash)\n }\n return hashes\n}\n\n/**\n * Execute generated operations through a host-owned authenticated transport.\n * No credential handling, retries, or global configuration. The manifest is\n * validated once and copied, so later caller mutation cannot alter the target.\n */\nexport function createOperationExecutorWithTransport({ namespace, manifest, transport }: {\n namespace: string\n /** Accept generated JSON imports directly; validate them at construction. */\n manifest?: unknown\n transport: OperationTransport\n}): TypedSqlOperationExecutor {\n if (typeof namespace !== 'string' || !NAMESPACE_PATTERN.test(namespace)) throw new OrmClientError('invalid ORM namespace — expected a lowercase identifier of at most 41 characters')\n const hashes = manifest === undefined ? new Map<string, string>() : readManifestHashes(manifest)\n const knownHashes = new Set(hashes.values())\n function execute<TVariables extends Record<string, unknown>, TData>(op: OperationReference<TVariables, TData>, variables: TVariables, options?: OperationExecutionOptions): Promise<TData>\n function execute<TData = Record<string, unknown>>(op: string, variables?: Record<string, unknown>, options?: OperationExecutionOptions): Promise<TData>\n async function execute<TData = Record<string, unknown>>(op: string | OperationReference<Record<string, unknown>, TData>, variables: Record<string, unknown> = {}, options: OperationExecutionOptions = {}): Promise<TData> {\n validateIdempotencyKey(options.idempotencyKey)\n if (typeof op !== 'string' && op.namespace !== namespace) throw new OrmClientError('operation belongs to a different namespace')\n const selector = typeof op === 'string' ? op : op.hash\n const hash = selector === BUILTIN_SQL_READ_HASH ? selector : hashes.get(selector) ?? (knownHashes.has(selector) ? selector : undefined)\n if (!hash) throw new OrmClientError(`unknown operation \"${op}\" — not in the manifest (${hashes.size} known). Re-run seq-studio orm generate.`)\n if (!isRecord(variables)) throw new OrmClientError('operation variables must be an object')\n const response = await transport({ namespace, op: hash, variables,\n ...(options.idempotencyKey === undefined ? {} : { idempotencyKey: options.idempotencyKey }),\n })\n if (!response || typeof response.ok !== 'boolean' || !Number.isInteger(response.status) || response.status < 100 || response.status > 599\n || response.ok !== (response.status >= 200 && response.status < 300)) {\n throw new OrmOperationError('malformed transport response', null, null)\n }\n return readOperationResponse<TData>(response)\n }\n return { execute, sql: variables => execute<SqlQueryResult>(BUILTIN_SQL_READ_HASH, variables) }\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 SqlOperationExecutor,\n OperationReference,\n TypedOperationExecutor,\n TypedSqlOperationExecutor,\n OperationExecutorConfig,\n OperationsManifest,\n} from './operations.js'\n\nexport { NAMESPACE_PATTERN, ORM_DATA_TOKEN_HEADER, ORM_SERVICE_DATA_TOKEN_HEADER } from '../constants.js'\nexport type { SqlQueryParameter, SqlQueryVariables, SqlQueryResult } from './sql.js'\nexport { BUILTIN_SQL_READ_HASH } from './sql.js'\nexport {\n createOperationExecutorWithTransport,\n type OperationTransport, type OperationTransportRequest, type OperationTransportResponse,\n} from './transport-executor.js'\n"]}
|
package/dist/compiler.cjs
CHANGED
|
@@ -1310,6 +1310,9 @@ function normalizeCanonical(definition) {
|
|
|
1310
1310
|
return normalized;
|
|
1311
1311
|
}
|
|
1312
1312
|
|
|
1313
|
+
// src/client/sql.ts
|
|
1314
|
+
var BUILTIN_SQL_READ_HASH = "sha256:a50c477c952a5e0fe68ed158a4530e4aab573c09bcbb1a8ac454dc88a39a6258";
|
|
1315
|
+
|
|
1313
1316
|
// src/ir/index.ts
|
|
1314
1317
|
var IR_VERSION = 5;
|
|
1315
1318
|
var LEGACY_IR_VERSION = 1;
|
|
@@ -1643,7 +1646,8 @@ var compiledOperationSchema = zod.z.object({
|
|
|
1643
1646
|
}).superRefine((operation, ctx) => {
|
|
1644
1647
|
if (operation.language === "sql") {
|
|
1645
1648
|
const validPlan = operation.sqlQuery ? !operation.sql && operation.irVersion === RUNTIME_SQL_IR_VERSION : !!operation.sql && operation.irVersion === SQL_IR_VERSION;
|
|
1646
|
-
|
|
1649
|
+
const builtin = operation.name === "BuiltinSqlRead" && operation.opHash === BUILTIN_SQL_READ_HASH && operation.requires === null;
|
|
1650
|
+
if (!validPlan || operation.kind !== "query" || operation.roots.length !== 0 || !builtin && !operation.requires?.capability) {
|
|
1647
1651
|
ctx.addIssue({ code: "custom", message: "SQL operations require a query-only v4 plan or v5 runtime contract, capability, and no GraphQL roots" });
|
|
1648
1652
|
}
|
|
1649
1653
|
} else if (operation.sql || operation.sqlQuery || operation.roots.length === 0) {
|
|
@@ -5421,9 +5425,9 @@ function compilePredIrToSql(pred, options = {}) {
|
|
|
5421
5425
|
case "cmp":
|
|
5422
5426
|
return compileCmp(pred.op, pred.column, pred.value, options);
|
|
5423
5427
|
case "capability":
|
|
5424
|
-
return `(${capabilityExpression(pred.key, pred.namespace ?? options.namespace)})`;
|
|
5428
|
+
return `(${options.statementClaimChecks ? "SELECT " : ""}${capabilityExpression(pred.key, pred.namespace ?? options.namespace)})`;
|
|
5425
5429
|
case "role":
|
|
5426
|
-
return `(${roleExpression(pred.key, pred.namespace ?? options.namespace)})`;
|
|
5430
|
+
return `(${options.statementClaimChecks ? "SELECT " : ""}${roleExpression(pred.key, pred.namespace ?? options.namespace)})`;
|
|
5427
5431
|
case "exists":
|
|
5428
5432
|
if (options.exists) return options.exists(pred);
|
|
5429
5433
|
throw new OrmDefinitionError("synced view read policy cannot use 'exists' without a relationship resolver");
|
|
@@ -5531,7 +5535,8 @@ function createSqlCatalog({ canonical, publishedObjects, executionTarget }) {
|
|
|
5531
5535
|
const { ctx, diagnostics } = buildCompileContext(canonical);
|
|
5532
5536
|
if (diagnostics.some((d) => d.severity === "error")) throw new Error(diagnostics.map((d) => d.message).join("; "));
|
|
5533
5537
|
const identity = sqlHash(`ontology-sql-v1\0${computeSchemaHash(canonical)}\0${executionTarget}`);
|
|
5534
|
-
const
|
|
5538
|
+
const logicalNames = new Map(Object.entries(ctx.tables).map(([key, meta]) => [meta, key]));
|
|
5539
|
+
const refOf = (meta) => `${meta.namespace ?? canonical.namespace}/${logicalNames.get(meta)}`;
|
|
5535
5540
|
const definitions = [canonical, ...canonical.imports ?? []];
|
|
5536
5541
|
const internal = new Set(definitions.flatMap((owner) => [
|
|
5537
5542
|
...owner.tables.filter((t) => t.internal).map((t) => `${owner.namespace}/${t.table}`),
|
|
@@ -5607,15 +5612,48 @@ function only(node, keys) {
|
|
|
5607
5612
|
var parser;
|
|
5608
5613
|
var SQL_TYPES = ["text", "boolean", "integer", "bigint", "numeric", "double", "uuid", "date", "timestamptz"];
|
|
5609
5614
|
var pgType = (type) => type === "double" ? "double precision" : SQL_TYPES.some((t) => t === type) ? type : fail3("unsupported SQL type");
|
|
5610
|
-
async function
|
|
5611
|
-
if (
|
|
5615
|
+
async function parseSelect(sql) {
|
|
5616
|
+
if (Buffer.byteLength(sql) > 65536) fail3("SQL limit exceeded");
|
|
5612
5617
|
parser ??= new pgParser.PgParser({ version: 17 });
|
|
5613
5618
|
const parsed = await parser.parse(sql);
|
|
5614
5619
|
if (parsed.error || !parsed.tree) fail3("invalid SQL");
|
|
5615
5620
|
const statements = list(obj(parsed.tree).stmts);
|
|
5616
5621
|
if (statements.length !== 1) fail3("one SQL SELECT is required");
|
|
5622
|
+
const statement = obj(obj(statements[0]).stmt);
|
|
5623
|
+
if (!statement.SelectStmt) fail3("one SQL SELECT is required");
|
|
5624
|
+
return statement;
|
|
5625
|
+
}
|
|
5626
|
+
async function referencedSqlObjects({ sql }) {
|
|
5627
|
+
const objects = /* @__PURE__ */ new Set();
|
|
5628
|
+
let nodes = 0;
|
|
5629
|
+
function visit2(value, depth) {
|
|
5630
|
+
if (++nodes > 1e4 || depth > 96) fail3("SQL complexity limit exceeded");
|
|
5631
|
+
if (Array.isArray(value)) {
|
|
5632
|
+
for (const child of value) visit2(child, depth + 1);
|
|
5633
|
+
return;
|
|
5634
|
+
}
|
|
5635
|
+
if (!value || typeof value !== "object") return;
|
|
5636
|
+
const node = obj(value);
|
|
5637
|
+
if (node.RangeVar) {
|
|
5638
|
+
const range = obj(node.RangeVar);
|
|
5639
|
+
if (range.schemaname) {
|
|
5640
|
+
const namespace = str(range.schemaname), name2 = str(range.relname);
|
|
5641
|
+
if (!/^[a-z][a-z0-9_]{0,40}$/.test(namespace) || namespace === "pg_catalog" || namespace === "information_schema") fail3("invalid ontology namespace");
|
|
5642
|
+
objects.add(`${namespace}/${name2}`);
|
|
5643
|
+
if (objects.size > 256) fail3("too many SQL objects");
|
|
5644
|
+
}
|
|
5645
|
+
}
|
|
5646
|
+
for (const child of Object.values(node)) visit2(child, depth + 1);
|
|
5647
|
+
}
|
|
5648
|
+
visit2(await parseSelect(sql), 0);
|
|
5649
|
+
if (!objects.size) fail3("SQL operation must read an ontology object");
|
|
5650
|
+
return [...objects].sort();
|
|
5651
|
+
}
|
|
5652
|
+
async function compileOntologySql({ catalog, sql, parameterTypes = [], maxRows = 1e3 }) {
|
|
5653
|
+
if (!Number.isInteger(maxRows) || maxRows < 1 || maxRows > 1e4 || Buffer.byteLength(sql) > 65536) fail3("SQL limit exceeded");
|
|
5654
|
+
const statement = await parseSelect(sql);
|
|
5617
5655
|
const emitter = new SqlEmitter({ catalog, parameterTypes });
|
|
5618
|
-
const result = emitter.select(
|
|
5656
|
+
const result = emitter.select(statement, { relations: [], ctes: /* @__PURE__ */ new Map() });
|
|
5619
5657
|
if (emitter.used.size !== parameterTypes.length) fail3("SQL parameters must be used exactly as declared");
|
|
5620
5658
|
if (!emitter.read.size) fail3("SQL operation must read an ontology object");
|
|
5621
5659
|
return {
|
|
@@ -6203,7 +6241,7 @@ var sqlQueryInputSchema = zod.z.object({
|
|
|
6203
6241
|
sql: zod.z.string().min(1).max(65536).refine((value) => Buffer.byteLength(value) <= 65536, "SQL exceeds 64 KiB"),
|
|
6204
6242
|
parameters: zod.z.record(parameterName, parameter).refine((value) => Object.keys(value).length <= 128, "too many SQL parameters").default({})
|
|
6205
6243
|
}).strict();
|
|
6206
|
-
async function compileRuntimeSql({ operation, input }) {
|
|
6244
|
+
async function compileRuntimeSql({ operation, input, qualified = false }) {
|
|
6207
6245
|
const contract = operation.sqlQuery;
|
|
6208
6246
|
if (!contract) throw new Error("missing runtime SQL contract");
|
|
6209
6247
|
const names = Object.keys(input.parameters).sort();
|
|
@@ -6219,10 +6257,87 @@ async function compileRuntimeSql({ operation, input }) {
|
|
|
6219
6257
|
sqlQuery: void 0,
|
|
6220
6258
|
irVersion: SQL_IR_VERSION,
|
|
6221
6259
|
variables: names.map((name2) => ({ name: name2, type: { kind: "scalar", scalar: input.parameters[name2].type }, nullable: true, list: false })),
|
|
6222
|
-
tableSet: plan.read.map((ref) => ref.split("/")[1]).sort(),
|
|
6260
|
+
tableSet: qualified ? plan.read : plan.read.map((ref) => ref.split("/")[1]).sort(),
|
|
6223
6261
|
sql: { text: plan.text, columns: plan.columns, parameters: names, read: plan.read, maxRows: plan.maxRows }
|
|
6224
6262
|
});
|
|
6225
6263
|
}
|
|
6264
|
+
|
|
6265
|
+
// src/sql/builtin.ts
|
|
6266
|
+
function localHash(definition) {
|
|
6267
|
+
const { imports: _imports, ...local } = definition;
|
|
6268
|
+
return computeSchemaHash(normalizeCanonical(local));
|
|
6269
|
+
}
|
|
6270
|
+
function compileBuiltinSqlArtifact({ namespace, definitions, read, unbackedObjects = [], executionTarget = "default" }) {
|
|
6271
|
+
const anchor = definitions.find((definition) => definition.namespace === namespace);
|
|
6272
|
+
if (!anchor) throw new Error("missing SQL namespace definition");
|
|
6273
|
+
const tables = {};
|
|
6274
|
+
const policies = {};
|
|
6275
|
+
const objects = [];
|
|
6276
|
+
for (const definition of definitions) {
|
|
6277
|
+
const owner = definition.namespace;
|
|
6278
|
+
const { ctx, diagnostics } = buildCompileContext(definition);
|
|
6279
|
+
if (diagnostics.some((diagnostic) => diagnostic.severity === "error")) throw new Error("SQL namespace definition is invalid");
|
|
6280
|
+
const ref = (key) => {
|
|
6281
|
+
const meta = ctx.tables[key];
|
|
6282
|
+
if (!meta) throw new Error("SQL dependency is unavailable");
|
|
6283
|
+
return `${meta.namespace ?? owner}/${key}`;
|
|
6284
|
+
};
|
|
6285
|
+
for (const [key, meta] of Object.entries(ctx.tables)) {
|
|
6286
|
+
if ((meta.namespace ?? owner) !== owner) continue;
|
|
6287
|
+
const identity = ref(key);
|
|
6288
|
+
tables[identity] = {
|
|
6289
|
+
...meta,
|
|
6290
|
+
namespace: owner,
|
|
6291
|
+
links: meta.links.map((link) => ({ ...link, ...link.target ? { target: ref(link.target) } : {} })),
|
|
6292
|
+
...meta.dependencies ? { dependencies: meta.dependencies.map(ref) } : {},
|
|
6293
|
+
...meta.foreignReferences ? { foreignReferences: meta.foreignReferences.map((link) => ({ ...link, target: ref(link.target) })) } : {}
|
|
6294
|
+
};
|
|
6295
|
+
const policy = ctx.readPolicies.get(key);
|
|
6296
|
+
if (policy) policies[identity] = policy;
|
|
6297
|
+
}
|
|
6298
|
+
const selected = read.filter((identity) => identity.startsWith(`${owner}/`));
|
|
6299
|
+
if (!selected.length) continue;
|
|
6300
|
+
if (owner !== namespace && selected.some((identity) => !definition.exports?.[identity.slice(owner.length + 1)]?.read)) {
|
|
6301
|
+
throw new Error("SQL object is not exported");
|
|
6302
|
+
}
|
|
6303
|
+
objects.push(...createSqlCatalog({ canonical: definition, publishedObjects: selected, executionTarget }).objects);
|
|
6304
|
+
}
|
|
6305
|
+
if (objects.length !== read.length) throw new Error("SQL object is unavailable");
|
|
6306
|
+
const actualRead = [...new Set(objects.flatMap((object) => object.read))].sort();
|
|
6307
|
+
const catalog = { objects, identity: sqlHash(JSON.stringify([
|
|
6308
|
+
"builtin-sql-catalog-v1",
|
|
6309
|
+
namespace,
|
|
6310
|
+
executionTarget,
|
|
6311
|
+
read,
|
|
6312
|
+
definitions.map((definition) => [definition.namespace, computeSchemaHash(definition)]).sort()
|
|
6313
|
+
])) };
|
|
6314
|
+
return normalizeIr({
|
|
6315
|
+
irVersion: RUNTIME_SQL_IR_VERSION,
|
|
6316
|
+
namespace,
|
|
6317
|
+
schemaHash: catalog.identity,
|
|
6318
|
+
ownSchemaHash: localHash(anchor),
|
|
6319
|
+
opsHash: BUILTIN_SQL_READ_HASH,
|
|
6320
|
+
dependencies: Object.fromEntries(definitions.filter((definition) => definition.namespace !== namespace).map((definition) => [definition.namespace, localHash(definition)])),
|
|
6321
|
+
tables,
|
|
6322
|
+
readPolicies: policies,
|
|
6323
|
+
unbackedTables: [...unbackedObjects],
|
|
6324
|
+
operations: { BuiltinSqlRead: {
|
|
6325
|
+
irVersion: RUNTIME_SQL_IR_VERSION,
|
|
6326
|
+
name: "BuiltinSqlRead",
|
|
6327
|
+
opHash: BUILTIN_SQL_READ_HASH,
|
|
6328
|
+
language: "sql",
|
|
6329
|
+
kind: "query",
|
|
6330
|
+
requires: null,
|
|
6331
|
+
roots: [],
|
|
6332
|
+
tableSet: actualRead,
|
|
6333
|
+
variables: [
|
|
6334
|
+
{ name: "sql", type: { kind: "scalar", scalar: "text" }, nullable: false, list: false },
|
|
6335
|
+
{ name: "parameters", type: { kind: "scalar", scalar: "jsonb" }, nullable: true, list: false }
|
|
6336
|
+
],
|
|
6337
|
+
sqlQuery: { catalog, read: actualRead, maxRows: 1e3 }
|
|
6338
|
+
} }
|
|
6339
|
+
});
|
|
6340
|
+
}
|
|
6226
6341
|
var DATASET_PREVIEW_LIMIT = 100;
|
|
6227
6342
|
function compileDatasetPreviews(input) {
|
|
6228
6343
|
const canonical = normalizeCanonical(input);
|
|
@@ -6287,11 +6402,13 @@ exports.allowedBoolExpOperators = allowedBoolExpOperators;
|
|
|
6287
6402
|
exports.allowedOps = allowedOps;
|
|
6288
6403
|
exports.andPred = andPred;
|
|
6289
6404
|
exports.assertClaimsOnlyWhen = assertClaimsOnlyWhen;
|
|
6405
|
+
exports.bindNamedParameters = bindNamedParameters;
|
|
6290
6406
|
exports.buildCompileContext = buildCompileContext;
|
|
6291
6407
|
exports.camelCase = camelCase;
|
|
6292
6408
|
exports.canonicalOperationText = canonicalOperationText;
|
|
6293
6409
|
exports.classifyInputType = classifyInputType;
|
|
6294
6410
|
exports.collectPinnedColumns = collectPinnedColumns;
|
|
6411
|
+
exports.compileBuiltinSqlArtifact = compileBuiltinSqlArtifact;
|
|
6295
6412
|
exports.compileDatasetPreviews = compileDatasetPreviews;
|
|
6296
6413
|
exports.compileNamespace = compileNamespace;
|
|
6297
6414
|
exports.compileNamespaceOrThrow = compileNamespaceOrThrow;
|
|
@@ -6319,6 +6436,7 @@ exports.platformUserMeta = platformUserMeta;
|
|
|
6319
6436
|
exports.predContains = predContains;
|
|
6320
6437
|
exports.predContainsExists = predContainsExists;
|
|
6321
6438
|
exports.queryRootNames = queryRootNames;
|
|
6439
|
+
exports.referencedSqlObjects = referencedSqlObjects;
|
|
6322
6440
|
exports.restrictOperation = restrictOperation;
|
|
6323
6441
|
exports.sqlOperationDefinitionSchema = sqlOperationDefinitionSchema;
|
|
6324
6442
|
exports.sqlQueryInputSchema = sqlQueryInputSchema;
|