@xemahq/biome-database-nest 0.6.4 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  <path d="M26 12 L41 21 L41 39 L26 48 L11 39 L11 21 Z" fill="#8B5CF6"/>
7
7
  </g>
8
8
  <text x="92" y="52" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="22" fill="#F8FAFC" font-weight="700">@xemahq/biome-database-nest</text>
9
- <text x="92" y="80" font-family="ui-sans-serif,system-ui,sans-serif" font-size="15" fill="#94A3B8">Centralized database wiring for Xema biome services.</text>
9
+ <text x="92" y="80" font-family="ui-sans-serif,system-ui,sans-serif" font-size="15" fill="#94A3B8">Explicit database ownership and runtime wiring for Xema biomes</text>
10
10
  <text x="652" y="105" text-anchor="end" font-family="ui-sans-serif,system-ui,sans-serif" font-size="12" fill="#475569">xema.dev</text>
11
11
  </svg>
12
12
  </p>
@@ -24,106 +24,20 @@
24
24
 
25
25
  # @xemahq/biome-database-nest
26
26
 
27
- > Centralized database wiring for Xema biome services.
28
-
29
- This package belongs to Layer 1 — it depends only on Layer 0 contracts and
30
- other Layer 1 SDKs plus npm libraries, and carries zero domain knowledge.
27
+ > Explicit database ownership and runtime wiring for Xema biomes
31
28
 
32
29
  ## Overview
33
30
 
34
- Xema biome services share one Postgres database and isolate their tables per
35
- biome by schema (`biome_<id>`). This package makes the correct database
36
- construction the only construction a biome can perform, so biome services carry
37
- no DB boilerplate. It provides:
38
-
39
- - **The schema-qualified driver-adapter.** `createBiomePrismaAdapter` (and its
40
- `…FromEnv` sibling) build a `PrismaPg` pool that passes the schema as the
41
- second constructor argument — the one thing that makes Prisma qualify
42
- `biome_<id>.<table>` instead of `public.<table>`. Raw queries are covered
43
- separately via the libpq `search_path` option.
44
- - **The schema-naming convention.** `deriveBiomeSchemaName(biomeId, dbKey?)`
45
- produces a deterministic, collision-resistant, 63-byte-safe schema name so
46
- two biomes never collide.
47
- - **Config resolution.** `resolveBiomeDatabaseConfigFromEnv` reads the standard
48
- `DB_*` contract (with per-key suffixes); `fetchSystemDatabaseConfig` pulls a
49
- fully-resolved config from the control plane.
50
- - **Boot-time bootstrap.** `bootstrapBiomeDatabases` resolves config, writes an
51
- inline CA cert if supplied, creates the schema under an advisory lock, runs
52
- `prisma migrate deploy`, and exports the resolved connection into the env.
53
- - **Systematic org-tenant isolation.** `createBiomePrismaService` detects
54
- org-scoped models (any model with an `orgId` column) from the client's
55
- runtime data model and scopes every query on them to the request's org via a
56
- Prisma client extension — no hand-written `where: { orgId }` per service.
57
-
58
- ## Tenant isolation
59
-
60
- Org-scoped access is pushed down into the client so it is systematic instead of
61
- hand-written. Any model declaring the org column (default `orgId`; configurable
62
- via `tenantIsolation.orgField`, opt-outs via `tenantIsolation.exemptModels`) is
63
- detected at client construction and covered by the isolation extension.
64
-
65
- ### Modes
66
-
67
- Resolution: `tenantIsolation.mode` option > `XEMA_TENANT_ISOLATION_MODE` env
68
- var > default `observe`. An invalid env value fails the boot — it never
69
- silently weakens the mode.
70
-
71
- | Mode | Behavior of the default injected client |
72
- | --- | --- |
73
- | `observe` (default) | NO query is rewritten. Every violation `enforce` would reject (org mismatch in a write payload, org-model access with no org context) is logged as a structured warning. |
74
- | `enforce` | `where` clauses are AND-ed with `{ orgId }` (unique wheres included — a cross-org `findUnique` returns `null`, a cross-org `update`/`delete` raises P2025); create payloads are stamped with the org; violations throw a typed `TenantIsolationError`. |
75
- | `off` | Passthrough kill switch. `forOrg()` still enforces — explicit scoping is never silently degraded. |
76
-
77
- The **rollout story** is deliberate: everything ships in `observe` (zero
78
- behavior change across ~60 services), each service burns down its warnings,
79
- then flips itself to `enforce` via `XEMA_TENANT_ISOLATION_MODE=enforce` (or the
80
- module option). `enforce` is the target state; `off` exists only as an
81
- emergency kill switch.
82
-
83
- ### Where the org comes from
84
-
85
- Inside a request, the org is the `RequestContext.orgId` that
86
- `RequestContextMiddleware` resolved. `AmbientOrgContextMiddleware`
87
- (`@xemahq/platform-common`) runs right after it and lifts the org into the
88
- ambient async scope the extension reads. Services wired through
89
- `configureAuthMiddleware` / `applyXemaServiceMiddleware` get BOTH middlewares
90
- automatically — no per-service wiring is needed.
91
-
92
- ### The boot-path rule
93
-
94
- Outside a request (boot, migrations, seeding, contribution sync, Temporal
95
- activities, background workers) there is NO ambient org. In `enforce` mode,
96
- touching an org-scoped model there throws. Scope explicitly:
97
-
98
- ```ts
99
- // Jobs/workers acting for one org — hard-bound, always enforced:
100
- const scoped = prisma.forOrg(orgId);
101
- await scoped.artifact.findMany(); // implicitly WHERE orgId = <orgId>
102
-
103
- // Legitimate cross-org system paths (boot backfills, platform admin):
104
- const system = prisma.asSystem(); // unscoped; debug-logged per call site
105
-
106
- // Non-HTTP entrypoints that DO have an org (queue consumers, activities):
107
- // runWithAmbientOrg comes from @xemahq/platform-common.
108
- await runWithAmbientOrg(orgId, () => handler());
109
- ```
110
-
111
- `forOrg(orgId)` always enforces, in every mode. `asSystem()` returns the raw
112
- client and logs each distinct call site once at debug level.
113
-
114
- ### Conformance testing
115
-
116
- `@xemahq/biome-test-utils` exports `assertTenantIsolation(client, { orgA,
117
- orgB, models })` — given the wrapped client and a list of org-scoped model
118
- probes, it verifies cross-org reads return empty/null, cross-org writes throw,
119
- and `asSystem()` sees both orgs, cleaning up after itself.
31
+ This package centralizes schema-qualified Prisma construction and database
32
+ bootstrap for Xema biome services. Every consumer explicitly selects whether
33
+ the application or an external process owns migrations. Externally managed
34
+ services receive only a verified runtime connection and must prove target
35
+ identity, least privilege, required DML access, and migration compatibility.
120
36
 
121
37
  ## When to use it
122
38
 
123
- - Use it inside a biome service so the service never hand-wires Prisma, the
124
- schema name, or the migrate-time connection string.
125
- - Reach for `createBiomePrismaAdapterFromEnv` in a `PrismaService` constructor,
126
- and `bootstrapBiomeDatabases` at service boot before Nest starts.
39
+ - Use it when a NestJS biome service needs a schema-qualified Prisma connection.
40
+ - Select externally managed migrations when deployment operations own all DDL.
127
41
 
128
42
  ## Installation
129
43
 
@@ -135,26 +49,21 @@ pnpm add @xemahq/biome-database-nest
135
49
 
136
50
  ```ts
137
51
  import {
138
- bootstrapBiomeDatabases,
139
- createBiomePrismaAdapterFromEnv,
52
+ BiomeDatabaseMigrationMode,
53
+ BiomeDatabaseModule,
140
54
  } from '@xemahq/biome-database-nest';
141
55
 
142
- // At boot (main.ts), before NestFactory.create:
143
- await bootstrapBiomeDatabases({
144
- biomeId: 'mailops',
145
- databases: [{ workspaceDir: process.cwd() }],
146
- registry,
147
- serviceToken: () => identity.getAccessToken(),
56
+ BiomeDatabaseModule.forRoot({
57
+ biomeId: 'example',
58
+ migrationMode: BiomeDatabaseMigrationMode.ExternallyManaged,
59
+ databases: [externallyManagedDatabase],
148
60
  });
149
-
150
- // In PrismaService:
151
- const adapter = createBiomePrismaAdapterFromEnv(process.env);
152
61
  ```
153
62
 
154
63
  ## Peer requirements
155
64
 
156
- - `@prisma/client`, `@prisma/adapter-pg` — the consumer owns the Prisma
157
- version; the adapter is constructed against the consumer's copy.
65
+ - NestJS 10 or 11 and Prisma 7.
66
+ - Compatible Xema identity, kernel-contract, service-registry, and decorator packages.
158
67
 
159
68
  ## License
160
69
 
package/dist/index.d.ts CHANGED
@@ -6,8 +6,9 @@ export { resolveBiomeDatabaseConfigFromEnv, type BiomeDatabaseConfig, } from './
6
6
  export { createBiomePrismaAdapter, createBiomePrismaAdapterFromEnv, } from './lib/adapter';
7
7
  export { fetchSystemDatabaseConfig, type SystemDatabaseConfigRequest, } from './lib/control-plane-client';
8
8
  export { resolveControlPlaneBaseUrl, ORG_DATABASE_POOL_SERVICE_NAME, type ControlPlaneDiscoveryOptions, } from './lib/control-plane-discovery';
