@xemahq/biome-database-nest 0.16.12 → 0.16.14

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
@@ -28,37 +28,18 @@
28
28
 
29
29
  ## Overview
30
30
 
31
- Gives a Xema biome service its database without coupling the service to its
32
- deployment environment. It resolves the connection at boot, builds a
33
- schema-qualified Prisma client, and applies the service's own Prisma migrations
34
- before the app serves traffic.
35
-
36
- A biome carries **no** database location or connection configuration. Those are
37
- deployment facts the platform owns, so changing infrastructure does not require
38
- changing biome code.
39
-
40
- ## What a biome gets
41
-
42
- - **A database of its own, on first boot.** The pool binds the service to it and
43
- holds it there, so the name can never silently move to an empty schema.
44
- - **A schema-qualified Prisma client**, already pointed at that database.
45
- - **Migrations applied at boot** — `prisma migrate deploy`, which THROWS on
46
- failure, so a bad migration stops the pod becoming ready instead of half-
47
- applying under live traffic.
48
- - **Image/schema compatibility before Ready.** A service refuses to start when
49
- the database contains a successful migration absent from the image, or when a
50
- shipped migration remains unapplied. Deliberate history compaction uses an
51
- explicit list of superseded migration names after the replacement baseline is
52
- established.
53
- - **More than one database when it needs one.** A biome that ships several API
54
- services gives each its own; a single service that needs a second declares a
55
- `dbKey`. Physically these are schemas in the shared `xema_biomes` database —
56
- `biome_<biomeId>` for the primary, `biome_<biomeId>__<dbKey>` for the rest.
31
+ Gives a Xema biome service explicit database ownership without coupling it to a
32
+ deployment environment. It supplies schema-qualified Prisma wiring, validates
33
+ image/schema compatibility, and provides a governed lifecycle for data
34
+ cutovers that require an operator between expansion and contraction.
57
35
 
58
36
  ## When to use it
59
37
 
60
- Use it in any NestJS biome service that stores data. There is no second way to
61
- reach a biome database, and nothing for the service to configure.
38
+ - Use it when a NestJS biome service stores data or owns database migrations.
39
+ - Use its operator lifecycle when a destructive contraction must wait for a
40
+ verified backfill instead of running automatically at application startup.
41
+ - Wrap the complete operator command with `withOperatorMigrationLock` so apply,
42
+ verification, and contraction cannot overlap across replicas.
62
43
 
63
44
  ## Installation
64
45
 
@@ -68,8 +49,6 @@ pnpm add @xemahq/biome-database-nest
68
49
 
69
50
  ## Usage
70
51
 
71
- The whole integration:
72
-
73
52
  ```ts
74
53
  import {
75
54
  BiomeDatabaseMigrationMode,
@@ -83,33 +62,6 @@ BiomeDatabaseModule.forRoot({
83
62
  });
84
63
  ```
85
64
 
86
- `biomeId` names the database this service owns; it is pinned by the pool on
87
- first resolve, so changing it later is refused rather than silently pointing the
88
- service at a fresh empty schema. `workspaceDir` is where the Prisma schema and
89
- `migrations/` live.
90
-
91
- Normal additive migration histories require no extra configuration. After an
92
- intentional Prisma history squash and baseline, declare the exact removed
93
- directory names on that database:
94
-
95
- ```ts
96
- databases: [{
97
- workspaceDir: process.cwd(),
98
- historyPolicy: {
99
- supersededMigrationNames: ['20250101000000_initial'],
100
- },
101
- }],
102
- ```
103
-
104
- A second database for the same service:
105
-
106
- ```ts
107
- databases: [
108
- { workspaceDir: process.cwd() },
109
- { key: 'analytics', workspaceDir: `${process.cwd()}/analytics` },
110
- ],
111
- ```
112
-
113
65
  ## Peer requirements
114
66
 
