bunderstack 0.19.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 +10 -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 +2 -2
- package/dist/api/crud-router.d.ts.map +1 -1
- package/dist/api/crud-router.js +72 -67
- package/dist/api/crud-router.js.map +1 -1
- package/dist/api/list-input-schema.js.map +1 -1
- package/dist/api/list-spec.js.map +1 -1
- package/dist/api/live-view.js.map +1 -1
- package/dist/api/live-window.js.map +1 -1
- 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.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.js.map +1 -1
- package/dist/live/index.js.map +1 -1
- package/dist/live/protocol.js.map +1 -1
- package/dist/live/sse.js.map +1 -1
- 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.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/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,16 @@ All notable changes to `bunderstack` will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.19.1] - 2026-08-23
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **Inline source maps in published packages.** `tsconfig.build.json` enables
|
|
12
|
+
`inlineSources: true` across all packages, embedding TypeScript source code
|
|
13
|
+
into `.js.map` files. This prevents bundlers and dev servers (like Vite) from
|
|
14
|
+
emitting warnings about missing source files when consuming packages whose
|
|
15
|
+
`src/` directory is omitted from npm tarballs.
|
|
16
|
+
|
|
7
17
|
## [0.19.0] - 2026-08-23
|
|
8
18
|
|
|
9
19
|
### Added
|
package/dist/access.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access.js","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAExD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IACtC,MAAM;IACN,SAAS;IACT,SAAS;IACT,cAAc;CACf,CAAC,CAAA;AAEF,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;AAsFhD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAsB,EACtB,SAAiB;IAEjB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,KAAK,CAAA;IACjD,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,gBAAgB,GAAG;IACvB,IAAI;IACJ,WAAW;IACX,WAAW;IACX,YAAY;IACZ,YAAY;CACb,CAAA;AAED,SAAS,eAAe,CACtB,MAAe;IAEf,MAAM,MAAM,GAKN,EAAE,CAAA;IACR,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,SAAQ;QAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;QACnD,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;IACnD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAuB,EACvB,OAAiB;IAKjB,MAAM,eAAe,GACnB,KAAK,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACjE,MAAM,WAAW,GAAgB,KAAK,CAAC,WAAW,IAAI;QACpD,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,IAAI;QAClC,KAAK,EAAE,MAAM;KACd,CAAA;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,qCAAqC,WAAW,CAAC,MAAM,iCAAiC,CACzF,CAAA;IACH,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,qCAAqC,WAAW,CAAC,MAAM,qCAAqC,CAC7F,CAAA;IACH,CAAC;IAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAA;IACvD,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,8DAA8D,GAAG,GAAG,CACrE,CAAA;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,4DAA4D,GAAG,GAAG,CACnE,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,CAAA;AAC5D,CAAC;AAED,SAAS,eAAe,CACtB,KAAuB,EACvB,WAA+B,EAC/B,OAAiB;IAEjB,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACpD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAA;IAC/D,OAAO;QACL,WAAW;QACX,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ;QAC5B,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,QAAQ;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ;QAChC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACxD,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACxD,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,eAAe,EAAE;YACf,GAAG,gBAAgB,CAAC,MAAM,CACxB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAC/D;YACD,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC;YAChC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACtC;QACD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI;QAC5B,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK;QAC9B,GAAG,UAAU;KACd,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAiB,EACjB,KAAwB;IAExB,IAAI,KAAK,EAAE,WAAW;QAAE,OAAO,KAAK,CAAC,WAAW,CAAA;IAChD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAA;IAC/C,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAGtC,MAAe,EACf,WAA8C;IAE9C,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACzD,MAAM,QAAQ,GAAmB,IAAI,GAAG,EAAE,CAAA;IAE1C,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,qCAAqC,CACjE,CAAA;YACH,CAAC;YACD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAA;YAC3C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;YAC9B,IAAI,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,IAAI,KAAK,EAAE,IAAI,KAAK,KAAK;oBAAE,SAAQ;gBACnC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC;oBACtE,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,8BAA8B,SAAS,gEAAgE,CACnI,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,MAAM,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC,GAAG,CAAC,CAAA;QAChC,IAAI,KAAK,EAAE,IAAI,KAAK,KAAK;YAAE,SAAQ;QACnC,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAQ;QAE5C,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,EAAE,eAAe,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAQ;YAE1E,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,CAAA;YAC7C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,iBAAiB,WAAW,+BAA+B,IAAI,GAAG,CAC9F,CAAA;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,eAAe,CAC9B;gBACE,GAAG,KAAK;gBACR,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,MAAM;gBAC9B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,MAAM;aAC/B,EACD,WAAW,EACX,OAAO,CACR,CAAA;YAED,MAAM,gBAAgB,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CACtB,CAAA;YACD,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAA;YAEvD,KAAK,MAAM,GAAG,IAAI;gBAChB,GAAG,CAAC,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAC;gBACnC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC;gBACrC,GAAG,QAAQ,CAAC,iBAAiB;gBAC7B,GAAG,QAAQ,CAAC,eAAe;gBAC3B,GAAG,gBAAgB;aACpB,EAAE,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3B,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,+BAA+B,GAAG,eAAe,IAAI,GAAG,CACpF,CAAA;gBACH,CAAC;YACH,CAAC;YAED,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;gBAChB,QAAQ,EAAE,GAAG;gBACb,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,IAAI;gBACb,GAAG,QAAQ;gBACX,eAAe,EAAE,gBAAgB;aAClC,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACrD,MAAM,gBAAgB,GAAG,KAAK,KAAK,SAAS,CAAA;QAC5C,MAAM,kBAAkB,GACtB,WAAW,KAAK,SAAS;YACzB,KAAK,EAAE,WAAW,KAAK,SAAS;YAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAE5B,IAAI,CAAC,gBAAgB,IAAI,CAAC,kBAAkB;YAAE,SAAQ;QACtD,IACE,CAAC,WAAW;YACZ,KAAK,EAAE,IAAI,KAAK,IAAI;YACpB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI;YACnB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK;YAEpB,SAAQ;QAEV,IAAI,KAAK,EAAE,WAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,iBAAiB,KAAK,CAAC,WAAW,+BAA+B,IAAI,GAAG,CACpG,CAAA;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;QACnE,MAAM,gBAAgB,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CACtB,CAAA;QACD,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAA;QAEvD,KAAK,MAAM,GAAG,IAAI;YAChB,GAAG,CAAC,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAC;YACnC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC;YACrC,GAAG,QAAQ,CAAC,iBAAiB;YAC7B,GAAG,QAAQ,CAAC,eAAe;YAC3B,GAAG,gBAAgB;SACpB,EAAE,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,+BAA+B,GAAG,eAAe,IAAI,GAAG,CACpF,CAAA;YACH,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CACxD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CACrB,CAAA;QACD,IAAI,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,2DAA2D,CACvF,CAAA;QACH,CAAC;QAED,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;YAChB,QAAQ,EAAE,GAAG;YACb,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,GAAG,QAAQ;YACX,eAAe,EAAE,gBAAgB;SAClC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,YAAY,CAG1B,MAAe,EAAE,KAAa;IAC9B,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACvC,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,GAA4B,EAC5B,KAAe;IAEf,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,MAAM,IAAI,IAAI;YAAE,OAAO,KAAK,CAAA;QAChC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAA;QAClE,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,MAA+B,EAC/B,KAAe;IAEf,MAAM,GAAG,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;IACzB,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAA;IACnD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,IAGC,EACD,GAAkB,EAClB,WAAoB;IAEpB,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC9C,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC/C,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACxC,IAAI,IAAI,KAAK,eAAe;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACtD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;QAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAA;QACpC,OAAO,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAA;IACpE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAmB,EACnB,GAAkB,EAClB,WAAoB;IAEpB,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IAE3D,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;YAChC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IACrC,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IAE5D,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IAErD,IAAI,IAAI,KAAK,eAAe;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IAEnE,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;QACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,CAAA;QAClE,IAAI,QAAQ,IAAI,IAAI;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;QAC5D,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;QAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IACvC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAA6B,EAC7B,MAA2B,EAC3B,IAAyB,EACzB,MAAqB;IAErB,MAAM,GAAG,GAA4B,EAAE,CAAA;IACvC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IAEhD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,+EAA+E;QAC/E,uEAAuE;QACvE,IAAI,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACtC,IAAI,MAAM,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACjE,SAAQ;YACV,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;YAChB,SAAQ;QACV,CAAC;QACD,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAQ;QAC/B,IAAI,MAAM,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC;YACjE,SAAQ;QACV,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IAClB,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5C,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,IAAI,IAAI,CAAA;IAC1C,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAChC,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAqC,EACrC,OAAgB;IAEhB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACtD,IAAI,CAAC,OAAO,EAAE,IAAI;QAAE,OAAO,IAAI,CAAA;IAC/B,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;QACnB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK;QACzB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;QACvB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;KACxB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAqC,EACrC,OAAgB;IAEhB,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAA;IAC5D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACtD,IAAI,CAAC,OAAO,EAAE,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAA;IACrE,OAAO;QACL,IAAI,EAAE;YACJ,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;YACnB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK;YACzB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;SACxB;QACD,oBAAoB,EAAE,OAAO,CAAC,OAAO,EAAE,oBAAoB,IAAI,IAAI;KACpE,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"access.js","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"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","sourcesContent":["import { getTableColumns, getTableName, isTable } from 'drizzle-orm'\n\nimport { INTERNAL_TABLE_NAMES } from './internal-tables'\n\nexport const AUTH_TABLE_NAMES = new Set([\n 'user',\n 'session',\n 'account',\n 'verification',\n])\n\nconst EXPOSEABLE_AUTH_TABLES = new Set(['user'])\n\nexport type AccessUser = {\n id: string\n email: string\n name?: string\n role?: string\n}\n\nexport type AccessContext = {\n user: AccessUser | null\n request: Request\n row?: Record<string, unknown>\n body?: Record<string, unknown>\n session?: { activeOrganizationId: string | null } | null\n}\n\nexport type OperationRule =\n | 'public'\n | 'authenticated'\n | 'owner'\n | 'deny'\n | ((ctx: AccessContext) => boolean | Promise<boolean>)\n\nexport type ScopeMap = Record<string, string | string[]>\nexport type ScopeResolver = (ctx: AccessContext) => ScopeMap\n\nexport type CrudOperation = 'list' | 'get' | 'create' | 'update' | 'delete'\n\nexport type SortOrder = 'asc' | 'desc'\n\nexport type DefaultSort = {\n column: string\n order: SortOrder\n}\n\nexport type TableAccessInput = {\n crud?: boolean\n /** Opt the BetterAuth `user` table into auto-CRUD (read profiles, owner-update image). */\n exposeAuthTable?: boolean\n ownerColumn?: string\n list?: OperationRule\n get?: OperationRule\n create?: OperationRule\n update?: OperationRule\n delete?: OperationRule\n /** Explicit write allowlist. Entries override matching system-readonly\n * defaults such as `updatedAt`; `id` remains immutable on update. */\n writableColumns?: string[]\n readonlyColumns?: string[]\n /** Columns matched by `?q=` on list — opt-in; omitted columns are never searched. */\n searchableColumns?: string[]\n /** Columns filterable via flat `?column=value` query params. */\n filterableColumns?: string[]\n /** Columns allowed in `?sort=`. Defaults to `['id']`. */\n sortableColumns?: string[]\n /** Default list ordering when `?sort` is omitted. Defaults to `{ column: 'id', order: 'desc' }`. */\n defaultSort?: DefaultSort\n scope?: {\n read?: ScopeResolver\n write?: ScopeResolver\n }\n}\n\nexport type ResolvedTableAccess = {\n tableKey: string\n tableName: string\n enabled: boolean\n ownerColumn?: string\n list: OperationRule\n get: OperationRule\n create: OperationRule\n update: OperationRule\n delete: OperationRule\n writableColumns?: string[]\n readonlyColumns: string[]\n searchableColumns?: string[]\n filterableColumns: string[]\n sortableColumns: string[]\n defaultSort: DefaultSort\n readScope?: ScopeResolver\n writeScope?: ScopeResolver\n}\n\nexport type ResolvedAccess = Map<string, ResolvedTableAccess>\n\n/**\n * Look up a table's resolved access by its physical table name.\n *\n * `ResolvedAccess` is keyed by schema export name, not table name, so every\n * consumer that starts from a physical name needs this scan. It lives here so\n * CRUD, realtime, and route validation cannot drift apart on which tables they\n * consider enabled.\n */\nexport function tableEntryForName(\n access: ResolvedAccess,\n tableName: string,\n): ResolvedTableAccess | undefined {\n for (const entry of access.values()) {\n if (entry.tableName === tableName) return entry\n }\n return undefined\n}\n\nconst DEFAULT_READONLY = [\n 'id',\n 'createdAt',\n 'updatedAt',\n 'created_at',\n 'updated_at',\n]\n\nfunction getSchemaTables<TSchema extends Record<string, unknown>>(\n schema: TSchema,\n) {\n const tables: {\n key: string\n table: Parameters<typeof getTableName>[0]\n name: string\n columns: string[]\n }[] = []\n for (const [key, value] of Object.entries(schema)) {\n if (!isTable(value)) continue\n const name = getTableName(value)\n const columns = Object.keys(getTableColumns(value))\n tables.push({ key, table: value, name, columns })\n }\n return tables\n}\n\nfunction resolveListAccess(\n input: TableAccessInput,\n columns: string[],\n): Pick<\n ResolvedTableAccess,\n 'filterableColumns' | 'sortableColumns' | 'defaultSort'\n> {\n const sortableColumns =\n input.sortableColumns ?? (columns.includes('id') ? ['id'] : [])\n const defaultSort: DefaultSort = input.defaultSort ?? {\n column: sortableColumns[0] ?? 'id',\n order: 'desc',\n }\n\n if (!columns.includes(defaultSort.column)) {\n throw new Error(\n `[bunderstack] defaultSort.column \"${defaultSort.column}\" is not a column on this table`,\n )\n }\n if (!sortableColumns.includes(defaultSort.column)) {\n throw new Error(\n `[bunderstack] defaultSort.column \"${defaultSort.column}\" must be listed in sortableColumns`,\n )\n }\n\n const filterableColumns = input.filterableColumns ?? []\n for (const col of filterableColumns) {\n if (!columns.includes(col)) {\n throw new Error(\n `[bunderstack] filterableColumns references unknown column \"${col}\"`,\n )\n }\n }\n\n for (const col of sortableColumns) {\n if (!columns.includes(col)) {\n throw new Error(\n `[bunderstack] sortableColumns references unknown column \"${col}\"`,\n )\n }\n }\n\n return { filterableColumns, sortableColumns, defaultSort }\n}\n\nfunction resolveDefaults(\n input: TableAccessInput,\n ownerColumn: string | undefined,\n columns: string[],\n): Omit<ResolvedTableAccess, 'tableKey' | 'tableName' | 'enabled'> {\n const listAccess = resolveListAccess(input, columns)\n const explicitlyWritable = new Set(input.writableColumns ?? [])\n return {\n ownerColumn,\n list: input.list ?? 'public',\n get: input.get ?? 'public',\n create: input.create ?? 'public',\n update: input.update ?? (ownerColumn ? 'owner' : 'deny'),\n delete: input.delete ?? (ownerColumn ? 'owner' : 'deny'),\n writableColumns: input.writableColumns,\n readonlyColumns: [\n ...DEFAULT_READONLY.filter(\n (column) => column === 'id' || !explicitlyWritable.has(column),\n ),\n ...(input.readonlyColumns ?? []),\n ...(ownerColumn ? [ownerColumn] : []),\n ],\n searchableColumns: input.searchableColumns,\n readScope: input.scope?.read,\n writeScope: input.scope?.write,\n ...listAccess,\n }\n}\n\nfunction detectOwnerColumn(\n columns: string[],\n input?: TableAccessInput,\n): string | undefined {\n if (input?.ownerColumn) return input.ownerColumn\n if (columns.includes('userId')) return 'userId'\n return undefined\n}\n\nexport function validateAndResolveAccess<\n TSchema extends Record<string, unknown>,\n>(\n schema: TSchema,\n accessInput?: Record<string, TableAccessInput>,\n): ResolvedAccess {\n const tables = getSchemaTables(schema)\n const tableByKey = new Map(tables.map((t) => [t.key, t]))\n const resolved: ResolvedAccess = new Map()\n\n if (accessInput) {\n for (const key of Object.keys(accessInput)) {\n if (!tableByKey.has(key)) {\n throw new Error(\n `[bunderstack] access.${key} does not match any table in schema`,\n )\n }\n const tableName = tableByKey.get(key)!.name\n const input = accessInput[key]\n if (AUTH_TABLE_NAMES.has(tableName)) {\n if (input?.crud === false) continue\n if (!EXPOSEABLE_AUTH_TABLES.has(tableName) || !input?.exposeAuthTable) {\n throw new Error(\n `[bunderstack] access.${key} cannot target auth table \"${tableName}\" — use { crud: false } to silence, or exposeAuthTable on user`,\n )\n }\n }\n }\n }\n\n for (const { key, name, columns } of tables) {\n const input = accessInput?.[key]\n if (input?.crud === false) continue\n if (INTERNAL_TABLE_NAMES.has(name)) continue\n\n if (AUTH_TABLE_NAMES.has(name)) {\n if (!input?.exposeAuthTable || !EXPOSEABLE_AUTH_TABLES.has(name)) continue\n\n const ownerColumn = input.ownerColumn ?? 'id'\n if (!columns.includes(ownerColumn)) {\n throw new Error(\n `[bunderstack] access.${key}.ownerColumn \"${ownerColumn}\" is not a column on table \"${name}\"`,\n )\n }\n\n const defaults = resolveDefaults(\n {\n ...input,\n create: input.create ?? 'deny',\n delete: input.delete ?? 'deny',\n },\n ownerColumn,\n columns,\n )\n\n const existingReadonly = defaults.readonlyColumns.filter((col) =>\n columns.includes(col),\n )\n const resolvedReadonly = [...new Set(existingReadonly)]\n\n for (const col of [\n ...(defaults.writableColumns ?? []),\n ...(defaults.searchableColumns ?? []),\n ...defaults.filterableColumns,\n ...defaults.sortableColumns,\n ...resolvedReadonly,\n ]) {\n if (!columns.includes(col)) {\n throw new Error(\n `[bunderstack] access.${key} references unknown column \"${col}\" on table \"${name}\"`,\n )\n }\n }\n\n resolved.set(key, {\n tableKey: key,\n tableName: name,\n enabled: true,\n ...defaults,\n readonlyColumns: resolvedReadonly,\n })\n continue\n }\n\n const ownerColumn = detectOwnerColumn(columns, input)\n const hasExplicitRules = input !== undefined\n const hasConventionOwner =\n ownerColumn !== undefined &&\n input?.ownerColumn === undefined &&\n columns.includes('userId')\n\n if (!hasExplicitRules && !hasConventionOwner) continue\n if (\n !ownerColumn &&\n input?.crud !== true &&\n !input?.scope?.read &&\n !input?.scope?.write\n )\n continue\n\n if (input?.ownerColumn && !columns.includes(input.ownerColumn)) {\n throw new Error(\n `[bunderstack] access.${key}.ownerColumn \"${input.ownerColumn}\" is not a column on table \"${name}\"`,\n )\n }\n\n const defaults = resolveDefaults(input ?? {}, ownerColumn, columns)\n const existingReadonly = defaults.readonlyColumns.filter((col) =>\n columns.includes(col),\n )\n const resolvedReadonly = [...new Set(existingReadonly)]\n\n for (const col of [\n ...(defaults.writableColumns ?? []),\n ...(defaults.searchableColumns ?? []),\n ...defaults.filterableColumns,\n ...defaults.sortableColumns,\n ...resolvedReadonly,\n ]) {\n if (!columns.includes(col)) {\n throw new Error(\n `[bunderstack] access.${key} references unknown column \"${col}\" on table \"${name}\"`,\n )\n }\n }\n\n const needsOwner = [defaults.update, defaults.delete].some(\n (r) => r === 'owner',\n )\n if (needsOwner && !ownerColumn) {\n throw new Error(\n `[bunderstack] access.${key} requires ownerColumn for owner-based update/delete rules`,\n )\n }\n\n resolved.set(key, {\n tableKey: key,\n tableName: name,\n enabled: true,\n ...defaults,\n readonlyColumns: resolvedReadonly,\n })\n }\n\n return resolved\n}\n\nexport function defineAccess<\n TSchema extends Record<string, unknown>,\n const TRules extends Record<string, TableAccessInput>,\n>(schema: TSchema, rules: TRules): TRules {\n validateAndResolveAccess(schema, rules)\n return rules\n}\n\nexport function rowMatchesScope(\n row: Record<string, unknown>,\n scope: ScopeMap,\n): boolean {\n for (const [col, expected] of Object.entries(scope)) {\n const actual = row[col]\n if (actual == null) return false\n if (Array.isArray(expected)) {\n if (!expected.map(String).includes(String(actual))) return false\n } else if (String(actual) !== String(expected)) {\n return false\n }\n }\n return true\n}\n\nexport function stampScope(\n values: Record<string, unknown>,\n scope: ScopeMap,\n): Record<string, unknown> {\n const out = { ...values }\n for (const [col, expected] of Object.entries(scope)) {\n if (!Array.isArray(expected)) out[col] = expected\n }\n return out\n}\n\nexport function checkAccessSync(\n rule: Exclude<\n OperationRule,\n (ctx: AccessContext) => boolean | Promise<boolean>\n >,\n ctx: AccessContext,\n ownerColumn?: string,\n): { allowed: boolean } {\n if (rule === 'deny') return { allowed: false }\n if (rule === 'public') return { allowed: true }\n if (!ctx.user) return { allowed: false }\n if (rule === 'authenticated') return { allowed: true }\n if (rule === 'owner') {\n if (!ownerColumn) return { allowed: false }\n const owner = ctx.row?.[ownerColumn]\n return { allowed: owner != null && String(owner) === ctx.user.id }\n }\n return { allowed: false }\n}\n\nexport async function checkAccess(\n rule: OperationRule,\n ctx: AccessContext,\n ownerColumn?: string,\n): Promise<{ allowed: boolean; status: 401 | 403 }> {\n if (rule === 'deny') return { allowed: false, status: 403 }\n\n if (typeof rule === 'function') {\n return (await rule(ctx))\n ? { allowed: true, status: 403 }\n : { allowed: false, status: 403 }\n }\n\n if (rule === 'public') return { allowed: true, status: 403 }\n\n if (!ctx.user) return { allowed: false, status: 401 }\n\n if (rule === 'authenticated') return { allowed: true, status: 403 }\n\n if (rule === 'owner') {\n if (!ownerColumn) return { allowed: false, status: 403 }\n const rowOwner = ctx.row?.[ownerColumn] ?? ctx.body?.[ownerColumn]\n if (rowOwner == null) return { allowed: false, status: 403 }\n if (String(rowOwner) !== ctx.user.id) return { allowed: false, status: 403 }\n return { allowed: true, status: 403 }\n }\n\n return { allowed: false, status: 403 }\n}\n\nexport function sanitizeWriteBody(\n body: Record<string, unknown>,\n access: ResolvedTableAccess,\n mode: 'create' | 'update',\n userId: string | null,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n const readonly = new Set(access.readonlyColumns)\n\n for (const [key, value] of Object.entries(body)) {\n // On create, allow client-supplied `id` even if it appears in readonlyColumns,\n // but still respect an explicit writableColumns allowlist if provided.\n if (mode === 'create' && key === 'id') {\n if (access.writableColumns && !access.writableColumns.includes(key))\n continue\n out[key] = value\n continue\n }\n if (readonly.has(key)) continue\n if (access.writableColumns && !access.writableColumns.includes(key))\n continue\n out[key] = value\n }\n\n if (mode === 'create' && access.ownerColumn) {\n out[access.ownerColumn] = userId ?? null\n }\n\n if (mode === 'update' && access.ownerColumn) {\n delete out[access.ownerColumn]\n }\n\n return out\n}\n\nexport type AuthSessionResolver = {\n api: {\n getSession: (opts: { headers: Headers }) => Promise<{\n user: { id: string; email: string; name?: string; role?: string } | null\n session?: { activeOrganizationId?: string | null } | null\n } | null>\n }\n}\n\nexport async function resolveAccessUser(\n auth: AuthSessionResolver | undefined,\n headers: Headers,\n): Promise<AccessUser | null> {\n if (!auth) return null\n const session = await auth.api.getSession({ headers })\n if (!session?.user) return null\n return {\n id: session.user.id,\n email: session.user.email,\n name: session.user.name,\n role: session.user.role,\n }\n}\n\nexport async function resolveSession(\n auth: AuthSessionResolver | undefined,\n headers: Headers,\n): Promise<{ user: AccessUser | null; activeOrganizationId: string | null }> {\n if (!auth) return { user: null, activeOrganizationId: null }\n const session = await auth.api.getSession({ headers })\n if (!session?.user) return { user: null, activeOrganizationId: null }\n return {\n user: {\n id: session.user.id,\n email: session.user.email,\n name: session.user.name,\n role: session.user.role,\n },\n activeOrganizationId: session.session?.activeOrganizationId ?? null,\n }\n}\n"]}
|
package/dist/api/builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/api/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,EAAE,GAKH,MAAM,cAAc,CAAA;AAKrB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,WAAW,CAAA;AAGlB,MAAM,UAAU,gBAAgB;IAI9B,MAAM,IAAI,GAAG,EAAE;SACZ,QAAQ,EAA6B;SACrC,MAAM,CAAC,kBAAkB,CAAC;SAC1B,GAAG,CAAC,oBAAoB,CAAC,CAAA;IAE5B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;QACzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAA;QAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,gBAAgB,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAA;QACvE,CAAC;QACD,OAAO,IAAI,CAAC;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE;oBACP,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;iBACnD;aACF;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,aAAa;QACxB,OAAO,EAAE,IAAI;QACb;;;;;;;WAOG;QACH,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAQnB;KACnB,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAGvB,QAAyC;IACzC,OAAO,gBAAgB,EAA+B,CAAA;AACxD,CAAC"}
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/api/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,EAAE,GAKH,MAAM,cAAc,CAAA;AAKrB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,WAAW,CAAA;AAGlB,MAAM,UAAU,gBAAgB;IAI9B,MAAM,IAAI,GAAG,EAAE;SACZ,QAAQ,EAA6B;SACrC,MAAM,CAAC,kBAAkB,CAAC;SAC1B,GAAG,CAAC,oBAAoB,CAAC,CAAA;IAE5B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;QACzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAA;QAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,gBAAgB,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAA;QACvE,CAAC;QACD,OAAO,IAAI,CAAC;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE;oBACP,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;iBACnD;aACF;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,aAAa;QACxB,OAAO,EAAE,IAAI;QACb;;;;;;;WAOG;QACH,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAQnB;KACnB,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAGvB,QAAyC;IACzC,OAAO,gBAAgB,EAA+B,CAAA;AACxD,CAAC","sourcesContent":["import {\n os,\n type AnyMiddleware,\n type AnyRouter,\n type Context,\n type Middleware,\n} from '@orpc/server'\n\nimport type { EnvConfigInput, ValidatedEnv } from '../env'\nimport type { ApiContext } from './context'\n\nimport {\n BUNDERSTACK_ERRORS,\n BunderstackError,\n mapBunderstackErrors,\n} from '../errors'\nexport type { ProtectedContextAdditions } from './types'\n\nexport function createApiBuilder<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnv = Record<string, unknown>,\n>() {\n const base = os\n .$context<ApiContext<TSchema, TEnv>>()\n .errors(BUNDERSTACK_ERRORS)\n .use(mapBunderstackErrors)\n\n const protectedProc = base.use(async ({ context, next }) => {\n const session = await context.getSession()\n if (!session.user) {\n throw new BunderstackError('UNAUTHORIZED', 'Authentication required')\n }\n return next({\n context: {\n user: session.user,\n session: {\n activeOrganizationId: session.activeOrganizationId,\n },\n },\n })\n })\n\n return {\n public: base,\n protected: protectedProc,\n webhook: base,\n /**\n * Declares a standalone middleware over the base context. Use it for\n * `createBunderstack({ middleware })`, which reaches every procedure in\n * the graph, and for `.use(...)` on any base declared here.\n *\n * The annotation is explicit because the inferred `DecoratedMiddleware`\n * is internal to `@orpc/server` and cannot be named in the emitted types.\n */\n middleware: base.middleware.bind(base) as <TOutContext extends Context>(\n middleware: Middleware<\n ApiContext<TSchema, TEnv>,\n TOutContext,\n unknown,\n unknown,\n typeof BUNDERSTACK_ERRORS\n >,\n ) => AnyMiddleware,\n }\n}\n\n/**\n * Same builder as `createApiBuilder`, but the generics come from the values an\n * application already has. It reads nothing at runtime, so a module can call it\n * at import time and export the bases that its router modules import.\n */\nexport function defineApi<\n TSchema extends Record<string, unknown>,\n TEnv extends EnvConfigInput | undefined = undefined,\n>(_options: { schema: TSchema; env?: TEnv }) {\n return createApiBuilder<TSchema, ValidatedEnv<TEnv>>()\n}\n\nexport type BunderstackApiBuilder<\n TSchema extends Record<string, unknown>,\n TEnv = Record<string, unknown>,\n> = ReturnType<typeof createApiBuilder<TSchema, TEnv>>\n\nexport type ApiFactory<\n TSchema extends Record<string, unknown>,\n TEnv,\n TCustomApiRouter extends AnyRouter,\n> = (builder: BunderstackApiBuilder<TSchema, TEnv>) => TCustomApiRouter\n"]}
|
package/dist/api/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/api/context.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AA6C1C,MAAM,UAAU,gBAAgB,CAI9B,IAAmC,EACnC,OAAgB;IAEhB,uEAAuE;IACvE,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,EAAE,CAAA;IACtC,IAAI,cAA2C,CAAA;IAC/C,IAAI,cAES,CAAA;IAEb,IAAI,cAES,CAAA;IAEb,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CACtE,CAAC,OAAO,EAAE,EAAE;gBACV,cAAc,GAAG,OAAO,CAAA;gBACxB,OAAO,OAAO,CAAA;YAChB,CAAC,CACF,CAAA;QACH,CAAC;QACD,OAAO,cAAc,CAAA;IACvB,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,cAAc,CAAA;IAExC,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,CAAC,cAAc;YAAE,cAAc,GAAG,cAAc,CAAC,IAAI,EAAE,CAAA;QAC3D,OAAO,cAAc,CAAA;IACvB,CAAC,CAAA;IAED,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO;QACP,UAAU,EAAE,IAAI,OAAO,EAAE;QACzB,UAAU;QACV,UAAU;QACV,WAAW;KACZ,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/api/context.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AA6C1C,MAAM,UAAU,gBAAgB,CAI9B,IAAmC,EACnC,OAAgB;IAEhB,uEAAuE;IACvE,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,EAAE,CAAA;IACtC,IAAI,cAA2C,CAAA;IAC/C,IAAI,cAES,CAAA;IAEb,IAAI,cAES,CAAA;IAEb,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CACtE,CAAC,OAAO,EAAE,EAAE;gBACV,cAAc,GAAG,OAAO,CAAA;gBACxB,OAAO,OAAO,CAAA;YAChB,CAAC,CACF,CAAA;QACH,CAAC;QACD,OAAO,cAAc,CAAA;IACvB,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,cAAc,CAAA;IAExC,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,CAAC,cAAc;YAAE,cAAc,GAAG,cAAc,CAAC,IAAI,EAAE,CAAA;QAC3D,OAAO,cAAc,CAAA;IACvB,CAAC,CAAA;IAED,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO;QACP,UAAU,EAAE,IAAI,OAAO,EAAE;QACzB,UAAU;QACV,UAAU;QACV,WAAW;KACZ,CAAA;AACH,CAAC","sourcesContent":["import type { AccessUser, AuthSessionResolver } from '../access'\nimport type { DbFor } from '../db'\nimport type { EmailFacade } from '../email'\nimport type { AuthInstance, StorageFacade } from '../index'\nimport type { JobsRuntimeFacade } from '../jobs/define'\nimport type { RealtimeFacade } from '../realtime/facade'\n\nimport { resolveSession } from '../access'\n\nexport interface ApiContextDeps<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnv = Record<string, unknown>,\n> {\n db: DbFor<TSchema>\n env: TEnv\n storage: StorageFacade\n email: EmailFacade\n jobs: JobsRuntimeFacade\n realtime: RealtimeFacade<TSchema>\n auth: AuthInstance\n authResolver?: AuthSessionResolver\n}\n\nexport interface ApiContext<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnv = Record<string, unknown>,\n> {\n db: DbFor<TSchema>\n env: TEnv\n storage: StorageFacade\n email: EmailFacade\n jobs: JobsRuntimeFacade\n realtime: RealtimeFacade<TSchema>\n auth: AuthInstance\n request: Request\n resHeaders: Headers\n getRawBody: () => Promise<string>\n getSession: () => Promise<{\n user: AccessUser | null\n activeOrganizationId: string | null\n }>\n /**\n * The session that some earlier code already resolved, or `undefined`.\n * Never starts a resolution, so a global middleware can log the caller\n * without removing the lazy session behavior that signed webhooks rely on.\n * Use it for observability only. Never use it for authorization.\n */\n peekSession: () =>\n | { user: AccessUser | null; activeOrganizationId: string | null }\n | undefined\n}\n\nexport function createApiContext<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnv = Record<string, unknown>,\n>(\n deps: ApiContextDeps<TSchema, TEnv>,\n request: Request,\n): ApiContext<TSchema, TEnv> {\n // Reserve the body stream before a transport codec consumes `request`.\n const rawBodyRequest = request.clone()\n let rawBodyPromise: Promise<string> | undefined\n let sessionPromise:\n | Promise<{ user: AccessUser | null; activeOrganizationId: string | null }>\n | undefined\n\n let settledSession:\n | { user: AccessUser | null; activeOrganizationId: string | null }\n | undefined\n\n const getSession = () => {\n if (!sessionPromise) {\n sessionPromise = resolveSession(deps.authResolver, request.headers).then(\n (session) => {\n settledSession = session\n return session\n },\n )\n }\n return sessionPromise\n }\n\n const peekSession = () => settledSession\n\n const getRawBody = () => {\n if (!rawBodyPromise) rawBodyPromise = rawBodyRequest.text()\n return rawBodyPromise\n }\n\n return {\n db: deps.db,\n env: deps.env,\n storage: deps.storage,\n email: deps.email,\n jobs: deps.jobs,\n realtime: deps.realtime,\n auth: deps.auth,\n request,\n resHeaders: new Headers(),\n getRawBody,\n getSession,\n peekSession,\n }\n}\n"]}
|
|
@@ -374,7 +374,7 @@ export declare function buildTableCrudProcedures<TSchema extends Record<string,
|
|
|
374
374
|
}>;
|
|
375
375
|
};
|
|
376
376
|
}, never>;
|
|
377
|
-
live
|
|
377
|
+
live: import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>> & object, object, v.GenericSchema<LiveInputFor<TTable, TFilterable, TSortable>, LiveInputFor<TTable, TFilterable, TSortable>>, import("@orpc/contract").Schema<AsyncIteratorObject<{
|
|
378
378
|
type: "snapshot";
|
|
379
379
|
items: {
|
|
380
380
|
[x: string]: unknown;
|
|
@@ -473,7 +473,7 @@ export declare function buildTableCrudProcedures<TSchema extends Record<string,
|
|
|
473
473
|
readonly code: "TOO_MANY_REQUESTS";
|
|
474
474
|
}>;
|
|
475
475
|
};
|
|
476
|
-
}, never
|
|
476
|
+
}, never>;
|
|
477
477
|
};
|
|
478
478
|
export type TableCrudProcedures<TTable extends Table, TFilterable extends string = string, TSortable extends string = string> = ReturnType<typeof buildTableCrudProcedures<Record<string, unknown>, TTable, TFilterable, TSortable>>;
|
|
479
479
|
export declare function buildCrudApiRouter<TSchema extends Record<string, unknown>, TAccess extends Record<string, TableAccessInput> | undefined = undefined>(schema: TSchema, db: AnyDb, options: CrudApiRouterOptions<TSchema>): CrudApiRouterFor<TSchema, TAccess>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud-router.d.ts","sourceRoot":"","sources":["../../src/api/crud-router.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"crud-router.d.ts","sourceRoot":"","sources":["../../src/api/crud-router.ts"],"names":[],"mappings":"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"}
|
package/dist/api/crud-router.js
CHANGED
|
@@ -215,82 +215,87 @@ export function buildTableCrudProcedures(args) {
|
|
|
215
215
|
v.strictObject({ type: v.literal('remove'), id: v.string() }),
|
|
216
216
|
v.strictObject({ type: v.literal('heartbeat'), intervalMs: v.number() }),
|
|
217
217
|
]);
|
|
218
|
-
const live =
|
|
219
|
-
|
|
220
|
-
:
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
218
|
+
const live = builder.public
|
|
219
|
+
.route({
|
|
220
|
+
method: 'GET',
|
|
221
|
+
// A path of its own, not a child of the table: `/{table}/live`
|
|
222
|
+
// would make the id "live" unreachable on the get route, and a
|
|
223
|
+
// colon suffix is a wildcard parameter in the oRPC matcher.
|
|
224
|
+
path: `/api/live/${name}`,
|
|
225
|
+
summary: `Live view of ${name}`,
|
|
226
|
+
tags: [name],
|
|
227
|
+
// Filters arrive as one URL-encoded JSON value, so no per-key query
|
|
228
|
+
// parsing rule is needed.
|
|
229
|
+
queryStyles: { filters: 'json' },
|
|
230
|
+
})
|
|
231
|
+
.input(liveQuerySchema)
|
|
232
|
+
.output(eventIterator(liveFrameSchema))
|
|
233
|
+
.handler(({ input, context, signal }) => {
|
|
234
|
+
if (!livePublisher) {
|
|
235
|
+
throw new Error(`Realtime is not enabled for live view of ${name}`);
|
|
236
|
+
}
|
|
237
|
+
// Subscribe before anything awaits, so no change slips between the
|
|
238
|
+
// snapshot read and the start of the stream; events that arrive
|
|
239
|
+
// during the query buffer in the publisher and replay on first pull.
|
|
240
|
+
const changes = filterTableChanges(livePublisher.subscribe('change', { signal }), {
|
|
241
|
+
tableName: schemaKey,
|
|
242
|
+
entry: access,
|
|
243
|
+
rule: access.list,
|
|
244
|
+
request: context.request,
|
|
245
|
+
getSession: context.getSession,
|
|
246
|
+
});
|
|
247
|
+
return withRealtimeHeartbeat((async function* () {
|
|
248
|
+
const session = await context.getSession();
|
|
249
|
+
const execCtx = {
|
|
243
250
|
request: context.request,
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
type: 'snapshot',
|
|
265
|
-
items: result.items,
|
|
266
|
-
sort: result.sort,
|
|
267
|
-
order: result.order,
|
|
268
|
-
limit: result.limit,
|
|
269
|
-
hasMore: result.hasMore,
|
|
270
|
-
};
|
|
251
|
+
user: session.user,
|
|
252
|
+
session: { activeOrganizationId: session.activeOrganizationId },
|
|
253
|
+
};
|
|
254
|
+
let view;
|
|
255
|
+
const readSnapshot = async () => {
|
|
256
|
+
const result = await operations.list(name, input ?? {}, execCtx);
|
|
257
|
+
view = createLiveWindow({
|
|
258
|
+
sort: result.sort,
|
|
259
|
+
order: result.order,
|
|
260
|
+
limit: result.limit,
|
|
261
|
+
filters: input?.filters,
|
|
262
|
+
});
|
|
263
|
+
view.reset(result.items, result.hasMore);
|
|
264
|
+
return {
|
|
265
|
+
type: 'snapshot',
|
|
266
|
+
items: result.items,
|
|
267
|
+
sort: result.sort,
|
|
268
|
+
order: result.order,
|
|
269
|
+
limit: result.limit,
|
|
270
|
+
hasMore: result.hasMore,
|
|
271
271
|
};
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
for (const frame of outcome.frames)
|
|
282
|
-
yield frame;
|
|
272
|
+
};
|
|
273
|
+
yield await readSnapshot();
|
|
274
|
+
for await (const change of changes) {
|
|
275
|
+
const outcome = view.apply(change);
|
|
276
|
+
if (outcome.type === 'none')
|
|
277
|
+
continue;
|
|
278
|
+
if (outcome.type === 'resnapshot') {
|
|
279
|
+
yield await readSnapshot();
|
|
280
|
+
continue;
|
|
283
281
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
282
|
+
for (const frame of outcome.frames)
|
|
283
|
+
yield frame;
|
|
284
|
+
}
|
|
285
|
+
})(), { intervalMs: REALTIME_HEARTBEAT_INTERVAL_MS, signal });
|
|
286
|
+
});
|
|
287
|
+
const procedures = {
|
|
287
288
|
list,
|
|
288
289
|
get,
|
|
289
290
|
create,
|
|
290
291
|
update,
|
|
291
292
|
delete: deleteProc,
|
|
292
|
-
|
|
293
|
+
live,
|
|
293
294
|
};
|
|
295
|
+
if (!livePublisher) {
|
|
296
|
+
delete procedures.live;
|
|
297
|
+
}
|
|
298
|
+
return procedures;
|
|
294
299
|
}
|
|
295
300
|
export function buildCrudApiRouter(schema, db, options) {
|
|
296
301
|
const { access, realtime, idempotency, livePublisher } = options;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud-router.js","sourceRoot":"","sources":["../../src/api/crud-router.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"crud-router.js","sourceRoot":"","sources":["../../src/api/crud-router.ts"],"names":[],"mappings":"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","sourcesContent":["import { getTableColumns, getTableName, isTable, type Table } from 'drizzle-orm'\nimport {\n createInsertSchema,\n createSelectSchema,\n createUpdateSchema,\n} from 'drizzle-valibot'\nimport '@orpc/openapi/extensions/route'\nimport { eventIterator } from '@orpc/server'\nimport * as v from 'valibot'\n\nimport type { AnyDb } from '../dialect'\nimport type { IdempotencyConfig } from '../idempotency'\nimport type { LiveSnapshotFrame } from '../live/protocol'\nimport type { RealtimeFacade } from '../realtime/facade'\nimport type { RealtimePublisher } from '../realtime/publisher'\nimport type { CrudApiRouterFor } from './types'\n\nimport {\n tableEntryForName,\n type ResolvedAccess,\n type ResolvedTableAccess,\n type TableAccessInput,\n} from '../access'\nimport { createCrudOperations, type CrudOperations } from '../crud-operations'\nimport { filterTableChanges } from '../realtime/filter'\nimport {\n REALTIME_HEARTBEAT_INTERVAL_MS,\n withRealtimeHeartbeat,\n} from '../realtime/heartbeat'\nimport { createApiBuilder } from './builder'\nimport { createLiveWindow } from './live-window'\nimport { buildListInputSchema, buildLiveInputSchema } from './list-input-schema'\n\nexport type CrudApiRouterOptions<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n> = {\n access: ResolvedAccess\n idempotency?: boolean | IdempotencyConfig\n realtime?: RealtimeFacade<TSchema>\n /**\n * The raw realtime publisher, present when realtime is enabled. The CRUD\n * router subscribes on behalf of live views (`GET /{table}:live`);\n * publishing stays behind the facade.\n */\n livePublisher?: RealtimePublisher\n}\n\nfunction strictObject<TEntries extends v.ObjectEntries>(schema: {\n entries: TEntries\n}) {\n return v.strictObject(schema.entries)\n}\n\ntype CrudInsert<TTable extends Table> = Partial<TTable['$inferInsert']>\ntype CrudUpdate<TTable extends Table> = Partial<\n Omit<TTable['$inferInsert'], 'id'>\n>\n\n/** A filter accepts one value (`=`), a list (`IN`), or null (`IS NULL`). */\nexport type ListFilterValue<T> = T | readonly T[] | null | 'null'\n\nexport type ListFilters<TTable extends Table, TFilterable extends string> = {\n [K in Extract<keyof TTable['$inferSelect'], TFilterable>]?: ListFilterValue<\n TTable['$inferSelect'][K]\n >\n}\n\n/**\n * The `list` input as callers see it. Filter columns and sortable columns come\n * from the table's `access` entry, so `filters` autocompletes to real columns\n * and rejects wrong value types at compile time.\n */\nexport type ListInputFor<\n TTable extends Table,\n TFilterable extends string,\n TSortable extends string,\n> =\n | {\n limit?: number\n offset?: number\n cursor?: string\n sort?: TSortable\n order?: 'asc' | 'desc'\n q?: string\n count?: boolean\n filters?: ListFilters<TTable, TFilterable>\n }\n | undefined\n\n/**\n * The live-view input as callers see it: the list contract narrowed to what a\n * stream can honor — no text search, no pagination.\n */\nexport type LiveInputFor<\n TTable extends Table,\n TFilterable extends string,\n TSortable extends string,\n> =\n | {\n limit?: number\n sort?: TSortable\n order?: 'asc' | 'desc'\n filters?: ListFilters<TTable, TFilterable>\n }\n | undefined\n\nexport type BuildTableCrudProceduresArgs<\n TSchema extends Record<string, unknown>,\n TTable extends Table,\n> = {\n table: TTable\n operations: CrudOperations\n builder: ReturnType<typeof createApiBuilder<TSchema>>\n access: ResolvedTableAccess\n /** The schema key events are published under. */\n schemaKey: string\n /** Present when realtime is enabled; without it no live procedure is built. */\n livePublisher?: RealtimePublisher\n}\n\nexport function buildTableCrudProcedures<\n TSchema extends Record<string, unknown>,\n TTable extends Table,\n TFilterable extends string = string,\n TSortable extends string = string,\n>(args: BuildTableCrudProceduresArgs<TSchema, TTable>) {\n const { table, operations, builder, access, schemaKey, livePublisher } =\n args\n const name = getTableName(table)\n\n // drizzle-valibot infers its schemas through internal generics. Left as-is,\n // declaration emit inlines those generics by name into the published `.d.ts`,\n // where they are unbound — every column silently becomes optional for the\n // consumer. Restating the type keeps the runtime schema and makes the emitted\n // one both correct and readable.\n const selectSchema = strictObject(\n createSelectSchema(table),\n ) as unknown as v.GenericSchema<\n TTable['$inferSelect'],\n TTable['$inferSelect']\n >\n const generatedInsertSchema = strictObject(createInsertSchema(table))\n const generatedColumns = Object.keys(generatedInsertSchema.entries)\n const columns = getTableColumns(table)\n const serverManagedColumns = [\n ...access.readonlyColumns,\n ...(access.writeScope && generatedColumns.includes('organizationId')\n ? ['organizationId']\n : []),\n ...Object.entries(columns)\n .filter(([, column]) => !column.notNull || column.hasDefault)\n .map(([column]) => column),\n ].filter((column) => generatedColumns.includes(column))\n const insertEntries: Record<\n string,\n v.BaseSchema<unknown, unknown, v.BaseIssue<unknown>>\n > = {\n ...generatedInsertSchema.entries,\n }\n for (const column of serverManagedColumns) {\n const schema = insertEntries[column]\n if (schema) insertEntries[column] = v.optional(schema)\n }\n const insertSchema = v.strictObject(\n insertEntries,\n ) as unknown as v.GenericSchema<CrudInsert<TTable>, CrudInsert<TTable>>\n const generatedUpdateSchema = createUpdateSchema(table)\n const updateBodySchema = v.omit(generatedUpdateSchema, [\n 'id' as keyof typeof generatedUpdateSchema.entries,\n ])\n const updateInputSchema = v.strictObject({\n params: v.strictObject({ id: v.string() }),\n query: v.optional(v.record(v.string(), v.unknown()), {}),\n headers: v.optional(v.record(v.string(), v.unknown()), {}),\n // Same reason as `selectSchema`: state the type instead of letting\n // declaration emit inline drizzle-valibot's generics.\n body: strictObject(updateBodySchema) as unknown as v.GenericSchema<\n CrudUpdate<TTable>,\n CrudUpdate<TTable>\n >,\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 // The cast restates the schema with the literals the caller's `access`\n // config carries, which the runtime column lists cannot name on their own.\n const listQuerySchema = buildListInputSchema(table, {\n filterableColumns: access.filterableColumns,\n sortableColumns: access.sortableColumns,\n }) as unknown as v.GenericSchema<\n ListInputFor<TTable, TFilterable, TSortable>,\n ListInputFor<TTable, TFilterable, TSortable>\n >\n\n const listOutputSchema = v.strictObject({\n items: v.array(selectSchema),\n nextCursor: v.optional(v.string()),\n hasMore: v.boolean(),\n total: v.optional(v.number()),\n limit: v.optional(v.number()),\n offset: v.optional(v.number()),\n cursor: v.optional(v.string()),\n q: v.optional(v.string()),\n sort: v.optional(v.string()),\n order: v.optional(v.string()),\n })\n\n // 1. LIST procedure\n const list = builder.public\n .route({\n method: 'GET',\n path: `/api/${name}`,\n summary: `List ${name}`,\n tags: [name],\n })\n .input(listQuerySchema)\n .output(listOutputSchema)\n .handler(async ({ input, context }) => {\n const session = await context.getSession()\n const execCtx = {\n request: context.request,\n user: session.user,\n session: { activeOrganizationId: session.activeOrganizationId },\n }\n const result = await operations.list(name, input ?? {}, execCtx)\n return {\n ...result,\n items: result.items as TTable['$inferSelect'][],\n }\n })\n\n // 2. GET procedure\n const get = builder.public\n .route({\n method: 'GET',\n path: `/api/${name}/{id}`,\n summary: `Get ${name} by ID`,\n tags: [name],\n })\n .input(v.strictObject({ id: v.string() }))\n .output(selectSchema)\n .handler(async ({ input, context }) => {\n const session = await context.getSession()\n const execCtx = {\n request: context.request,\n user: session.user,\n session: { activeOrganizationId: session.activeOrganizationId },\n }\n return (await operations.get(\n name,\n input.id,\n execCtx,\n )) as TTable['$inferSelect']\n })\n\n // 3. CREATE procedure\n const create = builder.public\n .route({\n method: 'POST',\n path: `/api/${name}`,\n summary: `Create ${name}`,\n tags: [name],\n successStatus: 201,\n })\n .input(insertSchema)\n .output(selectSchema)\n .handler(async ({ input, context }) => {\n const session = await context.getSession()\n const execCtx = {\n request: context.request,\n user: session.user,\n session: { activeOrganizationId: session.activeOrganizationId },\n }\n const idempotencyKey = context.request.headers\n .get('Idempotency-Key')\n ?.trim()\n const rawBody = await context.getRawBody()\n\n const res = await operations.create(\n name,\n input,\n rawBody,\n idempotencyKey,\n execCtx,\n )\n if (res.type === 'replay') {\n context.resHeaders.set('Idempotency-Replayed', 'true')\n return res.record as TTable['$inferSelect']\n }\n return res.record as TTable['$inferSelect']\n })\n\n // 4. UPDATE procedure\n const update = builder.public\n .route({\n method: 'PATCH',\n path: `/api/${name}/{id}`,\n summary: `Update ${name}`,\n tags: [name],\n inputStructure: 'detailed',\n })\n .input(updateInputSchema)\n .output(selectSchema)\n .handler(async ({ input, context }) => {\n const session = await context.getSession()\n const execCtx = {\n request: context.request,\n user: session.user,\n session: { activeOrganizationId: session.activeOrganizationId },\n }\n\n return (await operations.update(\n name,\n input.params.id,\n input.body,\n execCtx,\n )) as TTable['$inferSelect']\n })\n\n // 5. DELETE procedure\n const deleteProc = builder.public\n .route({\n method: 'DELETE',\n path: `/api/${name}/{id}`,\n summary: `Delete ${name}`,\n tags: [name],\n successStatus: 204,\n })\n .input(v.strictObject({ id: v.string() }))\n .output(v.undefined())\n .handler(async ({ input, context }) => {\n const session = await context.getSession()\n const execCtx = {\n request: context.request,\n user: session.user,\n session: { activeOrganizationId: session.activeOrganizationId },\n }\n await operations.delete(name, input.id, execCtx)\n return undefined\n })\n\n // 6. LIVE procedure — one list query as a stream. A snapshot first, then the\n // changes this view cares about, placed by the server. Every connection\n // opens with a snapshot, so a reconnect is its own recovery: no client-side\n // event buffer, no Last-Event-ID bookkeeping, and no refetch path.\n const liveQuerySchema = buildLiveInputSchema(table, {\n filterableColumns: access.filterableColumns,\n sortableColumns: access.sortableColumns,\n }) as unknown as v.GenericSchema<\n LiveInputFor<TTable, TFilterable, TSortable>,\n LiveInputFor<TTable, TFilterable, TSortable>\n >\n\n const recordSchema = v.record(v.string(), v.unknown())\n const liveFrameSchema = v.union([\n v.strictObject({\n type: v.literal('snapshot'),\n items: v.array(recordSchema),\n sort: v.string(),\n order: v.picklist(['asc', 'desc']),\n limit: v.number(),\n hasMore: v.boolean(),\n }),\n v.strictObject({\n type: v.literal('upsert'),\n record: recordSchema,\n afterId: v.union([v.string(), v.null()]),\n }),\n v.strictObject({ type: v.literal('remove'), id: v.string() }),\n v.strictObject({ type: v.literal('heartbeat'), intervalMs: v.number() }),\n ])\n\n const live = builder.public\n .route({\n method: 'GET',\n // A path of its own, not a child of the table: `/{table}/live`\n // would make the id \"live\" unreachable on the get route, and a\n // colon suffix is a wildcard parameter in the oRPC matcher.\n path: `/api/live/${name}`,\n summary: `Live view of ${name}`,\n tags: [name],\n // Filters arrive as one URL-encoded JSON value, so no per-key query\n // parsing rule is needed.\n queryStyles: { filters: 'json' },\n })\n .input(liveQuerySchema)\n .output(eventIterator(liveFrameSchema))\n .handler(({ input, context, signal }) => {\n if (!livePublisher) {\n throw new Error(`Realtime is not enabled for live view of ${name}`)\n }\n // Subscribe before anything awaits, so no change slips between the\n // snapshot read and the start of the stream; events that arrive\n // during the query buffer in the publisher and replay on first pull.\n const changes = filterTableChanges(\n livePublisher.subscribe('change', { signal }),\n {\n tableName: schemaKey,\n entry: access,\n rule: access.list,\n request: context.request,\n getSession: context.getSession,\n },\n )\n\n return withRealtimeHeartbeat(\n (async function* () {\n const session = await context.getSession()\n const execCtx = {\n request: context.request,\n user: session.user,\n session: { activeOrganizationId: session.activeOrganizationId },\n }\n let view: ReturnType<typeof createLiveWindow> | undefined\n\n const readSnapshot = async (): Promise<LiveSnapshotFrame> => {\n const result = await operations.list(name, input ?? {}, execCtx)\n view = createLiveWindow({\n sort: result.sort,\n order: result.order,\n limit: result.limit,\n filters: input?.filters as\n | Record<string, unknown>\n | undefined,\n })\n view.reset(result.items, result.hasMore)\n return {\n type: 'snapshot',\n items: result.items,\n sort: result.sort,\n order: result.order,\n limit: result.limit,\n hasMore: result.hasMore,\n }\n }\n\n yield await readSnapshot()\n\n for await (const change of changes) {\n const outcome = view!.apply(change)\n if (outcome.type === 'none') continue\n if (outcome.type === 'resnapshot') {\n yield await readSnapshot()\n continue\n }\n for (const frame of outcome.frames) yield frame\n }\n })(),\n { intervalMs: REALTIME_HEARTBEAT_INTERVAL_MS, signal },\n )\n })\n\n const procedures = {\n list,\n get,\n create,\n update,\n delete: deleteProc,\n live,\n }\n\n if (!livePublisher) {\n delete (procedures as { live?: unknown }).live\n }\n\n return procedures\n}\n\nexport type TableCrudProcedures<\n TTable extends Table,\n TFilterable extends string = string,\n TSortable extends string = string,\n> = ReturnType<\n typeof buildTableCrudProcedures<\n Record<string, unknown>,\n TTable,\n TFilterable,\n TSortable\n >\n>\n\nexport function buildCrudApiRouter<\n TSchema extends Record<string, unknown>,\n TAccess extends Record<string, TableAccessInput> | undefined = undefined,\n>(\n schema: TSchema,\n db: AnyDb,\n options: CrudApiRouterOptions<TSchema>,\n): CrudApiRouterFor<TSchema, TAccess> {\n const { access, realtime, idempotency, livePublisher } = options\n const builder = createApiBuilder<TSchema>()\n const operations = createCrudOperations({\n schema,\n db,\n access,\n idempotency,\n realtime,\n })\n\n const routerObj: Record<string, unknown> = {}\n\n for (const [tableKey, table] of Object.entries(schema)) {\n if (!isTable(table)) continue\n\n const name = getTableName(table)\n const tableAccess = tableEntryForName(access, name)\n if (!tableAccess?.enabled) continue\n\n const idCol = getTableColumns(table)['id']\n if (!idCol) continue\n\n const procedures = buildTableCrudProcedures({\n table: table as Table,\n operations,\n builder,\n access: tableAccess,\n schemaKey: tableKey,\n livePublisher,\n })\n\n routerObj[tableKey] = procedures\n }\n\n return routerObj as CrudApiRouterFor<TSchema, TAccess>\n}\n"]}
|
|
@@ -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;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,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,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"]}
|
|
@@ -1 +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"}
|
|
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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-window.js","sourceRoot":"","sources":["../../src/api/live-window.ts"],"names":[],"mappings":"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"}
|
|
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"]}
|