@xemahq/biome-database-nest 0.6.5 → 0.8.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,21 @@
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 must prove the exact connection and login identity, single-schema
35
+ least privilege, required DML access, a read-only migration ledger, and
36
+ migration compatibility before the application may start.
120
37
 
121
38
  ## When to use it
122
39
 
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.
40
+ - Use it when a NestJS biome service needs a schema-qualified Prisma connection.
41
+ - Select externally managed migrations when deployment operations own all DDL.
127
42
 
128
43
  ## Installation
129
44
 
@@ -135,26 +50,21 @@ pnpm add @xemahq/biome-database-nest
135
50
 
136
51
  ```ts
137
52
  import {
138
- bootstrapBiomeDatabases,
139
- createBiomePrismaAdapterFromEnv,
53
+ BiomeDatabaseMigrationMode,
54
+ BiomeDatabaseModule,
140
55
  } from '@xemahq/biome-database-nest';
141
56
 
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(),
57
+ BiomeDatabaseModule.forRoot({
58
+ biomeId: 'example',
59
+ migrationMode: BiomeDatabaseMigrationMode.ExternallyManaged,
60
+ databases: [externallyManagedDatabase],
148
61
  });
149
-
150
- // In PrismaService:
151
- const adapter = createBiomePrismaAdapterFromEnv(process.env);
152
62
  ```
153
63
 
154
64
  ## Peer requirements
155
65
 
156
- - `@prisma/client`, `@prisma/adapter-pg` — the consumer owns the Prisma
157
- version; the adapter is constructed against the consumer's copy.
66
+ - NestJS 10 or 11 and Prisma 7.
67
+ - Compatible Xema identity, kernel-contract, service-registry, and decorator packages.
158
68
 
159
69
  ## License
160
70
 
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;AA8VtC,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,24 @@ 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
+ config.username !== target.expectedRole) {
194
+ throw new Error(`${LOG_PREFIX} biome=${biomeId} key=${key}: resolved runtime target ` +
195
+ `${config.database}/${configuredSchema}/${config.username} does not match expected ` +
196
+ `${target.database}/${target.schema}/${target.expectedRole}.`);
197
+ }
198
+ }
158
199
  function exportResolvedEnv(key, config, runtimeUrl) {
159
200
  const suffix = upperKeySuffix(key);
160
201
  process.env[`DATABASE_URL${suffix}`] = runtimeUrl;
@@ -170,14 +211,30 @@ async function bootstrapBiomeDatabases(opts) {
170
211
  }
171
212
  return cachedBaseUrl;
172
213
  };
214
+ if (opts.migrationMode === migration_mode_1.BiomeDatabaseMigrationMode.ApplicationManaged) {
215
+ for (const decl of opts.databases) {
216
+ const key = decl.key ?? schema_name_1.DEFAULT_BIOME_DB_KEY;
217
+ console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: resolving config for mode=${opts.migrationMode}`);
218
+ const rawConfig = await resolveDatabaseConfig(opts, key, getControlPlaneBaseUrl);
219
+ const config = await materializeInlineCaCert(opts.biomeId, key, rawConfig);
220
+ const directUrl = buildDirectConnectionUrl(opts.biomeId, key, config);
221
+ await ensureSchemaExists(opts.biomeId, key, config, opts.requiredExtensions ?? []);
222
+ await runMigrations(opts.biomeId, key, decl.workspaceDir, directUrl);
223
+ const runtimeUrl = buildRuntimeUrl(opts.biomeId, key, config, directUrl);
224
+ exportResolvedEnv(key, config, runtimeUrl);
225
+ console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: bootstrap complete`);
226
+ }
227
+ return;
228
+ }
173
229
  for (const decl of opts.databases) {
174
230
  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);
231
+ console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: resolving config for mode=${opts.migrationMode}`);
232
+ const rawConfig = await resolveExternalRuntimeConfig(opts, key, decl.credentialSource, getControlPlaneBaseUrl);
177
233
  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);
234
+ const directUrl = buildDirectConnectionUrl(opts.biomeId, key, config);
235
+ assertExternalTargetMatchesConfig(opts.biomeId, key, config, decl.expectedTarget);
236
+ const runtimeUrl = withApplicationName(buildRuntimeUrl(opts.biomeId, key, config, directUrl), decl.expectedTarget.applicationName);
237
+ await (0, external_runtime_verifier_1.verifyExternallyManagedRuntime)(runtimeUrl, decl.expectedTarget, decl.runtimeAccess, decl.migrationCompatibility);
181
238
  exportResolvedEnv(key, config, runtimeUrl);
182
239
  console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: bootstrap complete`);