115
67
  - NestJS 10 or 11 and Prisma 7.
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ export { resolveControlPlaneBaseUrl, ORG_DATABASE_POOL_SERVICE_NAME, type Contro
8
8
  export { bootstrapBiomeDatabases, type BiomeDatabaseDeclaration, type BootstrapBiomeDatabasesOptions, } from './lib/bootstrap';
9
9
  export type { PrismaMigrationHistoryPolicy } from './lib/migration-history';
10
10
  export { BiomeDatabaseMigrationMode } from './lib/migration-mode';
11
+ export { contractOperatorMigration, OperatorMigrationMode, OperatorMigrationPhase, parseOperatorMigrationMode, verifyOperatorMigration, withOperatorMigrationLock, type ContractOperatorMigrationOptions, type OperatorMigrationDatabase, type VerifyOperatorMigrationOptions, type WithOperatorMigrationLockOptions, } from './lib/operator-migration';
11
12
  export { BiomeDatabaseModule, BIOME_DATABASE_READY, type ApplicationManagedBiomeDatabaseModuleOptions, type BiomeDatabaseModuleOptions, } from './lib/nest/biome-database.module';
12
13
  export { createBiomePrismaService, type BiomePrismaClient, type BiomePrismaClientCtor, type BiomePrismaServiceInstance, type CreateBiomePrismaServiceOptions, type TenantIsolationServiceOptions, type TenantScopedApi, } from './lib/nest/prisma-service-factory';
13
14
  export { TenantIsolationMode, TENANT_ISOLATION_MODE_ENV_VAR, resolveTenantIsolationMode, } from './lib/tenant-isolation/tenant-isolation-mode';
@@ -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,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,YAAY,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,4CAA4C,EACjD,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,6BAA6B,EAC7B,YAAY,EACZ,sBAAsB,EACtB,6BAA6B,EAC7B,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,+BAA+B,EAC/B,KAAK,kCAAkC,EACvC,KAAK,0BAA0B,GAChC,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EAClB,6BAA6B,EAC7B,+BAA+B,EAC/B,qBAAqB,EACrB,iCAAiC,EACjC,KAAK,kBAAkB,GACxB,MAAM,2BAA2B,CAAC;AACnC,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,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OrgProtectionGuard = exports.IdentityOrgProtectionProbe = exports.assertOrgNotProtected = exports.eraseOwnedAuthoredResourceGraph = exports.OrgErasureMatchesNothingError = exports.OrgErasureBlockedError = exports.eraseOrgData = exports.assertOrgErasureMatchesModels = 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.BiomeDatabaseMigrationMode = exports.bootstrapBiomeDatabases = exports.ORG_DATABASE_POOL_SERVICE_NAME = exports.resolveControlPlaneBaseUrl = exports.fetchSystemDatabaseConfig = exports.createBiomePrismaAdapterFromEnv = exports.createBiomePrismaAdapter = exports.resolveBiomeDatabaseConfigFromEnv = 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 = exports.OrgErasureController = exports.OrgErasureModule = exports.ORGANIZATION_PROTECTED_ERROR_CODE = exports.IDENTITY_SERVICE_NAME = exports.ProtectedOrgErasureRefusedError = exports.OrgProtectionUnavailableError = void 0;
3
+ exports.eraseOrgData = exports.assertOrgErasureMatchesModels = 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.withOperatorMigrationLock = exports.verifyOperatorMigration = exports.parseOperatorMigrationMode = exports.OperatorMigrationPhase = exports.OperatorMigrationMode = exports.contractOperatorMigration = exports.BiomeDatabaseMigrationMode = exports.bootstrapBiomeDatabases = exports.ORG_DATABASE_POOL_SERVICE_NAME = exports.resolveControlPlaneBaseUrl = exports.fetchSystemDatabaseConfig = exports.createBiomePrismaAdapterFromEnv = exports.createBiomePrismaAdapter = exports.resolveBiomeDatabaseConfigFromEnv = 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 = exports.OrgErasureController = exports.OrgErasureModule = exports.ORGANIZATION_PROTECTED_ERROR_CODE = exports.IDENTITY_SERVICE_NAME = exports.ProtectedOrgErasureRefusedError = exports.OrgProtectionUnavailableError = exports.OrgProtectionGuard = exports.IdentityOrgProtectionProbe = exports.assertOrgNotProtected = exports.eraseOwnedAuthoredResourceGraph = exports.OrgErasureMatchesNothingError = exports.OrgErasureBlockedError = void 0;
5
5
  var schema_name_1 = require("./lib/schema-name");
6
6
  Object.defineProperty(exports, "DEFAULT_BIOME_DB_KEY", { enumerable: true, get: function () { return schema_name_1.DEFAULT_BIOME_DB_KEY; } });
7
7
  Object.defineProperty(exports, "deriveBiomeSchemaName", { enumerable: true, get: function () { return schema_name_1.deriveBiomeSchemaName; } });
@@ -33,6 +33,13 @@ var bootstrap_1 = require("./lib/bootstrap");
33
33
  Object.defineProperty(exports, "bootstrapBiomeDatabases", { enumerable: true, get: function () { return bootstrap_1.bootstrapBiomeDatabases; } });
34
34
  var migration_mode_1 = require("./lib/migration-mode");
35
35
  Object.defineProperty(exports, "BiomeDatabaseMigrationMode", { enumerable: true, get: function () { return migration_mode_1.BiomeDatabaseMigrationMode; } });
36
+ var operator_migration_1 = require("./lib/operator-migration");
37
+ Object.defineProperty(exports, "contractOperatorMigration", { enumerable: true, get: function () { return operator_migration_1.contractOperatorMigration; } });
38
+ Object.defineProperty(exports, "OperatorMigrationMode", { enumerable: true, get: function () { return operator_migration_1.OperatorMigrationMode; } });
39
+ Object.defineProperty(exports, "OperatorMigrationPhase", { enumerable: true, get: function () { return operator_migration_1.OperatorMigrationPhase; } });
40
+ Object.defineProperty(exports, "parseOperatorMigrationMode", { enumerable: true, get: function () { return operator_migration_1.parseOperatorMigrationMode; } });
41
+ Object.defineProperty(exports, "verifyOperatorMigration", { enumerable: true, get: function () { return operator_migration_1.verifyOperatorMigration; } });
42
+ Object.defineProperty(exports, "withOperatorMigrationLock", { enumerable: true, get: function () { return operator_migration_1.withOperatorMigrationLock; } });
36
43
  var biome_database_module_1 = require("./lib/nest/biome-database.module");
37
44
  Object.defineProperty(exports, "BiomeDatabaseModule", { enumerable: true, get: function () { return biome_database_module_1.BiomeDatabaseModule; } });
38
45
  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,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;AAKzB,uDAAkE;AAAzD,4HAAA,0BAA0B,OAAA;AACnC,0EAK0C;AAJxC,4HAAA,mBAAmB,OAAA;AACnB,6HAAA,oBAAoB,OAAA;AAItB,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,kEAO4C;AAN1C,4HAAA,6BAA6B,OAAA;AAC7B,2GAAA,YAAY,OAAA;AACZ,qHAAA,sBAAsB,OAAA;AACtB,4HAAA,6BAA6B,OAAA;AAI/B,sGAI8D;AAH5D,gJAAA,+BAA+B,OAAA;AAIjC,4DASmC;AARjC,uHAAA,qBAAqB,OAAA;AACrB,4HAAA,0BAA0B,OAAA;AAC1B,oHAAA,kBAAkB,OAAA;AAClB,+HAAA,6BAA6B,OAAA;AAC7B,iIAAA,+BAA+B,OAAA;AAC/B,uHAAA,qBAAqB,OAAA;AACrB,mIAAA,iCAAiC,OAAA;AAGnC,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,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;AAKzB,uDAAkE;AAAzD,4HAAA,0BAA0B,OAAA;AACnC,+DAWkC;AAVhC,+HAAA,yBAAyB,OAAA;AACzB,2HAAA,qBAAqB,OAAA;AACrB,4HAAA,sBAAsB,OAAA;AACtB,gIAAA,0BAA0B,OAAA;AAC1B,6HAAA,uBAAuB,OAAA;AACvB,+HAAA,yBAAyB,OAAA;AAM3B,0EAK0C;AAJxC,4HAAA,mBAAmB,OAAA;AACnB,6HAAA,oBAAoB,OAAA;AAItB,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,kEAO4C;AAN1C,4HAAA,6BAA6B,OAAA;AAC7B,2GAAA,YAAY,OAAA;AACZ,qHAAA,sBAAsB,OAAA;AACtB,4HAAA,6BAA6B,OAAA;AAI/B,sGAI8D;AAH5D,gJAAA,+BAA+B,OAAA;AAIjC,4DASmC;AARjC,uHAAA,qBAAqB,OAAA;AACrB,4HAAA,0BAA0B,OAAA;AAC1B,oHAAA,kBAAkB,OAAA;AAClB,+HAAA,6BAA6B,OAAA;AAC7B,iIAAA,+BAA+B,OAAA;AAC/B,uHAAA,qBAAqB,OAAA;AACrB,mIAAA,iCAAiC,OAAA;AAGnC,oEAQuC;AAPrC,sHAAA,gBAAgB,OAAA;AAChB,0HAAA,oBAAoB,OAAA;AACpB,wHAAA,kBAAkB,OAAA;AAClB,iIAAA,2BAA2B,OAAA;AAC3B,4HAAA,sBAAsB,OAAA"}
@@ -0,0 +1,39 @@
1
+ import type { QueryResult, QueryResultRow } from 'pg';
2
+ export declare enum OperatorMigrationMode {
3
+ DryRun = "dry-run",
4
+ Apply = "apply",
5
+ Verify = "verify",
6
+ Contract = "contract"
7
+ }
8
+ export declare enum OperatorMigrationPhase {
9
+ Verified = "verified",
10
+ Contracted = "contracted"
11
+ }
12
+ export interface OperatorMigrationDatabase {
13
+ query<R extends QueryResultRow = QueryResultRow>(queryText: string, values?: unknown[]): Promise<QueryResult<R>>;
14
+ }
15
+ export interface VerifyOperatorMigrationOptions {
16
+ readonly database: OperatorMigrationDatabase;
17
+ readonly migrationId: string;
18
+ readonly verificationArtifact: string;
19
+ readonly verify: (database: OperatorMigrationDatabase) => Promise<void>;
20
+ }
21
+ export interface ContractOperatorMigrationOptions {
22
+ readonly database: OperatorMigrationDatabase;
23
+ readonly migrationId: string;
24
+ readonly contractionSql: string;
25
+ }
26
+ export interface WithOperatorMigrationLockOptions<T> {
27
+ readonly database: OperatorMigrationDatabase;
28
+ readonly migrationId: string;
29
+ readonly run: (database: OperatorMigrationDatabase) => Promise<T>;
30
+ }
31
+ export declare function parseOperatorMigrationMode(argv: readonly string[]): OperatorMigrationMode;
32
+ export declare function withOperatorMigrationLock<T>(options: WithOperatorMigrationLockOptions<T>): Promise<T>;
33
+ export declare function verifyOperatorMigration(options: VerifyOperatorMigrationOptions): Promise<{
34
+ readonly artifactSha256: string;
35
+ }>;
36
+ export declare function contractOperatorMigration(options: ContractOperatorMigrationOptions): Promise<{
37
+ readonly artifactSha256: string;
38
+ }>;
39
+ //# sourceMappingURL=operator-migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-migration.d.ts","sourceRoot":"","sources":["../../src/lib/operator-migration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAEtD,oBAAY,qBAAqB;IAC/B,MAAM,YAAY;IAClB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,QAAQ,aAAa;CACtB;AAED,oBAAY,sBAAsB;IAChC,QAAQ,aAAa;IACrB,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAC7C,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,gCAAgC,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACnE;AAKD,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,qBAAqB,CAgBvB;AAUD,wBAAsB,yBAAyB,CAAC,CAAC,EAC/C,OAAO,EAAE,gCAAgC,CAAC,CAAC,CAAC,GAC3C,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC;IAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB9C;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC;IAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAmC9C"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OperatorMigrationPhase = exports.OperatorMigrationMode = void 0;
4
+ exports.parseOperatorMigrationMode = parseOperatorMigrationMode;
5
+ exports.withOperatorMigrationLock = withOperatorMigrationLock;
6
+ exports.verifyOperatorMigration = verifyOperatorMigration;
7
+ exports.contractOperatorMigration = contractOperatorMigration;
8
+ const node_crypto_1 = require("node:crypto");
9
+ var OperatorMigrationMode;
10
+ (function (OperatorMigrationMode) {
11
+ OperatorMigrationMode["DryRun"] = "dry-run";
12
+ OperatorMigrationMode["Apply"] = "apply";
13
+ OperatorMigrationMode["Verify"] = "verify";
14
+ OperatorMigrationMode["Contract"] = "contract";
15
+ })(OperatorMigrationMode || (exports.OperatorMigrationMode = OperatorMigrationMode = {}));
16
+ var OperatorMigrationPhase;
17
+ (function (OperatorMigrationPhase) {
18
+ OperatorMigrationPhase["Verified"] = "verified";
19
+ OperatorMigrationPhase["Contracted"] = "contracted";
20
+ })(OperatorMigrationPhase || (exports.OperatorMigrationPhase = OperatorMigrationPhase = {}));
21
+ const MIGRATION_ID_PATTERN = /^[a-z][a-z0-9-]{0,126}$/u;
22
+ const SHA256_PATTERN = /^[a-f0-9]{64}$/u;
23
+ function parseOperatorMigrationMode(argv) {
24
+ const modeArguments = argv.filter((value) => value.startsWith('--mode='));
25
+ if (modeArguments.length !== 1) {
26
+ throw new Error(`Exactly one operator migration mode is required: --mode=${Object.values(OperatorMigrationMode).join('|')}.`);
27
+ }
28
+ const value = modeArguments[0]?.slice('--mode='.length) ?? '';
29
+ if (!Object.values(OperatorMigrationMode).includes(value)) {
30
+ throw new Error(`Unsupported operator migration mode: ${value}.`);
31
+ }
32
+ return value;
33
+ }
34
+ async function withOperatorMigrationLock(options) {
35
+ assertMigrationId(options.migrationId);
36
+ const lockKey = migrationLockKey(options.migrationId);
37
+ const acquired = await options.database.query('SELECT pg_try_advisory_lock(hashtextextended($1, 0)) AS acquired', [lockKey]);
38
+ if (acquired.rows[0]?.acquired !== true) {
39
+ throw new Error(`Operator migration ${options.migrationId} is already running.`);
40
+ }
41
+ let result;
42
+ try {
43
+ result = await options.run(options.database);
44
+ }
45
+ catch (error) {
46
+ await releaseSessionLock(options.database, lockKey, error);
47
+ throw error;
48
+ }
49
+ await releaseSessionLock(options.database, lockKey);
50
+ return result;
51
+ }
52
+ async function verifyOperatorMigration(options) {
53
+ const artifactSha256 = sha256(options.verificationArtifact);
54
+ await inMigrationTransaction(options.database, options.migrationId, async (database) => {
55
+ await options.verify(database);
56
+ await recordPhase(database, options.migrationId, OperatorMigrationPhase.Verified, artifactSha256);
57
+ });
58
+ return { artifactSha256 };
59
+ }
60
+ async function contractOperatorMigration(options) {
61
+ const artifactSha256 = sha256(options.contractionSql);
62
+ await inMigrationTransaction(options.database, options.migrationId, async (database) => {
63
+ await requirePhase(database, options.migrationId, OperatorMigrationPhase.Verified);
64
+ const existing = await readPhase(database, options.migrationId, OperatorMigrationPhase.Contracted);
65
+ if (existing !== null) {
66
+ assertArtifactMatches(options.migrationId, OperatorMigrationPhase.Contracted, existing, artifactSha256);
67
+ return;
68
+ }
69
+ await database.query(options.contractionSql);
70
+ await recordPhase(database, options.migrationId, OperatorMigrationPhase.Contracted, artifactSha256);
71
+ });
72
+ return { artifactSha256 };
73
+ }
74
+ async function inMigrationTransaction(database, migrationId, work) {
75
+ assertMigrationId(migrationId);
76
+ await database.query('BEGIN');
77
+ try {
78
+ await database.query('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE');
79
+ await database.query(`SELECT pg_advisory_xact_lock(hashtextextended($1, 0))`, [migrationLockKey(migrationId)]);
80
+ await work(database);
81
+ await database.query('COMMIT');
82
+ }
83
+ catch (error) {
84
+ try {
85
+ await database.query('ROLLBACK');
86
+ }
87
+ catch (rollbackError) {
88
+ throw new AggregateError([error, rollbackError], `Operator migration ${migrationId} failed and its transaction could not be rolled back.`);
89
+ }
90
+ throw error;
91
+ }
92
+ }
93
+ async function releaseSessionLock(database, lockKey, workError) {
94
+ try {
95
+ const released = await database.query('SELECT pg_advisory_unlock(hashtextextended($1, 0)) AS released', [lockKey]);
96
+ if (released.rows[0]?.released !== true) {
97
+ throw new Error('Database reported that the operator lock was not held.');
98
+ }
99
+ }
100
+ catch (unlockError) {
101
+ if (workError !== undefined) {
102
+ throw new AggregateError([workError, unlockError], 'Operator migration failed and its session lock could not be released.');
103
+ }
104
+ throw unlockError;
105
+ }
106
+ }
107
+ async function recordPhase(database, migrationId, phase, artifactSha256) {
108
+ const existing = await readPhase(database, migrationId, phase);
109
+ if (existing !== null) {
110
+ assertArtifactMatches(migrationId, phase, existing, artifactSha256);
111
+ return;
112
+ }
113
+ await database.query(`INSERT INTO xema_operator_migrations
114
+ (migration_id, phase, artifact_sha256)
115
+ VALUES ($1, $2, $3)`, [migrationId, phase, artifactSha256]);
116
+ }
117
+ async function requirePhase(database, migrationId, phase) {
118
+ if ((await readPhase(database, migrationId, phase)) === null) {
119
+ throw new Error(`Operator migration ${migrationId} has not completed phase ${phase}.`);
120
+ }
121
+ }
122
+ async function readPhase(database, migrationId, phase) {
123
+ const result = await database.query(`SELECT artifact_sha256
124
+ FROM xema_operator_migrations
125
+ WHERE migration_id = $1 AND phase = $2`, [migrationId, phase]);
126
+ const value = result.rows[0]?.artifact_sha256 ?? null;
127
+ if (value !== null && !SHA256_PATTERN.test(value)) {
128
+ throw new Error(`Operator migration ledger contains an invalid artifact hash for ${migrationId}/${phase}.`);
129
+ }
130
+ return value;
131
+ }
132
+ function assertArtifactMatches(migrationId, phase, recorded, expected) {
133
+ if (recorded !== expected) {
134
+ throw new Error(`Operator migration ${migrationId}/${phase} is already recorded for a different artifact.`);
135
+ }
136
+ }
137
+ function assertMigrationId(migrationId) {
138
+ if (!MIGRATION_ID_PATTERN.test(migrationId)) {
139
+ throw new Error(`Invalid operator migration id: ${migrationId}.`);
140
+ }
141
+ }
142
+ function migrationLockKey(migrationId) {
143
+ return `xema:operator-migration:${migrationId}`;
144
+ }
145
+ function sha256(value) {
146
+ return (0, node_crypto_1.createHash)('sha256').update(value).digest('hex');
147
+ }
148
+ //# sourceMappingURL=operator-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-migration.js","sourceRoot":"","sources":["../../src/lib/operator-migration.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xemahq/biome-database-nest",
3
- "version": "0.16.12",
3
+ "version": "0.16.14",
4
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)",