9
- export { bootstrapBiomeDatabases, type BiomeDatabaseDeclaration, type BootstrapBiomeDatabasesOptions, } from './lib/bootstrap';
10
- export { BiomeDatabaseModule, BIOME_DATABASE_READY, type BiomeDatabaseModuleOptions, } from './lib/nest/biome-database.module';
9
+ export { bootstrapBiomeDatabases, type BiomeDatabaseDeclaration, type ExternallyManagedBiomeDatabaseDeclaration, type ApplicationManagedBootstrapOptions, type ExternallyManagedBootstrapOptions, type BootstrapBiomeDatabasesOptions, } from './lib/bootstrap';
10
+ export { BiomeDatabaseMigrationMode, RuntimeDatabaseCredentialSource, RuntimeSequencePrivilege, RuntimeTablePrivilege, type AppliedPrismaMigration, type MigrationCompatibilityContext, type MigrationCompatibilityExpectation, type MigrationCompatibilityProof, type RuntimeDatabaseAccessExpectation, type RuntimeDatabaseTarget, } from './lib/migration-mode';
11
+ export { BiomeDatabaseModule, BIOME_DATABASE_READY, type ApplicationManagedBiomeDatabaseModuleOptions, type ExternallyManagedBiomeDatabaseModuleOptions, type BiomeDatabaseModuleOptions, } from './lib/nest/biome-database.module';
11
12
  export { createBiomePrismaService, type BiomePrismaClient, type BiomePrismaClientCtor, type BiomePrismaServiceInstance, type CreateBiomePrismaServiceOptions, type TenantIsolationServiceOptions, type TenantScopedApi, } from './lib/nest/prisma-service-factory';
12
13
  export { TenantIsolationMode, TENANT_ISOLATION_MODE_ENV_VAR, resolveTenantIsolationMode, } from './lib/tenant-isolation/tenant-isolation-mode';
13
14
  export { TenantIsolationError, TenantIsolationViolationKind, formatTenantIsolationViolation, type TenantIsolationViolation, } from './lib/tenant-isolation/tenant-isolation-error';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,2BAA2B,EAC3B,yBAAyB,EACzB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EACL,iCAAiC,EACjC,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,wBAAwB,EACxB,+BAA+B,GAChC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,KAAK,2BAA2B,GACjC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,KAAK,4BAA4B,GAClC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,uBAAuB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,GACpC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,0BAA0B,GAChC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,KAAK,eAAe,GACrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,8BAA8B,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,8BAA8B,EAC9B,iBAAiB,EACjB,KAAK,qCAAqC,EAC1C,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,kCAAkC,EACvC,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,GACjC,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,EACzB,kCAAkC,EAClC,6BAA6B,EAC7B,KAAK,2BAA2B,EAChC,KAAK,kCAAkC,EACvC,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,GAC/B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,2BAA2B,EAC3B,sBAAsB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,GACtB,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ORG_ERASURE_ROUTE_PATH = exports.ORG_DATA_ERASURE_CAPABILITY = exports.ORG_ERASURE_RUNNER = exports.OrgErasureController = exports.OrgErasureModule = exports.OrgErasureBlockedError = exports.eraseOrgData = exports.UndeclaredUnscopedModelsError = exports.normalizeUnscopedModelDeclarations = exports.formatUnscopedModelReport = exports.collectUnscopableModels = exports.assertUnscopedModelsDeclared = exports.readRuntimeModels = exports.createTenantIsolationExtension = exports.collectOrgScopedModels = exports.DEFAULT_ORG_FIELD = exports.scopeArgsToOrg = exports.PrismaModelOperation = exports.formatTenantIsolationViolation = exports.TenantIsolationViolationKind = exports.TenantIsolationError = exports.resolveTenantIsolationMode = exports.TENANT_ISOLATION_MODE_ENV_VAR = exports.TenantIsolationMode = exports.createBiomePrismaService = exports.BIOME_DATABASE_READY = exports.BiomeDatabaseModule = exports.bootstrapBiomeDatabases = exports.ORG_DATABASE_POOL_SERVICE_NAME = exports.resolveControlPlaneBaseUrl = exports.fetchSystemDatabaseConfig = exports.createBiomePrismaAdapterFromEnv = exports.createBiomePrismaAdapter = exports.resolveBiomeDatabaseConfigFromEnv = exports.unwrapPlatformResponseEnvelope = exports.SCHEMA_ROLE_SUFFIX_LENGTH = exports.SCHEMA_ROLE_BASE_MAX_LENGTH = exports.SchemaRoleKind = exports.schemaRoleName = exports.schemaRoleBase = exports.rolesForSchema = exports.sanitizeIdentifierSegment = exports.sanitizeIdentifierChars = exports.POSTGRES_MAX_IDENTIFIER_LENGTH = exports.IDENTIFIER_HASH_LENGTH = exports.fitIdentifier = exports.composeIdentifier = exports.deriveBiomeSchemaName = exports.DEFAULT_BIOME_DB_KEY = void 0;
3
+ exports.OrgErasureController = exports.OrgErasureModule = exports.OrgErasureBlockedError = exports.eraseOrgData = exports.UndeclaredUnscopedModelsError = exports.normalizeUnscopedModelDeclarations = exports.formatUnscopedModelReport = exports.collectUnscopableModels = exports.assertUnscopedModelsDeclared = exports.readRuntimeModels = exports.createTenantIsolationExtension = exports.collectOrgScopedModels = exports.DEFAULT_ORG_FIELD = exports.scopeArgsToOrg = exports.PrismaModelOperation = exports.formatTenantIsolationViolation = exports.TenantIsolationViolationKind = exports.TenantIsolationError = exports.resolveTenantIsolationMode = exports.TENANT_ISOLATION_MODE_ENV_VAR = exports.TenantIsolationMode = exports.createBiomePrismaService = exports.BIOME_DATABASE_READY = exports.BiomeDatabaseModule = exports.RuntimeTablePrivilege = exports.RuntimeSequencePrivilege = exports.RuntimeDatabaseCredentialSource = exports.BiomeDatabaseMigrationMode = exports.bootstrapBiomeDatabases = exports.ORG_DATABASE_POOL_SERVICE_NAME = exports.resolveControlPlaneBaseUrl = exports.fetchSystemDatabaseConfig = exports.createBiomePrismaAdapterFromEnv = exports.createBiomePrismaAdapter = exports.resolveBiomeDatabaseConfigFromEnv = exports.unwrapPlatformResponseEnvelope = exports.SCHEMA_ROLE_SUFFIX_LENGTH = exports.SCHEMA_ROLE_BASE_MAX_LENGTH = exports.SchemaRoleKind = exports.schemaRoleName = exports.schemaRoleBase = exports.rolesForSchema = exports.sanitizeIdentifierSegment = exports.sanitizeIdentifierChars = exports.POSTGRES_MAX_IDENTIFIER_LENGTH = exports.IDENTIFIER_HASH_LENGTH = exports.fitIdentifier = exports.composeIdentifier = exports.deriveBiomeSchemaName = exports.DEFAULT_BIOME_DB_KEY = void 0;
4
+ exports.ORG_ERASURE_ROUTE_PATH = exports.ORG_DATA_ERASURE_CAPABILITY = exports.ORG_ERASURE_RUNNER = void 0;
4
5
  var schema_name_1 = require("./lib/schema-name");
5
6
  Object.defineProperty(exports, "DEFAULT_BIOME_DB_KEY", { enumerable: true, get: function () { return schema_name_1.DEFAULT_BIOME_DB_KEY; } });
6
7
  Object.defineProperty(exports, "deriveBiomeSchemaName", { enumerable: true, get: function () { return schema_name_1.deriveBiomeSchemaName; } });
