@palbase/backend 25.0.0 → 25.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/bin/palbase-backend.cjs +2 -0
  2. package/dist/bin/palbase-backend.cjs.map +1 -1
  3. package/dist/bin/palbase-backend.js +2 -2
  4. package/dist/{chunk-43A3KGWL.js → chunk-34I4GB7D.js} +4 -2
  5. package/dist/{chunk-43A3KGWL.js.map → chunk-34I4GB7D.js.map} +1 -1
  6. package/dist/{chunk-ZQRWW37O.js → chunk-35PNTIRN.js} +5 -1
  7. package/dist/chunk-35PNTIRN.js.map +1 -0
  8. package/dist/{chunk-OEQBHE2Z.js → chunk-7JSEN7UR.js} +20 -4
  9. package/dist/chunk-7JSEN7UR.js.map +1 -0
  10. package/dist/{chunk-5CMLOAEF.js → chunk-YOY5DFQS.js} +2 -2
  11. package/dist/db/env.cjs.map +1 -1
  12. package/dist/db/env.d.cts +2 -1
  13. package/dist/db/env.d.ts +2 -1
  14. package/dist/db/index.cjs +17 -3
  15. package/dist/db/index.cjs.map +1 -1
  16. package/dist/db/index.d.cts +2 -2
  17. package/dist/db/index.d.ts +2 -2
  18. package/dist/db/index.js +1 -1
  19. package/dist/{endpoint-DMwJjEHQ.d.ts → endpoint-CTEHhb7A.d.ts} +19 -8
  20. package/dist/{endpoint-BSGw1pTu.d.cts → endpoint-DYHMo6cC.d.cts} +19 -8
  21. package/dist/engine/index.cjs +2 -0
  22. package/dist/engine/index.cjs.map +1 -1
  23. package/dist/engine/index.d.cts +4 -4
  24. package/dist/engine/index.d.ts +4 -4
  25. package/dist/engine/index.js +2 -2
  26. package/dist/{index-BF1f0DfA.d.ts → index-CUomTA3e.d.ts} +3 -3
  27. package/dist/{index-Ct1iiB4N.d.ts → index-CW21M9Z3.d.ts} +24 -17
  28. package/dist/{index-CoaDN9dL.d.cts → index-ClpDeSos.d.cts} +3 -3
  29. package/dist/{index-CwaWRhyc.d.cts → index-CmBK76nx.d.cts} +24 -17
  30. package/dist/index.cjs +80 -51
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.cts +13 -11
  33. package/dist/index.d.ts +13 -11
  34. package/dist/index.js +62 -51
  35. package/dist/index.js.map +1 -1
  36. package/dist/openapi/index.cjs +1 -1
  37. package/dist/openapi/index.cjs.map +1 -1
  38. package/dist/openapi/index.d.cts +2 -2
  39. package/dist/openapi/index.d.ts +2 -2
  40. package/dist/openapi/index.js +3 -3
  41. package/dist/openapi/index.js.map +1 -1
  42. package/dist/{registry-CgJvDYUW.d.cts → registry-CC0WBQq6.d.cts} +1 -1
  43. package/dist/{registry-B8pld3fj.d.ts → registry-dZZ5JKYg.d.ts} +1 -1
  44. package/dist/test/index.d.cts +1 -1
  45. package/dist/test/index.d.ts +1 -1
  46. package/docs/README.md +9 -8
  47. package/docs/database.md +2 -2
  48. package/docs/endpoints.md +6 -5
  49. package/docs/getting-started.md +1 -1
  50. package/docs/llms-full.txt +74 -38
  51. package/docs/migrations.md +16 -14
  52. package/docs/schema.md +38 -7
  53. package/docs/services.md +2 -1
  54. package/package.json +1 -1
  55. package/dist/chunk-OEQBHE2Z.js.map +0 -1
  56. package/dist/chunk-ZQRWW37O.js.map +0 -1
  57. /package/dist/{chunk-5CMLOAEF.js.map → chunk-YOY5DFQS.js.map} +0 -0
