bunderstack 0.17.0-beta.2 → 0.17.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +227 -0
- package/README.md +11 -1
- package/dist/access.d.ts +116 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +325 -0
- package/dist/access.js.map +1 -0
- package/dist/api/builder.d.ts +145 -0
- package/dist/api/builder.d.ts.map +1 -0
- package/dist/api/builder.js +28 -0
- package/dist/api/builder.js.map +1 -0
- package/dist/api/context.d.ts +34 -0
- package/dist/api/context.d.ts.map +1 -0
- package/dist/api/context.js +32 -0
- package/dist/api/context.js.map +1 -0
- package/dist/api/crud-router.d.ts +290 -0
- package/dist/api/crud-router.d.ts.map +1 -0
- package/dist/api/crud-router.js +249 -0
- package/dist/api/crud-router.js.map +1 -0
- package/dist/api/openapi.d.ts +6 -0
- package/dist/api/openapi.d.ts.map +1 -0
- package/dist/api/openapi.js +146 -0
- package/dist/api/openapi.js.map +1 -0
- package/dist/api/realtime-router.d.ts +76 -0
- package/dist/api/realtime-router.d.ts.map +1 -0
- package/dist/api/realtime-router.js +41 -0
- package/dist/api/realtime-router.js.map +1 -0
- package/dist/api/registry.d.ts +30 -0
- package/dist/api/registry.d.ts.map +1 -0
- package/dist/api/registry.js +239 -0
- package/dist/api/registry.js.map +1 -0
- package/dist/api/router.d.ts +9 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +19 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/storage-router.d.ts +279 -0
- package/dist/api/storage-router.d.ts.map +1 -0
- package/dist/api/storage-router.js +155 -0
- package/dist/api/storage-router.js.map +1 -0
- package/dist/api/types.d.ts +55 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/auth.d.ts +31 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +102 -0
- package/dist/auth.js.map +1 -0
- package/dist/blueprint-generator.d.ts +18 -0
- package/dist/blueprint-generator.d.ts.map +1 -0
- package/dist/blueprint-generator.js +125 -0
- package/dist/blueprint-generator.js.map +1 -0
- package/dist/blueprint.d.ts +46 -0
- package/dist/blueprint.d.ts.map +1 -0
- package/dist/blueprint.js +162 -0
- package/dist/blueprint.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +68 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +76 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +81 -0
- package/dist/config.js.map +1 -0
- package/dist/cron.d.ts +4 -0
- package/dist/cron.d.ts.map +1 -0
- package/dist/cron.js +3 -0
- package/dist/cron.js.map +1 -0
- package/dist/crud-operations.d.ts +43 -0
- package/dist/crud-operations.d.ts.map +1 -0
- package/dist/crud-operations.js +238 -0
- package/dist/crud-operations.js.map +1 -0
- package/dist/database/adapter.d.ts +20 -0
- package/dist/database/adapter.d.ts.map +1 -0
- package/dist/database/adapter.js +2 -0
- package/dist/database/adapter.js.map +1 -0
- package/dist/database/bun-sql.d.ts +3 -0
- package/dist/database/bun-sql.d.ts.map +1 -0
- package/dist/database/bun-sql.js +21 -0
- package/dist/database/bun-sql.js.map +1 -0
- package/dist/database/libsql.d.ts +3 -0
- package/dist/database/libsql.d.ts.map +1 -0
- package/dist/database/libsql.js +22 -0
- package/dist/database/libsql.js.map +1 -0
- package/dist/database/pglite.d.ts +3 -0
- package/dist/database/pglite.d.ts.map +1 -0
- package/dist/database/pglite.js +27 -0
- package/dist/database/pglite.js.map +1 -0
- package/dist/database/postgres-js.d.ts +3 -0
- package/dist/database/postgres-js.d.ts.map +1 -0
- package/dist/database/postgres-js.js +21 -0
- package/dist/database/postgres-js.js.map +1 -0
- package/dist/db.d.ts +18 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +26 -0
- package/dist/db.js.map +1 -0
- package/dist/dialect.d.ts +17 -0
- package/dist/dialect.d.ts.map +1 -0
- package/dist/dialect.js +22 -0
- package/dist/dialect.js.map +1 -0
- package/dist/email/smtp.d.ts +14 -0
- package/dist/email/smtp.d.ts.map +1 -0
- package/dist/email/smtp.js +27 -0
- package/dist/email/smtp.js.map +1 -0
- package/dist/email.d.ts +39 -0
- package/dist/email.d.ts.map +1 -0
- package/dist/email.js +97 -0
- package/dist/email.js.map +1 -0
- package/dist/env.d.ts +47 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +99 -0
- package/dist/env.js.map +1 -0
- package/dist/errors.d.ts +125 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +92 -0
- package/dist/errors.js.map +1 -0
- package/dist/handler.d.ts +9 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +22 -0
- package/dist/handler.js.map +1 -0
- package/dist/idempotency.d.ts +17 -0
- package/dist/idempotency.d.ts.map +1 -0
- package/dist/idempotency.js +65 -0
- package/dist/idempotency.js.map +1 -0
- package/dist/index.d.ts +134 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +477 -0
- package/dist/index.js.map +1 -0
- package/dist/internal-tables-pg.d.ts +481 -0
- package/dist/internal-tables-pg.d.ts.map +1 -0
- package/{src/internal-tables-pg.ts → dist/internal-tables-pg.js} +10 -34
- package/dist/internal-tables-pg.js.map +1 -0
- package/dist/internal-tables.d.ts +2509 -0
- package/dist/internal-tables.d.ts.map +1 -0
- package/dist/internal-tables.js +108 -0
- package/dist/internal-tables.js.map +1 -0
- package/dist/jobs/cron.d.ts +15 -0
- package/dist/jobs/cron.d.ts.map +1 -0
- package/dist/jobs/cron.js +74 -0
- package/dist/jobs/cron.js.map +1 -0
- package/dist/jobs/define.d.ts +133 -0
- package/dist/jobs/define.d.ts.map +1 -0
- package/dist/jobs/define.js +74 -0
- package/dist/jobs/define.js.map +1 -0
- package/dist/jobs/index.d.ts +11 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +8 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/queue.d.ts +6 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +55 -0
- package/dist/jobs/queue.js.map +1 -0
- package/dist/jobs/runtime.d.ts +13 -0
- package/dist/jobs/runtime.d.ts.map +1 -0
- package/dist/jobs/runtime.js +46 -0
- package/dist/jobs/runtime.js.map +1 -0
- package/dist/jobs/slots.d.ts +25 -0
- package/dist/jobs/slots.d.ts.map +1 -0
- package/dist/jobs/slots.js +41 -0
- package/dist/jobs/slots.js.map +1 -0
- package/dist/jobs/worker.d.ts +12 -0
- package/dist/jobs/worker.d.ts.map +1 -0
- package/dist/jobs/worker.js +311 -0
- package/dist/jobs/worker.js.map +1 -0
- package/dist/lifecycle.d.ts +10 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +37 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/list-query.d.ts +62 -0
- package/dist/list-query.d.ts.map +1 -0
- package/dist/list-query.js +194 -0
- package/dist/list-query.js.map +1 -0
- package/dist/manifest.d.ts +59 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +167 -0
- package/dist/manifest.js.map +1 -0
- package/dist/provision-internals.d.ts +24 -0
- package/dist/provision-internals.d.ts.map +1 -0
- package/dist/provision-internals.js +7 -0
- package/dist/provision-internals.js.map +1 -0
- package/dist/provision.d.ts +23 -0
- package/dist/provision.d.ts.map +1 -0
- package/dist/provision.js +96 -0
- package/dist/provision.js.map +1 -0
- package/dist/rate-limit.d.ts +7 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +49 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/realtime/facade.d.ts +18 -0
- package/dist/realtime/facade.d.ts.map +1 -0
- package/dist/realtime/facade.js +36 -0
- package/dist/realtime/facade.js.map +1 -0
- package/dist/realtime/filter.d.ts +13 -0
- package/dist/realtime/filter.d.ts.map +1 -0
- package/dist/realtime/filter.js +48 -0
- package/dist/realtime/filter.js.map +1 -0
- package/dist/realtime/heartbeat.d.ts +14 -0
- package/dist/realtime/heartbeat.d.ts.map +1 -0
- package/dist/realtime/heartbeat.js +64 -0
- package/dist/realtime/heartbeat.js.map +1 -0
- package/dist/realtime/publisher.d.ts +21 -0
- package/dist/realtime/publisher.d.ts.map +1 -0
- package/dist/realtime/publisher.js +17 -0
- package/dist/realtime/publisher.js.map +1 -0
- package/dist/schema-export-pg.d.ts +2 -0
- package/dist/schema-export-pg.d.ts.map +1 -0
- package/dist/schema-export-pg.js +4 -0
- package/dist/schema-export-pg.js.map +1 -0
- package/dist/schema-export.d.ts +2 -0
- package/dist/schema-export.d.ts.map +1 -0
- package/dist/schema-export.js +2 -0
- package/dist/schema-export.js.map +1 -0
- package/dist/scope.d.ts +4 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +13 -0
- package/dist/scope.js.map +1 -0
- package/dist/standard-schema.d.ts +13 -0
- package/dist/standard-schema.d.ts.map +1 -0
- package/dist/standard-schema.js +34 -0
- package/dist/standard-schema.js.map +1 -0
- package/dist/storage/buckets.d.ts +80 -0
- package/dist/storage/buckets.d.ts.map +1 -0
- package/dist/storage/buckets.js +178 -0
- package/dist/storage/buckets.js.map +1 -0
- package/dist/storage/delete.d.ts +11 -0
- package/dist/storage/delete.d.ts.map +1 -0
- package/dist/storage/delete.js +18 -0
- package/dist/storage/delete.js.map +1 -0
- package/dist/storage/file-meta.d.ts +37 -0
- package/dist/storage/file-meta.d.ts.map +1 -0
- package/dist/storage/file-meta.js +166 -0
- package/dist/storage/file-meta.js.map +1 -0
- package/dist/storage/index.d.ts +28 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local.d.ts +15 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +56 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/operations.d.ts +54 -0
- package/dist/storage/operations.d.ts.map +1 -0
- package/dist/storage/operations.js +250 -0
- package/dist/storage/operations.js.map +1 -0
- package/dist/storage/registry.d.ts +10 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +23 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/s3.d.ts +28 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +71 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/storage/sweep.d.ts +9 -0
- package/dist/storage/sweep.d.ts.map +1 -0
- package/dist/storage/sweep.js +17 -0
- package/dist/storage/sweep.js.map +1 -0
- package/dist/storage/thumbnails.d.ts +11 -0
- package/dist/storage/thumbnails.d.ts.map +1 -0
- package/dist/storage/thumbnails.js +60 -0
- package/dist/storage/thumbnails.js.map +1 -0
- package/dist/testing.d.ts +27 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +11 -0
- package/dist/testing.js.map +1 -0
- package/dist/typeid-pg.d.ts +19 -0
- package/dist/typeid-pg.d.ts.map +1 -0
- package/{src/typeid-pg.ts → dist/typeid-pg.js} +10 -13
- package/dist/typeid-pg.js.map +1 -0
- package/dist/typeid.d.ts +45 -0
- package/dist/typeid.d.ts.map +1 -0
- package/dist/typeid.js +100 -0
- package/dist/typeid.js.map +1 -0
- package/package.json +77 -28
- package/src/access.ts +0 -532
- package/src/api/builder.ts +0 -52
- package/src/api/context.ts +0 -83
- package/src/api/crud-router.ts +0 -386
- package/src/api/openapi.ts +0 -184
- package/src/api/realtime-router.ts +0 -75
- package/src/api/registry.ts +0 -338
- package/src/api/router.ts +0 -34
- package/src/api/storage-router.ts +0 -224
- package/src/api/types.ts +0 -105
- package/src/auth.ts +0 -117
- package/src/blueprint-generator.ts +0 -203
- package/src/blueprint.ts +0 -264
- package/src/cli.ts +0 -90
- package/src/config.ts +0 -215
- package/src/cron.ts +0 -3
- package/src/crud-operations.ts +0 -478
- package/src/database/adapter.ts +0 -26
- package/src/database/bun-sql.ts +0 -23
- package/src/database/libsql.ts +0 -28
- package/src/database/pglite.ts +0 -33
- package/src/database/postgres-js.ts +0 -33
- package/src/db.ts +0 -61
- package/src/dialect.ts +0 -38
- package/src/email/smtp.ts +0 -45
- package/src/email.ts +0 -154
- package/src/env.ts +0 -180
- package/src/errors.ts +0 -123
- package/src/handler.ts +0 -30
- package/src/idempotency.ts +0 -97
- package/src/index.ts +0 -834
- package/src/internal-tables.ts +0 -149
- package/src/jobs/cron.ts +0 -87
- package/src/jobs/define.ts +0 -283
- package/src/jobs/index.ts +0 -37
- package/src/jobs/queue.ts +0 -67
- package/src/jobs/runtime.ts +0 -58
- package/src/jobs/slots.ts +0 -52
- package/src/jobs/worker.ts +0 -369
- package/src/lifecycle.ts +0 -49
- package/src/list-query.ts +0 -333
- package/src/manifest.ts +0 -297
- package/src/provision-internals.ts +0 -29
- package/src/provision.ts +0 -128
- package/src/rate-limit.ts +0 -71
- package/src/realtime/facade.ts +0 -74
- package/src/realtime/filter.ts +0 -81
- package/src/realtime/heartbeat.ts +0 -80
- package/src/realtime/publisher.ts +0 -46
- package/src/schema-export-pg.ts +0 -7
- package/src/schema-export.ts +0 -5
- package/src/scope.ts +0 -17
- package/src/standard-schema.ts +0 -59
- package/src/storage/buckets.ts +0 -308
- package/src/storage/delete.ts +0 -26
- package/src/storage/file-meta.ts +0 -222
- package/src/storage/index.ts +0 -39
- package/src/storage/local.ts +0 -69
- package/src/storage/operations.ts +0 -398
- package/src/storage/registry.ts +0 -40
- package/src/storage/s3.ts +0 -99
- package/src/storage/sweep.ts +0 -25
- package/src/storage/thumbnails.ts +0 -65
- package/src/testing.ts +0 -31
- package/src/typeid.ts +0 -116
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
/**
|
|
3
|
+
* Every code we raise is one oRPC already knows, so handlers derive the HTTP
|
|
4
|
+
* status from `COMMON_ERROR_STATUS_MAP` on their own and clients can use the
|
|
5
|
+
* standard `isDefinedError` helpers. Do not add a code oRPC has no status for —
|
|
6
|
+
* it would silently answer 500.
|
|
7
|
+
*/
|
|
8
|
+
export declare const BUNDERSTACK_ERROR_CODES: readonly ["BAD_REQUEST", "UNAUTHORIZED", "FORBIDDEN", "NOT_FOUND", "CONFLICT", "PAYLOAD_TOO_LARGE", "TOO_MANY_REQUESTS"];
|
|
9
|
+
export type BunderstackErrorCode = (typeof BUNDERSTACK_ERROR_CODES)[number];
|
|
10
|
+
export declare const BUNDERSTACK_ERRORS: {
|
|
11
|
+
readonly BAD_REQUEST: {
|
|
12
|
+
readonly data: v.StrictObjectSchema<{
|
|
13
|
+
readonly code: v.LiteralSchema<"BAD_REQUEST", undefined>;
|
|
14
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
15
|
+
}, undefined>;
|
|
16
|
+
};
|
|
17
|
+
readonly UNAUTHORIZED: {
|
|
18
|
+
readonly data: v.StrictObjectSchema<{
|
|
19
|
+
readonly code: v.LiteralSchema<"UNAUTHORIZED", undefined>;
|
|
20
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
21
|
+
}, undefined>;
|
|
22
|
+
};
|
|
23
|
+
readonly FORBIDDEN: {
|
|
24
|
+
readonly data: v.StrictObjectSchema<{
|
|
25
|
+
readonly code: v.LiteralSchema<"FORBIDDEN", undefined>;
|
|
26
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
27
|
+
}, undefined>;
|
|
28
|
+
};
|
|
29
|
+
readonly NOT_FOUND: {
|
|
30
|
+
readonly data: v.StrictObjectSchema<{
|
|
31
|
+
readonly code: v.LiteralSchema<"NOT_FOUND", undefined>;
|
|
32
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
33
|
+
}, undefined>;
|
|
34
|
+
};
|
|
35
|
+
readonly CONFLICT: {
|
|
36
|
+
readonly data: v.StrictObjectSchema<{
|
|
37
|
+
readonly code: v.LiteralSchema<"CONFLICT", undefined>;
|
|
38
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
39
|
+
}, undefined>;
|
|
40
|
+
};
|
|
41
|
+
readonly PAYLOAD_TOO_LARGE: {
|
|
42
|
+
readonly data: v.StrictObjectSchema<{
|
|
43
|
+
readonly code: v.LiteralSchema<"PAYLOAD_TOO_LARGE", undefined>;
|
|
44
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
45
|
+
}, undefined>;
|
|
46
|
+
};
|
|
47
|
+
readonly TOO_MANY_REQUESTS: {
|
|
48
|
+
readonly data: v.StrictObjectSchema<{
|
|
49
|
+
readonly code: v.LiteralSchema<"TOO_MANY_REQUESTS", undefined>;
|
|
50
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
51
|
+
}, undefined>;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
export declare class BunderstackError extends Error {
|
|
55
|
+
readonly code: BunderstackErrorCode;
|
|
56
|
+
readonly details?: unknown | undefined;
|
|
57
|
+
readonly status: number;
|
|
58
|
+
constructor(code: BunderstackErrorCode, message: string, details?: unknown | undefined, options?: ErrorOptions);
|
|
59
|
+
}
|
|
60
|
+
export declare const mapBunderstackErrors: import("@orpc/server").DecoratedMiddleware<import("@orpc/server").DefaultInitialContext & object, object, unknown, any, {
|
|
61
|
+
readonly BAD_REQUEST: {
|
|
62
|
+
readonly data: v.StrictObjectSchema<{
|
|
63
|
+
readonly code: v.LiteralSchema<"BAD_REQUEST", undefined>;
|
|
64
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
65
|
+
}, undefined>;
|
|
66
|
+
};
|
|
67
|
+
readonly UNAUTHORIZED: {
|
|
68
|
+
readonly data: v.StrictObjectSchema<{
|
|
69
|
+
readonly code: v.LiteralSchema<"UNAUTHORIZED", undefined>;
|
|
70
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
71
|
+
}, undefined>;
|
|
72
|
+
};
|
|
73
|
+
readonly FORBIDDEN: {
|
|
74
|
+
readonly data: v.StrictObjectSchema<{
|
|
75
|
+
readonly code: v.LiteralSchema<"FORBIDDEN", undefined>;
|
|
76
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
77
|
+
}, undefined>;
|
|
78
|
+
};
|
|
79
|
+
readonly NOT_FOUND: {
|
|
80
|
+
readonly data: v.StrictObjectSchema<{
|
|
81
|
+
readonly code: v.LiteralSchema<"NOT_FOUND", undefined>;
|
|
82
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
83
|
+
}, undefined>;
|
|
84
|
+
};
|
|
85
|
+
readonly CONFLICT: {
|
|
86
|
+
readonly data: v.StrictObjectSchema<{
|
|
87
|
+
readonly code: v.LiteralSchema<"CONFLICT", undefined>;
|
|
88
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
89
|
+
}, undefined>;
|
|
90
|
+
};
|
|
91
|
+
readonly PAYLOAD_TOO_LARGE: {
|
|
92
|
+
readonly data: v.StrictObjectSchema<{
|
|
93
|
+
readonly code: v.LiteralSchema<"PAYLOAD_TOO_LARGE", undefined>;
|
|
94
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
95
|
+
}, undefined>;
|
|
96
|
+
};
|
|
97
|
+
readonly TOO_MANY_REQUESTS: {
|
|
98
|
+
readonly data: v.StrictObjectSchema<{
|
|
99
|
+
readonly code: v.LiteralSchema<"TOO_MANY_REQUESTS", undefined>;
|
|
100
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
101
|
+
}, undefined>;
|
|
102
|
+
};
|
|
103
|
+
}>;
|
|
104
|
+
/**
|
|
105
|
+
* Sub-codes carried in `data.details.code` when the oRPC code alone loses
|
|
106
|
+
* information the client may want to branch on. Codes that duplicate an oRPC
|
|
107
|
+
* code are suppressed as redundant, see {@link CrudOperationError}.
|
|
108
|
+
*/
|
|
109
|
+
export declare const ErrorCode: {
|
|
110
|
+
readonly BAD_REQUEST: "BAD_REQUEST";
|
|
111
|
+
readonly FORBIDDEN: "FORBIDDEN";
|
|
112
|
+
readonly NOT_FOUND: "NOT_FOUND";
|
|
113
|
+
readonly CONFLICT: "CONFLICT";
|
|
114
|
+
readonly INVALID_CURSOR: "INVALID_CURSOR";
|
|
115
|
+
readonly TOO_MANY_REQUESTS: "TOO_MANY_REQUESTS";
|
|
116
|
+
readonly IDEMPOTENCY_REPLAY: "IDEMPOTENCY_REPLAY";
|
|
117
|
+
readonly IDEMPOTENCY_CONFLICT: "IDEMPOTENCY_CONFLICT";
|
|
118
|
+
};
|
|
119
|
+
export type ErrorCodeValue = (typeof ErrorCode)[keyof typeof ErrorCode];
|
|
120
|
+
export declare class ListQueryError extends Error {
|
|
121
|
+
readonly code: ErrorCodeValue;
|
|
122
|
+
readonly details?: unknown;
|
|
123
|
+
constructor(message: string, code?: ErrorCodeValue, details?: unknown);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAI5B;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,0HAQkC,CAAA;AAEtE,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAA;AAW3E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQF,CAAA;AAE7B,qBAAa,gBAAiB,SAAQ,KAAK;IAIvC,QAAQ,CAAC,IAAI,EAAE,oBAAoB;IAEnC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO;IAL5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAGZ,IAAI,EAAE,oBAAoB,EACnC,OAAO,EAAE,MAAM,EACN,OAAO,CAAC,EAAE,OAAO,YAAA,EAC1B,OAAO,CAAC,EAAE,YAAY;CAMzB;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0B7B,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,SAAS;;;;;;;;;CASZ,CAAA;AAEV,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAA;AAEvE,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;gBAGxB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,cAAsC,EAC5C,OAAO,CAAC,EAAE,OAAO;CAOpB"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { COMMON_ERROR_STATUS_MAP, ORPCError, os, } from '@orpc/server';
|
|
2
|
+
import * as v from 'valibot';
|
|
3
|
+
import { StandardSchemaValidationError } from './standard-schema.js';
|
|
4
|
+
/**
|
|
5
|
+
* Every code we raise is one oRPC already knows, so handlers derive the HTTP
|
|
6
|
+
* status from `COMMON_ERROR_STATUS_MAP` on their own and clients can use the
|
|
7
|
+
* standard `isDefinedError` helpers. Do not add a code oRPC has no status for —
|
|
8
|
+
* it would silently answer 500.
|
|
9
|
+
*/
|
|
10
|
+
export const BUNDERSTACK_ERROR_CODES = [
|
|
11
|
+
'BAD_REQUEST',
|
|
12
|
+
'UNAUTHORIZED',
|
|
13
|
+
'FORBIDDEN',
|
|
14
|
+
'NOT_FOUND',
|
|
15
|
+
'CONFLICT',
|
|
16
|
+
'PAYLOAD_TOO_LARGE',
|
|
17
|
+
'TOO_MANY_REQUESTS',
|
|
18
|
+
];
|
|
19
|
+
function errorDataSchema(code) {
|
|
20
|
+
return v.strictObject({
|
|
21
|
+
code: v.literal(code),
|
|
22
|
+
details: v.optional(v.unknown()),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export const BUNDERSTACK_ERRORS = {
|
|
26
|
+
BAD_REQUEST: { data: errorDataSchema('BAD_REQUEST') },
|
|
27
|
+
UNAUTHORIZED: { data: errorDataSchema('UNAUTHORIZED') },
|
|
28
|
+
FORBIDDEN: { data: errorDataSchema('FORBIDDEN') },
|
|
29
|
+
NOT_FOUND: { data: errorDataSchema('NOT_FOUND') },
|
|
30
|
+
CONFLICT: { data: errorDataSchema('CONFLICT') },
|
|
31
|
+
PAYLOAD_TOO_LARGE: { data: errorDataSchema('PAYLOAD_TOO_LARGE') },
|
|
32
|
+
TOO_MANY_REQUESTS: { data: errorDataSchema('TOO_MANY_REQUESTS') },
|
|
33
|
+
};
|
|
34
|
+
export class BunderstackError extends Error {
|
|
35
|
+
code;
|
|
36
|
+
details;
|
|
37
|
+
status;
|
|
38
|
+
constructor(code, message, details, options) {
|
|
39
|
+
super(message, options);
|
|
40
|
+
this.code = code;
|
|
41
|
+
this.details = details;
|
|
42
|
+
this.name = 'BunderstackError';
|
|
43
|
+
this.status = COMMON_ERROR_STATUS_MAP[code];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export const mapBunderstackErrors = os
|
|
47
|
+
.errors(BUNDERSTACK_ERRORS)
|
|
48
|
+
.middleware(async ({ next }) => {
|
|
49
|
+
try {
|
|
50
|
+
return await next();
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const mapped = error instanceof StandardSchemaValidationError
|
|
54
|
+
? new BunderstackError('BAD_REQUEST', error.message, error.issues, { cause: error })
|
|
55
|
+
: error;
|
|
56
|
+
if (!(mapped instanceof BunderstackError))
|
|
57
|
+
throw error;
|
|
58
|
+
throw new ORPCError(mapped.code, {
|
|
59
|
+
message: mapped.message,
|
|
60
|
+
data: mapped.details === undefined
|
|
61
|
+
? { code: mapped.code }
|
|
62
|
+
: { code: mapped.code, details: mapped.details },
|
|
63
|
+
cause: mapped,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
/**
|
|
68
|
+
* Sub-codes carried in `data.details.code` when the oRPC code alone loses
|
|
69
|
+
* information the client may want to branch on. Codes that duplicate an oRPC
|
|
70
|
+
* code are suppressed as redundant, see {@link CrudOperationError}.
|
|
71
|
+
*/
|
|
72
|
+
export const ErrorCode = {
|
|
73
|
+
BAD_REQUEST: 'BAD_REQUEST',
|
|
74
|
+
FORBIDDEN: 'FORBIDDEN',
|
|
75
|
+
NOT_FOUND: 'NOT_FOUND',
|
|
76
|
+
CONFLICT: 'CONFLICT',
|
|
77
|
+
INVALID_CURSOR: 'INVALID_CURSOR',
|
|
78
|
+
TOO_MANY_REQUESTS: 'TOO_MANY_REQUESTS',
|
|
79
|
+
IDEMPOTENCY_REPLAY: 'IDEMPOTENCY_REPLAY',
|
|
80
|
+
IDEMPOTENCY_CONFLICT: 'IDEMPOTENCY_CONFLICT',
|
|
81
|
+
};
|
|
82
|
+
export class ListQueryError extends Error {
|
|
83
|
+
code;
|
|
84
|
+
details;
|
|
85
|
+
constructor(message, code = ErrorCode.BAD_REQUEST, details) {
|
|
86
|
+
super(message);
|
|
87
|
+
this.name = 'ListQueryError';
|
|
88
|
+
this.code = code;
|
|
89
|
+
this.details = details;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type RateLimitConfig } from './rate-limit.js';
|
|
2
|
+
interface HandlerParts {
|
|
3
|
+
authHandler?: (req: Request) => Promise<Response>;
|
|
4
|
+
apiHandler?: (req: Request) => Promise<Response | null>;
|
|
5
|
+
rateLimit?: boolean | RateLimitConfig;
|
|
6
|
+
}
|
|
7
|
+
export declare function buildHandler(parts: HandlerParts): (req: Request) => Promise<Response>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AAEtE,UAAU,YAAY;IACpB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IACjD,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IACvD,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAA;CACtC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAoBrF"}
|
package/dist/handler.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// src/handler.ts
|
|
2
|
+
import { createRateLimiter } from './rate-limit.js';
|
|
3
|
+
export function buildHandler(parts) {
|
|
4
|
+
const checkRateLimit = createRateLimiter(parts.rateLimit);
|
|
5
|
+
return async (req) => {
|
|
6
|
+
const limited = await checkRateLimit(req);
|
|
7
|
+
if (limited)
|
|
8
|
+
return limited;
|
|
9
|
+
const pathname = new URL(req.url).pathname;
|
|
10
|
+
if (parts.authHandler &&
|
|
11
|
+
(pathname === '/api/auth' || pathname.startsWith('/api/auth/'))) {
|
|
12
|
+
return parts.authHandler(req);
|
|
13
|
+
}
|
|
14
|
+
if (parts.apiHandler) {
|
|
15
|
+
const apiRes = await parts.apiHandler(req);
|
|
16
|
+
if (apiRes)
|
|
17
|
+
return apiRes;
|
|
18
|
+
}
|
|
19
|
+
return new Response('Not Found', { status: 404 });
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,OAAO,EAAE,iBAAiB,EAAwB,MAAM,cAAc,CAAA;AAQtE,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC9C,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAEzD,OAAO,KAAK,EAAE,GAAY,EAAqB,EAAE;QAC/C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,OAAO;YAAE,OAAO,OAAO,CAAA;QAE3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;QAC1C,IACE,KAAK,CAAC,WAAW;YACjB,CAAC,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAC/D,CAAC;YACD,OAAO,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC/B,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;YAC1C,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAA;QAC3B,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IACnD,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AnyDb } from './dialect.js';
|
|
2
|
+
export type IdempotencyConfig = {
|
|
3
|
+
ttlMs?: number;
|
|
4
|
+
};
|
|
5
|
+
export type IdempotencyLookup = {
|
|
6
|
+
type: 'replay';
|
|
7
|
+
status: number;
|
|
8
|
+
response: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: 'conflict';
|
|
11
|
+
} | {
|
|
12
|
+
type: 'proceed';
|
|
13
|
+
};
|
|
14
|
+
export declare function lookupIdempotency(db: AnyDb, tableName: string, key: string, body: string): Promise<IdempotencyLookup>;
|
|
15
|
+
export declare function storeIdempotency(db: AnyDb, tableName: string, key: string, body: string, status: number, response: unknown, config: IdempotencyConfig): Promise<void>;
|
|
16
|
+
export declare function resolveIdempotencyConfig(config: boolean | IdempotencyConfig | undefined): IdempotencyConfig | null;
|
|
17
|
+
//# sourceMappingURL=idempotency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../src/idempotency.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAItC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAQD,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAA;AAEvB,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,KAAK,EACT,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,CAAC,CA6B5B;AAED,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,KAAK,EACT,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,GAC9C,iBAAiB,GAAG,IAAI,CAI1B"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { and, eq, lt } from 'drizzle-orm';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { idempotencyTableFor } from './internal-tables.js';
|
|
4
|
+
const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;
|
|
5
|
+
function hashBody(body) {
|
|
6
|
+
return createHash('sha256').update(body).digest('hex');
|
|
7
|
+
}
|
|
8
|
+
export async function lookupIdempotency(db, tableName, key, body) {
|
|
9
|
+
const t = idempotencyTableFor(db);
|
|
10
|
+
const now = Date.now();
|
|
11
|
+
// TTL sweep: drop expired rows before reading.
|
|
12
|
+
await db.delete(t).where(lt(t.expiresAt, now));
|
|
13
|
+
const bodyHash = hashBody(body);
|
|
14
|
+
const rows = await db
|
|
15
|
+
.select({
|
|
16
|
+
bodyHash: t.bodyHash,
|
|
17
|
+
status: t.status,
|
|
18
|
+
response: t.response,
|
|
19
|
+
expiresAt: t.expiresAt,
|
|
20
|
+
})
|
|
21
|
+
.from(t)
|
|
22
|
+
.where(and(eq(t.key, key), eq(t.tableName, tableName)))
|
|
23
|
+
.limit(1);
|
|
24
|
+
const row = rows[0];
|
|
25
|
+
if (!row)
|
|
26
|
+
return { type: 'proceed' };
|
|
27
|
+
if (Number(row.expiresAt) < now)
|
|
28
|
+
return { type: 'proceed' };
|
|
29
|
+
if (row.bodyHash !== bodyHash)
|
|
30
|
+
return { type: 'conflict' };
|
|
31
|
+
return {
|
|
32
|
+
type: 'replay',
|
|
33
|
+
status: Number(row.status),
|
|
34
|
+
response: String(row.response),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export async function storeIdempotency(db, tableName, key, body, status, response, config) {
|
|
38
|
+
const t = idempotencyTableFor(db);
|
|
39
|
+
const ttlMs = config.ttlMs ?? DEFAULT_TTL_MS;
|
|
40
|
+
const expiresAt = Date.now() + ttlMs;
|
|
41
|
+
const bodyHash = hashBody(body);
|
|
42
|
+
const responseText = JSON.stringify(response);
|
|
43
|
+
await db
|
|
44
|
+
.insert(t)
|
|
45
|
+
.values({
|
|
46
|
+
key,
|
|
47
|
+
tableName,
|
|
48
|
+
bodyHash,
|
|
49
|
+
status,
|
|
50
|
+
response: responseText,
|
|
51
|
+
expiresAt,
|
|
52
|
+
})
|
|
53
|
+
.onConflictDoUpdate({
|
|
54
|
+
target: [t.key, t.tableName],
|
|
55
|
+
set: { bodyHash, status, response: responseText, expiresAt },
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export function resolveIdempotencyConfig(config) {
|
|
59
|
+
if (!config)
|
|
60
|
+
return null;
|
|
61
|
+
if (config === true)
|
|
62
|
+
return {};
|
|
63
|
+
return config;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=idempotency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../src/idempotency.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import type { AnyRouter as AnyORPCRouter } from '@orpc/server';
|
|
2
|
+
import type { TableAccessInput } from './access.js';
|
|
3
|
+
import type { CrudApiRouterFor, MergeApiRouterTypes, UnifiedApiRouter } from './api/types.js';
|
|
4
|
+
import type { RealtimeApiRouter } from './api/realtime-router.js';
|
|
5
|
+
import type { DbFor } from './db.js';
|
|
6
|
+
import type { BunderstackJobsBuilder, JobsDefs, JobsFacade, StartWorkerOptions, WorkerHandle } from './jobs/index.js';
|
|
7
|
+
import type { StorageConfigInput } from './storage/buckets.js';
|
|
8
|
+
import type { StorageAdapter } from './storage/index.js';
|
|
9
|
+
import { createAuth } from './auth.js';
|
|
10
|
+
import { type BunderstackConfig } from './config.js';
|
|
11
|
+
import { type EmailFacade } from './email.js';
|
|
12
|
+
import { type EnvConfigInput, type ValidatedEnv } from './env.js';
|
|
13
|
+
import { type LifecycleStatus } from './lifecycle.js';
|
|
14
|
+
import { type BunderstackManifest } from './manifest.js';
|
|
15
|
+
import { type RealtimeFacade } from './realtime/facade.js';
|
|
16
|
+
export type AuthInstance = ReturnType<typeof createAuth>;
|
|
17
|
+
/**
|
|
18
|
+
* Public storage facade exposed as `app.storage`. Object-level operations live
|
|
19
|
+
* on the per-bucket adapters; this surface offers the app-wide deletes that
|
|
20
|
+
* must also clean the file-meta row.
|
|
21
|
+
*/
|
|
22
|
+
export interface StorageFacade {
|
|
23
|
+
/** Delete a file row and purge all underlying storage derivatives. */
|
|
24
|
+
delete(fileId: string): Promise<void>;
|
|
25
|
+
/** Low-level access to the underlying storage adapter for a bucket. */
|
|
26
|
+
bucket(name: string): StorageAdapter | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Reap stale `pending` uploads older than `olderThanMs` (default 30m). Runs
|
|
29
|
+
* only when explicitly invoked by the host or local scheduler. Returns
|
|
30
|
+
* the count reaped.
|
|
31
|
+
*/
|
|
32
|
+
sweep(olderThanMs?: number): Promise<number>;
|
|
33
|
+
/**
|
|
34
|
+
* Get a public or presigned download URL for a file key.
|
|
35
|
+
* Returns a presigned S3 URL when S3 is configured, or local proxy route `/api/files/...` in development.
|
|
36
|
+
*/
|
|
37
|
+
getUrl(key: string, opts?: {
|
|
38
|
+
bucket?: string;
|
|
39
|
+
expiresIn?: number;
|
|
40
|
+
}): Promise<string>;
|
|
41
|
+
/**
|
|
42
|
+
* Upload bytes as a ready file and register it in file_meta so it is
|
|
43
|
+
* accessible via `GET /api/files/<key>`. Use this for server-generated
|
|
44
|
+
* files (e.g. generated PDFs) that are not uploaded by end-users.
|
|
45
|
+
*/
|
|
46
|
+
upload(key: string, body: ArrayBuffer | Uint8Array, contentType: string, opts?: {
|
|
47
|
+
ownerId?: string;
|
|
48
|
+
filename?: string;
|
|
49
|
+
}): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
export type AppStartWorkerOptions = Omit<StartWorkerOptions, 'tick'>;
|
|
52
|
+
export type AppRunWorkerOptions = AppStartWorkerOptions & {
|
|
53
|
+
/**
|
|
54
|
+
* Permit process-local realtime in a standalone worker.
|
|
55
|
+
*
|
|
56
|
+
* Use only when job handlers never call ctx.realtime.publish(). Publications
|
|
57
|
+
* made through the memory broker cannot reach SSE clients in another process.
|
|
58
|
+
*/
|
|
59
|
+
allowProcessLocalRealtime?: boolean;
|
|
60
|
+
};
|
|
61
|
+
/** Bucket names declared in a storage config; `string` when unknowable. */
|
|
62
|
+
export type BucketNamesOf<TStorage> = TStorage extends {
|
|
63
|
+
buckets: infer B extends Record<string, unknown>;
|
|
64
|
+
} ? keyof B & string : string;
|
|
65
|
+
export type BunderstackApp<TSchema extends Record<string, unknown>, TAccess extends Record<string, TableAccessInput> | undefined = undefined, TBuckets extends string = string, TEnv extends EnvConfigInput | undefined = undefined, TJobsDefs extends JobsDefs | undefined = undefined, TCustomApiRouter extends AnyORPCRouter | undefined = undefined> = {
|
|
66
|
+
handler: (req: Request) => Promise<Response>;
|
|
67
|
+
db: DbFor<TSchema>;
|
|
68
|
+
auth: AuthInstance;
|
|
69
|
+
storage: StorageFacade;
|
|
70
|
+
/** Validated env: bunderstack's base vars plus the config's `env` extension. */
|
|
71
|
+
env: ValidatedEnv<TEnv>;
|
|
72
|
+
/** Email facade; always present — send() throws when email isn't configured. */
|
|
73
|
+
email: EmailFacade;
|
|
74
|
+
/** Job queue facade; always present — enqueue throws when jobs aren't configured. */
|
|
75
|
+
jobs: JobsFacade<TJobsDefs extends JobsDefs ? TJobsDefs : Record<never, never>>;
|
|
76
|
+
/** Typed custom row publication; enabled=false/no-op when realtime is off. */
|
|
77
|
+
realtime: RealtimeFacade<TSchema>;
|
|
78
|
+
startWorker(options?: AppStartWorkerOptions): Promise<WorkerHandle>;
|
|
79
|
+
/** Run a queue worker until aborted, then close the application. */
|
|
80
|
+
runWorker(options?: AppRunWorkerOptions): Promise<void>;
|
|
81
|
+
close(): Promise<void>;
|
|
82
|
+
/** True when this process is running the background tick loop. */
|
|
83
|
+
readonly backgroundRunning: boolean;
|
|
84
|
+
readonly status: LifecycleStatus;
|
|
85
|
+
readonly signal: AbortSignal;
|
|
86
|
+
/** Deploy-time introspection: what this app needs provisioned. */
|
|
87
|
+
manifest: BunderstackManifest;
|
|
88
|
+
/**
|
|
89
|
+
* Type-only carrier for client inference (`createClient<typeof app>()`).
|
|
90
|
+
* Never assigned at runtime.
|
|
91
|
+
*/
|
|
92
|
+
readonly $inferClient?: {
|
|
93
|
+
schema: TSchema;
|
|
94
|
+
access: TAccess;
|
|
95
|
+
buckets: TBuckets;
|
|
96
|
+
api: MergeApiRouterTypes<UnifiedApiRouter<CrudApiRouterFor<TSchema, TAccess>, TCustomApiRouter>, RealtimeApiRouter>;
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
export declare function createBunderstack<TSchema extends Record<string, unknown>, const TAccess extends Record<string, TableAccessInput> | undefined = undefined, const TStorage extends StorageConfigInput | undefined = undefined, const TEnv extends EnvConfigInput | undefined = undefined, const TJobsDefs extends JobsDefs | undefined = undefined, TCustomApiRouter extends AnyORPCRouter | undefined = undefined>(options: BunderstackConfig<TSchema, TAccess, TStorage, TEnv, TCustomApiRouter> & {
|
|
100
|
+
jobs?: TJobsDefs | ((j: BunderstackJobsBuilder<TSchema, ValidatedEnv<TEnv>>) => TJobsDefs);
|
|
101
|
+
}): Promise<BunderstackApp<TSchema, TAccess, BucketNamesOf<TStorage>, TEnv, TJobsDefs, TCustomApiRouter>>;
|
|
102
|
+
export { MAX_LIST_LIMIT } from './list-query.js';
|
|
103
|
+
export { BunderstackError } from './errors.js';
|
|
104
|
+
export type { BunderstackErrorCode } from './errors.js';
|
|
105
|
+
export { resolveConfig } from './config.js';
|
|
106
|
+
export type { BetterAuthConfig, BunderstackConfig, ResolvedConfig, } from './config.js';
|
|
107
|
+
export { validateEnv, createClientEnv, BunderstackEnvError } from './env.js';
|
|
108
|
+
export type { EnvConfigInput, BaseEnv, ValidatedEnv } from './env.js';
|
|
109
|
+
export { buildManifest, parseManifest } from './manifest.js';
|
|
110
|
+
export type { BunderstackManifest, ManifestEnvVar } from './manifest.js';
|
|
111
|
+
export { createEmail } from './email.js';
|
|
112
|
+
export type { EmailMessage, EmailAdapter, EmailConfigInput, EmailFacade, } from './email.js';
|
|
113
|
+
export { createJobsBuilder } from './jobs/index.js';
|
|
114
|
+
export type { BunderstackJobContext, BunderstackJobsBuilder, BackgroundDefinition, BackgroundDefs, CronDefinition, CronInvocation, EnqueueOptions, JobContext, JobDefinition, JobsDefs, JobsFacade, JobsRuntimeFacade, QueueJobDefinition, QueueJobKeys, RunWorkerOptions, StartWorkerOptions, WorkerHandle, } from './jobs/index.js';
|
|
115
|
+
export { defineAccess, validateAndResolveAccess, checkAccess, AUTH_TABLE_NAMES, } from './access.js';
|
|
116
|
+
export type { TableAccessInput, OperationRule, AccessContext, AccessUser, } from './access.js';
|
|
117
|
+
export { typeid, generate as generateTypeId, parse as parseTypeId, asTypeId, } from './typeid.js';
|
|
118
|
+
export type { TypeId } from './typeid.js';
|
|
119
|
+
export type { DatabaseAdapter, DatabaseConnectOptions, DatabaseConnection, DatabaseConnectionResult, } from './database/adapter.js';
|
|
120
|
+
export type { StorageAdapter } from './storage/index.js';
|
|
121
|
+
export type { StorageConfigInput, BucketConfigInput, ResolvedBucket, } from './storage/buckets.js';
|
|
122
|
+
export type { TransformSpec } from './storage/thumbnails.js';
|
|
123
|
+
export { mockAuthSession } from './testing.js';
|
|
124
|
+
export type { RealtimeAction } from './realtime/publisher.js';
|
|
125
|
+
export { createRealtimeFacade } from './realtime/facade.js';
|
|
126
|
+
export type { RealtimeFacade, RealtimeTransport, SchemaTable, } from './realtime/facade.js';
|
|
127
|
+
export { createApiBuilder } from './api/builder.js';
|
|
128
|
+
export type { BunderstackApiBuilder, ApiFactory } from './api/builder.js';
|
|
129
|
+
export type { ApiContext } from './api/context.js';
|
|
130
|
+
export type { CrudApiRouterFor, ExposedApiTables, MergeApiRouterTypes, UnifiedApiRouter, } from './api/types.js';
|
|
131
|
+
export type { TableCrudProcedures } from './api/crud-router.js';
|
|
132
|
+
export { buildApiRegistry, mergeApiRoutersStrict, normalizeApiPath, normalizeForeignOpenAPISpec, } from './api/registry.js';
|
|
133
|
+
export { mergeOpenAPISpecs } from './api/openapi.js';
|
|
134
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|