@@ -32,6 +33,11 @@ Object.defineProperty(exports, "resolveControlPlaneBaseUrl", { enumerable: true,
32
33
  Object.defineProperty(exports, "ORG_DATABASE_POOL_SERVICE_NAME", { enumerable: true, get: function () { return control_plane_discovery_1.ORG_DATABASE_POOL_SERVICE_NAME; } });
33
34
  var bootstrap_1 = require("./lib/bootstrap");
34
35
  Object.defineProperty(exports, "bootstrapBiomeDatabases", { enumerable: true, get: function () { return bootstrap_1.bootstrapBiomeDatabases; } });
36
+ var migration_mode_1 = require("./lib/migration-mode");
37
+ Object.defineProperty(exports, "BiomeDatabaseMigrationMode", { enumerable: true, get: function () { return migration_mode_1.BiomeDatabaseMigrationMode; } });
38
+ Object.defineProperty(exports, "RuntimeDatabaseCredentialSource", { enumerable: true, get: function () { return migration_mode_1.RuntimeDatabaseCredentialSource; } });
39
+ Object.defineProperty(exports, "RuntimeSequencePrivilege", { enumerable: true, get: function () { return migration_mode_1.RuntimeSequencePrivilege; } });
40
+ Object.defineProperty(exports, "RuntimeTablePrivilege", { enumerable: true, get: function () { return migration_mode_1.RuntimeTablePrivilege; } });
35
41
  var biome_database_module_1 = require("./lib/nest/biome-database.module");
36
42
  Object.defineProperty(exports, "BiomeDatabaseModule", { enumerable: true, get: function () { return biome_database_module_1.BiomeDatabaseModule; } });
37
43
  Object.defineProperty(exports, "BIOME_DATABASE_READY", { enumerable: true, get: function () { return biome_database_module_1.BIOME_DATABASE_READY; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAgF;AAAvE,mHAAA,oBAAoB,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AACpD,+CAS0B;AARxB,+GAAA,iBAAiB,OAAA;AACjB,2GAAA,aAAa,OAAA;AACb,oHAAA,sBAAsB,OAAA;AACtB,4HAAA,8BAA8B,OAAA;AAC9B,qHAAA,uBAAuB,OAAA;AACvB,uHAAA,yBAAyB,OAAA;AAI3B,+CAQ0B;AAPxB,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,yHAAA,2BAA2B,OAAA;AAC3B,uHAAA,yBAAyB,OAAA;AAG3B,6DAAyE;AAAhE,mIAAA,8BAA8B,OAAA;AACvC,uCAGsB;AAFpB,2HAAA,iCAAiC,OAAA;AAGnC,yCAGuB;AAFrB,mHAAA,wBAAwB,OAAA;AACxB,0HAAA,+BAA+B,OAAA;AAEjC,mEAGoC;AAFlC,iIAAA,yBAAyB,OAAA;AAG3B,yEAIuC;AAHrC,qIAAA,0BAA0B,OAAA;AAC1B,yIAAA,8BAA8B,OAAA;AAGhC,6CAIyB;AAHvB,oHAAA,uBAAuB,OAAA;AAIzB,0EAI0C;AAHxC,4HAAA,mBAAmB,OAAA;AACnB,6HAAA,oBAAoB,OAAA;AAGtB,4EAQ2C;AAPzC,kIAAA,wBAAwB,OAAA;AAQ1B,sFAIsD;AAHpD,4HAAA,mBAAmB,OAAA;AACnB,sIAAA,6BAA6B,OAAA;AAC7B,mIAAA,0BAA0B,OAAA;AAE5B,wFAKuD;AAJrD,8HAAA,oBAAoB,OAAA;AACpB,sIAAA,4BAA4B,OAAA;AAC5B,wIAAA,8BAA8B,OAAA;AAGhC,8DAK0C;AAJxC,iHAAA,oBAAoB,OAAA;AACpB,2GAAA,cAAc,OAAA;AAIhB,gGAW2D;AAVzD,+HAAA,iBAAiB,OAAA;AACjB,oIAAA,sBAAsB,OAAA;AACtB,4IAAA,8BAA8B,OAAA;AAC9B,+HAAA,iBAAiB,OAAA;AAQnB,0EAUgD;AAT9C,+HAAA,4BAA4B,OAAA;AAC5B,0HAAA,uBAAuB,OAAA;AACvB,4HAAA,yBAAyB,OAAA;AACzB,qIAAA,kCAAkC,OAAA;AAClC,gIAAA,6BAA6B,OAAA;AAM/B,kEAK4C;AAJ1C,2GAAA,YAAY,OAAA;AACZ,qHAAA,sBAAsB,OAAA;AAIxB,oEAQuC;AAPrC,sHAAA,gBAAgB,OAAA;AAChB,0HAAA,oBAAoB,OAAA;AACpB,wHAAA,kBAAkB,OAAA;AAClB,iIAAA,2BAA2B,OAAA;AAC3B,4HAAA,sBAAsB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,iDAAgF;AAAvE,mHAAA,oBAAoB,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AACpD,+CAS0B;AARxB,+GAAA,iBAAiB,OAAA;AACjB,2GAAA,aAAa,OAAA;AACb,oHAAA,sBAAsB,OAAA;AACtB,4HAAA,8BAA8B,OAAA;AAC9B,qHAAA,uBAAuB,OAAA;AACvB,uHAAA,yBAAyB,OAAA;AAI3B,+CAQ0B;AAPxB,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,yHAAA,2BAA2B,OAAA;AAC3B,uHAAA,yBAAyB,OAAA;AAG3B,6DAAyE;AAAhE,mIAAA,8BAA8B,OAAA;AACvC,uCAGsB;AAFpB,2HAAA,iCAAiC,OAAA;AAGnC,yCAGuB;AAFrB,mHAAA,wBAAwB,OAAA;AACxB,0HAAA,+BAA+B,OAAA;AAEjC,mEAGoC;AAFlC,iIAAA,yBAAyB,OAAA;AAG3B,yEAIuC;AAHrC,qIAAA,0BAA0B,OAAA;AAC1B,yIAAA,8BAA8B,OAAA;AAGhC,6CAOyB;AANvB,oHAAA,uBAAuB,OAAA;AAOzB,uDAW8B;AAV5B,4HAAA,0BAA0B,OAAA;AAC1B,iIAAA,+BAA+B,OAAA;AAC/B,0HAAA,wBAAwB,OAAA;AACxB,uHAAA,qBAAqB,OAAA;AAQvB,0EAM0C;AALxC,4HAAA,mBAAmB,OAAA;AACnB,6HAAA,oBAAoB,OAAA;AAKtB,4EAQ2C;AAPzC,kIAAA,wBAAwB,OAAA;AAQ1B,sFAIsD;AAHpD,4HAAA,mBAAmB,OAAA;AACnB,sIAAA,6BAA6B,OAAA;AAC7B,mIAAA,0BAA0B,OAAA;AAE5B,wFAKuD;AAJrD,8HAAA,oBAAoB,OAAA;AACpB,sIAAA,4BAA4B,OAAA;AAC5B,wIAAA,8BAA8B,OAAA;AAGhC,8DAK0C;AAJxC,iHAAA,oBAAoB,OAAA;AACpB,2GAAA,cAAc,OAAA;AAIhB,gGAW2D;AAVzD,+HAAA,iBAAiB,OAAA;AACjB,oIAAA,sBAAsB,OAAA;AACtB,4IAAA,8BAA8B,OAAA;AAC9B,+HAAA,iBAAiB,OAAA;AAQnB,0EAUgD;AAT9C,+HAAA,4BAA4B,OAAA;AAC5B,0HAAA,uBAAuB,OAAA;AACvB,4HAAA,yBAAyB,OAAA;AACzB,qIAAA,kCAAkC,OAAA;AAClC,gIAAA,6BAA6B,OAAA;AAM/B,kEAK4C;AAJ1C,2GAAA,YAAY,OAAA;AACZ,qHAAA,sBAAsB,OAAA;AAIxB,oEAQuC;AAPrC,sHAAA,gBAAgB,OAAA;AAChB,0HAAA,oBAAoB,OAAA;AACpB,wHAAA,kBAAkB,OAAA;AAClB,iIAAA,2BAA2B,OAAA;AAC3B,4HAAA,sBAAsB,OAAA"}
@@ -1,16 +1,34 @@
1
1
  import type { KernelState } from '@xemahq/kernel-contracts/kernel-state';
2
2
  import { type ControlPlaneDiscoveryOptions } from './control-plane-discovery';
3
+ import { BiomeDatabaseMigrationMode, RuntimeDatabaseCredentialSource, type MigrationCompatibilityExpectation, type RuntimeDatabaseAccessExpectation, type RuntimeDatabaseTarget } from './migration-mode';
3
4
  export interface BiomeDatabaseDeclaration {
4
5
  readonly key?: string;
5
6
  readonly workspaceDir: string;
6
7
  }
7
- export interface BootstrapBiomeDatabasesOptions {
8
+ export interface ExternallyManagedBiomeDatabaseDeclaration {
9
+ readonly key?: string;
10
+ readonly credentialSource: RuntimeDatabaseCredentialSource;
11
+ readonly expectedTarget: RuntimeDatabaseTarget;
12
+ readonly runtimeAccess: RuntimeDatabaseAccessExpectation;
13
+ readonly migrationCompatibility: MigrationCompatibilityExpectation;
14
+ }
15
+ interface BootstrapBiomeDatabasesCommonOptions {
8
16
  readonly biomeId: string;
9
- readonly databases: readonly BiomeDatabaseDeclaration[];
10
17
  readonly serviceToken?: string | (() => Promise<string>);
11
18
  readonly kernelState: KernelState;
12
19
  readonly controlPlaneDiscovery?: ControlPlaneDiscoveryOptions;
20
+ }
21
+ export interface ApplicationManagedBootstrapOptions extends BootstrapBiomeDatabasesCommonOptions {
22
+ readonly migrationMode: BiomeDatabaseMigrationMode.ApplicationManaged;
23
+ readonly databases: readonly BiomeDatabaseDeclaration[];
13
24
  readonly requiredExtensions?: readonly string[];
14
25
  }
26
+ export interface ExternallyManagedBootstrapOptions extends BootstrapBiomeDatabasesCommonOptions {
27
+ readonly migrationMode: BiomeDatabaseMigrationMode.ExternallyManaged;
28
+ readonly databases: readonly ExternallyManagedBiomeDatabaseDeclaration[];
29
+ readonly requiredExtensions?: never;
30
+ }
31
+ export type BootstrapBiomeDatabasesOptions = ApplicationManagedBootstrapOptions | ExternallyManagedBootstrapOptions;
15
32
  export declare function bootstrapBiomeDatabases(opts: BootstrapBiomeDatabasesOptions): Promise<void>;
33
+ export {};
16
34
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAWzE,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,2BAA2B,CAAC;AAInC,MAAM,WAAW,wBAAwB;IAEvC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAQxD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAQzD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAElC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,4BAA4B,CAAC;IAW9D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAgSD,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC,IAAI,CAAC,CAmDf"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAWzE,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,EAC/B,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EACrC,KAAK,qBAAqB,EAC3B,MAAM,kBAAkB,CAAC;AAI1B,MAAM,WAAW,wBAAwB;IAEvC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAGD,MAAM,WAAW,yCAAyC;IAExD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;IAE3D,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAE/C,QAAQ,CAAC,aAAa,EAAE,gCAAgC,CAAC;IAEzD,QAAQ,CAAC,sBAAsB,EAAE,iCAAiC,CAAC;CACpE;AAED,UAAU,oCAAoC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAMzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAOzD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAElC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,4BAA4B,CAAC;CAC/D;AAED,MAAM,WAAW,kCACf,SAAQ,oCAAoC;IAC5C,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC,kBAAkB,CAAC;IACtE,QAAQ,CAAC,SAAS,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAWxD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,iCACf,SAAQ,oCAAoC;IAC5C,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC,iBAAiB,CAAC;IACrE,QAAQ,CAAC,SAAS,EAAE,SAAS,yCAAyC,EAAE,CAAC;IAEzE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC;CACrC;AAED,MAAM,MAAM,8BAA8B,GACtC,kCAAkC,GAClC,iCAAiC,CAAC;AA6VtC,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC,IAAI,CAAC,CAiFf"}
@@ -12,6 +12,8 @@ const pg_1 = require("pg");
12
12
  const config_1 = require("./config");
13
13
  const control_plane_client_1 = require("./control-plane-client");
14
14
  const control_plane_discovery_1 = require("./control-plane-discovery");
15
+ const external_runtime_verifier_1 = require("./external-runtime-verifier");
16
+ const migration_mode_1 = require("./migration-mode");
15
17
  const schema_name_1 = require("./schema-name");
16
18
  const LOG_PREFIX = '[biome-database]';
17
19
  function upperKeySuffix(key) {
@@ -38,6 +40,26 @@ async function resolveDatabaseConfig(opts, key, getControlPlaneBaseUrl) {
38
40
  ...(key !== schema_name_1.DEFAULT_BIOME_DB_KEY ? { dbKey: key } : {}),
39
41
  });
40
42
  }
43
+ async function resolveExternalRuntimeConfig(opts, key, credentialSource, getControlPlaneBaseUrl) {
44
+ switch (credentialSource) {
45
+ case migration_mode_1.RuntimeDatabaseCredentialSource.Environment: {
46
+ const local = (0, config_1.resolveBiomeDatabaseConfigFromEnv)(process.env, key);
47
+ if (local === null) {
48
+ throw new Error(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: external runtime ` +
49
+ 'credential source is environment, but no complete DB_* config exists.');
50
+ }
51
+ return local;
52
+ }
53
+ case migration_mode_1.RuntimeDatabaseCredentialSource.ControlPlane: {
54
+ const baseUrl = await getControlPlaneBaseUrl();
55
+ const token = await resolveServiceToken(opts.serviceToken);
56
+ return (0, control_plane_client_1.fetchSystemDatabaseConfig)(baseUrl, token, {
57
+ biomeId: opts.biomeId,
58
+ ...(key !== schema_name_1.DEFAULT_BIOME_DB_KEY ? { dbKey: key } : {}),
59
+ });
60
+ }
61
+ }
62
+ }
41
63
  async function materializeInlineCaCert(biomeId, key, config) {
42
64
  if (config.caCertPem === undefined || config.caCertPem === '') {
43
65
  return config;
@@ -98,7 +120,9 @@ async function ensureSchemaExists(biomeId, key, config, requiredExtensions) {
98
120
  }
99
121
  if (hasSchema) {
100
122
  await client.query('BEGIN');
101
- await client.query('SELECT pg_advisory_xact_lock(hashtext($1))', [schema]);
123
+ await client.query('SELECT pg_advisory_xact_lock(hashtext($1))', [
124
+ schema,
125
+ ]);
102
126
  await client.query(`CREATE SCHEMA IF NOT EXISTS "${schema}"`);
103
127
  await client.query('COMMIT');
104
128
  console.log(`${LOG_PREFIX} biome=${biomeId} key=${key}: ensured schema "${schema}" exists`);
@@ -112,8 +136,8 @@ async function ensureSchemaExists(biomeId, key, config, requiredExtensions) {
112
136
  await client.end();
113
137
  }
114
138
  }
115
- async function runMigrations(biomeId, key, workspaceDir, config) {
116
- const migrateUrl = (0, platform_common_1.composeBiomeDatabaseUrl)({
139
+ function buildDirectConnectionUrl(biomeId, key, config) {
140
+ const directUrl = (0, platform_common_1.composeBiomeDatabaseUrl)({
117
141
  user: config.username,
118
142
  password: config.password,
119
143
  host: config.host,
@@ -122,23 +146,25 @@ async function runMigrations(biomeId, key, workspaceDir, config) {
122
146
  ...(config.schema !== undefined ? { schema: config.schema } : {}),
123
147
  ...(config.sslParams !== undefined ? { sslParams: config.sslParams } : {}),
124
148
  });
125
- if (migrateUrl === null) {
126
- throw new Error(`${LOG_PREFIX} biome=${biomeId} key=${key}: incomplete config — cannot form a migrate URL.`);
149
+ if (directUrl === null) {
150
+ throw new Error(`${LOG_PREFIX} biome=${biomeId} key=${key}: incomplete config — cannot form a database URL.`);
127
151
  }
152
+ return (0, platform_common_1.ensureBiomeDbSearchPath)(directUrl);
153
+ }
154
+ async function runMigrations(biomeId, key, workspaceDir, migrateUrl) {
128
155
  console.log(`${LOG_PREFIX} biome=${biomeId} key=${key}: running prisma migrate deploy (cwd=${workspaceDir})`);
129
156
  const result = await new migration_runner_prisma_1.PrismaMigrationRunner().run({
130
157
  workspaceDir,
131
- connectionUrl: (0, platform_common_1.ensureBiomeDbSearchPath)(migrateUrl),
158
+ connectionUrl: migrateUrl,
132
159
  env: {},
133
160
  });
134
161
  if (result.exitCode !== 0) {
135
162
  throw new Error(`${LOG_PREFIX} biome=${biomeId} key=${key}: migrations failed (exit ${result.exitCode}):\n${result.output}`);
136
163
  }
137
- return migrateUrl;
138
164
  }
139
- function buildRuntimeUrl(biomeId, key, config, directMigrateUrl) {
165
+ function buildRuntimeUrl(biomeId, key, config, directUrl) {
140
166
  if (config.poolerHost === undefined || config.poolerHost === '') {
141
- return (0, platform_common_1.ensureBiomeDbSearchPath)(directMigrateUrl);
167
+ return (0, platform_common_1.ensureBiomeDbSearchPath)(directUrl);
142
168
  }
143
169
  const pooledUrl = (0, platform_common_1.composeBiomeDatabaseUrl)({
144
170
  user: config.username,
@@ -152,9 +178,23 @@ function buildRuntimeUrl(biomeId, key, config, directMigrateUrl) {
152
178
  if (pooledUrl === null) {
153
179
  throw new Error(`${LOG_PREFIX} biome=${biomeId} key=${key}: incomplete config — cannot form a pooled runtime URL.`);
154
180
  }
155
- console.log(`${LOG_PREFIX} biome=${biomeId} key=${key}: runtime routed through pooler ${config.poolerHost}:${config.poolerPort ?? config.port} (migrations stay direct)`);
181
+ console.log(`${LOG_PREFIX} biome=${biomeId} key=${key}: runtime routed through pooler ${config.poolerHost}:${config.poolerPort ?? config.port}`);
156
182
  return (0, platform_common_1.ensureBiomeDbSearchPath)(pooledUrl);
157
183
  }
184
+ function withApplicationName(url, applicationName) {
185
+ const parsed = new URL(url);
186
+ parsed.searchParams.set('application_name', applicationName);
187
+ return parsed.toString();
188
+ }
189
+ function assertExternalTargetMatchesConfig(biomeId, key, config, target) {
190
+ const configuredSchema = config.schema ?? 'public';
191
+ if (config.database !== target.database ||
192
+ configuredSchema !== target.schema) {
193
+ throw new Error(`${LOG_PREFIX} biome=${biomeId} key=${key}: resolved runtime target ` +
194
+ `${config.database}/${configuredSchema} does not match expected ` +
195
+ `${target.database}/${target.schema}.`);
196
+ }
197
+ }
158
198
  function exportResolvedEnv(key, config, runtimeUrl) {
159
199
  const suffix = upperKeySuffix(key);
160
200
  process.env[`DATABASE_URL${suffix}`] = runtimeUrl;
@@ -170,14 +210,30 @@ async function bootstrapBiomeDatabases(opts) {
170
210
  }
171
211
  return cachedBaseUrl;
172
212
  };
213
+ if (opts.migrationMode === migration_mode_1.BiomeDatabaseMigrationMode.ApplicationManaged) {
214
+ for (const decl of opts.databases) {
215
+ const key = decl.key ?? schema_name_1.DEFAULT_BIOME_DB_KEY;
216
+ console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: resolving config for mode=${opts.migrationMode}`);
217
+ const rawConfig = await resolveDatabaseConfig(opts, key, getControlPlaneBaseUrl);
218
+ const config = await materializeInlineCaCert(opts.biomeId, key, rawConfig);
219
+ const directUrl = buildDirectConnectionUrl(opts.biomeId, key, config);
220
+ await ensureSchemaExists(opts.biomeId, key, config, opts.requiredExtensions ?? []);
221
+ await runMigrations(opts.biomeId, key, decl.workspaceDir, directUrl);
222
+ const runtimeUrl = buildRuntimeUrl(opts.biomeId, key, config, directUrl);
223
+ exportResolvedEnv(key, config, runtimeUrl);
224
+ console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: bootstrap complete`);
225
+ }
226
+ return;
227
+ }
173
228
  for (const decl of opts.databases) {
174
229
  const key = decl.key ?? schema_name_1.DEFAULT_BIOME_DB_KEY;
175
- console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: resolving config`);
176
- const rawConfig = await resolveDatabaseConfig(opts, key, getControlPlaneBaseUrl);
230
+ console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: resolving config for mode=${opts.migrationMode}`);
231
+ const rawConfig = await resolveExternalRuntimeConfig(opts, key, decl.credentialSource, getControlPlaneBaseUrl);
177
232
  const config = await materializeInlineCaCert(opts.biomeId, key, rawConfig);
178
- await ensureSchemaExists(opts.biomeId, key, config, opts.requiredExtensions ?? []);
179
- const migrateUrl = await runMigrations(opts.biomeId, key, decl.workspaceDir, config);
180
- const runtimeUrl = buildRuntimeUrl(opts.biomeId, key, config, migrateUrl);
233
+ const directUrl = buildDirectConnectionUrl(opts.biomeId, key, config);
234
+ assertExternalTargetMatchesConfig(opts.biomeId, key, config, decl.expectedTarget);
235
+ const runtimeUrl = withApplicationName(buildRuntimeUrl(opts.biomeId, key, config, directUrl), decl.expectedTarget.applicationName);
236
+ await (0, external_runtime_verifier_1.verifyExternallyManagedRuntime)(runtimeUrl, decl.expectedTarget, decl.runtimeAccess, decl.migrationCompatibility);
181
237
  exportResolvedEnv(key, config, runtimeUrl);
182
238
  console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: bootstrap complete`);
183
239
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { MigrationCompatibilityContext, MigrationCompatibilityExpectation, RuntimeDatabaseAccessExpectation, RuntimeDatabaseTarget } from './migration-mode';
2
+ export declare function verifyExternallyManagedRuntime(runtimeUrl: string, target: RuntimeDatabaseTarget, access: RuntimeDatabaseAccessExpectation, compatibility: MigrationCompatibilityExpectation): Promise<MigrationCompatibilityContext>;
3
+ //# sourceMappingURL=external-runtime-verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-runtime-verifier.d.ts","sourceRoot":"","sources":["../../src/lib/external-runtime-verifier.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,6BAA6B,EAC7B,iCAAiC,EACjC,gCAAgC,EAChC,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AA4K1B,wBAAsB,8BAA8B,CAClD,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,gCAAgC,EACxC,aAAa,EAAE,iCAAiC,GAC/C,OAAO,CAAC,6BAA6B,CAAC,CA6NxC"}
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyExternallyManagedRuntime = verifyExternallyManagedRuntime;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const pg_1 = require("pg");
6
+ const LOG_PREFIX = '[biome-database]';
7
+ function quoteIdentifier(identifier) {
8
+ return `"${identifier.replaceAll('"', '""')}"`;
9
+ }
10
+ function requireSingleRow(rows, description) {
11
+ if (rows.length !== 1) {
12
+ throw new Error(`${LOG_PREFIX} expected exactly one ${description} row, received ${rows.length}.`);
13
+ }
14
+ return rows[0];
15
+ }
16
+ function assertNonEmpty(value, field) {
17
+ if (value.trim() === '') {
18
+ throw new Error(`${LOG_PREFIX} ${field} must be a non-empty string.`);
19
+ }
20
+ }
21
+ function assertExpectation(expectation) {
22
+ if (expectation.tablePrivileges.length === 0) {
23
+ throw new Error(`${LOG_PREFIX} externally-managed runtime access must require at least one table privilege.`);
24
+ }
25
+ }
26
+ function buildMissingTablePrivilegeQuery(privileges) {
27
+ const projections = privileges
28
+ .map((privilege) => `CASE WHEN NOT has_table_privilege(current_user, ` +
29
+ `format('%I.%I', table_schema, table_name), '${privilege}') ` +
30
+ `THEN '${privilege}' END`)
31
+ .join(', ');
32
+ return `
33
+ SELECT table_name AS object_name,
34
+ array_remove(ARRAY[${projections}], NULL) AS missing_privileges
35
+ FROM information_schema.tables
36
+ WHERE table_schema = $1
37
+ AND table_type = 'BASE TABLE'
38
+ AND table_name <> '_prisma_migrations'
39
+ AND NOT (
40
+ ${privileges
41
+ .map((privilege) => `has_table_privilege(current_user, ` +
42
+ `format('%I.%I', table_schema, table_name), '${privilege}')`)
43
+ .join(' AND ')}
44
+ )
45
+ ORDER BY table_name
46
+ `;
47
+ }
48
+ function buildMissingSequencePrivilegeQuery(privileges) {
49
+ if (privileges.length === 0) {
50
+ return null;
51
+ }
52
+ const projections = privileges
53
+ .map((privilege) => `CASE WHEN NOT has_sequence_privilege(current_user, ` +
54
+ `format('%I.%I', sequence_schema, sequence_name), '${privilege}') ` +
55
+ `THEN '${privilege}' END`)
56
+ .join(', ');
57
+ return `
58
+ SELECT sequence_name AS object_name,
59
+ array_remove(ARRAY[${projections}], NULL) AS missing_privileges
60
+ FROM information_schema.sequences
61
+ WHERE sequence_schema = $1
62
+ AND NOT (
63
+ ${privileges
64
+ .map((privilege) => `has_sequence_privilege(current_user, ` +
65
+ `format('%I.%I', sequence_schema, sequence_name), '${privilege}')`)
66
+ .join(' AND ')}
67
+ )
68
+ ORDER BY sequence_name
69
+ `;
70
+ }
71
+ function formatMissingPrivileges(kind, rows) {
72
+ return rows
73
+ .map((row) => `${kind} ${row.object_name} missing ${row.missing_privileges.join('/')}`)
74
+ .join(', ');
75
+ }
76
+ function digestLedger(appliedMigrations) {
77
+ return (0, node_crypto_1.createHash)('sha256')
78
+ .update(JSON.stringify(appliedMigrations))
79
+ .digest('hex');
80
+ }
81
+ function assertTarget(target) {
82
+ assertNonEmpty(target.database, 'expected target database');
83
+ assertNonEmpty(target.schema, 'expected target schema');
84
+ assertNonEmpty(target.applicationName, 'expected application_name');
85
+ }
86
+ async function verifyExternallyManagedRuntime(runtimeUrl, target, access, compatibility) {
87
+ assertTarget(target);
88
+ assertExpectation(access);
89
+ if (compatibility === undefined ||
90
+ typeof compatibility.verify !== 'function') {
91
+ throw new Error(`${LOG_PREFIX} externally-managed mode requires a migration compatibility verifier.`);
92
+ }
93
+ assertNonEmpty(compatibility.verifierId, 'migration verifierId');
94
+ const client = new pg_1.Client({ connectionString: runtimeUrl });
95
+ await client.connect();
96
+ try {
97
+ const identity = requireSingleRow((await client.query(`
98
+ SELECT current_database() AS database_name,
99
+ current_schema() AS schema_name,
100
+ current_setting('application_name') AS application_name,
101
+ current_user AS role_name
102
+ `)).rows, 'connection identity');
103
+ if (identity.database_name !== target.database ||
104
+ identity.schema_name !== target.schema ||
105
+ identity.application_name !== target.applicationName) {
106
+ throw new Error(`${LOG_PREFIX} runtime target mismatch: expected ` +
107
+ `${target.database}/${target.schema}/${target.applicationName}, observed ` +
108
+ `${identity.database_name}/${identity.schema_name ?? '<none>'}/${identity.application_name}.`);
109
+ }
110
+ const role = requireSingleRow((await client.query(`
111
+ SELECT rolsuper, rolcreatedb, rolcreaterole, rolbypassrls
112
+ FROM pg_roles
113
+ WHERE rolname = current_user
114
+ `)).rows, 'runtime role');
115
+ const forbiddenRoleAttributes = [
116
+ role.rolsuper ? 'SUPERUSER' : null,
117
+ role.rolcreatedb ? 'CREATEDB' : null,
118
+ role.rolcreaterole ? 'CREATEROLE' : null,
119
+ role.rolbypassrls ? 'BYPASSRLS' : null,
120
+ ].filter((value) => value !== null);
121
+ if (forbiddenRoleAttributes.length > 0) {
122
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden attribute(s): ` +
123
+ forbiddenRoleAttributes.join(', '));
124
+ }
125
+ const databasePrivileges = requireSingleRow((await client.query(`
126
+ SELECT has_database_privilege(current_user, current_database(), 'CONNECT') AS can_connect,
127
+ has_database_privilege(current_user, current_database(), 'CREATE') AS can_create,
128
+ pg_has_role(current_user, datdba, 'USAGE') AS owns_database
129
+ FROM pg_database
130
+ WHERE datname = current_database()
131
+ `)).rows, 'database privilege');
132
+ if (!databasePrivileges.can_connect) {
133
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} lacks database CONNECT.`);
134
+ }
135
+ if (databasePrivileges.can_create || databasePrivileges.owns_database) {
136
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden database ` +
137
+ `${databasePrivileges.owns_database ? 'ownership' : 'CREATE privilege'}.`);
138
+ }
139
+ const schemaPrivileges = requireSingleRow((await client.query(`
140
+ SELECT has_schema_privilege(current_user, oid, 'USAGE') AS can_use,
141
+ has_schema_privilege(current_user, oid, 'CREATE') AS can_create,
142
+ pg_has_role(current_user, nspowner, 'USAGE') AS owns_schema
143
+ FROM pg_namespace
144
+ WHERE nspname = $1
145
+ `, [target.schema])).rows, 'target schema privilege');
146
+ if (!schemaPrivileges.can_use) {
147
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} lacks USAGE on schema ${target.schema}.`);
148
+ }
149
+ if (schemaPrivileges.can_create || schemaPrivileges.owns_schema) {
150
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden CREATE/ownership ` +
151
+ `on schema ${target.schema}.`);
152
+ }
153
+ const persistentDdlSchemas = (await client.query(`
154
+ SELECT nspname AS schema_name
155
+ FROM pg_namespace
156
+ WHERE nspname NOT IN ('pg_catalog', 'information_schema')
157
+ AND nspname NOT LIKE 'pg_toast%'
158
+ AND nspname NOT LIKE 'pg_temp_%'
159
+ AND (
160
+ has_schema_privilege(current_user, oid, 'CREATE')
161
+ OR pg_has_role(current_user, nspowner, 'USAGE')
162
+ )
163
+ ORDER BY nspname
164
+ `)).rows;
165
+ if (persistentDdlSchemas.length > 0) {
166
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden persistent ` +
167
+ `schema CREATE/ownership on: ${persistentDdlSchemas
168
+ .map((row) => row.schema_name)
169
+ .join(', ')}.`);
170
+ }
171
+ const missingTablePrivileges = (await client.query(buildMissingTablePrivilegeQuery(access.tablePrivileges), [target.schema])).rows;
172
+ if (missingTablePrivileges.length > 0) {
173
+ throw new Error(`${LOG_PREFIX} runtime DML contract failed: ${formatMissingPrivileges('table', missingTablePrivileges)}.`);
174
+ }
175
+ const sequenceQuery = buildMissingSequencePrivilegeQuery(access.sequencePrivileges);
176
+ if (sequenceQuery !== null) {
177
+ const missingSequencePrivileges = (await client.query(sequenceQuery, [target.schema])).rows;
178
+ if (missingSequencePrivileges.length > 0) {
179
+ throw new Error(`${LOG_PREFIX} runtime DML contract failed: ${formatMissingPrivileges('sequence', missingSequencePrivileges)}.`);
180
+ }
181
+ }
182
+ const migrationRows = (await client.query(`
183
+ SELECT id::text,
184
+ migration_name,
185
+ checksum,
186
+ started_at::text,
187
+ finished_at::text,
188
+ applied_steps_count
189
+ FROM ${quoteIdentifier(target.schema)}."_prisma_migrations"
190
+ WHERE finished_at IS NOT NULL
191
+ AND rolled_back_at IS NULL
192
+ ORDER BY finished_at, id
193
+ `)).rows;
194
+ const appliedMigrations = migrationRows.map((row) => ({
195
+ id: row.id,
196
+ name: row.migration_name,
197
+ checksum: row.checksum,
198
+ startedAt: row.started_at,
199
+ finishedAt: row.finished_at,
200
+ appliedStepsCount: row.applied_steps_count,
201
+ }));
202
+ const observedLedgerDigest = digestLedger(appliedMigrations);
203
+ const context = Object.freeze({
204
+ target: Object.freeze({ ...target }),
205
+ currentRole: identity.role_name,
206
+ appliedMigrations: Object.freeze(appliedMigrations.map((migration) => Object.freeze(migration))),
207
+ observedLedgerDigest,
208
+ });
209
+ const proof = await compatibility.verify(context);
210
+ if (proof.verifierId !== compatibility.verifierId ||
211
+ proof.observedLedgerDigest !== observedLedgerDigest) {
212
+ throw new Error(`${LOG_PREFIX} migration compatibility proof does not match verifier ` +
213
+ `${compatibility.verifierId} and observed ledger ${observedLedgerDigest}.`);
214
+ }
215
+ if (!proof.compatible) {
216
+ throw new Error(`${LOG_PREFIX} migration compatibility rejected by ${proof.verifierId}: ${proof.reason}`);
217
+ }
218
+ assertNonEmpty(proof.expectedState, 'migration proof expectedState');
219
+ return context;
220
+ }
221
+ finally {
222
+ await client.end();
223
+ }
224
+ }
225
+ //# sourceMappingURL=external-runtime-verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-runtime-verifier.js","sourceRoot":"","sources":["../../src/lib/external-runtime-verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ export declare enum BiomeDatabaseMigrationMode {
2
+ ApplicationManaged = "application-managed",
3
+ ExternallyManaged = "externally-managed"
4
+ }
5
+ export declare enum RuntimeDatabaseCredentialSource {
6
+ ControlPlane = "control-plane",
7
+ Environment = "environment"
8
+ }
9
+ export declare enum RuntimeTablePrivilege {
10
+ Select = "SELECT",
11
+ Insert = "INSERT",
12
+ Update = "UPDATE",
13
+ Delete = "DELETE"
14
+ }
15
+ export declare enum RuntimeSequencePrivilege {
16
+ Usage = "USAGE",
17
+ Select = "SELECT",
18
+ Update = "UPDATE"
19
+ }
20
+ export interface RuntimeDatabaseAccessExpectation {
21
+ readonly tablePrivileges: readonly RuntimeTablePrivilege[];
22
+ readonly sequencePrivileges: readonly RuntimeSequencePrivilege[];
23
+ }
24
+ export interface RuntimeDatabaseTarget {
25
+ readonly database: string;
26
+ readonly schema: string;
27
+ readonly applicationName: string;
28
+ }
29
+ export interface AppliedPrismaMigration {
30
+ readonly id: string;
31
+ readonly name: string;
32
+ readonly checksum: string;
33
+ readonly startedAt: string;
34
+ readonly finishedAt: string;
35
+ readonly appliedStepsCount: number;
36
+ }
37
+ export interface MigrationCompatibilityContext {
38
+ readonly target: RuntimeDatabaseTarget;
39
+ readonly currentRole: string;
40
+ readonly appliedMigrations: readonly AppliedPrismaMigration[];
41
+ readonly observedLedgerDigest: string;
42
+ }
43
+ export type MigrationCompatibilityProof = {
44
+ readonly compatible: true;
45
+ readonly verifierId: string;
46
+ readonly expectedState: string;
47
+ readonly observedLedgerDigest: string;
48
+ } | {
49
+ readonly compatible: false;
50
+ readonly verifierId: string;
51
+ readonly reason: string;
52
+ readonly observedLedgerDigest: string;
53
+ };
54
+ export interface MigrationCompatibilityExpectation {
55
+ readonly verifierId: string;
56
+ readonly verify: (context: MigrationCompatibilityContext) => MigrationCompatibilityProof | Promise<MigrationCompatibilityProof>;
57
+ }
58
+ //# sourceMappingURL=migration-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-mode.d.ts","sourceRoot":"","sources":["../../src/lib/migration-mode.ts"],"names":[],"mappings":"AAOA,oBAAY,0BAA0B;IACpC,kBAAkB,wBAAwB;IAC1C,iBAAiB,uBAAuB;CACzC;AAQD,oBAAY,+BAA+B;IACzC,YAAY,kBAAkB;IAC9B,WAAW,gBAAgB;CAC5B;AAGD,oBAAY,qBAAqB;IAC/B,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAGD,oBAAY,wBAAwB;IAClC,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAUD,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,eAAe,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC3D,QAAQ,CAAC,kBAAkB,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAClE;AAGD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAGD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAGD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC9D,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AAGD,MAAM,MAAM,2BAA2B,GACnC;IACE,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC,GACD;IACE,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC,CAAC;AASN,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,CACf,OAAO,EAAE,6BAA6B,KACnC,2BAA2B,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;CACzE"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RuntimeSequencePrivilege = exports.RuntimeTablePrivilege = exports.RuntimeDatabaseCredentialSource = exports.BiomeDatabaseMigrationMode = void 0;
4
+ var BiomeDatabaseMigrationMode;
5
+ (function (BiomeDatabaseMigrationMode) {
6
+ BiomeDatabaseMigrationMode["ApplicationManaged"] = "application-managed";
7
+ BiomeDatabaseMigrationMode["ExternallyManaged"] = "externally-managed";
8
+ })(BiomeDatabaseMigrationMode || (exports.BiomeDatabaseMigrationMode = BiomeDatabaseMigrationMode = {}));
9
+ var RuntimeDatabaseCredentialSource;
10
+ (function (RuntimeDatabaseCredentialSource) {
11
+ RuntimeDatabaseCredentialSource["ControlPlane"] = "control-plane";
12
+ RuntimeDatabaseCredentialSource["Environment"] = "environment";
13
+ })(RuntimeDatabaseCredentialSource || (exports.RuntimeDatabaseCredentialSource = RuntimeDatabaseCredentialSource = {}));
14
+ var RuntimeTablePrivilege;
15
+ (function (RuntimeTablePrivilege) {
16
+ RuntimeTablePrivilege["Select"] = "SELECT";
17
+ RuntimeTablePrivilege["Insert"] = "INSERT";
18
+ RuntimeTablePrivilege["Update"] = "UPDATE";
19
+ RuntimeTablePrivilege["Delete"] = "DELETE";
20
+ })(RuntimeTablePrivilege || (exports.RuntimeTablePrivilege = RuntimeTablePrivilege = {}));
21
+ var RuntimeSequencePrivilege;
22
+ (function (RuntimeSequencePrivilege) {
23
+ RuntimeSequencePrivilege["Usage"] = "USAGE";
24
+ RuntimeSequencePrivilege["Select"] = "SELECT";
25
+ RuntimeSequencePrivilege["Update"] = "UPDATE";
26
+ })(RuntimeSequencePrivilege || (exports.RuntimeSequencePrivilege = RuntimeSequencePrivilege = {}));
27
+ //# sourceMappingURL=migration-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-mode.js","sourceRoot":"","sources":["../../src/lib/migration-mode.ts"],"names":[],"mappings":";;;AAOA,IAAY,0BAGX;AAHD,WAAY,0BAA0B;IACpC,wEAA0C,CAAA;IAC1C,sEAAwC,CAAA;AAC1C,CAAC,EAHW,0BAA0B,0CAA1B,0BAA0B,QAGrC;AAQD,IAAY,+BAGX;AAHD,WAAY,+BAA+B;IACzC,iEAA8B,CAAA;IAC9B,8DAA2B,CAAA;AAC7B,CAAC,EAHW,+BAA+B,+CAA/B,+BAA+B,QAG1C;AAGD,IAAY,qBAKX;AALD,WAAY,qBAAqB;IAC/B,0CAAiB,CAAA;IACjB,0CAAiB,CAAA;IACjB,0CAAiB,CAAA;IACjB,0CAAiB,CAAA;AACnB,CAAC,EALW,qBAAqB,qCAArB,qBAAqB,QAKhC;AAGD,IAAY,wBAIX;AAJD,WAAY,wBAAwB;IAClC,2CAAe,CAAA;IACf,6CAAiB,CAAA;IACjB,6CAAiB,CAAA;AACnB,CAAC,EAJW,wBAAwB,wCAAxB,wBAAwB,QAInC"}
@@ -1,12 +1,23 @@
1
1
  import type { DynamicModule } from '@nestjs/common';
2
- import type { BiomeDatabaseDeclaration } from '../bootstrap';
2
+ import type { BiomeDatabaseDeclaration, ExternallyManagedBiomeDatabaseDeclaration } from '../bootstrap';
3
+ import { BiomeDatabaseMigrationMode } from '../migration-mode';
3
4
  export declare const BIOME_DATABASE_READY: unique symbol;
4
- export interface BiomeDatabaseModuleOptions {
5
+ interface BiomeDatabaseModuleCommonOptions {
5
6
  readonly biomeId: string;
7
+ }
8
+ export interface ApplicationManagedBiomeDatabaseModuleOptions extends BiomeDatabaseModuleCommonOptions {
9
+ readonly migrationMode: BiomeDatabaseMigrationMode.ApplicationManaged;
6
10
  readonly databases?: readonly BiomeDatabaseDeclaration[];
7
11
  readonly requiredExtensions?: readonly string[];
8
12
  }
13
+ export interface ExternallyManagedBiomeDatabaseModuleOptions extends BiomeDatabaseModuleCommonOptions {
14
+ readonly migrationMode: BiomeDatabaseMigrationMode.ExternallyManaged;
15
+ readonly databases: readonly ExternallyManagedBiomeDatabaseDeclaration[];
16
+ readonly requiredExtensions?: never;
17
+ }
18
+ export type BiomeDatabaseModuleOptions = ApplicationManagedBiomeDatabaseModuleOptions | ExternallyManagedBiomeDatabaseModuleOptions;
9
19
  export declare class BiomeDatabaseModule {
10
20
  static forRoot(opts: BiomeDatabaseModuleOptions): DynamicModule;
11
21
  }
22
+ export {};
12
23
  //# sourceMappingURL=biome-database.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"biome-database.module.d.ts","sourceRoot":"","sources":["../../../src/lib/nest/biome-database.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAUpD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAY7D,eAAO,MAAM,oBAAoB,eAEhC,CAAC;AAGF,MAAM,WAAW,0BAA0B;IAEzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAKzB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAMzD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AA6CD,qBACa,mBAAmB;IAC9B,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,0BAA0B,GAAG,aAAa;CAgDhE"}
1
+ {"version":3,"file":"biome-database.module.d.ts","sourceRoot":"","sources":["../../../src/lib/nest/biome-database.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAUpD,OAAO,KAAK,EACV,wBAAwB,EACxB,yCAAyC,EAC1C,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAY/D,eAAO,MAAM,oBAAoB,eAEhC,CAAC;AAEF,UAAU,gCAAgC;IAExC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,4CACf,SAAQ,gCAAgC;IACxC,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC,kBAAkB,CAAC;IAKtE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAMzD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,2CACf,SAAQ,gCAAgC;IACxC,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC,iBAAiB,CAAC;IAKrE,QAAQ,CAAC,SAAS,EAAE,SAAS,yCAAyC,EAAE,CAAC;IACzE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC;CACrC;AAGD,MAAM,MAAM,0BAA0B,GAClC,4CAA4C,GAC5C,2CAA2C,CAAC;AA+ChD,qBACa,mBAAmB;IAC9B,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,0BAA0B,GAAG,aAAa;CAmFhE"}
@@ -12,13 +12,24 @@ const common_1 = require("@nestjs/common");
12
12
  const identity_client_1 = require("@xemahq/identity-client");
13
13
  const service_registry_nest_1 = require("@xemahq/service-registry-nest");
14
14
  const bootstrap_1 = require("../bootstrap");
15
+ const migration_mode_1 = require("../migration-mode");
15
16
  const schema_name_1 = require("../schema-name");
16
17
  exports.BIOME_DATABASE_READY = Symbol.for('@xemahq/biome-database-nest:ready');
17
18
  let BiomeDatabaseModule = BiomeDatabaseModule_1 = class BiomeDatabaseModule {
18
19
  static forRoot(opts) {
19
- const databases = opts.databases ?? [
20
- { key: schema_name_1.DEFAULT_BIOME_DB_KEY, workspaceDir: process.cwd() },
21
- ];
20
+ if (opts.migrationMode !== migration_mode_1.BiomeDatabaseMigrationMode.ApplicationManaged &&
21
+ opts.migrationMode !== migration_mode_1.BiomeDatabaseMigrationMode.ExternallyManaged) {
22
+ throw new Error('[biome-database] migrationMode is required and must be a BiomeDatabaseMigrationMode.');
23
+ }
24
+ if (opts.migrationMode === migration_mode_1.BiomeDatabaseMigrationMode.ExternallyManaged &&
25
+ opts.databases.length === 0) {
26
+ throw new Error('[biome-database] externally-managed mode requires at least one explicit database declaration.');
27
+ }
28
+ const databases = opts.migrationMode === migration_mode_1.BiomeDatabaseMigrationMode.ApplicationManaged
29
+ ? (opts.databases ?? [
30
+ { key: schema_name_1.DEFAULT_BIOME_DB_KEY, workspaceDir: process.cwd() },
31
+ ])
32
+ : opts.databases;
22
33
  if ((0, service_registry_nest_1.isOpenApiExtraction)()) {
23
34
  return {
24
35
  module: BiomeDatabaseModule_1,
@@ -34,15 +45,28 @@ let BiomeDatabaseModule = BiomeDatabaseModule_1 = class BiomeDatabaseModule {
34
45
  {
35
46
  provide: exports.BIOME_DATABASE_READY,
36
47
  useFactory: async (identityBootstrap, kernelState) => {
37
- await (0, bootstrap_1.bootstrapBiomeDatabases)({
38
- biomeId: opts.biomeId,
39
- databases,
40
- ...(opts.requiredExtensions !== undefined
41
- ? { requiredExtensions: opts.requiredExtensions }
42
- : {}),
43
- serviceToken: () => identityBootstrap.getAccessToken(),
44
- kernelState,
45
- });
48
+ if (opts.migrationMode ===
49
+ migration_mode_1.BiomeDatabaseMigrationMode.ApplicationManaged) {
50
+ await (0, bootstrap_1.bootstrapBiomeDatabases)({
51
+ biomeId: opts.biomeId,
52
+ migrationMode: opts.migrationMode,
53
+ databases: databases,
54
+ ...(opts.requiredExtensions !== undefined
55
+ ? { requiredExtensions: opts.requiredExtensions }
56
+ : {}),
57
+ serviceToken: () => identityBootstrap.getAccessToken(),
58
+ kernelState,
59
+ });
60
+ }
61
+ else {
62
+ await (0, bootstrap_1.bootstrapBiomeDatabases)({
63
+ biomeId: opts.biomeId,
64
+ migrationMode: opts.migrationMode,
65
+ databases: databases,
66
+ serviceToken: () => identityBootstrap.getAccessToken(),
67
+ kernelState,
68
+ });
69
+ }
46
70
  return true;
47
71
  },
48
72
  inject: [identity_client_1.IdentityBootstrapService, service_registry_nest_1.KERNEL_STATE_TOKEN],
@@ -1 +1 @@
1
- {"version":3,"file":"biome-database.module.js","sourceRoot":"","sources":["../../../src/lib/nest/biome-database.module.ts"],"names":[],"mappings":";;;;;;;;;;AACA,2CAAwC;AACxC,6DAAmE;AAEnE,yEAGuC;AAEvC,4CAAuD;AAEvD,gDAAsD;AAWzC,QAAA,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAC5C,mCAAmC,CACpC,CAAC;AA+DK,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAC9B,MAAM,CAAC,OAAO,CAAC,IAAgC;QAC7C,MAAM,SAAS,GACb,IAAI,CAAC,SAAS,IAAI;YAChB,EAAE,GAAG,EAAE,kCAAoB,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE;SAC3D,CAAC;QAQJ,IAAI,IAAA,2CAAmB,GAAE,EAAE,CAAC;YAC1B,OAAO;gBACL,MAAM,EAAE,qBAAmB;gBAC3B,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,4BAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;gBAC9D,OAAO,EAAE,CAAC,4BAAoB,CAAC;aAChC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,qBAAmB;YAC3B,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,4BAAoB;oBAC7B,UAAU,EAAE,KAAK,EACf,iBAA2C,EAC3C,WAAwB,EACT,EAAE;wBACjB,MAAM,IAAA,mCAAuB,EAAC;4BAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;4BACrB,SAAS;4BACT,GAAG,CAAC,IAAI,CAAC,kBAAkB,KAAK,SAAS;gCACvC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE;gCACjD,CAAC,CAAC,EAAE,CAAC;4BACP,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,cAAc,EAAE;4BACtD,WAAW;yBACZ,CAAC,CAAC;wBACH,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,MAAM,EAAE,CAAC,0CAAwB,EAAE,0CAAkB,CAAC;iBACvD;aACF;YACD,OAAO,EAAE,CAAC,4BAAoB,CAAC;SAChC,CAAC;IACJ,CAAC;CACF,CAAA;AAjDY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,mBAAmB,CAiD/B"}
1
+ {"version":3,"file":"biome-database.module.js","sourceRoot":"","sources":["../../../src/lib/nest/biome-database.module.ts"],"names":[],"mappings":";;;;;;;;;;AACA,2CAAwC;AACxC,6DAAmE;AAEnE,yEAGuC;AAEvC,4CAAuD;AAKvD,sDAA+D;AAC/D,gDAAsD;AAWzC,QAAA,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAC5C,mCAAmC,CACpC,CAAC;AAqFK,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAC9B,MAAM,CAAC,OAAO,CAAC,IAAgC;QAC7C,IACE,IAAI,CAAC,aAAa,KAAK,2CAA0B,CAAC,kBAAkB;YACpE,IAAI,CAAC,aAAa,KAAK,2CAA0B,CAAC,iBAAiB,EACnE,CAAC;YACD,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAC;QACJ,CAAC;QACD,IACE,IAAI,CAAC,aAAa,KAAK,2CAA0B,CAAC,iBAAiB;YACnE,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAC3B,CAAC;YACD,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAGb,IAAI,CAAC,aAAa,KAAK,2CAA0B,CAAC,kBAAkB;YAClE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI;gBACjB,EAAE,GAAG,EAAE,kCAAoB,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE;aAC3D,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QAQrB,IAAI,IAAA,2CAAmB,GAAE,EAAE,CAAC;YAC1B,OAAO;gBACL,MAAM,EAAE,qBAAmB;gBAC3B,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,4BAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;gBAC9D,OAAO,EAAE,CAAC,4BAAoB,CAAC;aAChC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,qBAAmB;YAC3B,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,4BAAoB;oBAC7B,UAAU,EAAE,KAAK,EACf,iBAA2C,EAC3C,WAAwB,EACT,EAAE;wBACjB,IACE,IAAI,CAAC,aAAa;4BAClB,2CAA0B,CAAC,kBAAkB,EAC7C,CAAC;4BACD,MAAM,IAAA,mCAAuB,EAAC;gCAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;gCACrB,aAAa,EAAE,IAAI,CAAC,aAAa;gCACjC,SAAS,EAAE,SAAgD;gCAC3D,GAAG,CAAC,IAAI,CAAC,kBAAkB,KAAK,SAAS;oCACvC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE;oCACjD,CAAC,CAAC,EAAE,CAAC;gCACP,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,cAAc,EAAE;gCACtD,WAAW;6BACZ,CAAC,CAAC;wBACL,CAAC;6BAAM,CAAC;4BACN,MAAM,IAAA,mCAAuB,EAAC;gCAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;gCACrB,aAAa,EAAE,IAAI,CAAC,aAAa;gCACjC,SAAS,EACP,SAAiE;gCACnE,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,cAAc,EAAE;gCACtD,WAAW;6BACZ,CAAC,CAAC;wBACL,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,MAAM,EAAE,CAAC,0CAAwB,EAAE,0CAAkB,CAAC;iBACvD;aACF;YACD,OAAO,EAAE,CAAC,4BAAoB,CAAC;SAChC,CAAC;IACJ,CAAC;CACF,CAAA;AApFY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,mBAAmB,CAoF/B"}
@@ -1,2 +1,2 @@
1
- export declare function unwrapPlatformResponseEnvelope<T>(payload: unknown, context: string): T;
1
+ export { unwrapPlatformResponseEnvelope } from '@xemahq/platform-common';
2
2
  //# sourceMappingURL=response-envelope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"response-envelope.d.ts","sourceRoot":"","sources":["../../src/lib/response-envelope.ts"],"names":[],"mappings":"AAwCA,wBAAgB,8BAA8B,CAAC,CAAC,EAC9C,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,GACd,CAAC,CAaH"}
1
+ {"version":3,"file":"response-envelope.d.ts","sourceRoot":"","sources":["../../src/lib/response-envelope.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC"}
@@ -1,26 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.unwrapPlatformResponseEnvelope = unwrapPlatformResponseEnvelope;
4
- function describePayload(payload) {
5
- if (payload === null) {
6
- return 'null';
7
- }
8
- if (Array.isArray(payload)) {
9
- return 'a bare array';
10
- }
11
- if (typeof payload === 'object') {
12
- return `an object with keys [${Object.keys(payload).join(', ')}]`;
13
- }
14
- return `a bare ${typeof payload}`;
15
- }
16
- function unwrapPlatformResponseEnvelope(payload, context) {
17
- if (payload === null ||
18
- typeof payload !== 'object' ||
19
- !('data' in payload)) {
20
- throw new Error(`${context}: response is not a platform envelope — expected an object with a 'data' property, ` +
21
- `received ${describePayload(payload)}. The peer either is not a Xema platform service or is ` +
22
- `missing the global ResponseEnvelopeInterceptor.`);
23
- }
24
- return payload.data;
25
- }
3
+ exports.unwrapPlatformResponseEnvelope = void 0;
4
+ var platform_common_1 = require("@xemahq/platform-common");
5
+ Object.defineProperty(exports, "unwrapPlatformResponseEnvelope", { enumerable: true, get: function () { return platform_common_1.unwrapPlatformResponseEnvelope; } });
26
6
  //# sourceMappingURL=response-envelope.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"response-envelope.js","sourceRoot":"","sources":["../../src/lib/response-envelope.ts"],"names":[],"mappings":";;AAwCA,wEAgBC;AAvCD,SAAS,eAAe,CAAC,OAAgB;IACvC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,wBAAwB,MAAM,CAAC,IAAI,CACxC,OAAkC,CACnC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IACD,OAAO,UAAU,OAAO,OAAO,EAAE,CAAC;AACpC,CAAC;AAUD,SAAgB,8BAA8B,CAC5C,OAAgB,EAChB,OAAe;IAEf,IACE,OAAO,KAAK,IAAI;QAChB,OAAO,OAAO,KAAK,QAAQ;QAC3B,CAAC,CAAC,MAAM,IAAK,OAAmC,CAAC,EACjD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,qFAAqF;YAC7F,YAAY,eAAe,CAAC,OAAO,CAAC,yDAAyD;YAC7F,iDAAiD,CACpD,CAAC;IACJ,CAAC;IACD,OAAQ,OAAuB,CAAC,IAAI,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"response-envelope.js","sourceRoot":"","sources":["../../src/lib/response-envelope.ts"],"names":[],"mappings":";;;AAcA,2DAAyE;AAAhE,iIAAA,8BAA8B,OAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xemahq/biome-database-nest",
3
- "version": "0.6.4",
4
- "description": "Layer 1 SDK that centralizes ALL database concerns for Xema biome services. Provides the single correct construction of a schema-qualified Prisma driver-adapter (the second-arg `{ schema }` that makes `@prisma/adapter-pg` qualify `biome_<id>.<table>` instead of `public.<table>`), the per-biome schema-naming convention, env/control-plane config resolution, and a boot-time bootstrap that creates the schema and runs migrations. Biomes carry zero DB boilerplate.",
3
+ "version": "0.7.0",
4
+ "description": "Explicit database migration ownership, least-privilege runtime verification, and schema-qualified Prisma wiring for Xema biome services.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Neuralchowder Inc. <developer@xema.dev> (https://xema.dev)",
7
7
  "homepage": "https://xema.dev",
@@ -28,7 +28,7 @@
28
28
  "@types/node": "25.2.3",
29
29
  "@types/pg": "^8.16.0",
30
30
  "@xemahq/identity-client": "^0.3.5",
31
- "@xemahq/kernel-contracts": "^0.58.0",
31
+ "@xemahq/kernel-contracts": "^0.60.0",
32
32
  "@xemahq/xema-decorators": "^0.5.0",
33
33
  "jest": "^30.3.0",
34
34
  "prettier": "3.6.2",
@@ -49,7 +49,7 @@
49
49
  },
50
50
  "dependencies": {
51
51
  "@xemahq/migration-runner-prisma": "^0.1.2",
52
- "@xemahq/platform-common": "^0.5.1",
52
+ "@xemahq/platform-common": "^0.5.9",
53
53
  "pg": "8.16.3"
54
54
  },
55
55
  "exports": {