package/dist/index.d.cts CHANGED
@@ -1,13 +1,13 @@
1
- import { h as PalbaseResult, A as AuthSpec, H as HttpError } from './endpoint-BSGw1pTu.cjs';
2
- export { i as AuthConfig, B as BadRequest, C as CacheClient, j as ClientInfo, k as Conflict, D as DBClient, f as DBOps, E as ErrorDef, l as ErrorMap, m as ErrorThrowers, F as FileContext, n as Forbidden, o as HttpMethod, L as Logger, M as Materialized, p as Middleware, q as MiddlewareContext, r as MiddlewareHandler, N as NotFound, s as PBRequest, t as PalError, u as PalbaseAnalyticsClient, v as PalbaseAnalyticsManagementNamespace, w as PalbaseAnalyticsProperties, x as PalbaseAnalyticsQueryNamespace, y as PalbaseAttestAndroidParams, z as PalbaseAttestAndroidResult, G as PalbaseAttestiOSParams, I as PalbaseAttestiOSResult, J as PalbaseAuthClient, K as PalbaseBatchOverrideOperation, O as PalbaseBatchSetOverridesResult, Q as PalbaseBindDeviceParams, e as PalbaseBucketClient, U as PalbaseClearAllOverridesResult, V as PalbaseClearOverrideResult, W as PalbaseCohortQueryInput, X as PalbaseCohortResult, Y as PalbaseCollectionRef, Z as PalbaseCountQueryInput, _ as PalbaseCountResult, $ as PalbaseCreateLinkParams, a0 as PalbaseDeviceInfo, a1 as PalbaseDeviceTokenView, P as PalbaseDocsClient, a2 as PalbaseDocumentRef, a3 as PalbaseDocumentSnapshot, a4 as PalbaseEmailClient, a5 as PalbaseEmailSendParams, a6 as PalbaseEmailSendResponse, a7 as PalbaseEventNamesResult, a8 as PalbaseEventsQueryInput, a9 as PalbaseEventsResult, aa as PalbaseFileObject, ab as PalbaseFlag, ac as PalbaseFlagContext, ad as PalbaseFlagSource, ae as PalbaseFlagValue, af as PalbaseFlagVariant, a as PalbaseFlagsClient, ag as PalbaseFlagsServiceClient, ah as PalbaseFunctionsClient, ai as PalbaseFunnelQueryInput, aj as PalbaseFunnelResult, ak as PalbaseIdentifyTraits, al as PalbaseInboxClient, am as PalbaseInboxListOptions, an as PalbaseInboxListResult, ao as PalbaseInboxMessage, ap as PalbaseInboxSendParams, aq as PalbaseInboxSendResponse, ar as PalbaseInitialLink, as as PalbaseInvokeOptions, at as PalbaseLink, au as PalbaseLinkAnalytics, av as PalbaseLinkDetails, aw as PalbaseLinksClient, ax as PalbaseListLinksOptions, ay as PalbaseListLinksResult, az as PalbaseListOptions, aA as PalbaseMatchParams, aB as PalbaseMultiChannelResponse, b as PalbaseNotificationsClient, aC as PalbaseOverviewResult, aD as PalbasePreferences, aE as PalbasePreferencesClient, aF as PalbasePushClient, aG as PalbasePushSendParams, aH as PalbasePushSendResponse, aI as PalbaseQrCodeOptions, aJ as PalbaseQuerySnapshot, c as PalbaseRealtimeClient, aK as PalbaseRegisterDeviceParams, aL as PalbaseRetentionQueryInput, aM as PalbaseRetentionResult, aN as PalbaseSession, aO as PalbaseSetOverrideResult, aP as PalbaseSetOverridesResult, aQ as PalbaseSignedUrlResponse, aR as PalbaseSmsClient, aS as PalbaseSmsSendParams, aT as PalbaseSmsSendResponse, d as PalbaseStorageClient, aU as PalbaseTransformOptions, aV as PalbaseUpdateLinkParams, aW as PalbaseUploadOptions, aX as PalbaseUser, aY as PalbaseUserDetailResult, aZ as PalbaseUsersQueryInput, a_ as PalbaseUsersResult, a$ as PalbaseVerifyRequestSignatureParams, b0 as PalbaseWhereOperator, R as RateLimitConfig, b1 as Ref, S as SecretsService, b2 as TooManyRequests, b3 as TxColumnExpr, b4 as TxInsertShape, b5 as TxInsertValue, b6 as TxNow, T as TxPlanBody, b7 as TxPlanError, b8 as TxPlanHandle, b9 as TxPlanOpResult, ba as TxPlanRejection, g as TxPlanResponse, bb as TxRefError, bc as TxRow, bd as TxRows, be as TxSelectOptions, bf as TxSetShape, bg as TxSetValue, bh as TxTable, bi as TxWhere, bj as TxWireExpr, bk as TxWireGuard, bl as TxWireOp, bm as TxWireRef, bn as TxWireValue, bo as Unauthorized, bp as UniqueViolation, bq as UserT, br as VerifiedDevice, bs as dec, bt as defineMiddleware, bu as inc, bv as now } from './endpoint-BSGw1pTu.cjs';
3
- import { M as ModuleClients } from './index-CoaDN9dL.cjs';
4
- export { C as Cache, D as Database, a as Documents, F as Flags, L as LifecycleHook, b as Log, N as Notifications, R as Realtime, c as RequestStore, d as RuntimeServices, S as Secrets, e as ShutdownRunner, f as Storage, _ as __getRuntime, g as __requestALS, h as __resetLifecycleHooks, i as __runStartHooks, j as __runWithRuntime, k as __setRuntime, o as onShutdown, l as onStart } from './index-CoaDN9dL.cjs';
5
- import { S as SchemaDef } from './index-CwaWRhyc.cjs';
6
- export { A as AnyColumn, C as ColumnBuilder, a as ColumnDef, b as ColumnMap, c as ColumnType, d as EXTENSION_DEPENDENCIES, e as EmbeddingModelRef, f as EnvSchemas, g as EnvServiceDatabase, h as EnvTables, E as EnvTypedDatabase, i as EnvTypedTable, I as InsertShape, O as OnDeleteAction, P as PALBASE_EXTENSIONS, j as PalbaseExtension, k as PolicyBuilder, l as PolicyCommand, m as PolicyDef, n as PolicyMode, R as RawConstraintDef, o as RowShape, p as SchemaInput, T as TABLE_META, q as TableDef, r as TableHandle, s as TableInput, t as TxPlan, u as TxTables, v as TypedDB, w as TypedTable, x as TypedTx, y as bigint, z as boolean, B as defineSchema, D as defineTable, F as enumType, G as installationRef, H as integer, J as isPalbaseExtension, K as jsonb, L as makeTypedDB, M as numeric, N as openai, Q as ownedByUser, U as policy, V as raw, W as text, X as timestamp, Y as userRef, Z as uuid, _ as vector } from './index-CwaWRhyc.cjs';
1
+ import { h as PalbaseResult, A as AuthSpec, H as HttpError } from './endpoint-DYHMo6cC.cjs';
2
+ export { i as AuthConfig, B as BadRequest, C as CacheClient, j as ClientInfo, k as Conflict, D as DBClient, f as DBOps, E as ErrorDef, l as ErrorMap, m as ErrorThrowers, F as FileContext, n as Forbidden, o as HttpMethod, L as Logger, M as Materialized, p as Middleware, q as MiddlewareContext, r as MiddlewareHandler, N as NotFound, s as PBRequest, t as PalError, u as PalbaseAnalyticsClient, v as PalbaseAnalyticsManagementNamespace, w as PalbaseAnalyticsProperties, x as PalbaseAnalyticsQueryNamespace, y as PalbaseAttestAndroidParams, z as PalbaseAttestAndroidResult, G as PalbaseAttestiOSParams, I as PalbaseAttestiOSResult, J as PalbaseAuthClient, K as PalbaseBatchOverrideOperation, O as PalbaseBatchSetOverridesResult, Q as PalbaseBindDeviceParams, e as PalbaseBucketClient, U as PalbaseClearAllOverridesResult, V as PalbaseClearOverrideResult, W as PalbaseCohortQueryInput, X as PalbaseCohortResult, Y as PalbaseCollectionRef, Z as PalbaseCountQueryInput, _ as PalbaseCountResult, $ as PalbaseCreateLinkParams, a0 as PalbaseDeviceInfo, a1 as PalbaseDeviceTokenView, P as PalbaseDocsClient, a2 as PalbaseDocumentRef, a3 as PalbaseDocumentSnapshot, a4 as PalbaseEmailClient, a5 as PalbaseEmailSendParams, a6 as PalbaseEmailSendResponse, a7 as PalbaseEventNamesResult, a8 as PalbaseEventsQueryInput, a9 as PalbaseEventsResult, aa as PalbaseFileObject, ab as PalbaseFlag, ac as PalbaseFlagContext, ad as PalbaseFlagSource, ae as PalbaseFlagValue, af as PalbaseFlagVariant, a as PalbaseFlagsClient, ag as PalbaseFlagsServiceClient, ah as PalbaseFunctionsClient, ai as PalbaseFunnelQueryInput, aj as PalbaseFunnelResult, ak as PalbaseIdentifyTraits, al as PalbaseInboxClient, am as PalbaseInboxListOptions, an as PalbaseInboxListResult, ao as PalbaseInboxMessage, ap as PalbaseInboxSendParams, aq as PalbaseInboxSendResponse, ar as PalbaseInitialLink, as as PalbaseInvokeOptions, at as PalbaseLink, au as PalbaseLinkAnalytics, av as PalbaseLinkDetails, aw as PalbaseLinksClient, ax as PalbaseListLinksOptions, ay as PalbaseListLinksResult, az as PalbaseListOptions, aA as PalbaseMatchParams, aB as PalbaseMultiChannelResponse, b as PalbaseNotificationsClient, aC as PalbaseOverviewResult, aD as PalbasePreferences, aE as PalbasePreferencesClient, aF as PalbasePushClient, aG as PalbasePushSendParams, aH as PalbasePushSendResponse, aI as PalbaseQrCodeOptions, aJ as PalbaseQuerySnapshot, c as PalbaseRealtimeClient, aK as PalbaseRegisterDeviceParams, aL as PalbaseRetentionQueryInput, aM as PalbaseRetentionResult, aN as PalbaseSession, aO as PalbaseSetOverrideResult, aP as PalbaseSetOverridesResult, aQ as PalbaseSignedUrlResponse, aR as PalbaseSmsClient, aS as PalbaseSmsSendParams, aT as PalbaseSmsSendResponse, d as PalbaseStorageClient, aU as PalbaseTransformOptions, aV as PalbaseUpdateLinkParams, aW as PalbaseUploadOptions, aX as PalbaseUser, aY as PalbaseUserDetailResult, aZ as PalbaseUsersQueryInput, a_ as PalbaseUsersResult, a$ as PalbaseVerifyRequestSignatureParams, b0 as PalbaseWhereOperator, R as RateLimitConfig, b1 as Ref, S as SecretsService, b2 as TooManyRequests, b3 as TxColumnExpr, b4 as TxInsertShape, b5 as TxInsertValue, b6 as TxNow, T as TxPlanBody, b7 as TxPlanError, b8 as TxPlanHandle, b9 as TxPlanOpResult, ba as TxPlanRejection, g as TxPlanResponse, bb as TxRefError, bc as TxRow, bd as TxRows, be as TxSelectOptions, bf as TxSetShape, bg as TxSetValue, bh as TxTable, bi as TxWhere, bj as TxWireExpr, bk as TxWireGuard, bl as TxWireOp, bm as TxWireRef, bn as TxWireValue, bo as Unauthorized, bp as UniqueViolation, bq as UserT, br as VerifiedDevice, bs as dec, bt as defineMiddleware, bu as inc, bv as now } from './endpoint-DYHMo6cC.cjs';
3
+ import { M as ModuleClients } from './index-ClpDeSos.cjs';
4
+ export { C as Cache, D as Database, a as Documents, F as Flags, L as LifecycleHook, b as Log, N as Notifications, R as Realtime, c as RequestStore, d as RuntimeServices, S as Secrets, e as ShutdownRunner, f as Storage, _ as __getRuntime, g as __requestALS, h as __resetLifecycleHooks, i as __runStartHooks, j as __runWithRuntime, k as __setRuntime, o as onShutdown, l as onStart } from './index-ClpDeSos.cjs';
5
+ import { S as SchemaDef } from './index-CmBK76nx.cjs';
6
+ export { A as AnyColumn, C as ColumnBuilder, a as ColumnDef, b as ColumnMap, c as ColumnType, d as EXTENSION_DEPENDENCIES, e as EmbeddingModelRef, f as EnvSchemas, g as EnvServiceDatabase, h as EnvTables, E as EnvTypedDatabase, i as EnvTypedTable, I as InsertShape, O as OnDeleteAction, P as PALBASE_EXTENSIONS, j as PalbaseExtension, k as PolicyBuilder, l as PolicyCommand, m as PolicyDef, n as PolicyMode, R as RawConstraintDef, o as RowShape, T as TABLE_META, p as TableDef, q as TableHandle, r as TableInput, s as TxPlan, t as TxTables, u as TypedDB, v as TypedTable, w as TypedTx, x as bigint, y as boolean, z as defineSchema, B as defineTable, D as enumType, F as installationRef, G as integer, H as isPalbaseExtension, J as jsonb, K as makeTypedDB, L as numeric, M as openai, N as ownedByUser, Q as policy, U as raw, V as text, W as timestamp, X as userRef, Y as uuid, Z as vector } from './index-CmBK76nx.cjs';
7
7
  export { TableTypes, Tables } from './db/env.cjs';