183
240
  }
@@ -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;AA0a1B,wBAAsB,8BAA8B,CAClD,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,gCAAgC,EACxC,aAAa,EAAE,iCAAiC,GAC/C,OAAO,CAAC,6BAA6B,CAAC,CAmTxC"}
@@ -0,0 +1,411 @@
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 migration_mode_1 = require("./migration-mode");
7
+ const LOG_PREFIX = '[biome-database]';
8
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
9
+ const SHA_256_PATTERN = /^[0-9a-f]{64}$/;
10
+ const ALL_TABLE_DML = Object.values(migration_mode_1.RuntimeTablePrivilege);
11
+ const ALL_SEQUENCE_PRIVILEGES = Object.values(migration_mode_1.RuntimeSequencePrivilege);
12
+ const TABLE_DML_SET = new Set(ALL_TABLE_DML);
13
+ const SEQUENCE_PRIVILEGE_SET = new Set(ALL_SEQUENCE_PRIVILEGES);
14
+ function quoteIdentifier(identifier) {
15
+ return `"${identifier.replaceAll('"', '""')}"`;
16
+ }
17
+ function requireSingleRow(rows, description) {
18
+ if (rows.length !== 1) {
19
+ throw new Error(`${LOG_PREFIX} expected exactly one ${description} row, received ${rows.length}.`);
20
+ }
21
+ return rows[0];
22
+ }
23
+ function assertNonEmpty(value, field) {
24
+ if (value.trim() === '') {
25
+ throw new Error(`${LOG_PREFIX} ${field} must be a non-empty string.`);
26
+ }
27
+ }
28
+ function assertExpectation(expectation) {
29
+ if (!Array.isArray(expectation.tablePrivileges) ||
30
+ expectation.tablePrivileges.length === 0) {
31
+ throw new Error(`${LOG_PREFIX} externally-managed runtime access must require at least one table privilege.`);
32
+ }
33
+ if (expectation.tablePrivileges.some((privilege) => !TABLE_DML_SET.has(privilege)) ||
34
+ new Set(expectation.tablePrivileges).size !==
35
+ expectation.tablePrivileges.length) {
36
+ throw new Error(`${LOG_PREFIX} runtime table privileges must be unique RuntimeTablePrivilege values.`);
37
+ }
38
+ if (!Array.isArray(expectation.sequencePrivileges) ||
39
+ expectation.sequencePrivileges.some((privilege) => !SEQUENCE_PRIVILEGE_SET.has(privilege)) ||
40
+ new Set(expectation.sequencePrivileges).size !==
41
+ expectation.sequencePrivileges.length) {
42
+ throw new Error(`${LOG_PREFIX} runtime sequence privileges must be unique RuntimeSequencePrivilege values.`);
43
+ }
44
+ const memberships = expectation.authorizedRoleMemberships;
45
+ if (!Array.isArray(memberships)) {
46
+ throw new Error(`${LOG_PREFIX} externally-managed runtime access must explicitly declare authorizedRoleMemberships.`);
47
+ }
48
+ for (const role of memberships) {
49
+ assertNonEmpty(role, 'authorized role membership');
50
+ }
51
+ if (new Set(memberships).size !== memberships.length) {
52
+ throw new Error(`${LOG_PREFIX} authorizedRoleMemberships must not contain duplicates.`);
53
+ }
54
+ }
55
+ function buildMissingTablePrivilegeQuery(privileges) {
56
+ const projections = privileges
57
+ .map((privilege) => `CASE WHEN NOT has_table_privilege(current_user, ` +
58
+ `format('%I.%I', table_schema, table_name), '${privilege}') ` +
59
+ `THEN '${privilege}' END`)
60
+ .join(', ');
61
+ return `
62
+ SELECT table_name AS object_name,
63
+ array_remove(ARRAY[${projections}], NULL) AS missing_privileges
64
+ FROM information_schema.tables
65
+ WHERE table_schema = $1
66
+ AND table_type = 'BASE TABLE'
67
+ AND table_name <> '_prisma_migrations'
68
+ AND NOT (
69
+ ${privileges
70
+ .map((privilege) => `has_table_privilege(current_user, ` +
71
+ `format('%I.%I', table_schema, table_name), '${privilege}')`)
72
+ .join(' AND ')}
73
+ )
74
+ ORDER BY table_name
75
+ `;
76
+ }
77
+ function buildMissingSequencePrivilegeQuery(privileges) {
78
+ if (privileges.length === 0) {
79
+ return null;
80
+ }
81
+ const projections = privileges
82
+ .map((privilege) => `CASE WHEN NOT has_sequence_privilege(current_user, ` +
83
+ `format('%I.%I', sequence_schema, sequence_name), '${privilege}') ` +
84
+ `THEN '${privilege}' END`)
85
+ .join(', ');
86
+ return `
87
+ SELECT sequence_name AS object_name,
88
+ array_remove(ARRAY[${projections}], NULL) AS missing_privileges
89
+ FROM information_schema.sequences
90
+ WHERE sequence_schema = $1
91
+ AND NOT (
92
+ ${privileges
93
+ .map((privilege) => `has_sequence_privilege(current_user, ` +
94
+ `format('%I.%I', sequence_schema, sequence_name), '${privilege}')`)
95
+ .join(' AND ')}
96
+ )
97
+ ORDER BY sequence_name
98
+ `;
99
+ }
100
+ function buildCrossSchemaTablePrivilegeQuery() {
101
+ const projections = ALL_TABLE_DML.map((privilege) => `CASE WHEN has_table_privilege(current_user, ` +
102
+ `format('%I.%I', table_schema, table_name), '${privilege}') ` +
103
+ `THEN '${privilege}' END`).join(', ');
104
+ return `
105
+ SELECT table_schema AS schema_name,
106
+ table_name AS object_name,
107
+ array_remove(ARRAY[${projections}], NULL) AS privileges
108
+ FROM information_schema.tables
109
+ WHERE table_schema <> $1
110
+ AND table_schema NOT IN ('pg_catalog', 'information_schema')
111
+ AND table_schema NOT LIKE 'pg_toast%'
112
+ AND table_schema NOT LIKE 'pg_temp_%'
113
+ AND (
114
+ ${ALL_TABLE_DML.map((privilege) => `has_table_privilege(current_user, ` +
115
+ `format('%I.%I', table_schema, table_name), '${privilege}')`).join(' OR ')}
116
+ )
117
+ ORDER BY table_schema, table_name
118
+ `;
119
+ }
120
+ function buildCrossSchemaSequencePrivilegeQuery() {
121
+ const projections = ALL_SEQUENCE_PRIVILEGES.map((privilege) => `CASE WHEN has_sequence_privilege(current_user, ` +
122
+ `format('%I.%I', sequence_schema, sequence_name), '${privilege}') ` +
123
+ `THEN '${privilege}' END`).join(', ');
124
+ return `
125
+ SELECT sequence_schema AS schema_name,
126
+ sequence_name AS object_name,
127
+ array_remove(ARRAY[${projections}], NULL) AS privileges
128
+ FROM information_schema.sequences
129
+ WHERE sequence_schema <> $1
130
+ AND sequence_schema NOT IN ('pg_catalog', 'information_schema')
131
+ AND sequence_schema NOT LIKE 'pg_toast%'
132
+ AND sequence_schema NOT LIKE 'pg_temp_%'
133
+ AND (
134
+ ${ALL_SEQUENCE_PRIVILEGES.map((privilege) => `has_sequence_privilege(current_user, ` +
135
+ `format('%I.%I', sequence_schema, sequence_name), '${privilege}')`).join(' OR ')}
136
+ )
137
+ ORDER BY sequence_schema, sequence_name
138
+ `;
139
+ }
140
+ function formatMissingPrivileges(kind, rows) {
141
+ return rows
142
+ .map((row) => `${kind} ${row.object_name} missing ${row.missing_privileges.join('/')}`)
143
+ .join(', ');
144
+ }
145
+ function formatCrossSchemaPrivileges(kind, rows) {
146
+ return rows
147
+ .map((row) => `${kind} ${row.schema_name}.${row.object_name} ` +
148
+ `[${row.privileges.join('/')}]`)
149
+ .join(', ');
150
+ }
151
+ function assertExactRoleMemberships(observedRows, authorized, expectedRole) {
152
+ if (authorized.includes(expectedRole)) {
153
+ throw new Error(`${LOG_PREFIX} authorizedRoleMemberships must not include the runtime login role itself.`);
154
+ }
155
+ const observed = observedRows.map((row) => row.role_name).sort();
156
+ const expected = [...authorized].sort();
157
+ if (observed.length !== expected.length ||
158
+ observed.some((role, index) => role !== expected[index])) {
159
+ throw new Error(`${LOG_PREFIX} runtime role membership mismatch: expected ` +
160
+ `[${expected.join(', ')}], observed [${observed.join(', ')}].`);
161
+ }
162
+ }
163
+ function parseLedgerTimestamp(value, migrationName, field) {
164
+ const milliseconds = Date.parse(value);
165
+ if (!Number.isFinite(milliseconds)) {
166
+ throw new Error(`${LOG_PREFIX} migration ${migrationName} has invalid ${field} "${value}".`);
167
+ }
168
+ return milliseconds;
169
+ }
170
+ function validateMigrationLedger(rows) {
171
+ const ids = new Set();
172
+ const names = new Set();
173
+ return rows.map((row) => {
174
+ if (!UUID_PATTERN.test(row.id)) {
175
+ throw new Error(`${LOG_PREFIX} migration ledger row has invalid id "${row.id}".`);
176
+ }
177
+ assertNonEmpty(row.migration_name, 'migration name');
178
+ if (ids.has(row.id) || names.has(row.migration_name)) {
179
+ throw new Error(`${LOG_PREFIX} migration ledger contains a duplicate id or migration name: ${row.migration_name}.`);
180
+ }
181
+ ids.add(row.id);
182
+ names.add(row.migration_name);
183
+ if (!SHA_256_PATTERN.test(row.checksum)) {
184
+ throw new Error(`${LOG_PREFIX} migration ${row.migration_name} has an invalid SHA-256 checksum.`);
185
+ }
186
+ if (row.started_at === null) {
187
+ throw new Error(`${LOG_PREFIX} migration ${row.migration_name} has no started_at timestamp.`);
188
+ }
189
+ const startedAt = parseLedgerTimestamp(row.started_at, row.migration_name, 'started_at');
190
+ if (row.rolled_back_at !== null) {
191
+ throw new Error(`${LOG_PREFIX} migration ${row.migration_name} is rolled back.`);
192
+ }
193
+ if (row.finished_at === null) {
194
+ throw new Error(`${LOG_PREFIX} migration ${row.migration_name} is unfinished or failed.`);
195
+ }
196
+ if (row.logs !== null) {
197
+ throw new Error(`${LOG_PREFIX} migration ${row.migration_name} contains failure logs.`);
198
+ }
199
+ const finishedAt = parseLedgerTimestamp(row.finished_at, row.migration_name, 'finished_at');
200
+ if (finishedAt < startedAt) {
201
+ throw new Error(`${LOG_PREFIX} migration ${row.migration_name} finished before it started.`);
202
+ }
203
+ if (!Number.isInteger(row.applied_steps_count) ||
204
+ row.applied_steps_count <= 0) {
205
+ throw new Error(`${LOG_PREFIX} migration ${row.migration_name} has invalid applied_steps_count ${row.applied_steps_count}.`);
206
+ }
207
+ return {
208
+ id: row.id,
209
+ name: row.migration_name,
210
+ checksum: row.checksum,
211
+ startedAt: row.started_at,
212
+ finishedAt: row.finished_at,
213
+ appliedStepsCount: row.applied_steps_count,
214
+ };
215
+ });
216
+ }
217
+ function digestLedger(appliedMigrations) {
218
+ return (0, node_crypto_1.createHash)('sha256')
219
+ .update(JSON.stringify(appliedMigrations))
220
+ .digest('hex');
221
+ }
222
+ function assertTarget(target) {
223
+ assertNonEmpty(target.database, 'expected target database');
224
+ assertNonEmpty(target.schema, 'expected target schema');
225
+ assertNonEmpty(target.applicationName, 'expected application_name');
226
+ assertNonEmpty(target.expectedRole, 'expected runtime role');
227
+ }
228
+ async function verifyExternallyManagedRuntime(runtimeUrl, target, access, compatibility) {
229
+ assertTarget(target);
230
+ assertExpectation(access);
231
+ if (compatibility === undefined ||
232
+ typeof compatibility.verify !== 'function') {
233
+ throw new Error(`${LOG_PREFIX} externally-managed mode requires a migration compatibility verifier.`);
234
+ }
235
+ assertNonEmpty(compatibility.verifierId, 'migration verifierId');
236
+ const client = new pg_1.Client({ connectionString: runtimeUrl });
237
+ await client.connect();
238
+ try {
239
+ const identity = requireSingleRow((await client.query(`
240
+ SELECT current_database() AS database_name,
241
+ current_schema() AS schema_name,
242
+ current_setting('application_name') AS application_name,
243
+ current_user AS role_name,
244
+ session_user AS session_role_name
245
+ `)).rows, 'connection identity');
246
+ if (identity.database_name !== target.database ||
247
+ identity.schema_name !== target.schema ||
248
+ identity.application_name !== target.applicationName ||
249
+ identity.role_name !== target.expectedRole ||
250
+ identity.session_role_name !== target.expectedRole) {
251
+ throw new Error(`${LOG_PREFIX} runtime target mismatch: expected ` +
252
+ `${target.database}/${target.schema}/${target.applicationName}/${target.expectedRole}, observed ` +
253
+ `${identity.database_name}/${identity.schema_name ?? '<none>'}/${identity.application_name}/` +
254
+ `${identity.role_name} (session=${identity.session_role_name}).`);
255
+ }
256
+ const role = requireSingleRow((await client.query(`
257
+ SELECT rolsuper, rolcreatedb, rolcreaterole, rolbypassrls, rolreplication
258
+ FROM pg_roles
259
+ WHERE rolname = current_user
260
+ `)).rows, 'runtime role');
261
+ const forbiddenRoleAttributes = [
262
+ role.rolsuper ? 'SUPERUSER' : null,
263
+ role.rolcreatedb ? 'CREATEDB' : null,
264
+ role.rolcreaterole ? 'CREATEROLE' : null,
265
+ role.rolbypassrls ? 'BYPASSRLS' : null,
266
+ role.rolreplication ? 'REPLICATION' : null,
267
+ ].filter((value) => value !== null);
268
+ if (forbiddenRoleAttributes.length > 0) {
269
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden attribute(s): ` +
270
+ forbiddenRoleAttributes.join(', '));
271
+ }
272
+ const roleMemberships = (await client.query(`
273
+ SELECT rolname AS role_name
274
+ FROM pg_roles
275
+ WHERE rolname <> current_user
276
+ AND pg_has_role(current_user, oid, 'MEMBER')
277
+ ORDER BY rolname
278
+ `)).rows;
279
+ assertExactRoleMemberships(roleMemberships, access.authorizedRoleMemberships, target.expectedRole);
280
+ const databasePrivileges = requireSingleRow((await client.query(`
281
+ SELECT has_database_privilege(current_user, current_database(), 'CONNECT') AS can_connect,
282
+ has_database_privilege(current_user, current_database(), 'CREATE') AS can_create,
283
+ pg_has_role(current_user, datdba, 'USAGE') AS owns_database
284
+ FROM pg_database
285
+ WHERE datname = current_database()
286
+ `)).rows, 'database privilege');
287
+ if (!databasePrivileges.can_connect) {
288
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} lacks database CONNECT.`);
289
+ }
290
+ if (databasePrivileges.can_create || databasePrivileges.owns_database) {
291
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden database ` +
292
+ `${databasePrivileges.owns_database ? 'ownership' : 'CREATE privilege'}.`);
293
+ }
294
+ const persistentSchemaPrivileges = (await client.query(`
295
+ SELECT nspname AS schema_name,
296
+ has_schema_privilege(current_user, oid, 'USAGE') AS can_use,
297
+ has_schema_privilege(current_user, oid, 'CREATE') AS can_create,
298
+ pg_has_role(current_user, nspowner, 'USAGE') AS owns_schema
299
+ FROM pg_namespace
300
+ WHERE nspname NOT IN ('pg_catalog', 'information_schema')
301
+ AND nspname NOT LIKE 'pg_toast%'
302
+ AND nspname NOT LIKE 'pg_temp_%'
303
+ ORDER BY nspname
304
+ `)).rows;
305
+ const targetSchemaPrivileges = requireSingleRow(persistentSchemaPrivileges.filter((row) => row.schema_name === target.schema), 'target schema privilege');
306
+ if (!targetSchemaPrivileges.can_use) {
307
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} lacks USAGE on schema ${target.schema}.`);
308
+ }
309
+ const persistentDdlSchemas = persistentSchemaPrivileges.filter((row) => row.can_create || row.owns_schema);
310
+ if (persistentDdlSchemas.length > 0) {
311
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden persistent ` +
312
+ `schema CREATE/ownership on: ${persistentDdlSchemas
313
+ .map((row) => row.schema_name)
314
+ .join(', ')}.`);
315
+ }
316
+ const crossSchemaUsage = persistentSchemaPrivileges.filter((row) => row.schema_name !== target.schema && row.can_use);
317
+ if (crossSchemaUsage.length > 0) {
318
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden cross-schema ` +
319
+ `USAGE on: ${crossSchemaUsage
320
+ .map((row) => row.schema_name)
321
+ .join(', ')}.`);
322
+ }
323
+ const crossSchemaTablePrivileges = (await client.query(buildCrossSchemaTablePrivilegeQuery(), [target.schema])).rows;
324
+ if (crossSchemaTablePrivileges.length > 0) {
325
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden cross-schema ` +
326
+ `table privileges: ${formatCrossSchemaPrivileges('table', crossSchemaTablePrivileges)}.`);
327
+ }
328
+ const crossSchemaSequencePrivileges = (await client.query(buildCrossSchemaSequencePrivilegeQuery(), [target.schema])).rows;
329
+ if (crossSchemaSequencePrivileges.length > 0) {
330
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden cross-schema ` +
331
+ `sequence privileges: ${formatCrossSchemaPrivileges('sequence', crossSchemaSequencePrivileges)}.`);
332
+ }
333
+ const missingTablePrivileges = (await client.query(buildMissingTablePrivilegeQuery(access.tablePrivileges), [target.schema])).rows;
334
+ if (missingTablePrivileges.length > 0) {
335
+ throw new Error(`${LOG_PREFIX} runtime DML contract failed: ${formatMissingPrivileges('table', missingTablePrivileges)}.`);
336
+ }
337
+ const sequenceQuery = buildMissingSequencePrivilegeQuery(access.sequencePrivileges);
338
+ if (sequenceQuery !== null) {
339
+ const missingSequencePrivileges = (await client.query(sequenceQuery, [target.schema])).rows;
340
+ if (missingSequencePrivileges.length > 0) {
341
+ throw new Error(`${LOG_PREFIX} runtime DML contract failed: ${formatMissingPrivileges('sequence', missingSequencePrivileges)}.`);
342
+ }
343
+ }
344
+ const ledgerPrivileges = requireSingleRow((await client.query(`
345
+ SELECT has_table_privilege(
346
+ current_user,
347
+ format('%I.%I', $1, '_prisma_migrations'),
348
+ 'SELECT'
349
+ ) AS can_select,
350
+ has_table_privilege(
351
+ current_user,
352
+ format('%I.%I', $1, '_prisma_migrations'),
353
+ 'INSERT'
354
+ ) AS can_insert,
355
+ has_table_privilege(
356
+ current_user,
357
+ format('%I.%I', $1, '_prisma_migrations'),
358
+ 'UPDATE'
359
+ ) AS can_update,
360
+ has_table_privilege(
361
+ current_user,
362
+ format('%I.%I', $1, '_prisma_migrations'),
363
+ 'DELETE'
364
+ ) AS can_delete
365
+ `, [target.schema])).rows, 'migration ledger privilege');
366
+ if (!ledgerPrivileges.can_select) {
367
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} lacks required SELECT on ${target.schema}._prisma_migrations.`);
368
+ }
369
+ if (ledgerPrivileges.can_insert ||
370
+ ledgerPrivileges.can_update ||
371
+ ledgerPrivileges.can_delete) {
372
+ throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden write privilege on ` +
373
+ `${target.schema}._prisma_migrations.`);
374
+ }
375
+ const migrationRows = (await client.query(`
376
+ SELECT id::text,
377
+ migration_name,
378
+ checksum,
379
+ started_at::text,
380
+ finished_at::text,
381
+ rolled_back_at::text,
382
+ logs,
383
+ applied_steps_count
384
+ FROM ${quoteIdentifier(target.schema)}."_prisma_migrations"
385
+ ORDER BY started_at NULLS FIRST, id
386
+ `)).rows;
387
+ const appliedMigrations = validateMigrationLedger(migrationRows);
388
+ const observedLedgerDigest = digestLedger(appliedMigrations);
389
+ const context = Object.freeze({
390
+ target: Object.freeze({ ...target }),
391
+ currentRole: identity.role_name,
392
+ appliedMigrations: Object.freeze(appliedMigrations.map((migration) => Object.freeze(migration))),
393
+ observedLedgerDigest,
394
+ });
395
+ const proof = await compatibility.verify(context);
396
+ if (proof.verifierId !== compatibility.verifierId ||
397
+ proof.observedLedgerDigest !== observedLedgerDigest) {
398
+ throw new Error(`${LOG_PREFIX} migration compatibility proof does not match verifier ` +
399
+ `${compatibility.verifierId} and observed ledger ${observedLedgerDigest}.`);
400
+ }
401
+ if (!proof.compatible) {
402
+ throw new Error(`${LOG_PREFIX} migration compatibility rejected by ${proof.verifierId}: ${proof.reason}`);
403
+ }
404
+ assertNonEmpty(proof.expectedState, 'migration proof expectedState');
405
+ return context;
406
+ }
407
+ finally {
408
+ await client.end();
409
+ }
410
+ }
411
+ //# 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,60 @@
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
+ readonly authorizedRoleMemberships: readonly string[];
24
+ }
25
+ export interface RuntimeDatabaseTarget {
26
+ readonly database: string;
27
+ readonly schema: string;
28
+ readonly applicationName: string;
29
+ readonly expectedRole: string;
30
+ }
31
+ export interface AppliedPrismaMigration {
32
+ readonly id: string;
33
+ readonly name: string;
34
+ readonly checksum: string;
35
+ readonly startedAt: string;
36
+ readonly finishedAt: string;
37
+ readonly appliedStepsCount: number;
38
+ }
39
+ export interface MigrationCompatibilityContext {
40
+ readonly target: RuntimeDatabaseTarget;
41
+ readonly currentRole: string;
42
+ readonly appliedMigrations: readonly AppliedPrismaMigration[];
43
+ readonly observedLedgerDigest: string;
44
+ }
45
+ export type MigrationCompatibilityProof = {
46
+ readonly compatible: true;
47
+ readonly verifierId: string;
48
+ readonly expectedState: string;
49
+ readonly observedLedgerDigest: string;
50
+ } | {
51
+ readonly compatible: false;
52
+ readonly verifierId: string;
53
+ readonly reason: string;
54
+ readonly observedLedgerDigest: string;
55
+ };
56
+ export interface MigrationCompatibilityExpectation {
57
+ readonly verifierId: string;
58
+ readonly verify: (context: MigrationCompatibilityContext) => MigrationCompatibilityProof | Promise<MigrationCompatibilityProof>;
59
+ }
60
+ //# 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;IAKjE,QAAQ,CAAC,yBAAyB,EAAE,SAAS,MAAM,EAAE,CAAC;CACvD;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;IAEjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xemahq/biome-database-nest",
3
- "version": "0.6.5",
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.8.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.3",
52
+ "@xemahq/platform-common": "^0.5.9",
53
53
  "pg": "8.16.3"
54
54
  },
55
55
  "exports": {