bunderstack 0.18.0 → 0.19.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/CHANGELOG.md +24 -0
- package/dist/access.js.map +1 -1
- package/dist/api/builder.js.map +1 -1
- package/dist/api/context.js.map +1 -1
- package/dist/api/crud-router.d.ts +121 -0
- package/dist/api/crud-router.d.ts.map +1 -1
- package/dist/api/crud-router.js +110 -4
- package/dist/api/crud-router.js.map +1 -1
- package/dist/api/list-input-schema.d.ts +15 -0
- package/dist/api/list-input-schema.d.ts.map +1 -1
- package/dist/api/list-input-schema.js +16 -0
- package/dist/api/list-input-schema.js.map +1 -1
- package/dist/api/list-spec.js.map +1 -1
- package/dist/api/live-view.d.ts +14 -0
- package/dist/api/live-view.d.ts.map +1 -0
- package/dist/api/live-view.js +42 -0
- package/dist/api/live-view.js.map +1 -0
- package/dist/api/live-window.d.ts +40 -0
- package/dist/api/live-window.d.ts.map +1 -0
- package/dist/api/live-window.js +83 -0
- package/dist/api/live-window.js.map +1 -0
- package/dist/api/openapi.js.map +1 -1
- package/dist/api/realtime-router.js.map +1 -1
- package/dist/api/registry.js.map +1 -1
- package/dist/api/router.js.map +1 -1
- package/dist/api/storage-router.js.map +1 -1
- package/dist/api/types.d.ts +1 -1
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js.map +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/blueprint-generator.js.map +1 -1
- package/dist/blueprint.js.map +1 -1
- package/dist/cli-skills.js.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/cron.js.map +1 -1
- package/dist/crud-operations.js.map +1 -1
- package/dist/database/adapter.js.map +1 -1
- package/dist/database/bun-sql.js.map +1 -1
- package/dist/database/libsql.js.map +1 -1
- package/dist/database/pglite.js.map +1 -1
- package/dist/database/postgres-js.js.map +1 -1
- package/dist/db.js.map +1 -1
- package/dist/dialect.js.map +1 -1
- package/dist/email/smtp.js.map +1 -1
- package/dist/email.js.map +1 -1
- package/dist/env.js.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/handler.js.map +1 -1
- package/dist/idempotency.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal-tables-pg.js.map +1 -1
- package/dist/internal-tables.js.map +1 -1
- package/dist/jobs/cron.js.map +1 -1
- package/dist/jobs/define.js.map +1 -1
- package/dist/jobs/index.js.map +1 -1
- package/dist/jobs/queue.js.map +1 -1
- package/dist/jobs/runtime.js.map +1 -1
- package/dist/jobs/slots.js.map +1 -1
- package/dist/jobs/worker.js.map +1 -1
- package/dist/lifecycle.js.map +1 -1
- package/dist/list-query.js.map +1 -1
- package/dist/live/apply.d.ts +13 -0
- package/dist/live/apply.d.ts.map +1 -0
- package/dist/live/apply.js +32 -0
- package/dist/live/apply.js.map +1 -0
- package/dist/live/index.d.ts +48 -0
- package/dist/live/index.d.ts.map +1 -0
- package/dist/live/index.js +108 -0
- package/dist/live/index.js.map +1 -0
- package/dist/live/protocol.d.ts +44 -0
- package/dist/live/protocol.d.ts.map +1 -0
- package/dist/live/protocol.js +12 -0
- package/dist/live/protocol.js.map +1 -0
- package/dist/live/sse.d.ts +22 -0
- package/dist/live/sse.d.ts.map +1 -0
- package/dist/live/sse.js +41 -0
- package/dist/live/sse.js.map +1 -0
- package/dist/manifest.js.map +1 -1
- package/dist/provision-internals.js.map +1 -1
- package/dist/provision.js.map +1 -1
- package/dist/rate-limit.js.map +1 -1
- package/dist/realtime/facade.js.map +1 -1
- package/dist/realtime/filter.d.ts +34 -5
- package/dist/realtime/filter.d.ts.map +1 -1
- package/dist/realtime/filter.js +62 -25
- package/dist/realtime/filter.js.map +1 -1
- package/dist/realtime/heartbeat.js.map +1 -1
- package/dist/realtime/publisher.js.map +1 -1
- package/dist/schema-export-pg.js.map +1 -1
- package/dist/schema-export.js.map +1 -1
- package/dist/scope.js.map +1 -1
- package/dist/standard-schema.js.map +1 -1
- package/dist/storage/buckets.js.map +1 -1
- package/dist/storage/delete.js.map +1 -1
- package/dist/storage/file-meta.js.map +1 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/local.js.map +1 -1
- package/dist/storage/operations.js.map +1 -1
- package/dist/storage/registry.js.map +1 -1
- package/dist/storage/s3.js.map +1 -1
- package/dist/storage/sweep.js.map +1 -1
- package/dist/storage/thumbnails.js.map +1 -1
- package/dist/testing.js.map +1 -1
- package/dist/typeid-pg.js.map +1 -1
- package/dist/typeid.js.map +1 -1
- package/llms.txt +3 -3
- package/package.json +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-input-schema.js","sourceRoot":"","sources":["../../src/api/list-input-schema.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C;;;;;GAKG;AACH,SAAS,kBAAkB,CACzB,KAAY,EACZ,iBAAoC;IAEpC,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,OAG/C,CAAA;IACD,MAAM,aAAa,GAAoB,EAAE,CAAA;IACzC,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;QAClC,IAAI,CAAC,IAAI;YAAE,SAAQ;QACnB,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAChC,CAAC,CAAC,KAAK,CAAC;YACN,kEAAkE;YAClE,CAAC,CAAC,IAAI,CACJ,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EACjB,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CACxB;YACD,IAAI;YACJ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAClD,CAAC,CAAC,IAAI,EAAE;SACT,CAAC,CACH,CAAA;IACH,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAY,EACZ,OAGC;IAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAE1E,OAAO,CAAC,CAAC,QAAQ,CACf,CAAC,CAAC,YAAY,CAAC;QACb,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,eAA2B,CAAC,CAAC;QACjE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9C,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9B,sEAAsE;QACtE,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;KACnD,CAAC,CACH,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"list-input-schema.js","sourceRoot":"","sources":["../../src/api/list-input-schema.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Table } from 'drizzle-orm'\n\nimport { createSelectSchema } from 'drizzle-valibot'\nimport * as v from 'valibot'\n\nimport { MAX_LIST_LIMIT } from '../list-query'\n\n/**\n * One filter field per allowed column, typed by the column itself: a scalar\n * for `=`, a list for `IN`, and `null` for `IS NULL`. Query strings are\n * coerced to these types by SmartCoercionHandlerPlugin, so REST and RPC share\n * one contract and nothing has to re-read the raw URL.\n */\nfunction buildFilterEntries(\n table: Table,\n filterableColumns: readonly string[],\n): v.ObjectEntries {\n const selectEntries = createSelectSchema(table).entries as Record<\n string,\n v.BaseSchema<unknown, unknown, v.BaseIssue<unknown>>\n >\n const filterEntries: v.ObjectEntries = {}\n for (const column of filterableColumns) {\n const base = selectEntries[column]\n if (!base) continue\n filterEntries[column] = v.optional(\n v.union([\n // `?filters[col]=null` — a query string cannot carry a real null.\n v.pipe(\n v.literal('null'),\n v.transform(() => null),\n ),\n base,\n v.pipe(v.array(base), v.maxLength(MAX_LIST_LIMIT)),\n v.null(),\n ]),\n )\n }\n return filterEntries\n}\n\n/**\n * The input contract every list endpoint shares. Built from runtime column\n * lists, so the schema's own inferred type cannot name the columns; callers\n * restate it with the literals their configuration carries. Runtime shape and\n * the restated type are the same object.\n */\nexport function buildListInputSchema(\n table: Table,\n options: {\n filterableColumns: readonly string[]\n sortableColumns: readonly string[]\n },\n) {\n const filterEntries = buildFilterEntries(table, options.filterableColumns)\n\n return v.optional(\n v.strictObject({\n limit: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1))),\n offset: v.optional(v.pipe(v.number(), v.integer(), v.minValue(0))),\n cursor: v.optional(v.string()),\n sort: v.optional(v.picklist(options.sortableColumns as string[])),\n order: v.optional(v.picklist(['asc', 'desc'])),\n q: v.optional(v.pipe(v.string(), v.maxLength(100))),\n count: v.optional(v.boolean()),\n // Always present, even with no filterable columns: clients send `{}`.\n filters: v.optional(v.strictObject(filterEntries)),\n }),\n )\n}\n\n/**\n * The input contract of a live view (`GET /api/{table}:live`): the list\n * contract narrowed to what a stream can honor. No text search, no pagination\n * — membership is decided per streamed record on the server, which only\n * equality-style filters allow.\n */\nexport function buildLiveInputSchema(\n table: Table,\n options: {\n filterableColumns: readonly string[]\n sortableColumns: readonly string[]\n },\n) {\n const filterEntries = buildFilterEntries(table, options.filterableColumns)\n\n return v.optional(\n v.strictObject({\n limit: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1))),\n sort: v.optional(v.picklist(options.sortableColumns as string[])),\n order: v.optional(v.picklist(['asc', 'desc'])),\n // Always present, even with no filterable columns: clients send `{}`.\n filters: v.optional(v.strictObject(filterEntries)),\n }),\n )\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-spec.js","sourceRoot":"","sources":["../../src/api/list-spec.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK3D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAY1D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAa,EACb,UAA2B,EAAE;IAE7B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzE,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IAEhE,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,EAAE;QAC9C,iBAAiB,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;QAC3C,eAAe;KAChB,CAGA,CAAA;IAED,0EAA0E;IAC1E,4EAA4E;IAC5E,wDAAwD;IACxD,MAAM,MAAM,GAAG;QACb,iBAAiB,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;QAC3C,eAAe;QACf,iBAAiB,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;QAC3C,WAAW;KACsB,CAAA;IAEnC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAA;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,4DAA4D,YAAY,CAAC,KAAK,CAAC,GAAG,CACnF,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,EAAE,cAGtB,EAA+C,EAAE;QAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,CAAC,CAAA;QACpE,OAAO,WAAW,CAChB,cAAc,CAAC,OAAO,CAAC,EAAW,EAClC,KAAc,EACd,MAAM,EACN,MAAM,EACN,QAAQ,CACT,CAAA;IACH,CAAC,CAAA;IAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAA;AACxC,CAAC"}
|
|
1
|
+
{"version":3,"file":"list-spec.js","sourceRoot":"","sources":["../../src/api/list-spec.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK3D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAY1D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAa,EACb,UAA2B,EAAE;IAE7B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzE,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IAEhE,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,EAAE;QAC9C,iBAAiB,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;QAC3C,eAAe;KAChB,CAGA,CAAA;IAED,0EAA0E;IAC1E,4EAA4E;IAC5E,wDAAwD;IACxD,MAAM,MAAM,GAAG;QACb,iBAAiB,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;QAC3C,eAAe;QACf,iBAAiB,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;QAC3C,WAAW;KACsB,CAAA;IAEnC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAA;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,4DAA4D,YAAY,CAAC,KAAK,CAAC,GAAG,CACnF,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,EAAE,cAGtB,EAA+C,EAAE;QAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,CAAC,CAAA;QACpE,OAAO,WAAW,CAChB,cAAc,CAAC,OAAO,CAAC,EAAW,EAClC,KAAc,EACd,MAAM,EACN,MAAM,EACN,QAAQ,CACT,CAAA;IACH,CAAC,CAAA;IAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAA;AACxC,CAAC","sourcesContent":["import type { Table } from 'drizzle-orm'\nimport type * as v from 'valibot'\n\nimport { getTableColumns, getTableName } from 'drizzle-orm'\n\nimport type { ResolvedTableAccess } from '../access'\nimport type { ListParamsInput, ListResult } from '../list-query'\n\nimport { executeList, resolveListParams } from '../list-query'\nimport { buildListInputSchema } from './list-input-schema'\n\nexport type ListSpecOptions = {\n /** Columns a caller may filter on. Others are rejected by the schema. */\n filterable?: readonly string[]\n /** Columns a caller may sort on. Defaults to the default sort column. */\n sortable?: readonly string[]\n defaultSort?: { column: string; order: 'asc' | 'desc' }\n /** Columns the `q` parameter searches. */\n searchable?: readonly string[]\n}\n\n/**\n * The input schema and handler of a list endpoint, with the same filter, sort,\n * cursor, and count contract that the generated CRUD list uses.\n *\n * The caller applies both to its own base procedure:\n *\n * ```ts\n * const logsList = listSpec(appLogs, { filterable: ['level'] })\n * getLogs: adminProcedure.input(logsList.input).handler(logsList.handler)\n * ```\n *\n * The two parts are returned separately rather than as a finished procedure,\n * because a procedure built here would have to receive the builder as a\n * generic parameter. TypeScript resolves a method call on a generic parameter\n * through its constraint, which erases the input schema and the row type. With\n * this shape the builder stays concrete at the call site and keeps both.\n *\n * It reads no `access` configuration: the base procedure carries the policy.\n */\nexport function listSpec<TTable extends Table>(\n table: TTable,\n options: ListSpecOptions = {},\n) {\n const defaultSort = options.defaultSort ?? { column: 'id', order: 'asc' }\n const sortableColumns = options.sortable ?? [defaultSort.column]\n\n const inputSchema = buildListInputSchema(table, {\n filterableColumns: options.filterable ?? [],\n sortableColumns,\n }) as unknown as v.GenericSchema<\n ListParamsInput | undefined,\n ListParamsInput | undefined\n >\n\n // `executeList` reads its policy from a resolved access record. This spec\n // declares that policy at the call site instead, because the base procedure\n // — not `access.ts` — carries the authorization for it.\n const access = {\n filterableColumns: options.filterable ?? [],\n sortableColumns,\n searchableColumns: options.searchable ?? [],\n defaultSort,\n } as unknown as ResolvedTableAccess\n\n const idColumn = getTableColumns(table).id\n if (!idColumn) {\n throw new Error(\n `[bunderstack] listSpec requires an \"id\" column on table \"${getTableName(table)}\"`,\n )\n }\n\n const handler = async (handlerOptions: {\n context: { db: unknown }\n input: ListParamsInput | undefined\n }): Promise<ListResult<TTable['$inferSelect']>> => {\n const params = resolveListParams(handlerOptions.input ?? {}, access)\n return executeList<TTable['$inferSelect']>(\n handlerOptions.context.db as never,\n table as never,\n access,\n params,\n idColumn,\n )\n }\n\n return { input: inputSchema, handler }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side membership for a live view: does one record belong to a view,
|
|
3
|
+
* given that view's filters?
|
|
4
|
+
*
|
|
5
|
+
* The rule is evaluated per streamed record, so a change is routed to the
|
|
6
|
+
* views that want it without asking the database.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Bunderstack's filter contract — a scalar is `=`, an array is `IN`, `null` is
|
|
10
|
+
* `IS NULL` — evaluated against one record. The string `'null'` means the same
|
|
11
|
+
* as `null`, because a query string cannot carry a real null.
|
|
12
|
+
*/
|
|
13
|
+
export declare function matchesLiveFilters(record: Record<string, unknown>, filters: Record<string, unknown> | undefined): boolean;
|
|
14
|
+
//# sourceMappingURL=live-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-view.d.ts","sourceRoot":"","sources":["../../src/api/live-view.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC3C,OAAO,CAeT"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side membership for a live view: does one record belong to a view,
|
|
3
|
+
* given that view's filters?
|
|
4
|
+
*
|
|
5
|
+
* The rule is evaluated per streamed record, so a change is routed to the
|
|
6
|
+
* views that want it without asking the database.
|
|
7
|
+
*/
|
|
8
|
+
/** Same value semantics as list filters: dates by time, the rest by identity. */
|
|
9
|
+
function sameValue(a, b) {
|
|
10
|
+
if (a instanceof Date && b instanceof Date)
|
|
11
|
+
return a.getTime() === b.getTime();
|
|
12
|
+
return a === b;
|
|
13
|
+
}
|
|
14
|
+
function isNullish(value) {
|
|
15
|
+
return value === null || value === undefined;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Bunderstack's filter contract — a scalar is `=`, an array is `IN`, `null` is
|
|
19
|
+
* `IS NULL` — evaluated against one record. The string `'null'` means the same
|
|
20
|
+
* as `null`, because a query string cannot carry a real null.
|
|
21
|
+
*/
|
|
22
|
+
export function matchesLiveFilters(record, filters) {
|
|
23
|
+
for (const [column, expected] of Object.entries(filters ?? {})) {
|
|
24
|
+
if (expected === undefined)
|
|
25
|
+
continue;
|
|
26
|
+
const actual = record[column];
|
|
27
|
+
if (expected === null || expected === 'null') {
|
|
28
|
+
if (!isNullish(actual))
|
|
29
|
+
return false;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (Array.isArray(expected)) {
|
|
33
|
+
if (!expected.some((value) => sameValue(value, actual)))
|
|
34
|
+
return false;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (!sameValue(expected, actual))
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=live-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-view.js","sourceRoot":"","sources":["../../src/api/live-view.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iFAAiF;AACjF,SAAS,SAAS,CAAC,CAAU,EAAE,CAAU;IACvC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,IAAI;QAAE,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;IAC9E,OAAO,CAAC,KAAK,CAAC,CAAA;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAA;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA+B,EAC/B,OAA4C;IAE5C,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,IAAI,QAAQ,KAAK,SAAS;YAAE,SAAQ;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;QAC7B,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC7C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAA;YACpC,SAAQ;QACV,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAA;YACrE,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;YAAE,OAAO,KAAK,CAAA;IAChD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["/**\n * Server-side membership for a live view: does one record belong to a view,\n * given that view's filters?\n *\n * The rule is evaluated per streamed record, so a change is routed to the\n * views that want it without asking the database.\n */\n\n/** Same value semantics as list filters: dates by time, the rest by identity. */\nfunction sameValue(a: unknown, b: unknown): boolean {\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime()\n return a === b\n}\n\nfunction isNullish(value: unknown): boolean {\n return value === null || value === undefined\n}\n\n/**\n * Bunderstack's filter contract — a scalar is `=`, an array is `IN`, `null` is\n * `IS NULL` — evaluated against one record. The string `'null'` means the same\n * as `null`, because a query string cannot carry a real null.\n */\nexport function matchesLiveFilters(\n record: Record<string, unknown>,\n filters: Record<string, unknown> | undefined,\n): boolean {\n for (const [column, expected] of Object.entries(filters ?? {})) {\n if (expected === undefined) continue\n const actual = record[column]\n if (expected === null || expected === 'null') {\n if (!isNullish(actual)) return false\n continue\n }\n if (Array.isArray(expected)) {\n if (!expected.some((value) => sameValue(value, actual))) return false\n continue\n }\n if (!sameValue(expected, actual)) return false\n }\n return true\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { LiveDeltaFrame } from '../live/protocol.js';
|
|
2
|
+
import type { RealtimeChange } from '../realtime/publisher.js';
|
|
3
|
+
/**
|
|
4
|
+
* The server-side state of one live-view connection: which rows the client
|
|
5
|
+
* holds, in view order, and whether rows exist below the window.
|
|
6
|
+
*
|
|
7
|
+
* The window is what lets the server place a row for the client (`afterId`)
|
|
8
|
+
* instead of making the browser repeat `ORDER BY`. It is also what makes a
|
|
9
|
+
* removal from a truncated view ask for a fresh snapshot instead of silently
|
|
10
|
+
* shrinking the view.
|
|
11
|
+
*
|
|
12
|
+
* Ordering follows `buildOrderBy` in `../list-query`: the sort column first,
|
|
13
|
+
* then `id`, both in the query's direction. Values are compared in the process
|
|
14
|
+
* on raw column values. That is exact for numbers, dates, and booleans, and
|
|
15
|
+
* matches the database for ordinary text. A collation that differs from
|
|
16
|
+
* code-unit order, or a NULLS rule other than "nulls first", can place a row
|
|
17
|
+
* inside the window differently from the database.
|
|
18
|
+
*/
|
|
19
|
+
export type LiveWindowOptions = {
|
|
20
|
+
sort: string;
|
|
21
|
+
order: 'asc' | 'desc';
|
|
22
|
+
limit: number;
|
|
23
|
+
filters?: Record<string, unknown>;
|
|
24
|
+
};
|
|
25
|
+
export type LiveWindowResult = {
|
|
26
|
+
type: 'none';
|
|
27
|
+
} | {
|
|
28
|
+
type: 'frames';
|
|
29
|
+
frames: LiveDeltaFrame[];
|
|
30
|
+
} | {
|
|
31
|
+
type: 'resnapshot';
|
|
32
|
+
};
|
|
33
|
+
export type LiveWindow = {
|
|
34
|
+
/** Adopt a query result as the current view. */
|
|
35
|
+
reset: (items: Record<string, unknown>[], hasMore: boolean) => void;
|
|
36
|
+
/** What this change means for this view. */
|
|
37
|
+
apply: (change: RealtimeChange) => LiveWindowResult;
|
|
38
|
+
};
|
|
39
|
+
export declare function createLiveWindow(options: LiveWindowOptions): LiveWindow;
|
|
40
|
+
//# sourceMappingURL=live-window.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-window.d.ts","sourceRoot":"","sources":["../../src/api/live-window.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAI3D;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAA;AAE1B,MAAM,MAAM,UAAU,GAAG;IACvB,gDAAgD;IAChD,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACnE,4CAA4C;IAC5C,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,gBAAgB,CAAA;CACpD,CAAA;AAmBD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAsEvE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { matchesLiveFilters } from './live-view.js';
|
|
2
|
+
function compareValues(a, b) {
|
|
3
|
+
if (a === b)
|
|
4
|
+
return 0;
|
|
5
|
+
const aNull = a === null || a === undefined;
|
|
6
|
+
const bNull = b === null || b === undefined;
|
|
7
|
+
if (aNull || bNull)
|
|
8
|
+
return aNull ? (bNull ? 0 : -1) : 1;
|
|
9
|
+
if (a instanceof Date && b instanceof Date)
|
|
10
|
+
return a.getTime() - b.getTime();
|
|
11
|
+
if (typeof a === 'number' && typeof b === 'number')
|
|
12
|
+
return a - b;
|
|
13
|
+
if (typeof a === 'boolean' && typeof b === 'boolean') {
|
|
14
|
+
return Number(a) - Number(b);
|
|
15
|
+
}
|
|
16
|
+
const left = String(a);
|
|
17
|
+
const right = String(b);
|
|
18
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
19
|
+
}
|
|
20
|
+
export function createLiveWindow(options) {
|
|
21
|
+
const direction = options.order === 'desc' ? -1 : 1;
|
|
22
|
+
let rows = [];
|
|
23
|
+
let hasMore = false;
|
|
24
|
+
const compareRows = (a, b) => direction * (compareValues(a.key, b.key) || compareValues(a.id, b.id));
|
|
25
|
+
const rowOf = (record) => ({
|
|
26
|
+
id: String(record.id),
|
|
27
|
+
key: record[options.sort],
|
|
28
|
+
});
|
|
29
|
+
/** Where this row belongs among rows that are already in order. */
|
|
30
|
+
const placeOf = (row) => {
|
|
31
|
+
const index = rows.findIndex((current) => compareRows(row, current) < 0);
|
|
32
|
+
return index === -1 ? rows.length : index;
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
reset(items, nextHasMore) {
|
|
36
|
+
rows = items.map(rowOf);
|
|
37
|
+
hasMore = nextHasMore;
|
|
38
|
+
},
|
|
39
|
+
apply(change) {
|
|
40
|
+
const id = String(change.record.id);
|
|
41
|
+
const index = rows.findIndex((row) => row.id === id);
|
|
42
|
+
const held = index !== -1;
|
|
43
|
+
// The row left the view: deleted, or no longer a match for the filters.
|
|
44
|
+
if (change.action === 'delete' ||
|
|
45
|
+
!matchesLiveFilters(change.record, options.filters)) {
|
|
46
|
+
if (!held)
|
|
47
|
+
return { type: 'none' };
|
|
48
|
+
rows.splice(index, 1);
|
|
49
|
+
// A row from below the window must take the free place, and only the
|
|
50
|
+
// database knows which one.
|
|
51
|
+
if (hasMore)
|
|
52
|
+
return { type: 'resnapshot' };
|
|
53
|
+
return { type: 'frames', frames: [{ type: 'remove', id }] };
|
|
54
|
+
}
|
|
55
|
+
if (held)
|
|
56
|
+
rows.splice(index, 1);
|
|
57
|
+
const row = rowOf(change.record);
|
|
58
|
+
const place = placeOf(row);
|
|
59
|
+
if (place >= options.limit) {
|
|
60
|
+
// It sorts below the window. If the client holds it, it moved out.
|
|
61
|
+
if (!held)
|
|
62
|
+
return { type: 'none' };
|
|
63
|
+
hasMore = true;
|
|
64
|
+
return { type: 'frames', frames: [{ type: 'remove', id }] };
|
|
65
|
+
}
|
|
66
|
+
rows.splice(place, 0, row);
|
|
67
|
+
const frames = [
|
|
68
|
+
{
|
|
69
|
+
type: 'upsert',
|
|
70
|
+
record: change.record,
|
|
71
|
+
afterId: place === 0 ? null : rows[place - 1].id,
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
if (rows.length > options.limit) {
|
|
75
|
+
const evicted = rows.pop();
|
|
76
|
+
hasMore = true;
|
|
77
|
+
frames.push({ type: 'remove', id: evicted.id });
|
|
78
|
+
}
|
|
79
|
+
return { type: 'frames', frames };
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=live-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-window.js","sourceRoot":"","sources":["../../src/api/live-window.ts"],"names":[],"mappings":"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","sourcesContent":["import type { LiveDeltaFrame } from '../live/protocol'\nimport type { RealtimeChange } from '../realtime/publisher'\n\nimport { matchesLiveFilters } from './live-view'\n\n/**\n * The server-side state of one live-view connection: which rows the client\n * holds, in view order, and whether rows exist below the window.\n *\n * The window is what lets the server place a row for the client (`afterId`)\n * instead of making the browser repeat `ORDER BY`. It is also what makes a\n * removal from a truncated view ask for a fresh snapshot instead of silently\n * shrinking the view.\n *\n * Ordering follows `buildOrderBy` in `../list-query`: the sort column first,\n * then `id`, both in the query's direction. Values are compared in the process\n * on raw column values. That is exact for numbers, dates, and booleans, and\n * matches the database for ordinary text. A collation that differs from\n * code-unit order, or a NULLS rule other than \"nulls first\", can place a row\n * inside the window differently from the database.\n */\n\nexport type LiveWindowOptions = {\n sort: string\n order: 'asc' | 'desc'\n limit: number\n filters?: Record<string, unknown>\n}\n\nexport type LiveWindowResult =\n | { type: 'none' }\n | { type: 'frames'; frames: LiveDeltaFrame[] }\n | { type: 'resnapshot' }\n\nexport type LiveWindow = {\n /** Adopt a query result as the current view. */\n reset: (items: Record<string, unknown>[], hasMore: boolean) => void\n /** What this change means for this view. */\n apply: (change: RealtimeChange) => LiveWindowResult\n}\n\ntype WindowRow = { id: string; key: unknown }\n\nfunction compareValues(a: unknown, b: unknown): number {\n if (a === b) return 0\n const aNull = a === null || a === undefined\n const bNull = b === null || b === undefined\n if (aNull || bNull) return aNull ? (bNull ? 0 : -1) : 1\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime()\n if (typeof a === 'number' && typeof b === 'number') return a - b\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return Number(a) - Number(b)\n }\n const left = String(a)\n const right = String(b)\n return left < right ? -1 : left > right ? 1 : 0\n}\n\nexport function createLiveWindow(options: LiveWindowOptions): LiveWindow {\n const direction = options.order === 'desc' ? -1 : 1\n let rows: WindowRow[] = []\n let hasMore = false\n\n const compareRows = (a: WindowRow, b: WindowRow): number =>\n direction * (compareValues(a.key, b.key) || compareValues(a.id, b.id))\n\n const rowOf = (record: Record<string, unknown>): WindowRow => ({\n id: String(record.id),\n key: record[options.sort],\n })\n\n /** Where this row belongs among rows that are already in order. */\n const placeOf = (row: WindowRow): number => {\n const index = rows.findIndex((current) => compareRows(row, current) < 0)\n return index === -1 ? rows.length : index\n }\n\n return {\n reset(items, nextHasMore) {\n rows = items.map(rowOf)\n hasMore = nextHasMore\n },\n\n apply(change) {\n const id = String(change.record.id)\n const index = rows.findIndex((row) => row.id === id)\n const held = index !== -1\n\n // The row left the view: deleted, or no longer a match for the filters.\n if (\n change.action === 'delete' ||\n !matchesLiveFilters(change.record, options.filters)\n ) {\n if (!held) return { type: 'none' }\n rows.splice(index, 1)\n // A row from below the window must take the free place, and only the\n // database knows which one.\n if (hasMore) return { type: 'resnapshot' }\n return { type: 'frames', frames: [{ type: 'remove', id }] }\n }\n\n if (held) rows.splice(index, 1)\n const row = rowOf(change.record)\n const place = placeOf(row)\n\n if (place >= options.limit) {\n // It sorts below the window. If the client holds it, it moved out.\n if (!held) return { type: 'none' }\n hasMore = true\n return { type: 'frames', frames: [{ type: 'remove', id }] }\n }\n\n rows.splice(place, 0, row)\n const frames: LiveDeltaFrame[] = [\n {\n type: 'upsert',\n record: change.record,\n afterId: place === 0 ? null : rows[place - 1]!.id,\n },\n ]\n if (rows.length > options.limit) {\n const evicted = rows.pop()!\n hasMore = true\n frames.push({ type: 'remove', id: evicted.id })\n }\n return { type: 'frames', frames }\n },\n }\n}\n"]}
|
package/dist/api/openapi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/api/openapi.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/api/openapi.ts"],"names":[],"mappings":"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","sourcesContent":["const HTTP_METHODS = new Set([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'HEAD',\n 'OPTIONS',\n])\n\nexport interface MergeOpenAPISpecsOptions {\n nativeSpec: Record<string, any>\n authSpec?: Record<string, any>\n}\n\nexport function mergeOpenAPISpecs(\n options: MergeOpenAPISpecsOptions,\n): Record<string, any> {\n const { nativeSpec, authSpec } = options\n\n const merged: Record<string, any> = {\n openapi: nativeSpec.openapi || authSpec?.openapi || '3.1.0',\n info: {\n title: 'Bunderstack API',\n version: '1.0.0',\n ...nativeSpec.info,\n },\n paths: JSON.parse(JSON.stringify(nativeSpec.paths || {})),\n components: {},\n security: [...(nativeSpec.security || [])],\n tags: [...(nativeSpec.tags || [])],\n }\n\n if (authSpec) {\n // Merge paths and check for overwrite collisions\n if (authSpec.paths && typeof authSpec.paths === 'object') {\n for (const [routePath, authPathItem] of Object.entries(authSpec.paths)) {\n if (!authPathItem || typeof authPathItem !== 'object') continue\n\n const clonedPathItem = JSON.parse(\n JSON.stringify(authPathItem),\n ) as Record<string, any>\n\n // Normalize tags for Better Auth operations (replace generic \"Default\" with \"Auth\")\n if (routePath.startsWith('/api/auth')) {\n for (const [methodKey, operation] of Object.entries(clonedPathItem)) {\n if (\n HTTP_METHODS.has(methodKey.toUpperCase()) &&\n operation &&\n typeof operation === 'object'\n ) {\n if (Array.isArray(operation.tags)) {\n operation.tags = operation.tags.map((t: string) =>\n t === 'Default' ? 'Auth' : t,\n )\n if (!operation.tags.includes('Auth')) {\n operation.tags.unshift('Auth')\n }\n } else {\n operation.tags = ['Auth']\n }\n }\n }\n }\n\n if (!(routePath in merged.paths)) {\n merged.paths[routePath] = clonedPathItem\n } else {\n const existingPathItem = merged.paths[routePath]\n const incomingPathItem = clonedPathItem\n\n for (const [key, authVal] of Object.entries(incomingPathItem)) {\n const upperKey = key.toUpperCase()\n const isOperation = HTTP_METHODS.has(upperKey)\n\n if (key in existingPathItem) {\n const existingVal = existingPathItem[key]\n if (JSON.stringify(existingVal) !== JSON.stringify(authVal)) {\n if (isOperation) {\n throw new Error(\n `[bunderstack] OpenAPI path overwrite collision: operation \"${upperKey} ${routePath}\"`,\n )\n } else {\n throw new Error(\n `[bunderstack] OpenAPI path property collision on \"${routePath}\": key \"${key}\"`,\n )\n }\n }\n } else {\n existingPathItem[key] = JSON.parse(JSON.stringify(authVal))\n }\n }\n }\n }\n }\n\n // Merge security metadata\n if (Array.isArray(authSpec.security)) {\n for (const sec of authSpec.security) {\n if (\n !merged.security.some(\n (s: any) => JSON.stringify(s) === JSON.stringify(sec),\n )\n ) {\n merged.security.push(sec)\n }\n }\n }\n\n // Merge tags\n if (!merged.tags.some((t: any) => t.name === 'Auth')) {\n merged.tags.push({\n name: 'Auth',\n description: 'Authentication and session management',\n })\n }\n if (Array.isArray(authSpec.tags)) {\n for (const tag of authSpec.tags) {\n if (\n tag.name !== 'Default' &&\n !merged.tags.some((t: any) => t.name === tag.name)\n ) {\n merged.tags.push(tag)\n }\n }\n }\n }\n\n // Merge components by category\n const categories = new Set([\n ...Object.keys(nativeSpec.components || {}),\n ...Object.keys(authSpec?.components || {}),\n ])\n\n for (const category of categories) {\n const nativeCat = nativeSpec.components?.[category] || {}\n const authCat = authSpec?.components?.[category] || {}\n\n const mergedCat: Record<string, any> = { ...nativeCat }\n\n for (const [key, authVal] of Object.entries(authCat)) {\n if (key in nativeCat) {\n const nativeVal = nativeCat[key]\n if (JSON.stringify(nativeVal) !== JSON.stringify(authVal)) {\n throw new Error(\n `[bunderstack] OpenAPI component collision: category \"${category}\" component \"${key}\"`,\n )\n }\n } else {\n mergedCat[key] = authVal\n }\n }\n\n merged.components[category] = mergedCat\n }\n\n // Ensure all tags used in path operations are declared in merged.tags\n for (const pathItem of Object.values(merged.paths)) {\n if (!pathItem || typeof pathItem !== 'object') continue\n for (const [key, op] of Object.entries(pathItem as Record<string, any>)) {\n if (\n HTTP_METHODS.has(key.toUpperCase()) &&\n op &&\n typeof op === 'object' &&\n Array.isArray(op.tags)\n ) {\n for (const tagName of op.tags) {\n if (\n tagName &&\n tagName !== 'Default' &&\n !merged.tags.some((t: any) => t.name === tagName)\n ) {\n merged.tags.push({\n name: tagName,\n description: `${tagName} operations`,\n })\n }\n }\n }\n }\n }\n\n return merged\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime-router.js","sourceRoot":"","sources":["../../src/api/realtime-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,gCAAgC,CAAA;AACvC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAK5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAE5C,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CACzB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAC1C,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CACjE,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;CAC1C,CAAC,CAAA;AAEF,MAAM,eAAe,GAAG,CAAC,CAAC,YAAY,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,wEAAwE;IACxE,sDAAsD;IACtD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAA;AAMF,MAAM,UAAU,sBAAsB,CACpC,SAAwC,EACxC,MAAsB,EACtB,UAAiC,EAAE;IAEnC,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAA;IAChC,MAAM,OAAO,GAAG,gBAAgB,EAG7B,CAAA;IAEH,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM;SAC3B,KAAK,CAAC;QACL,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,+BAA+B;QACxC,IAAI,EAAE,CAAC,UAAU,CAAC;QAClB,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;KACjC,CAAC;SACD,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;SAC/C,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;SAC/D,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CACnD,qBAAqB,CACnB,qBAAqB,CACnB,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EACtD;QACE,aAAa,EAAE,KAAK,CAAC,MAAM;QAC3B,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CACF,EACD;QACE,UAAU,EAAE,OAAO,CAAC,WAAW;QAC/B,MAAM;KACP,CACF,CACF,CAAA;IAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,CAAA;AAClC,CAAC"}
|
|
1
|
+
{"version":3,"file":"realtime-router.js","sourceRoot":"","sources":["../../src/api/realtime-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,gCAAgC,CAAA;AACvC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAK5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAE5C,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CACzB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAC1C,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CACjE,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;CAC1C,CAAC,CAAA;AAEF,MAAM,eAAe,GAAG,CAAC,CAAC,YAAY,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,wEAAwE;IACxE,sDAAsD;IACtD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAA;AAMF,MAAM,UAAU,sBAAsB,CACpC,SAAwC,EACxC,MAAsB,EACtB,UAAiC,EAAE;IAEnC,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAA;IAChC,MAAM,OAAO,GAAG,gBAAgB,EAG7B,CAAA;IAEH,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM;SAC3B,KAAK,CAAC;QACL,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,+BAA+B;QACxC,IAAI,EAAE,CAAC,UAAU,CAAC;QAClB,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;KACjC,CAAC;SACD,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;SAC/C,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;SAC/D,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CACnD,qBAAqB,CACnB,qBAAqB,CACnB,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EACtD;QACE,aAAa,EAAE,KAAK,CAAC,MAAM;QAC3B,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CACF,EACD;QACE,UAAU,EAAE,OAAO,CAAC,WAAW;QAC/B,MAAM;KACP,CACF,CACF,CAAA;IAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,CAAA;AAClC,CAAC","sourcesContent":["import { eventIterator } from '@orpc/server'\nimport '@orpc/openapi/extensions/route'\nimport * as v from 'valibot'\n\nimport type { ResolvedAccess } from '../access'\nimport type { RealtimePublisher } from '../realtime/publisher'\n\nimport { filterRealtimeChanges } from '../realtime/filter'\nimport { withRealtimeHeartbeat } from '../realtime/heartbeat'\nimport { createApiBuilder } from './builder'\n\nconst tablesSchema = v.pipe(\n v.union([v.string(), v.array(v.string())]),\n v.transform((value) => (Array.isArray(value) ? value : [value])),\n)\n\nconst changeSchema = v.strictObject({\n table: v.string(),\n action: v.picklist(['create', 'update', 'delete']),\n record: v.record(v.string(), v.unknown()),\n})\n\nconst heartbeatSchema = v.strictObject({\n type: v.literal('heartbeat'),\n // The cadence this stream sends heartbeats at, so a client can size its\n // dead-stream timeout from the server's real setting.\n intervalMs: v.number(),\n})\n\ntype RealtimeRouterOptions = {\n heartbeatMs?: number\n}\n\nexport function buildRealtimeApiRouter(\n publisher: RealtimePublisher | undefined,\n access: ResolvedAccess,\n options: RealtimeRouterOptions = {},\n) {\n if (!publisher) return undefined\n const builder = createApiBuilder<\n Record<string, unknown>,\n Record<string, unknown>\n >()\n\n const changes = builder.public\n .route({\n method: 'GET',\n path: '/api/realtime',\n summary: 'Subscribe to realtime changes',\n tags: ['realtime'],\n queryStyles: { tables: 'array' },\n })\n .input(v.strictObject({ tables: tablesSchema }))\n .output(eventIterator(v.union([changeSchema, heartbeatSchema])))\n .handler(({ input, context, signal, lastEventId }) =>\n withRealtimeHeartbeat(\n filterRealtimeChanges(\n publisher.subscribe('change', { signal, lastEventId }),\n {\n subscriptions: input.tables,\n access,\n request: context.request,\n getSession: context.getSession,\n },\n ),\n {\n intervalMs: options.heartbeatMs,\n signal,\n },\n ),\n )\n\n return { realtime: { changes } }\n}\n\nexport type RealtimeApiRouter = NonNullable<\n ReturnType<typeof buildRealtimeApiRouter>\n>\n"]}
|
package/dist/api/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/api/registry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/api/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { getOpenAPIMeta } from '@orpc/openapi'\n\nconst RESERVED_EXACT = new Set([\n '/api/health',\n '/api/openapi.json',\n '/api/realtime',\n '/api/rpc',\n '/api/auth',\n '/api/files',\n])\nconst RESERVED_PREFIXES = ['/api/rpc/', '/api/auth/', '/api/files/']\n\nfunction collisionForBunderstackPath(path: string): string | undefined {\n if (RESERVED_EXACT.has(path)) return 'it is reserved by bunderstack'\n const prefix = RESERVED_PREFIXES.find((value) => path.startsWith(value))\n return prefix ? `\"${prefix}*\" is reserved by bunderstack` : undefined\n}\n\nexport interface ApiRegistryEntry {\n handle: string\n operationId: string\n method: string\n path: string\n source: string\n}\n\nexport interface ApiRegistry {\n entries: ApiRegistryEntry[]\n}\n\nexport interface ForeignSpecEntry {\n spec: Record<string, unknown>\n prefix?: string\n source?: string\n}\n\nexport interface BuildApiRegistryOptions {\n nativeRouter?: Record<string, unknown>\n foreignSpecs?: Array<Record<string, unknown> | ForeignSpecEntry>\n /** Native procedures generated by Bunderstack itself may own reserved paths. */\n reservedCoreHandles?: ReadonlySet<string>\n}\n\nconst HTTP_METHODS = new Set([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'HEAD',\n 'OPTIONS',\n])\n\nexport function normalizeApiPath(path: string, prefix?: string): string {\n let cleanPath = path.startsWith('/') ? path : '/' + path\n if (prefix) {\n let cleanPrefix = prefix.startsWith('/') ? prefix : '/' + prefix\n if (cleanPrefix.endsWith('/')) {\n cleanPrefix = cleanPrefix.slice(0, -1)\n }\n if (cleanPath === cleanPrefix || cleanPath.startsWith(cleanPrefix + '/')) {\n // Path already starts with prefix\n } else {\n cleanPath = cleanPrefix + cleanPath\n }\n }\n return cleanPath.replace(/\\/+/g, '/')\n}\n\nexport interface ForeignSpecOptions {\n prefix?: string\n source?: string\n}\n\nexport function normalizeForeignOpenAPISpec(\n spec: Record<string, unknown>,\n options: ForeignSpecOptions = {},\n): Record<string, unknown> {\n const prefix = options.prefix\n const source = options.source\n const cloned: Record<string, unknown> = JSON.parse(JSON.stringify(spec))\n\n if (cloned.paths && typeof cloned.paths === 'object') {\n const normalizedPaths: Record<string, unknown> = {}\n for (const [routePath, pathItem] of Object.entries(\n cloned.paths as Record<string, unknown>,\n )) {\n const canonicalPath = normalizeApiPath(routePath, prefix)\n normalizedPaths[canonicalPath] = pathItem\n }\n cloned.paths = normalizedPaths\n }\n\n if (source) {\n cloned['x-bunderstack-source'] = source\n }\n\n return cloned\n}\n\nexport function mergeApiRoutersStrict(\n target: Record<string, unknown>,\n source?: Record<string, unknown>,\n prefix: string[] = [],\n): Record<string, unknown> {\n if (!source) return { ...target }\n const result: Record<string, unknown> = { ...target }\n\n for (const [key, val] of Object.entries(source)) {\n const currentPath = [...prefix, key]\n const handle = currentPath.join('.')\n const targetVal = result[key]\n\n if (targetVal !== undefined) {\n const isTargetNamespace =\n typeof targetVal === 'object' &&\n targetVal !== null &&\n !('~orpc' in targetVal)\n\n const isSourceNamespace =\n typeof val === 'object' && val !== null && !('~orpc' in val)\n\n if (isTargetNamespace && isSourceNamespace) {\n result[key] = mergeApiRoutersStrict(\n targetVal as Record<string, unknown>,\n val as Record<string, unknown>,\n currentPath,\n )\n } else {\n throw new Error(\n `[bunderstack] Router merge collision at handle \"${handle}\": duplicate procedure or namespace collision`,\n )\n }\n } else {\n result[key] = val\n }\n }\n\n return result\n}\n\nfunction normalizePathSegments(path: string): string[] {\n return path.split('/').filter(Boolean)\n}\n\nfunction isParamSegment(segment: string): boolean {\n return (\n (segment.startsWith('{') && segment.endsWith('}')) ||\n segment.startsWith(':')\n )\n}\n\nfunction normalizePathForCollision(path: string): string {\n const segments = normalizePathSegments(path)\n const normalized = segments.map((seg) =>\n isParamSegment(seg) ? '{param}' : seg,\n )\n return '/' + normalized.join('/')\n}\n\nfunction walkNativeRouter(\n obj: Record<string, unknown>,\n pathSegments: string[] = [],\n): ApiRegistryEntry[] {\n const entries: ApiRegistryEntry[] = []\n\n for (const [key, value] of Object.entries(obj)) {\n if (!value || typeof value !== 'object') continue\n const currentSegments = [...pathSegments, key]\n\n if ('~orpc' in value) {\n const meta = (getOpenAPIMeta(value as any) || {}) as Record<\n string,\n unknown\n >\n const handle = currentSegments.join('.')\n const method = ((meta.method as string) || 'GET').toUpperCase()\n const routePath = (meta.path as string) || '/' + currentSegments.join('/')\n const operationId =\n typeof meta.operationId === 'string' ? meta.operationId : handle\n\n entries.push({\n handle,\n operationId,\n method,\n path: routePath,\n source: 'native',\n })\n } else {\n entries.push(\n ...walkNativeRouter(value as Record<string, unknown>, currentSegments),\n )\n }\n }\n\n return entries\n}\n\nfunction extractForeignEntries(\n specs: Array<Record<string, unknown> | ForeignSpecEntry>,\n): ApiRegistryEntry[] {\n const entries: ApiRegistryEntry[] = []\n\n for (const item of specs) {\n if (!item) continue\n let specObj: Record<string, unknown>\n let source = 'foreign'\n\n if ('spec' in item && typeof item.spec === 'object' && item.spec !== null) {\n const entry = item as ForeignSpecEntry\n source = entry.source || 'foreign'\n specObj = normalizeForeignOpenAPISpec(entry.spec, {\n prefix: entry.prefix,\n source,\n })\n } else {\n const rawSpec = item as Record<string, unknown>\n source = (rawSpec['x-bunderstack-source'] as string) || 'foreign'\n specObj = normalizeForeignOpenAPISpec(rawSpec, { source })\n }\n\n if (!specObj || typeof specObj.paths !== 'object' || !specObj.paths)\n continue\n const paths = specObj.paths as Record<string, Record<string, unknown>>\n\n for (const [routePath, pathItem] of Object.entries(paths)) {\n if (!pathItem || typeof pathItem !== 'object') continue\n\n for (const [methodKey, operation] of Object.entries(pathItem)) {\n const uppercaseMethod = methodKey.toUpperCase()\n if (!HTTP_METHODS.has(uppercaseMethod)) continue\n if (!operation || typeof operation !== 'object') continue\n\n const op = operation as Record<string, unknown>\n const handle = `foreign:${source}:${uppercaseMethod}:${routePath}`\n const operationId =\n typeof op.operationId === 'string' ? op.operationId : handle\n\n entries.push({\n handle,\n operationId,\n method: uppercaseMethod,\n path: routePath,\n source,\n })\n }\n }\n }\n\n return entries\n}\n\nexport async function buildApiRegistry(\n options: BuildApiRegistryOptions = {},\n): Promise<ApiRegistry> {\n const entries: ApiRegistryEntry[] = []\n\n if (options.nativeRouter) {\n entries.push(...walkNativeRouter(options.nativeRouter))\n }\n\n if (options.foreignSpecs) {\n entries.push(...extractForeignEntries(options.foreignSpecs))\n }\n\n const errors: string[] = []\n\n for (const entry of entries) {\n if (entry.source !== 'native') continue\n if (options.reservedCoreHandles?.has(entry.handle)) continue\n const reason = collisionForBunderstackPath(entry.path)\n if (reason) {\n errors.push(\n `Reserved route collision on ${entry.method} ${entry.path}: native handle \"${entry.handle}\" conflicts because ${reason}`,\n )\n }\n }\n\n // Check duplicate handles\n const handleMap = new Map<string, ApiRegistryEntry>()\n for (const entry of entries) {\n const existing = handleMap.get(entry.handle)\n if (existing) {\n errors.push(\n `Duplicate handle \"${entry.handle}\": collision between ${existing.source} (${existing.method} ${existing.path}) and ${entry.source} (${entry.method} ${entry.path})`,\n )\n } else {\n handleMap.set(entry.handle, entry)\n }\n }\n\n // Check duplicate operation IDs\n const opIdMap = new Map<string, ApiRegistryEntry>()\n for (const entry of entries) {\n const existing = opIdMap.get(entry.operationId)\n if (existing) {\n errors.push(\n `Duplicate operation ID \"${entry.operationId}\": collision between ${existing.source} (${existing.handle}) and ${entry.source} (${entry.handle})`,\n )\n } else {\n opIdMap.set(entry.operationId, entry)\n }\n }\n\n // Check method/path collisions (exact and parameter ambiguity)\n const routePatternMap = new Map<string, ApiRegistryEntry>()\n for (const entry of entries) {\n const normalizedPath = normalizePathForCollision(entry.path)\n const routeKey = `${entry.method} ${normalizedPath}`\n\n const existing = routePatternMap.get(routeKey)\n if (existing) {\n if (existing.path === entry.path) {\n errors.push(\n `Exact method/path collision on ${entry.method} ${entry.path}: collision between ${existing.source} (${existing.handle}) and ${entry.source} (${entry.handle})`,\n )\n } else {\n errors.push(\n `Ambiguous parameter path collision on ${entry.method} (${existing.path} vs ${entry.path}): collision between ${existing.source} (${existing.handle}) and ${entry.source} (${entry.handle})`,\n )\n }\n } else {\n routePatternMap.set(routeKey, entry)\n }\n }\n\n if (errors.length > 0) {\n throw new Error(\n `[bunderstack] Route registry validation failed (${errors.length} error(s)):\\n` +\n errors.join('\\n'),\n )\n }\n\n return { entries }\n}\n"]}
|
package/dist/api/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/api/router.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAA;AAGvC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAWlD,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,OAAO,GAAG,gBAAgB,EAG7B,CAAA;IACH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;SAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;SAC/D,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACnD,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAa,EAAE,CAAC,CAAC,CAAA;IAE7C,MAAM,MAAM,GAAG;QACb,EAAE,MAAM,EAAE;QACV,OAAO,CAAC,IAAI;QACZ,OAAO,CAAC,OAAO;QACf,OAAO,CAAC,QAAQ;QAChB,OAAO,CAAC,MAAM;KACf,CAAC,MAAM,CACN,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC7D,EAAE,CACH,CAAA;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAA;IAC3C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAA;IAE1C,6EAA6E;IAC7E,yEAAyE;IACzE,+DAA+D;IAC/D,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CACtC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAW,CAAC,EACjC,OAAO,CAAC,MAAM,CACf,CAAA;IAED,OAAO,cAAc,CAAC,MAAM,CAAC,MAAe,CAA4B,CAAA;AAC1E,CAAC"}
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/api/router.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAA;AAGvC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAWlD,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,OAAO,GAAG,gBAAgB,EAG7B,CAAA;IACH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;SAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;SAC/D,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACnD,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAa,EAAE,CAAC,CAAC,CAAA;IAE7C,MAAM,MAAM,GAAG;QACb,EAAE,MAAM,EAAE;QACV,OAAO,CAAC,IAAI;QACZ,OAAO,CAAC,OAAO;QACf,OAAO,CAAC,QAAQ;QAChB,OAAO,CAAC,MAAM;KACf,CAAC,MAAM,CACN,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC7D,EAAE,CACH,CAAA;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAA;IAC3C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAA;IAE1C,6EAA6E;IAC7E,yEAAyE;IACzE,+DAA+D;IAC/D,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CACtC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAW,CAAC,EACjC,OAAO,CAAC,MAAM,CACf,CAAA;IAED,OAAO,cAAc,CAAC,MAAM,CAAC,MAAe,CAA4B,CAAA;AAC1E,CAAC","sourcesContent":["import '@orpc/openapi/extensions/route'\nimport type { AnyMiddleware } from '@orpc/server'\n\nimport * as v from 'valibot'\n\nimport { createApiBuilder } from './builder'\nimport { mergeApiRoutersStrict } from './registry'\n\nexport interface BuildApiRouterOptions {\n crud: Record<string, unknown>\n storage: Record<string, unknown>\n realtime?: Record<string, unknown>\n custom?: Record<string, unknown>\n /** Applied to every procedure in the graph, outermost first. */\n middleware?: AnyMiddleware[]\n}\n\nexport function buildApiRouter(options: BuildApiRouterOptions) {\n const builder = createApiBuilder<\n Record<string, unknown>,\n Record<string, unknown>\n >()\n const health = builder.public\n .route({ method: 'GET', path: '/api/health', tags: ['system'] })\n .output(v.strictObject({ status: v.literal('ok') }))\n .handler(() => ({ status: 'ok' as const }))\n\n const merged = [\n { health },\n options.crud,\n options.storage,\n options.realtime,\n options.custom,\n ].reduce<Record<string, unknown>>(\n (router, addition) => mergeApiRoutersStrict(router, addition),\n {},\n )\n\n const middleware = options.middleware ?? []\n if (middleware.length === 0) return merged\n\n // `.router()` applies the builder's middleware to every procedure inside, so\n // one list covers CRUD, storage, realtime, health, and custom procedures\n // instead of only the bases an application happens to declare.\n const withMiddleware = middleware.reduce(\n (acc, mw) => acc.use(mw as never),\n builder.public,\n )\n\n return withMiddleware.router(merged as never) as Record<string, unknown>\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-router.js","sourceRoot":"","sources":["../../src/api/storage-router.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage-router.js","sourceRoot":"","sources":["../../src/api/storage-router.ts"],"names":[],"mappings":"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","sourcesContent":["import '@orpc/openapi/extensions/route'\nimport * as v from 'valibot'\n\nimport type {\n StorageExecutionContext,\n StorageOperations,\n} from '../storage/operations'\nimport type { BucketStorageRegistry } from '../storage/registry'\nimport type { ApiContext } from './context'\n\nimport { createApiBuilder } from './builder'\n\nconst uploadResultSchema = v.strictObject({\n fileId: v.string(),\n url: v.string(),\n})\n\nconst prepareUploadSchema = v.variant('mode', [\n v.strictObject({\n mode: v.literal('proxy'),\n uploadUrl: v.string(),\n }),\n v.strictObject({\n mode: v.literal('presign'),\n fileId: v.string(),\n uploadUrl: v.string(),\n method: v.literal('PUT'),\n confirmUrl: v.string(),\n }),\n])\n\nconst responseHeadersSchema = v.record(\n v.string(),\n v.union([v.string(), v.array(v.string()), v.undefined()]),\n)\n\nasync function executionContext(\n context: ApiContext<Record<string, unknown>, Record<string, unknown>>,\n): Promise<StorageExecutionContext> {\n const session = await context.getSession()\n return {\n request: context.request,\n user: session.user,\n session: { activeOrganizationId: session.activeOrganizationId },\n }\n}\n\nfunction headersRecord(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {}\n headers.forEach((value, key) => {\n result[key] = value\n })\n return result\n}\n\nfunction buildBucketProcedures(\n name: string,\n operations: StorageOperations,\n builder: ReturnType<\n typeof createApiBuilder<Record<string, unknown>, Record<string, unknown>>\n >,\n) {\n const prepareUpload = builder.public\n .route({\n method: 'POST',\n path: `/api/files/${name}/presign`,\n summary: `Prepare upload to ${name}`,\n tags: ['files'],\n })\n .input(\n v.strictObject({\n filename: v.optional(v.string()),\n contentType: v.optional(v.string()),\n }),\n )\n .output(prepareUploadSchema)\n .handler(({ input, context }) =>\n executionContext(context).then((exec) =>\n operations.prepareUpload(name, input, exec),\n ),\n )\n\n const upload = builder.public\n .route({\n method: 'POST',\n path: `/api/files/${name}`,\n summary: `Upload to ${name}`,\n tags: ['files'],\n inputStructure: 'detailed',\n outputStructure: 'detailed',\n requestBodyHint: 'form-data',\n })\n .input(\n v.strictObject({\n params: v.optional(v.strictObject({}), {}),\n query: v.optional(v.record(v.string(), v.unknown()), {}),\n headers: v.optional(v.record(v.string(), v.unknown()), {}),\n body: v.strictObject({ file: v.file() }),\n }),\n )\n .output(\n v.strictObject({\n status: v.literal(201),\n body: uploadResultSchema,\n }),\n )\n .handler(async ({ input, context }) => {\n const result = await operations.upload(\n name,\n input.body.file,\n await executionContext(context),\n )\n return {\n status: result.status,\n body: { fileId: result.fileId, url: result.url },\n }\n })\n\n const confirmUpload = builder.public\n .route({\n method: 'POST',\n path: `/api/files/${name}/{id}/confirm`,\n summary: `Confirm upload to ${name}`,\n tags: ['files'],\n })\n .input(v.strictObject({ id: v.string() }))\n .output(uploadResultSchema)\n .handler(({ input, context }) =>\n executionContext(context).then((exec) =>\n operations.confirmUpload(name, input.id, exec),\n ),\n )\n\n const download = builder.public\n .route({\n method: 'GET',\n path: `/api/files/${name}/{+path}`,\n summary: `Download from ${name}`,\n tags: ['files'],\n inputStructure: 'detailed',\n outputStructure: 'detailed',\n })\n .input(\n v.strictObject({\n params: v.strictObject({ path: v.string() }),\n query: v.optional(v.record(v.string(), v.string()), {}),\n headers: v.optional(v.record(v.string(), v.unknown()), {}),\n body: v.optional(v.undefined()),\n }),\n )\n .output(\n v.union([\n v.strictObject({\n status: v.literal(200),\n headers: responseHeadersSchema,\n body: v.unknown(),\n }),\n v.strictObject({\n status: v.literal(302),\n headers: responseHeadersSchema,\n body: v.optional(v.undefined()),\n }),\n ]),\n )\n .handler(async ({ input, context }) => {\n const result = await operations.download(\n name,\n input.params.path,\n input.query,\n await executionContext(context),\n )\n if (result.kind === 'redirect') {\n return {\n status: 302 as const,\n headers: { Location: result.url },\n body: undefined,\n }\n }\n return {\n status: 200 as const,\n headers: headersRecord(result.headers),\n body: result.body,\n }\n })\n\n const deleteFile = builder.public\n .route({\n method: 'DELETE',\n path: `/api/files/${name}/{+path}`,\n summary: `Delete from ${name}`,\n tags: ['files'],\n successStatus: 204,\n })\n .input(v.strictObject({ path: v.string() }))\n .output(v.undefined())\n .handler(async ({ input, context }) => {\n await operations.delete(name, input.path, await executionContext(context))\n return undefined\n })\n\n return { prepareUpload, upload, confirmUpload, download, delete: deleteFile }\n}\n\nexport function buildStorageApiRouter(\n registry: BucketStorageRegistry,\n operations: StorageOperations,\n) {\n const builder = createApiBuilder<\n Record<string, unknown>,\n Record<string, unknown>\n >()\n return {\n files: Object.fromEntries(\n [...registry.keys()].map((name) => [\n name,\n buildBucketProcedures(name, operations, builder),\n ]),\n ),\n }\n}\n"]}
|
package/dist/api/types.d.ts
CHANGED
|
@@ -50,6 +50,6 @@ type IsProcedure<T> = T extends {
|
|
|
50
50
|
export type MergeApiRouterTypes<A, B> = {
|
|
51
51
|
[K in keyof A | keyof B]: K extends keyof A ? K extends keyof B ? IsProcedure<A[K]> extends true ? never : IsProcedure<B[K]> extends true ? never : A[K] extends Record<string, unknown> ? B[K] extends Record<string, unknown> ? MergeApiRouterTypes<A[K], B[K]> : never : never : A[K] : K extends keyof B ? B[K] : never;
|
|
52
52
|
};
|
|
53
|
-
export type UnifiedApiRouter<TCrud
|
|
53
|
+
export type UnifiedApiRouter<TCrud, TCustom extends AnyRouter | undefined> = TCustom extends AnyRouter ? MergeApiRouterTypes<TCrud, TCustom> : TCrud;
|
|
54
54
|
export {};
|
|
55
55
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/api/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"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"}
|
package/dist/api/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AnyRouter } from '@orpc/server'\nimport type { Table } from 'drizzle-orm'\n\nimport type { AccessUser } from '../access'\nimport type { TableCrudProcedures } from './crud-router'\n\nexport interface ProtectedContextAdditions {\n user: AccessUser\n session: {\n activeOrganizationId: string | null\n }\n}\n\ntype AuthTableName = 'user' | 'session' | 'account' | 'verification'\ntype InferSelect<T> = T extends { $inferSelect: infer R } ? R : never\n\ntype DisabledKeys<TAccess> = {\n [K in keyof TAccess & string]: TAccess[K] extends { crud: false } ? K : never\n}[keyof TAccess & string]\n\ntype ExplicitKeys<TSchema, TAccess> = {\n [K in keyof TAccess & keyof TSchema & string]: TAccess[K] extends {\n crud: false\n }\n ? never\n : K extends AuthTableName\n ? TAccess[K] extends { exposeAuthTable: true }\n ? K extends 'user'\n ? K\n : never\n : never\n : K\n}[keyof TAccess & keyof TSchema & string]\n\ntype ConventionKeys<TSchema> = {\n [K in keyof TSchema & string]: K extends AuthTableName\n ? never\n : InferSelect<TSchema[K]> extends { userId: unknown }\n ? K\n : never\n}[keyof TSchema & string]\n\nexport type ExposedApiTables<TSchema, TAccess> = [TAccess] extends [undefined]\n ? ConventionKeys<TSchema>\n :\n | ExplicitKeys<TSchema, TAccess>\n | Exclude<\n ConventionKeys<TSchema>,\n DisabledKeys<TAccess> | (keyof TAccess & string)\n >\n\n/**\n * Column allowlists declared in `access` reach the client as literal unions, so\n * `list` can type `filters` and `sort` per table. Tables that declare nothing\n * get `never` filters and `'id'` sorting, matching the runtime defaults.\n */\ntype FilterableOf<TAccess, K extends string> = K extends keyof TAccess\n ? TAccess[K] extends {\n filterableColumns: readonly (infer F extends string)[]\n }\n ? F\n : never\n : never\n\ntype SortableOf<TAccess, K extends string> = K extends keyof TAccess\n ? TAccess[K] extends { sortableColumns: readonly (infer S extends string)[] }\n ? S\n : 'id'\n : 'id'\n\nexport type CrudApiRouterFor<\n TSchema extends Record<string, unknown>,\n TAccess = undefined,\n> = {\n [K in ExposedApiTables<TSchema, TAccess> as TSchema[K] extends Table\n ? K\n : never]: TableCrudProcedures<\n Extract<TSchema[K], Table>,\n FilterableOf<TAccess, K>,\n SortableOf<TAccess, K>\n >\n}\n\ntype IsProcedure<T> = T extends { '~orpc': unknown } ? true : false\n\nexport type MergeApiRouterTypes<A, B> = {\n [K in keyof A | keyof B]: K extends keyof A\n ? K extends keyof B\n ? IsProcedure<A[K]> extends true\n ? never\n : IsProcedure<B[K]> extends true\n ? never\n : A[K] extends Record<string, unknown>\n ? B[K] extends Record<string, unknown>\n ? MergeApiRouterTypes<A[K], B[K]>\n : never\n : never\n : A[K]\n : K extends keyof B\n ? B[K]\n : never\n}\n\nexport type UnifiedApiRouter<\n TCrud,\n TCustom extends AnyRouter | undefined,\n> = TCustom extends AnyRouter ? MergeApiRouterTypes<TCrud, TCustom> : TCrud\n"]}
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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","sourcesContent":["// src/auth.ts\nimport { betterAuth, type Auth } from 'better-auth'\nimport { drizzleAdapter } from 'better-auth/adapters/drizzle'\nimport { openAPI } from 'better-auth/plugins'\n\nimport type { AuthSessionResolver } from './access'\nimport type { BetterAuthConfig } from './config'\nimport type { AnyDb, Dialect } from './dialect'\nimport type { EmailFacade } from './email'\n\n/**\n * Returns better-auth's plain `Auth`, not the plugin-parameterised type its\n * builder infers: declaration emit would otherwise inline that whole inferred\n * options object into the published `.d.ts`, where it no longer satisfies\n * better-auth's own `BetterAuthOptions` constraint. Plugin-specific endpoints\n * are reached through runtime checks (see the OpenAPI schema lookup in\n * `index.ts`), so nothing depends on the wider type.\n */\nexport function createAuth(\n db: AnyDb,\n cfg: BetterAuthConfig,\n dialect: Dialect,\n userSchema?: Record<string, unknown>,\n): Auth {\n const hasOpenApi = cfg.plugins?.some((p: any) => p.id === 'open-api')\n const plugins = hasOpenApi ? cfg.plugins : [...(cfg.plugins || []), openAPI()]\n\n // Type-only narrowing: the value is unchanged, but the published signature\n // stays a type better-auth itself can name.\n return betterAuth({\n ...cfg,\n plugins,\n database: drizzleAdapter(db as Parameters<typeof drizzleAdapter>[0], {\n provider: dialect === 'pg' ? 'pg' : 'sqlite',\n ...(userSchema ? { schema: userSchema } : {}),\n }),\n }) as unknown as Auth\n}\n\n/**\n * Adapt the raw better-auth instance to our internal {@link AuthSessionResolver}\n * contract. better-auth's `getSession` has a union return (a bare session, or a\n * `{ headers, response }` wrapper when `returnHeaders` is set); we only ever\n * call the bare form, so we narrow on `'user' in result` and map to our shape.\n * Keeping this adapter here means internal modules never depend on better-auth's\n * evolving types.\n */\nexport function toAuthSessionResolver(\n auth: ReturnType<typeof createAuth>,\n): AuthSessionResolver {\n return {\n api: {\n async getSession({ headers }) {\n const result = await auth.api.getSession({ headers })\n if (result && 'user' in result && result.user) {\n const session = 'session' in result ? result.session : null\n const activeOrganizationId =\n session &&\n 'activeOrganizationId' in session &&\n typeof session.activeOrganizationId === 'string'\n ? session.activeOrganizationId\n : null\n const role =\n 'role' in result.user && typeof result.user.role === 'string'\n ? result.user.role\n : undefined\n return {\n user: {\n id: result.user.id,\n email: result.user.email,\n name: result.user.name,\n ...(role ? { role } : {}),\n },\n session: session ? { activeOrganizationId } : null,\n }\n }\n return null\n },\n },\n }\n}\n\n/**\n * Fill better-auth's email hooks from the bunderstack email facade. Only fills\n * gaps: user-supplied handlers always win, and nothing is injected when email\n * isn't configured. emailAndPassword is only touched when the user enabled it\n * (injecting it unasked would enable the feature).\n */\nexport function withEmailAuthDefaults(\n cfg: BetterAuthConfig,\n email: EmailFacade,\n emailConfigured: boolean,\n): BetterAuthConfig {\n if (!emailConfigured) return cfg\n const out: BetterAuthConfig = { ...cfg }\n\n if (\n cfg.emailAndPassword?.enabled &&\n !cfg.emailAndPassword.sendResetPassword\n ) {\n out.emailAndPassword = {\n ...cfg.emailAndPassword,\n sendResetPassword: async ({ user, url }) => {\n await email.send({\n to: user.email,\n subject: 'Reset your password',\n text: `Click the link to reset your password:\\n\\n${url}\\n\\nIf you didn't request this, you can ignore this email.`,\n })\n },\n }\n }\n\n if (!cfg.emailVerification?.sendVerificationEmail) {\n out.emailVerification = {\n ...cfg.emailVerification,\n sendVerificationEmail: async ({ user, url }) => {\n await email.send({\n to: user.email,\n subject: 'Verify your email',\n text: `Click the link to verify your email address:\\n\\n${url}`,\n })\n },\n }\n }\n\n return out\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blueprint-generator.js","sourceRoot":"","sources":["../src/blueprint-generator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"blueprint-generator.js","sourceRoot":"","sources":["../src/blueprint-generator.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n mkdir,\n readFile,\n realpath,\n rename,\n rm,\n writeFile,\n} from 'node:fs/promises'\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\n\nimport {\n blueprintFromManifest,\n serializeBlueprint,\n type BunderstackBlueprint,\n} from './blueprint'\nimport { parseManifest } from './manifest'\n\nexport type GenerateBlueprintOptions = {\n directory: string\n entry?: string\n output?: string\n check?: boolean\n}\n\nexport type GenerateBlueprintResult = {\n path: string\n blueprint: BunderstackBlueprint\n source: string\n changed: boolean\n}\n\nexport class BlueprintCheckError extends Error {\n constructor() {\n super(\n 'bunderstack.blueprint.yaml is missing or stale; run `bunderstack blueprint`',\n )\n this.name = 'BlueprintCheckError'\n }\n}\n\ntype AppPackage = {\n scripts?: Record<string, unknown>\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n bunderstack?: { entry?: unknown }\n}\n\nfunction requireRelativePath(value: string, label: string): string {\n const normalized = value.replaceAll('\\\\', '/')\n if (\n !normalized ||\n isAbsolute(normalized) ||\n normalized.split('/').some((part) => !part || part === '..')\n ) {\n throw new Error(\n `[bunderstack] ${label} must be a relative path without traversal`,\n )\n }\n return normalized\n}\n\nfunction resolveWithin(root: string, value: string, label: string): string {\n const path = resolve(root, requireRelativePath(value, label))\n const pathFromRoot = relative(root, path)\n if (\n pathFromRoot === '..' ||\n pathFromRoot.startsWith('../') ||\n isAbsolute(pathFromRoot)\n ) {\n throw new Error(\n `[bunderstack] ${label} must stay within the application directory`,\n )\n }\n return path\n}\n\nfunction normalizeProjectPath(\n root: string,\n value: string,\n label: string,\n): string {\n if (!isAbsolute(value)) return requireRelativePath(value, label)\n const pathFromRoot = relative(root, resolve(value)) || '.'\n return requireRelativePath(pathFromRoot, label)\n}\n\nfunction requireScript(\n pkg: AppPackage,\n name: 'build' | 'start' | 'worker',\n required: boolean,\n): boolean {\n const value = pkg.scripts?.[name]\n if (typeof value === 'string' && value.trim()) return true\n if (required)\n throw new Error(\n `[bunderstack] package.json requires a non-empty \"${name}\" script`,\n )\n return false\n}\n\nasync function packageVersion(): Promise<string> {\n const pkg = (await Bun.file(\n new URL('../package.json', import.meta.url),\n ).json()) as { version: string }\n return pkg.version\n}\n\nexport async function generateBlueprint(\n options: GenerateBlueprintOptions,\n): Promise<GenerateBlueprintResult> {\n const directory = await realpath(resolve(options.directory))\n const packagePath = join(directory, 'package.json')\n const pkg = JSON.parse(await readFile(packagePath, 'utf8')) as AppPackage\n const allDependencies = { ...pkg.dependencies, ...pkg.devDependencies }\n if (typeof allDependencies['@tanstack/react-start'] !== 'string') {\n throw new Error(\n '[bunderstack] package.json must depend on @tanstack/react-start',\n )\n }\n requireScript(pkg, 'build', true)\n requireScript(pkg, 'start', true)\n\n const configuredEntry = pkg.bunderstack?.entry\n const entry = requireRelativePath(\n options.entry ??\n (typeof configuredEntry === 'string'\n ? configuredEntry\n : 'src/bunderstack.ts'),\n 'entry',\n )\n const entryPath = resolveWithin(directory, entry, 'entry')\n if (!(await Bun.file(entryPath).exists())) {\n throw new Error(`[bunderstack] entry does not exist: ${entry}`)\n }\n const output = requireRelativePath(\n options.output ?? 'bunderstack.blueprint.yaml',\n 'output',\n )\n const outputPath = resolveWithin(directory, output, 'output')\n\n const previousIntrospection = process.env.BUNDERSTACK_INTROSPECT\n process.env.BUNDERSTACK_INTROSPECT = '1'\n let app: { manifest?: unknown; close?: () => Promise<void> } | undefined\n try {\n const module = (await import(\n `${pathToFileURL(entryPath).href}?blueprint=${Date.now()}`\n )) as {\n app?: typeof app\n }\n app = module.app\n if (!app) throw new Error(`[bunderstack] ${entry} must export app`)\n const manifest = parseManifest(app.manifest)\n const workerRequired = manifest.background.jobs.length > 0\n requireScript(pkg, 'worker', workerRequired)\n const migrationsDirectory = normalizeProjectPath(\n directory,\n manifest.database.migrationsDirectory,\n 'migrationsDirectory',\n )\n const migrationJournal = join(\n resolveWithin(directory, migrationsDirectory, 'migrationsDirectory'),\n 'meta',\n '_journal.json',\n )\n const migrationMode = (await Bun.file(migrationJournal).exists())\n ? 'migrations'\n : 'push'\n const blueprint = blueprintFromManifest({\n manifest: {\n ...manifest,\n database: { ...manifest.database, migrationsDirectory },\n },\n generatorVersion: await packageVersion(),\n entry,\n migrationMode,\n })\n const source = serializeBlueprint(blueprint)\n const existing = (await Bun.file(outputPath).exists())\n ? await Bun.file(outputPath).text()\n : undefined\n if (options.check) {\n if (existing !== source) throw new BlueprintCheckError()\n return { path: outputPath, blueprint, source, changed: false }\n }\n if (existing === source)\n return { path: outputPath, blueprint, source, changed: false }\n await mkdir(dirname(outputPath), { recursive: true })\n const temporary = `${outputPath}.${process.pid}.${Date.now()}.tmp`\n try {\n await writeFile(temporary, source, { mode: 0o600 })\n await rename(temporary, outputPath)\n } finally {\n await rm(temporary, { force: true })\n }\n return { path: outputPath, blueprint, source, changed: true }\n } finally {\n await app?.close?.()\n if (previousIntrospection === undefined)\n delete process.env.BUNDERSTACK_INTROSPECT\n else process.env.BUNDERSTACK_INTROSPECT = previousIntrospection\n }\n}\n"]}
|