8
8
  export { PalbaseBucketName, PalbaseFlagKey, PalbaseSecretName } from './stack.cjs';
9
- import { a as RouteOptions } from './registry-CgJvDYUW.cjs';
10
- export { H as HttpMethodUpper, b as ParamKind, P as ParamMeta, R as RouteMeta, c as Signal, d as Sse, S as SseConfig, e as SseOut, f as SseWriter, T as ThrowDescriptor, g as Upload, U as UploadConfig, h as UploadedObject, i as getRoutes, r as recordThrows } from './registry-CgJvDYUW.cjs';
9
+ import { a as RouteOptions } from './registry-CC0WBQq6.cjs';
10
+ export { H as HttpMethodUpper, b as ParamKind, P as ParamMeta, R as RouteMeta, c as Signal, d as Sse, S as SseConfig, e as SseOut, f as SseWriter, T as ThrowDescriptor, g as Upload, U as UploadConfig, h as UploadedObject, i as getRoutes, r as recordThrows } from './registry-CC0WBQq6.cjs';
11
11
  import { ZodTypeAny, z } from 'zod';
12
12
  export { z } from 'zod';
13
13
  import 'node:async_hooks';
@@ -139,6 +139,7 @@ interface ColumnJSON {
139
139
  renamedFrom?: string;
140
140
  /** See Go's `schema.ColumnJSON.Ignored` — the contraction gate's only signal. */
141
141
  ignored?: boolean;
142
+ owns?: boolean;
142
143
  references?: {
143
144
  table: string;
144
145
  column: string;
@@ -368,7 +369,7 @@ declare function defineChannels(map: ChannelsInput): ChannelsDef;
368
369
  * The output is FLAT: each table gets a `{ row: {...}; insert: {...} }` entry
369
370
  * with plain TypeScript object types. The phantom `ColumnBuilder<...>` type
370
371
  * NEVER appears in the generated `.d.ts` — that type only lives at authoring
371
- * time inside `db/schema.ts`.
372
+ * time inside the project's `db/*.ts` schema files.
372
373
  */
373
374
 
374
375
  /**
@@ -384,8 +385,9 @@ declare function defineChannels(map: ChannelsInput): ChannelsDef;
384
385
  *
385
386
  * @example
386
387
  * import { makeEnvDts } from "@palbase/backend";
387
- * import schema from "./db/schema.js";
388
- * writeFileSync("palbase-env.d.ts", makeEnvDts([schema]));
388
+ * import publicSchema from "./db/public.js";
389
+ * import billing from "./db/billing.js";
390
+ * writeFileSync("palbase-env.d.ts", makeEnvDts([publicSchema, billing]));
389
391
  */
390
392
  declare function makeEnvDts(schemas: readonly SchemaDef[]): string;
391
393
 
package/dist/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- import { h as PalbaseResult, A as AuthSpec, H as HttpError } from './endpoint-DMwJjEHQ.js';
2
- export { i as AuthConfig, B as BadRequest, C as CacheClient, j as ClientInfo, k as Conflict, D as DBClient, f as DBOps, E as ErrorDef, l as ErrorMap, m as ErrorThrowers, F as FileContext, n as Forbidden, o as HttpMethod, L as Logger, M as Materialized, p as Middleware, q as MiddlewareContext, r as MiddlewareHandler, N as NotFound, s as PBRequest, t as PalError, u as PalbaseAnalyticsClient, v as PalbaseAnalyticsManagementNamespace, w as PalbaseAnalyticsProperties, x as PalbaseAnalyticsQueryNamespace, y as PalbaseAttestAndroidParams, z as PalbaseAttestAndroidResult, G as PalbaseAttestiOSParams, I as PalbaseAttestiOSResult, J as PalbaseAuthClient, K as PalbaseBatchOverrideOperation, O as PalbaseBatchSetOverridesResult, Q as PalbaseBindDeviceParams, e as PalbaseBucketClient, U as PalbaseClearAllOverridesResult, V as PalbaseClearOverrideResult, W as PalbaseCohortQueryInput, X as PalbaseCohortResult, Y as PalbaseCollectionRef, Z as PalbaseCountQueryInput, _ as PalbaseCountResult, $ as PalbaseCreateLinkParams, a0 as PalbaseDeviceInfo, a1 as PalbaseDeviceTokenView, P as PalbaseDocsClient, a2 as PalbaseDocumentRef, a3 as PalbaseDocumentSnapshot, a4 as PalbaseEmailClient, a5 as PalbaseEmailSendParams, a6 as PalbaseEmailSendResponse, a7 as PalbaseEventNamesResult, a8 as PalbaseEventsQueryInput, a9 as PalbaseEventsResult, aa as PalbaseFileObject, ab as PalbaseFlag, ac as PalbaseFlagContext, ad as PalbaseFlagSource, ae as PalbaseFlagValue, af as PalbaseFlagVariant, a as PalbaseFlagsClient, ag as PalbaseFlagsServiceClient, ah as PalbaseFunctionsClient, ai as PalbaseFunnelQueryInput, aj as PalbaseFunnelResult, ak as PalbaseIdentifyTraits, al as PalbaseInboxClient, am as PalbaseInboxListOptions, an as PalbaseInboxListResult, ao as PalbaseInboxMessage, ap as PalbaseInboxSendParams, aq as PalbaseInboxSendResponse, ar as PalbaseInitialLink, as as PalbaseInvokeOptions, at as PalbaseLink, au as PalbaseLinkAnalytics, av as PalbaseLinkDetails, aw as PalbaseLinksClient, ax as PalbaseListLinksOptions, ay as PalbaseListLinksResult, az as PalbaseListOptions, aA as PalbaseMatchParams, aB as PalbaseMultiChannelResponse, b as PalbaseNotificationsClient, aC as PalbaseOverviewResult, aD as PalbasePreferences, aE as PalbasePreferencesClient, aF as PalbasePushClient, aG as PalbasePushSendParams, aH as PalbasePushSendResponse, aI as PalbaseQrCodeOptions, aJ as PalbaseQuerySnapshot, c as PalbaseRealtimeClient, aK as PalbaseRegisterDeviceParams, aL as PalbaseRetentionQueryInput, aM as PalbaseRetentionResult, aN as PalbaseSession, aO as PalbaseSetOverrideResult, aP as PalbaseSetOverridesResult, aQ as PalbaseSignedUrlResponse, aR as PalbaseSmsClient, aS as PalbaseSmsSendParams, aT as PalbaseSmsSendResponse, d as PalbaseStorageClient, aU as PalbaseTransformOptions, aV as PalbaseUpdateLinkParams, aW as PalbaseUploadOptions, aX as PalbaseUser, aY as PalbaseUserDetailResult, aZ as PalbaseUsersQueryInput, a_ as PalbaseUsersResult, a$ as PalbaseVerifyRequestSignatureParams, b0 as PalbaseWhereOperator, R as RateLimitConfig, b1 as Ref, S as SecretsService, b2 as TooManyRequests, b3 as TxColumnExpr, b4 as TxInsertShape, b5 as TxInsertValue, b6 as TxNow, T as TxPlanBody, b7 as TxPlanError, b8 as TxPlanHandle, b9 as TxPlanOpResult, ba as TxPlanRejection, g as TxPlanResponse, bb as TxRefError, bc as TxRow, bd as TxRows, be as TxSelectOptions, bf as TxSetShape, bg as TxSetValue, bh as TxTable, bi as TxWhere, bj as TxWireExpr, bk as TxWireGuard, bl as TxWireOp, bm as TxWireRef, bn as TxWireValue, bo as Unauthorized, bp as UniqueViolation, bq as UserT, br as VerifiedDevice, bs as dec, bt as defineMiddleware, bu as inc, bv as now } from './endpoint-DMwJjEHQ.js';
3
- import { M as ModuleClients } from './index-BF1f0DfA.js';
4
- export { C as Cache, D as Database, a as Documents, F as Flags, L as LifecycleHook, b as Log, N as Notifications, R as Realtime, c as RequestStore, d as RuntimeServices, S as Secrets, e as ShutdownRunner, f as Storage, _ as __getRuntime, g as __requestALS, h as __resetLifecycleHooks, i as __runStartHooks, j as __runWithRuntime, k as __setRuntime, o as onShutdown, l as onStart } from './index-BF1f0DfA.js';
5
- import { S as SchemaDef } from './index-Ct1iiB4N.js';
6
- export { A as AnyColumn, C as ColumnBuilder, a as ColumnDef, b as ColumnMap, c as ColumnType, d as EXTENSION_DEPENDENCIES, e as EmbeddingModelRef, f as EnvSchemas, g as EnvServiceDatabase, h as EnvTables, E as EnvTypedDatabase, i as EnvTypedTable, I as InsertShape, O as OnDeleteAction, P as PALBASE_EXTENSIONS, j as PalbaseExtension, k as PolicyBuilder, l as PolicyCommand, m as PolicyDef, n as PolicyMode, R as RawConstraintDef, o as RowShape, p as SchemaInput, T as TABLE_META, q as TableDef, r as TableHandle, s as TableInput, t as TxPlan, u as TxTables, v as TypedDB, w as TypedTable, x as TypedTx, y as bigint, z as boolean, B as defineSchema, D as defineTable, F as enumType, G as installationRef, H as integer, J as isPalbaseExtension, K as jsonb, L as makeTypedDB, M as numeric, N as openai, Q as ownedByUser, U as policy, V as raw, W as text, X as timestamp, Y as userRef, Z as uuid, _ as vector } from './index-Ct1iiB4N.js';
1
+ import { h as PalbaseResult, A as AuthSpec, H as HttpError } from './endpoint-CTEHhb7A.js';
2
+ export { i as AuthConfig, B as BadRequest, C as CacheClient, j as ClientInfo, k as Conflict, D as DBClient, f as DBOps, E as ErrorDef, l as ErrorMap, m as ErrorThrowers, F as FileContext, n as Forbidden, o as HttpMethod, L as Logger, M as Materialized, p as Middleware, q as MiddlewareContext, r as MiddlewareHandler, N as NotFound, s as PBRequest, t as PalError, u as PalbaseAnalyticsClient, v as PalbaseAnalyticsManagementNamespace, w as PalbaseAnalyticsProperties, x as PalbaseAnalyticsQueryNamespace, y as PalbaseAttestAndroidParams, z as PalbaseAttestAndroidResult, G as PalbaseAttestiOSParams, I as PalbaseAttestiOSResult, J as PalbaseAuthClient, K as PalbaseBatchOverrideOperation, O as PalbaseBatchSetOverridesResult, Q as PalbaseBindDeviceParams, e as PalbaseBucketClient, U as PalbaseClearAllOverridesResult, V as PalbaseClearOverrideResult, W as PalbaseCohortQueryInput, X as PalbaseCohortResult, Y as PalbaseCollectionRef, Z as PalbaseCountQueryInput, _ as PalbaseCountResult, $ as PalbaseCreateLinkParams, a0 as PalbaseDeviceInfo, a1 as PalbaseDeviceTokenView, P as PalbaseDocsClient, a2 as PalbaseDocumentRef, a3 as PalbaseDocumentSnapshot, a4 as PalbaseEmailClient, a5 as PalbaseEmailSendParams, a6 as PalbaseEmailSendResponse, a7 as PalbaseEventNamesResult, a8 as PalbaseEventsQueryInput, a9 as PalbaseEventsResult, aa as PalbaseFileObject, ab as PalbaseFlag, ac as PalbaseFlagContext, ad as PalbaseFlagSource, ae as PalbaseFlagValue, af as PalbaseFlagVariant, a as PalbaseFlagsClient, ag as PalbaseFlagsServiceClient, ah as PalbaseFunctionsClient, ai as PalbaseFunnelQueryInput, aj as PalbaseFunnelResult, ak as PalbaseIdentifyTraits, al as PalbaseInboxClient, am as PalbaseInboxListOptions, an as PalbaseInboxListResult, ao as PalbaseInboxMessage, ap as PalbaseInboxSendParams, aq as PalbaseInboxSendResponse, ar as PalbaseInitialLink, as as PalbaseInvokeOptions, at as PalbaseLink, au as PalbaseLinkAnalytics, av as PalbaseLinkDetails, aw as PalbaseLinksClient, ax as PalbaseListLinksOptions, ay as PalbaseListLinksResult, az as PalbaseListOptions, aA as PalbaseMatchParams, aB as PalbaseMultiChannelResponse, b as PalbaseNotificationsClient, aC as PalbaseOverviewResult, aD as PalbasePreferences, aE as PalbasePreferencesClient, aF as PalbasePushClient, aG as PalbasePushSendParams, aH as PalbasePushSendResponse, aI as PalbaseQrCodeOptions, aJ as PalbaseQuerySnapshot, c as PalbaseRealtimeClient, aK as PalbaseRegisterDeviceParams, aL as PalbaseRetentionQueryInput, aM as PalbaseRetentionResult, aN as PalbaseSession, aO as PalbaseSetOverrideResult, aP as PalbaseSetOverridesResult, aQ as PalbaseSignedUrlResponse, aR as PalbaseSmsClient, aS as PalbaseSmsSendParams, aT as PalbaseSmsSendResponse, d as PalbaseStorageClient, aU as PalbaseTransformOptions, aV as PalbaseUpdateLinkParams, aW as PalbaseUploadOptions, aX as PalbaseUser, aY as PalbaseUserDetailResult, aZ as PalbaseUsersQueryInput, a_ as PalbaseUsersResult, a$ as PalbaseVerifyRequestSignatureParams, b0 as PalbaseWhereOperator, R as RateLimitConfig, b1 as Ref, S as SecretsService, b2 as TooManyRequests, b3 as TxColumnExpr, b4 as TxInsertShape, b5 as TxInsertValue, b6 as TxNow, T as TxPlanBody, b7 as TxPlanError, b8 as TxPlanHandle, b9 as TxPlanOpResult, ba as TxPlanRejection, g as TxPlanResponse, bb as TxRefError, bc as TxRow, bd as TxRows, be as TxSelectOptions, bf as TxSetShape, bg as TxSetValue, bh as TxTable, bi as TxWhere, bj as TxWireExpr, bk as TxWireGuard, bl as TxWireOp, bm as TxWireRef, bn as TxWireValue, bo as Unauthorized, bp as UniqueViolation, bq as UserT, br as VerifiedDevice, bs as dec, bt as defineMiddleware, bu as inc, bv as now } from './endpoint-CTEHhb7A.js';
3
+ import { M as ModuleClients } from './index-CUomTA3e.js';
4
+ export { C as Cache, D as Database, a as Documents, F as Flags, L as LifecycleHook, b as Log, N as Notifications, R as Realtime, c as RequestStore, d as RuntimeServices, S as Secrets, e as ShutdownRunner, f as Storage, _ as __getRuntime, g as __requestALS, h as __resetLifecycleHooks, i as __runStartHooks, j as __runWithRuntime, k as __setRuntime, o as onShutdown, l as onStart } from './index-CUomTA3e.js';
5
+ import { S as SchemaDef } from './index-CW21M9Z3.js';
6
+ export { A as AnyColumn, C as ColumnBuilder, a as ColumnDef, b as ColumnMap, c as ColumnType, d as EXTENSION_DEPENDENCIES, e as EmbeddingModelRef, f as EnvSchemas, g as EnvServiceDatabase, h as EnvTables, E as EnvTypedDatabase, i as EnvTypedTable, I as InsertShape, O as OnDeleteAction, P as PALBASE_EXTENSIONS, j as PalbaseExtension, k as PolicyBuilder, l as PolicyCommand, m as PolicyDef, n as PolicyMode, R as RawConstraintDef, o as RowShape, T as TABLE_META, p as TableDef, q as TableHandle, r as TableInput, s as TxPlan, t as TxTables, u as TypedDB, v as TypedTable, w as TypedTx, x as bigint, y as boolean, z as defineSchema, B as defineTable, D as enumType, F as installationRef, G as integer, H as isPalbaseExtension, J as jsonb, K as makeTypedDB, L as numeric, M as openai, N as ownedByUser, Q as policy, U as raw, V as text, W as timestamp, X as userRef, Y as uuid, Z as vector } from './index-CW21M9Z3.js';
7
7
  export { TableTypes, Tables } from './db/env.js';
8
8
  export { PalbaseBucketName, PalbaseFlagKey, PalbaseSecretName } from './stack.js';
9
- import { a as RouteOptions } from './registry-B8pld3fj.js';
10
- export { H as HttpMethodUpper, b as ParamKind, P as ParamMeta, R as RouteMeta, c as Signal, d as Sse, S as SseConfig, e as SseOut, f as SseWriter, T as ThrowDescriptor, g as Upload, U as UploadConfig, h as UploadedObject, i as getRoutes, r as recordThrows } from './registry-B8pld3fj.js';
9
+ import { a as RouteOptions } from './registry-dZZ5JKYg.js';
10
+ export { H as HttpMethodUpper, b as ParamKind, P as ParamMeta, R as RouteMeta, c as Signal, d as Sse, S as SseConfig, e as SseOut, f as SseWriter, T as ThrowDescriptor, g as Upload, U as UploadConfig, h as UploadedObject, i as getRoutes, r as recordThrows } from './registry-dZZ5JKYg.js';
11
11
  import { ZodTypeAny, z } from 'zod';
12
12
  export { z } from 'zod';
13
13
  import 'node:async_hooks';
@@ -139,6 +139,7 @@ interface ColumnJSON {
139
139
  renamedFrom?: string;
140
140
  /** See Go's `schema.ColumnJSON.Ignored` — the contraction gate's only signal. */
141
141
  ignored?: boolean;
142
+ owns?: boolean;
142
143
  references?: {
143
144
  table: string;
144
145
  column: string;
@@ -368,7 +369,7 @@ declare function defineChannels(map: ChannelsInput): ChannelsDef;
368
369
  * The output is FLAT: each table gets a `{ row: {...}; insert: {...} }` entry
369
370
  * with plain TypeScript object types. The phantom `ColumnBuilder<...>` type
370
371
  * NEVER appears in the generated `.d.ts` — that type only lives at authoring
371
- * time inside `db/schema.ts`.
372
+ * time inside the project's `db/*.ts` schema files.
372
373
  */
373
374
 
374
375
  /**
@@ -384,8 +385,9 @@ declare function defineChannels(map: ChannelsInput): ChannelsDef;
384
385
  *
385
386
  * @example
386
387
  * import { makeEnvDts } from "@palbase/backend";
387
- * import schema from "./db/schema.js";
388
- * writeFileSync("palbase-env.d.ts", makeEnvDts([schema]));
388
+ * import publicSchema from "./db/public.js";
389
+ * import billing from "./db/billing.js";
390
+ * writeFileSync("palbase-env.d.ts", makeEnvDts([publicSchema, billing]));
389
391
  */
390
392
  declare function makeEnvDts(schemas: readonly SchemaDef[]): string;
391
393
 
package/dist/index.js CHANGED
@@ -17,6 +17,7 @@ import {
17
17
  openai,
18
18
  ownedByUser,
19
19
  policy,
20
+ qualifiedTableKey,
20
21
  raw,
21
22
  text,
22
23
  timestamp,
@@ -24,11 +25,11 @@ import {
24
25
  userRef,
25
26
  uuid,
26
27
  vector
27
- } from "./chunk-OEQBHE2Z.js";
28
+ } from "./chunk-7JSEN7UR.js";
28
29
  import {
29
30
  defineError,
30
31
  getErrorRegistry
31
- } from "./chunk-5CMLOAEF.js";
32
+ } from "./chunk-YOY5DFQS.js";
32
33
  import {
33
34
  Cache,
34
35
  Database,
@@ -79,7 +80,7 @@ import {
79
80
  recordRoute,
80
81
  recordThrows,
81
82
  resolveEffectiveAuth
82
- } from "./chunk-ZQRWW37O.js";
83
+ } from "./chunk-35PNTIRN.js";
83
84
  import "./chunk-7D4SUZUM.js";
84
85
 
85
86
  // src/clients/http.ts
@@ -1059,64 +1060,73 @@ function optionalOnInsert(def) {
1059
1060
  function forwardName(column) {
1060
1061
  return column.endsWith("_id") ? column.slice(0, -3) : column;
1061
1062
  }
1062
- function qualify(schemaName, tableName) {
1063
- return schemaName === "public" ? tableName : `${schemaName}.${tableName}`;
1063
+ function describeOrigin(o) {
1064
+ return o.direction === "forward" ? `the foreign key "${o.table}.${o.column}"` : `the reverse of "${o.table}.${o.column}"`;
1065
+ }
1066
+ function renameCall(o) {
1067
+ if (o.direction === "reverse") return `references(() => \u2026, { reverseAs: "\u2026" })`;
1068
+ if (o.def.owns === true) {
1069
+ return `ownedByUser() takes no { as } \u2014 if "${o.column}" only POINTS at a user, declare it userRef({ onDelete: \u2026 }) instead`;
1070
+ }
1071
+ const target = o.def.references?.table;
1072
+ if (target === "auth.users") return `userRef({ onDelete: \u2026, as: "\u2026" })`;
1073
+ if (target === "auth.installations") return `installationRef({ onDelete: \u2026, as: "\u2026" })`;
1074
+ if (o.def.selfRefColumn !== void 0) return `selfReferences("\u2026", { as: "\u2026" })`;
1075
+ return `references(() => \u2026, { as: "\u2026" })`;
1064
1076
  }
1065
1077
  function buildRelations(schemas) {
1066
1078
  const out = /* @__PURE__ */ new Map();
1067
- const keyOf = /* @__PURE__ */ new Map();
1079
+ const taken = /* @__PURE__ */ new Map();
1068
1080
  for (const schema of schemas) {
1069
1081
  for (const t of Object.values(schema.tables)) {
1070
- const key = qualify(schema.name, t.name);
1082
+ const key = qualifiedTableKey(schema.name, t.name);
1071
1083
  out.set(key, []);
1072
- keyOf.set(t.name, key);
1084
+ taken.set(key, /* @__PURE__ */ new Map());
1073
1085
  }
1074
1086
  }
1087
+ const claim = (tableKey, name, origin, edge) => {
1088
+ const names = taken.get(tableKey);
1089
+ if (names === void 0) return;
1090
+ const held = names.get(name);
1091
+ if (held !== void 0) {
1092
+ if (held.def.owns === true && origin.def.owns === true) {
1093
+ throw new Error(
1094
+ `table "${tableKey}" declares TWO owner columns (${held.column}, ${origin.column}) \u2014 a table has at most ONE ownedByUser(). If the other column only POINTS at a user, declare it userRef({ onDelete: \u2026 }) instead.`
1095
+ );
1096
+ }
1097
+ const heldFix = renameCall(held);
1098
+ const originFix = renameCall(origin);
1099
+ const remedy = heldFix === originFix ? `rename one of them: ${heldFix}` : `rename one of them \u2014 "${held.table}.${held.column}": ${heldFix}; "${origin.table}.${origin.column}": ${originFix}`;
1100
+ throw new Error(
1101
+ `table "${tableKey}": ${describeOrigin(held)} and ${describeOrigin(origin)} both resolve to the relation name "${name}" \u2014 ${remedy}.`
1102
+ );
1103
+ }
1104
+ names.set(name, origin);
1105
+ out.get(tableKey)?.push(edge);
1106
+ };
1075
1107
  for (const schema of schemas) {
1076
1108
  for (const table of Object.values(schema.tables)) {
1077
- const childKey = qualify(schema.name, table.name);
1078
- const bucket = out.get(childKey);
1079
- if (bucket === void 0) continue;
1080
- const byTarget = /* @__PURE__ */ new Map();
1081
- for (const [col, builder] of Object.entries(table.columns)) {
1082
- const ref = builder._def.references;
1083
- if (ref === void 0) continue;
1084
- const list = byTarget.get(ref.table) ?? [];
1085
- list.push(col);
1086
- byTarget.set(ref.table, list);
1087
- }
1088
- for (const [target, cols] of byTarget) {
1089
- if (cols.length < 2) continue;
1090
- const unnamed = cols.filter((c) => {
1091
- const d = table.columns[c]?._def;
1092
- return d?.refAs === void 0 && d?.owns !== true;
1093
- });
1094
- if (unnamed.length > 0) {
1095
- throw new Error(
1096
- `table "${table.name}" declares ${cols.length} foreign keys onto "${target}" (${cols.join(", ")}) \u2014 name each one: references(() => \u2026, { as: "\u2026" })`
1097
- );
1098
- }
1099
- }
1109
+ const childKey = qualifiedTableKey(schema.name, table.name);
1110
+ if (!out.has(childKey)) continue;
1100
1111
  for (const [col, builder] of Object.entries(table.columns)) {
1101
1112
  const def = builder._def;
1102
1113
  if (def.references === void 0) continue;
1114
+ const targetKey = def.references.table;
1103
1115
  const name = def.owns === true ? "owner" : def.refAs ?? forwardName(col);
1104
- if (bucket.some((r) => r.name === name)) {
1105
- throw new Error(
1106
- name === "owner" ? `table "${table.name}": two columns claim ownership of the row \u2014 a table has at most ONE ownedByUser(). If the other column only POINTS at a user, declare it userRef({ onDelete: \u2026 }) instead.` : `table "${table.name}": two relations resolve to the name "${name}" \u2014 give one an explicit { as: "\u2026" }`
1107
- );
1108
- }
1109
- const targetKey = keyOf.get(def.references.table) ?? def.references.table;
1110
- bucket.push({ name, to: targetKey, kind: "one", via: col });
1111
- const parent = out.get(targetKey);
1112
- if (parent === void 0 || targetKey === childKey) continue;
1113
- const reverse = def.refAs ?? table.name;
1114
- if (parent.some((r) => r.name === reverse)) {
1115
- throw new Error(
1116
- `table "${def.references.table}": two reverse relations resolve to the name "${reverse}" \u2014 give one an explicit { as: "\u2026" }`
1117
- );
1118
- }
1119
- parent.push({ name: reverse, to: childKey, kind: "many", via: col });
1116
+ claim(
1117
+ childKey,
1118
+ name,
1119
+ { table: table.name, column: col, direction: "forward", def },
1120
+ { name, to: targetKey, kind: "one", via: col }
1121
+ );
1122
+ if (!out.has(targetKey) || targetKey === childKey) continue;
1123
+ const reverse = def.reverseAs ?? table.name;
1124
+ claim(
1125
+ targetKey,
1126
+ reverse,
1127
+ { table: table.name, column: col, direction: "reverse", def },
1128
+ { name: reverse, to: childKey, kind: "many", via: col }
1129
+ );
1120
1130
  }
1121
1131
  }
1122
1132
  }
@@ -1153,7 +1163,6 @@ function tableBlock(table, relations, indent) {
1153
1163
  }
1154
1164
  function makeEnvDts(schemas) {
1155
1165
  const relations = buildRelations(schemas);
1156
- const qualify2 = (schemaName, table) => schemaName === "public" ? table : `${schemaName}.${table}`;
1157
1166
  const publicSchema = schemas.find((s) => s.name === "public");
1158
1167
  const others = schemas.filter((s) => s.name !== "public");
1159
1168
  const publicBlocks = Object.keys(publicSchema?.tables ?? {}).map(
@@ -1164,7 +1173,7 @@ ${publicBlocks.join("\n")}
1164
1173
  ` : "";
1165
1174
  const schemaBlocks = others.map((schema) => {
1166
1175
  const inner = Object.keys(schema.tables).map(
1167
- (name) => tableBlock(schema.tables[name], relations.get(qualify2(schema.name, name)) ?? [], " ")
1176
+ (name) => tableBlock(schema.tables[name], relations.get(qualifiedTableKey(schema.name, name)) ?? [], " ")
1168
1177
  );
1169
1178
  return ` ${schema.name}: {
1170
1179
  ${inner.join("\n")}
@@ -1555,8 +1564,10 @@ function Req() {
1555
1564
  }
1556
1565
 
1557
1566
  // src/middleware.ts
1558
- function defineMiddleware(fn) {
1559
- return fn;
1567
+ function defineMiddleware(_fn) {
1568
+ throw new Error(
1569
+ "defineMiddleware() is not wired to anything: no bundler reads a `middleware/` directory and the engine has no middleware pipeline, so a handler defined here deploys and never runs. Put cross-cutting work in a service the controllers call, and use route options for auth (`@Controller(path, { auth })`) and rate limits (`@Get(path, { rateLimit })`)."
1570
+ );
1560
1571
  }
1561
1572
 
1562
1573
  // src/job.ts