@rehearsal-db/core 0.1.0-beta.9 → 0.1.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +319 -1
- package/COMPATIBILITY.md +15 -0
- package/README.md +73 -16
- package/dist/package.json +100 -0
- package/dist/scripts/install/create_root_config.d.mts +3 -0
- package/dist/scripts/install/create_root_config.mjs +13 -0
- package/dist/scripts/runtime/manage_database.d.mts +6 -0
- package/{scripts → dist/scripts}/runtime/manage_database.mjs +6 -8
- package/dist/src/application/interactive_task.d.mts +30 -0
- package/dist/src/application/interactive_task.mjs +83 -0
- package/dist/src/application/session.d.mts +97 -0
- package/dist/src/application/session.mjs +380 -0
- package/dist/src/baseline/artifact.d.mts +119 -0
- package/dist/src/baseline/artifact.mjs +522 -0
- package/dist/src/baseline/builder.d.mts +19 -0
- package/dist/src/baseline/builder.mjs +142 -0
- package/dist/src/baseline/input_discovery.d.mts +13 -0
- package/dist/src/baseline/input_discovery.mjs +149 -0
- package/dist/src/baseline/policy_review.d.mts +56 -0
- package/dist/src/baseline/policy_review.mjs +73 -0
- package/dist/src/baseline/preparation.d.mts +63 -0
- package/dist/src/baseline/preparation.mjs +295 -0
- package/dist/src/baseline/privacy_contract.d.mts +147 -0
- package/dist/src/baseline/privacy_contract.mjs +2 -0
- package/dist/src/baseline/privacy_dependency_graph.d.mts +7 -0
- package/dist/src/baseline/privacy_dependency_graph.mjs +110 -0
- package/dist/src/baseline/privacy_engine.d.mts +5 -0
- package/dist/src/baseline/privacy_engine.mjs +4 -0
- package/dist/src/baseline/privacy_key.d.mts +7 -0
- package/dist/src/baseline/privacy_key.mjs +42 -0
- package/dist/src/baseline/privacy_pipeline.d.mts +7 -0
- package/dist/src/baseline/privacy_pipeline.mjs +127 -0
- package/dist/src/baseline/privacy_policy.d.mts +6 -0
- package/dist/src/baseline/privacy_policy.mjs +237 -0
- package/dist/src/baseline/privacy_recipe_validation.d.mts +5 -0
- package/dist/src/baseline/privacy_recipe_validation.mjs +289 -0
- package/dist/src/baseline/privacy_rule_registry.d.mts +18 -0
- package/dist/src/baseline/privacy_rule_registry.mjs +143 -0
- package/dist/src/baseline/privacy_structured_json.d.mts +66 -0
- package/dist/src/baseline/privacy_structured_json.mjs +464 -0
- package/dist/src/baseline/privacy_transforms.d.mts +18 -0
- package/dist/src/baseline/privacy_transforms.mjs +142 -0
- package/dist/src/baseline/privacy_validation_shared.d.mts +31 -0
- package/dist/src/baseline/privacy_validation_shared.mjs +127 -0
- package/dist/src/baseline/sanitization_policy.d.mts +69 -0
- package/dist/src/baseline/sanitization_policy.mjs +227 -0
- package/dist/src/baseline/schema_snapshot.d.mts +19 -0
- package/dist/src/baseline/schema_snapshot.mjs +79 -0
- package/dist/src/cli/application_command_handlers.d.mts +8 -0
- package/dist/src/cli/application_command_handlers.mjs +52 -0
- package/dist/src/cli/arguments.d.mts +38 -0
- package/dist/src/cli/arguments.mjs +130 -0
- package/dist/src/cli/basic_command_handlers.d.mts +4 -0
- package/dist/src/cli/basic_command_handlers.mjs +57 -0
- package/dist/src/cli/cli_commands.d.mts +14 -0
- package/dist/src/cli/cli_commands.mjs +34 -0
- package/dist/src/cli/command_contract.d.mts +57 -0
- package/dist/src/cli/command_contract.mjs +39 -0
- package/dist/src/cli/command_output.d.mts +12 -0
- package/dist/src/cli/command_output.mjs +20 -0
- package/dist/src/cli/command_registry.d.mts +7 -0
- package/dist/src/cli/command_registry.mjs +14 -0
- package/dist/src/cli/guided.d.mts +53 -0
- package/dist/src/cli/guided.mjs +727 -0
- package/dist/src/cli/identity_command_handlers.d.mts +12 -0
- package/dist/src/cli/identity_command_handlers.mjs +239 -0
- package/dist/src/cli/identity_renderer.d.mts +8 -0
- package/dist/src/cli/identity_renderer.mjs +33 -0
- package/dist/src/cli/init_command.d.mts +21 -0
- package/dist/src/cli/init_command.mjs +90 -0
- package/dist/src/cli/inspection_command_handlers.d.mts +3 -0
- package/dist/src/cli/inspection_command_handlers.mjs +79 -0
- package/dist/src/cli/project_command_handlers.d.mts +11 -0
- package/dist/src/cli/project_command_handlers.mjs +92 -0
- package/dist/src/cli/project_commands.d.mts +283 -0
- package/dist/src/cli/project_commands.mjs +192 -0
- package/dist/src/cli/rehearsal.d.mts +7 -0
- package/dist/src/cli/rehearsal.mjs +190 -0
- package/dist/src/cli/renderers.d.mts +299 -0
- package/dist/src/cli/renderers.mjs +554 -0
- package/dist/src/cli/runtime_action_handlers.d.mts +12 -0
- package/dist/src/cli/runtime_action_handlers.mjs +201 -0
- package/dist/src/cli/runtime_commands.d.mts +294 -0
- package/dist/src/cli/runtime_commands.mjs +619 -0
- package/dist/src/cli/source_command_handlers.d.mts +8 -0
- package/dist/src/cli/source_command_handlers.mjs +62 -0
- package/dist/src/cli/source_commands.d.mts +436 -0
- package/dist/src/cli/source_commands.mjs +301 -0
- package/dist/src/cli/terminal.d.mts +59 -0
- package/dist/src/cli/terminal.mjs +230 -0
- package/dist/src/identity/claim.d.mts +5 -0
- package/dist/src/identity/claim.mjs +4 -0
- package/dist/src/identity/claim_contract.d.mts +135 -0
- package/dist/src/identity/claim_contract.mjs +6 -0
- package/dist/src/identity/claim_executor.d.mts +10 -0
- package/dist/src/identity/claim_executor.mjs +358 -0
- package/dist/src/identity/claim_identity_lookup.d.mts +23 -0
- package/dist/src/identity/claim_identity_lookup.mjs +134 -0
- package/dist/src/identity/claim_plan.d.mts +8 -0
- package/dist/src/identity/claim_plan.mjs +61 -0
- package/dist/src/identity/claim_policy.d.mts +3 -0
- package/dist/src/identity/claim_policy.mjs +377 -0
- package/dist/src/identity/claim_sql.d.mts +10 -0
- package/dist/src/identity/claim_sql.mjs +46 -0
- package/dist/src/identity/claim_verification.d.mts +13 -0
- package/dist/src/identity/claim_verification.mjs +35 -0
- package/dist/src/identity/connect.d.mts +30 -0
- package/dist/src/identity/connect.mjs +111 -0
- package/dist/src/identity/provider_configuration.d.mts +37 -0
- package/dist/src/identity/provider_configuration.mjs +132 -0
- package/dist/src/identity/storage.d.mts +21 -0
- package/dist/src/identity/storage.mjs +122 -0
- package/dist/src/index.d.mts +4 -0
- package/dist/src/index.mjs +3 -0
- package/dist/src/project/configuration.d.mts +13 -0
- package/dist/src/project/configuration.mjs +9 -0
- package/dist/src/project/configuration_contract.d.mts +125 -0
- package/dist/src/project/configuration_contract.mjs +27 -0
- package/dist/src/project/configuration_discovery.d.mts +7 -0
- package/dist/src/project/configuration_discovery.mjs +37 -0
- package/dist/src/project/configuration_normalization.d.mts +107 -0
- package/dist/src/project/configuration_normalization.mjs +302 -0
- package/dist/src/project/configuration_rendering.d.mts +14 -0
- package/dist/src/project/configuration_rendering.mjs +228 -0
- package/dist/src/project/configuration_resolution.d.mts +125 -0
- package/dist/src/project/configuration_resolution.mjs +81 -0
- package/dist/src/project/configuration_schema.d.mts +22 -0
- package/dist/src/project/configuration_schema.mjs +160 -0
- package/dist/src/project/configuration_validation.d.mts +22 -0
- package/dist/src/project/configuration_validation.mjs +136 -0
- package/dist/src/project/install_scaffold.d.mts +42 -0
- package/dist/src/project/install_scaffold.mjs +263 -0
- package/dist/src/project/project_detection.d.mts +14 -0
- package/dist/src/project/project_detection.mjs +47 -0
- package/dist/src/project/setup.d.mts +87 -0
- package/dist/src/project/setup.mjs +414 -0
- package/dist/src/project/support_report.d.mts +88 -0
- package/dist/src/project/support_report.mjs +83 -0
- package/dist/src/runtime/cleanup.d.mts +85 -0
- package/dist/src/runtime/cleanup.mjs +311 -0
- package/dist/src/runtime/lifecycle_engine.d.mts +63 -0
- package/dist/src/runtime/lifecycle_engine.mjs +114 -0
- package/dist/src/runtime/migration_history.d.mts +51 -0
- package/dist/src/runtime/migration_history.mjs +170 -0
- package/dist/src/runtime/plan.d.mts +134 -0
- package/dist/src/runtime/plan.mjs +640 -0
- package/dist/src/runtime/policy.d.mts +66 -0
- package/dist/src/runtime/policy.mjs +369 -0
- package/dist/src/runtime/restore.d.mts +22 -0
- package/dist/src/runtime/restore.mjs +276 -0
- package/dist/src/runtime/service_environment.d.mts +11 -0
- package/dist/src/runtime/service_environment.mjs +58 -0
- package/dist/src/runtime/topology.d.mts +51 -0
- package/dist/src/runtime/topology.mjs +128 -0
- package/dist/src/shared/diagnostics.d.mts +97 -0
- package/dist/src/shared/diagnostics.mjs +170 -0
- package/dist/src/shared/human_output.d.mts +2 -0
- package/{src → dist/src}/shared/human_output.mjs +1 -3
- package/dist/src/shared/node_runtime.d.mts +14 -0
- package/dist/src/shared/node_runtime.mjs +25 -0
- package/dist/src/shared/operation_guard.d.mts +22 -0
- package/dist/src/shared/operation_guard.mjs +150 -0
- package/dist/src/shared/process_environment.d.mts +15 -0
- package/dist/src/shared/process_environment.mjs +50 -0
- package/dist/src/source/access.d.mts +165 -0
- package/dist/src/source/access.mjs +602 -0
- package/dist/src/source/asset_transfer.d.mts +27 -0
- package/dist/src/source/asset_transfer.mjs +202 -0
- package/dist/src/source/baseline.d.mts +66 -0
- package/dist/src/source/baseline.mjs +372 -0
- package/dist/src/source/external_reader.d.mts +42 -0
- package/dist/src/source/external_reader.mjs +278 -0
- package/dist/src/source/postgresql_access.d.mts +86 -0
- package/dist/src/source/postgresql_access.mjs +454 -0
- package/dist/src/source/privacy_paths.d.mts +10 -0
- package/dist/src/source/privacy_paths.mjs +27 -0
- package/dist/src/targets/driver.d.mts +2 -0
- package/dist/src/targets/driver.mjs +13 -0
- package/dist/src/targets/postgresql.d.mts +5 -0
- package/dist/src/targets/postgresql.mjs +620 -0
- package/dist/src/targets/supabase.d.mts +8 -0
- package/dist/src/targets/supabase.mjs +629 -0
- package/dist/src/targets/supabase_environment.d.mts +54 -0
- package/dist/src/targets/supabase_environment.mjs +184 -0
- package/dist/src/targets/target.d.mts +33 -0
- package/dist/src/targets/target.mjs +39 -0
- package/docs/README.md +35 -16
- package/docs/architecture.md +135 -10
- package/docs/commands.md +53 -15
- package/docs/configuration.md +186 -31
- package/docs/getting-started.md +66 -9
- package/docs/index.md +67 -0
- package/docs/production-source.md +175 -17
- package/docs/releasing.md +24 -12
- package/docs/roadmap.md +3 -2
- package/docs/runtime-lifecycle.md +99 -0
- package/docs/runtime-policies.md +80 -7
- package/docs/sanitization.md +572 -4
- package/docs/security-model.md +8 -0
- package/docs/stability.md +70 -0
- package/docs/standalone-workflow.md +36 -13
- package/docs/troubleshooting.md +82 -10
- package/docs/tutorial.md +7 -1
- package/docs/typescript.md +134 -0
- package/package.json +44 -29
- package/types/configuration.d.mts +5 -0
- package/src/README.md +0 -17
- package/src/application/session.mjs +0 -313
- package/src/baseline/artifact.mjs +0 -661
- package/src/baseline/builder.mjs +0 -164
- package/src/baseline/input_discovery.mjs +0 -155
- package/src/baseline/policy_review.mjs +0 -92
- package/src/baseline/preparation.mjs +0 -323
- package/src/baseline/privacy_engine.mjs +0 -413
- package/src/baseline/sanitization_policy.mjs +0 -299
- package/src/baseline/schema_snapshot.mjs +0 -113
- package/src/cli/arguments.mjs +0 -120
- package/src/cli/guided.mjs +0 -807
- package/src/cli/rehearsal.mjs +0 -933
- package/src/cli/renderers.mjs +0 -584
- package/src/cli/runtime_commands.mjs +0 -553
- package/src/cli/source_commands.mjs +0 -326
- package/src/cli/terminal.mjs +0 -275
- package/src/identity/claim.mjs +0 -975
- package/src/identity/storage.mjs +0 -165
- package/src/project/configuration.d.mts +0 -153
- package/src/project/configuration.mjs +0 -1197
- package/src/project/setup.mjs +0 -379
- package/src/project/support_report.mjs +0 -105
- package/src/runtime/cleanup.mjs +0 -381
- package/src/runtime/migration_history.mjs +0 -220
- package/src/runtime/plan.mjs +0 -685
- package/src/runtime/policy.mjs +0 -438
- package/src/runtime/restore.mjs +0 -329
- package/src/runtime/service_environment.mjs +0 -82
- package/src/runtime/topology.mjs +0 -177
- package/src/shared/diagnostics.mjs +0 -199
- package/src/shared/operation_guard.mjs +0 -162
- package/src/shared/process_environment.mjs +0 -68
- package/src/source/access.mjs +0 -578
- package/src/source/asset_transfer.mjs +0 -177
- package/src/source/baseline.mjs +0 -446
- package/src/source/postgresql_access.mjs +0 -480
- package/src/targets/postgresql.mjs +0 -808
- package/src/targets/supabase.mjs +0 -830
- package/src/targets/supabase_environment.mjs +0 -229
- package/src/targets/target.mjs +0 -66
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Purpose: Build and compare content-addressed application migration histories for
|
|
3
|
+
* Rehearsal without trusting timestamp-only migration alignment. Do not run directly;
|
|
4
|
+
* this module is reusable script infrastructure.
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
7
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
8
|
+
const migrationNamePattern = /^(\d{14})_(.+)\.sql$/u;
|
|
9
|
+
const sha256 = (value) => createHash("sha256").update(value).digest("hex");
|
|
10
|
+
const canonicalJson = (value) => `${JSON.stringify(value, null, "\t")}\n`;
|
|
11
|
+
const normalizeStatement = (statement) => {
|
|
12
|
+
if (typeof statement !== "string") {
|
|
13
|
+
throw new Error("A Rehearsal migration ledger statement is not text.");
|
|
14
|
+
}
|
|
15
|
+
return statement.replaceAll("\r\n", "\n").replaceAll("\r", "\n");
|
|
16
|
+
};
|
|
17
|
+
const assertOrderedUniqueHistory = (entries, label) => {
|
|
18
|
+
const seen = new Set();
|
|
19
|
+
let previous = null;
|
|
20
|
+
for (const entry of entries) {
|
|
21
|
+
if (!/^\d{14}$/u.test(entry.version)) {
|
|
22
|
+
throw new Error(`${label} has an invalid migration version: ${entry.version}`);
|
|
23
|
+
}
|
|
24
|
+
if (seen.has(entry.version)) {
|
|
25
|
+
throw new Error(`${label} contains duplicate migration ${entry.version}.`);
|
|
26
|
+
}
|
|
27
|
+
if (previous !== null && entry.version <= previous) {
|
|
28
|
+
throw new Error(`${label} is not in strictly increasing migration order at ${entry.version}.`);
|
|
29
|
+
}
|
|
30
|
+
seen.add(entry.version);
|
|
31
|
+
previous = entry.version;
|
|
32
|
+
}
|
|
33
|
+
return entries;
|
|
34
|
+
};
|
|
35
|
+
export const readMigrationFileInventory = async (directory) => {
|
|
36
|
+
const names = (await readdir(directory))
|
|
37
|
+
.filter((name) => name.endsWith(".sql"))
|
|
38
|
+
.sort();
|
|
39
|
+
const entries = [];
|
|
40
|
+
for (const filename of names) {
|
|
41
|
+
const match = migrationNamePattern.exec(filename);
|
|
42
|
+
if (!match) {
|
|
43
|
+
throw new Error(`Invalid migration filename in ${directory}: ${filename}`);
|
|
44
|
+
}
|
|
45
|
+
const bytes = await readFile(new URL(filename, directory));
|
|
46
|
+
entries.push({
|
|
47
|
+
version: match[1],
|
|
48
|
+
name: match[2],
|
|
49
|
+
filename,
|
|
50
|
+
fileSha256: sha256(bytes),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return [...assertOrderedUniqueHistory(entries, "Migration files")];
|
|
54
|
+
};
|
|
55
|
+
export const readMigrationSourceBundle = async ({ directory, sourceLedger, }) => {
|
|
56
|
+
assertOrderedUniqueHistory(sourceLedger, "Source migration ledger");
|
|
57
|
+
const inventory = await readMigrationFileInventory(directory);
|
|
58
|
+
if (sourceLedger.length > inventory.length) {
|
|
59
|
+
throw new Error("The source migration history contains a version absent from local migration source.");
|
|
60
|
+
}
|
|
61
|
+
const bundle = [];
|
|
62
|
+
for (let index = 0; index < sourceLedger.length; index += 1) {
|
|
63
|
+
const source = sourceLedger[index];
|
|
64
|
+
const file = inventory[index];
|
|
65
|
+
if (source.version !== file.version || source.name !== file.name) {
|
|
66
|
+
throw new Error(`Source migration ${source.version}_${source.name} does not match local file ${file.filename}.`);
|
|
67
|
+
}
|
|
68
|
+
bundle.push({
|
|
69
|
+
...file,
|
|
70
|
+
content: await readFile(new URL(file.filename, directory), "utf8"),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return bundle;
|
|
74
|
+
};
|
|
75
|
+
export const buildMigrationLedgerInventory = (rows, label = "Migration ledger") => {
|
|
76
|
+
if (!Array.isArray(rows) || rows.length === 0) {
|
|
77
|
+
throw new Error(`${label} is empty or unavailable.`);
|
|
78
|
+
}
|
|
79
|
+
const entries = rows.map((row) => {
|
|
80
|
+
if (!row ||
|
|
81
|
+
typeof row !== "object" ||
|
|
82
|
+
!("name" in row) ||
|
|
83
|
+
typeof row.name !== "string") {
|
|
84
|
+
throw new Error(`${label} contains an invalid row.`);
|
|
85
|
+
}
|
|
86
|
+
if (!("statements" in row) ||
|
|
87
|
+
!Array.isArray(row.statements) ||
|
|
88
|
+
row.statements.length === 0) {
|
|
89
|
+
throw new Error(`${label} migration ${"version" in row ? String(row.version) : "unknown"} has no applied statements.`);
|
|
90
|
+
}
|
|
91
|
+
const statements = row.statements.map(normalizeStatement);
|
|
92
|
+
return {
|
|
93
|
+
version: String("version" in row ? row.version : ""),
|
|
94
|
+
name: row.name,
|
|
95
|
+
statementCount: statements.length,
|
|
96
|
+
statementSha256: sha256(JSON.stringify(statements)),
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
return [...assertOrderedUniqueHistory(entries, label)];
|
|
100
|
+
};
|
|
101
|
+
export const createMigrationReplayReceipt = ({ files, ledger, }) => {
|
|
102
|
+
assertOrderedUniqueHistory(files, "Migration files");
|
|
103
|
+
assertOrderedUniqueHistory(ledger, "Replayed migration ledger");
|
|
104
|
+
if (files.length !== ledger.length) {
|
|
105
|
+
throw new Error(`Migration replay length mismatch: ${files.length} files but ${ledger.length} applied ledger rows.`);
|
|
106
|
+
}
|
|
107
|
+
const entries = files.map((file, index) => {
|
|
108
|
+
const applied = ledger[index];
|
|
109
|
+
if (file.version !== applied.version || file.name !== applied.name) {
|
|
110
|
+
throw new Error(`Migration replay mismatch at ${file.filename}: ledger contains ${applied.version}_${applied.name}.`);
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
version: file.version,
|
|
114
|
+
name: file.name,
|
|
115
|
+
filename: file.filename,
|
|
116
|
+
fileSha256: file.fileSha256,
|
|
117
|
+
statementCount: applied.statementCount,
|
|
118
|
+
statementSha256: applied.statementSha256,
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
return {
|
|
122
|
+
entries,
|
|
123
|
+
historySha256: sha256(canonicalJson(entries)),
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
export const compareSourceToReplay = ({ sourceLedger, replayReceipt, snapshotSchemaSha256, }) => {
|
|
127
|
+
assertOrderedUniqueHistory(sourceLedger, "Source migration ledger");
|
|
128
|
+
if (!replayReceipt?.entries?.length || !replayReceipt.historySha256) {
|
|
129
|
+
throw new Error("The migration replay receipt is missing or invalid.");
|
|
130
|
+
}
|
|
131
|
+
if (sourceLedger.length > replayReceipt.entries.length) {
|
|
132
|
+
throw new Error("The source migration history contains a version absent from the reviewed replay.");
|
|
133
|
+
}
|
|
134
|
+
const snapshotBacked = snapshotSchemaSha256 !== undefined;
|
|
135
|
+
if (snapshotBacked && !/^[a-f0-9]{64}$/u.test(snapshotSchemaSha256)) {
|
|
136
|
+
throw new Error("The production schema snapshot receipt is invalid.");
|
|
137
|
+
}
|
|
138
|
+
let historicalStatementDifferences = 0;
|
|
139
|
+
for (let index = 0; index < sourceLedger.length; index += 1) {
|
|
140
|
+
const source = sourceLedger[index];
|
|
141
|
+
const replayed = replayReceipt.entries[index];
|
|
142
|
+
if (source.version !== replayed.version || source.name !== replayed.name) {
|
|
143
|
+
throw new Error(`Source migration history is not an exact replay prefix at ${source.version}_${source.name}.`);
|
|
144
|
+
}
|
|
145
|
+
if (source.statementCount !== replayed.statementCount ||
|
|
146
|
+
source.statementSha256 !== replayed.statementSha256) {
|
|
147
|
+
if (!snapshotBacked) {
|
|
148
|
+
throw new Error(`Applied statement content differs for migration ${source.version}_${source.name}.`);
|
|
149
|
+
}
|
|
150
|
+
historicalStatementDifferences += 1;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const candidates = replayReceipt.entries.slice(sourceLedger.length);
|
|
154
|
+
return {
|
|
155
|
+
cutoff: sourceLedger.at(-1).version,
|
|
156
|
+
candidates,
|
|
157
|
+
candidateSha256: sha256(canonicalJson(candidates)),
|
|
158
|
+
historicalStatementDifferences,
|
|
159
|
+
snapshotSchemaSha256: snapshotBacked ? snapshotSchemaSha256 : null,
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
export const assertNoCrossDatabaseMigrationVersions = ({ applicationFiles, apiFiles, }) => {
|
|
163
|
+
const applicationVersions = new Set(applicationFiles.map((entry) => entry.version));
|
|
164
|
+
const collisions = apiFiles
|
|
165
|
+
.map((entry) => entry.version)
|
|
166
|
+
.filter((version) => applicationVersions.has(version));
|
|
167
|
+
if (collisions.length) {
|
|
168
|
+
throw new Error(`Primary and secondary database migration versions collide: ${collisions.join(", ")}.`);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Purpose: Build the immutable, audit-only Rehearsal execution plan and readiness
|
|
3
|
+
* report from project configuration and verified artifacts. Do not run directly;
|
|
4
|
+
* this module is reusable script infrastructure.
|
|
5
|
+
*/
|
|
6
|
+
import type { RehearsalConfigPathOptions } from "../project/configuration.mjs";
|
|
7
|
+
export declare const buildRehearsalPlan: (options?: RehearsalConfigPathOptions) => Promise<{
|
|
8
|
+
config: {
|
|
9
|
+
schemaVersion: 1;
|
|
10
|
+
path: string;
|
|
11
|
+
project: string;
|
|
12
|
+
};
|
|
13
|
+
environment: {
|
|
14
|
+
target: "postgresql" | "supabase";
|
|
15
|
+
kind: string;
|
|
16
|
+
applicationUrl: string;
|
|
17
|
+
projectId: string;
|
|
18
|
+
ports: Readonly<{
|
|
19
|
+
api?: number;
|
|
20
|
+
database: number;
|
|
21
|
+
studio?: number;
|
|
22
|
+
}>;
|
|
23
|
+
hostedAccess: "disabled";
|
|
24
|
+
outboundNetwork: "deny";
|
|
25
|
+
authenticationProviders: readonly string[];
|
|
26
|
+
authenticationCallback: string | null;
|
|
27
|
+
barriers: string[];
|
|
28
|
+
};
|
|
29
|
+
baseline: {
|
|
30
|
+
rehearsalVersion: string;
|
|
31
|
+
formatVersion: 1 | 2;
|
|
32
|
+
generationId: string;
|
|
33
|
+
createdAt: string | null;
|
|
34
|
+
migrationCutoff: string;
|
|
35
|
+
migrationHistorySha256: string;
|
|
36
|
+
sanitizationPolicySha256: string;
|
|
37
|
+
dataSha256: string;
|
|
38
|
+
tableCount: number;
|
|
39
|
+
rowCount: number;
|
|
40
|
+
migrationCount: number;
|
|
41
|
+
verification: string;
|
|
42
|
+
};
|
|
43
|
+
migrations: {
|
|
44
|
+
representedCount: number;
|
|
45
|
+
candidateCount: number;
|
|
46
|
+
candidateSha256: string;
|
|
47
|
+
candidates: {
|
|
48
|
+
filename: string;
|
|
49
|
+
sha256: string;
|
|
50
|
+
}[];
|
|
51
|
+
};
|
|
52
|
+
execution: string[];
|
|
53
|
+
guarantee: string;
|
|
54
|
+
paths: {
|
|
55
|
+
artifactDirectory: string;
|
|
56
|
+
migrationDirectory: string;
|
|
57
|
+
sanitizationPolicy: string;
|
|
58
|
+
};
|
|
59
|
+
}>;
|
|
60
|
+
export declare const inspectRehearsalBaseline: (options?: RehearsalConfigPathOptions) => Promise<{
|
|
61
|
+
rehearsalVersion: string;
|
|
62
|
+
formatVersion: 1 | 2;
|
|
63
|
+
generationId: string;
|
|
64
|
+
createdAt: string | null;
|
|
65
|
+
migrationCutoff: string;
|
|
66
|
+
migrationHistorySha256: string;
|
|
67
|
+
sanitizationPolicySha256: string;
|
|
68
|
+
dataSha256: string;
|
|
69
|
+
tableCount: number;
|
|
70
|
+
rowCount: number;
|
|
71
|
+
migrationCount: number;
|
|
72
|
+
verification: string;
|
|
73
|
+
project: string;
|
|
74
|
+
provenance: {
|
|
75
|
+
configVersion: 1;
|
|
76
|
+
migrationCutoff: string;
|
|
77
|
+
sanitizationPolicySha256: string;
|
|
78
|
+
};
|
|
79
|
+
privacy: {
|
|
80
|
+
sourceRowsExposed: boolean;
|
|
81
|
+
sensitiveValuesIncludedInReport: boolean;
|
|
82
|
+
};
|
|
83
|
+
}>;
|
|
84
|
+
export declare const inspectRehearsalMigrations: (options?: RehearsalConfigPathOptions) => Promise<{
|
|
85
|
+
baselineGenerationId: string;
|
|
86
|
+
baselineCutoff: string;
|
|
87
|
+
candidateSha256: string;
|
|
88
|
+
migrations: {
|
|
89
|
+
version: string;
|
|
90
|
+
name: string;
|
|
91
|
+
filename: string;
|
|
92
|
+
sha256: string;
|
|
93
|
+
status: string;
|
|
94
|
+
}[];
|
|
95
|
+
definitions: {
|
|
96
|
+
represented_by_baseline: string;
|
|
97
|
+
applied_to_current_runtime: string;
|
|
98
|
+
candidate: string;
|
|
99
|
+
modified: string;
|
|
100
|
+
invalid: string;
|
|
101
|
+
};
|
|
102
|
+
}>;
|
|
103
|
+
export declare const runRehearsalDoctor: (options?: RehearsalConfigPathOptions) => Promise<{
|
|
104
|
+
state: string;
|
|
105
|
+
checks: {
|
|
106
|
+
id: string;
|
|
107
|
+
label: string;
|
|
108
|
+
status: string;
|
|
109
|
+
detail: string;
|
|
110
|
+
remediation: string;
|
|
111
|
+
}[];
|
|
112
|
+
ambientHostedVariables?: never;
|
|
113
|
+
} | {
|
|
114
|
+
state: string;
|
|
115
|
+
checks: ({
|
|
116
|
+
id: string;
|
|
117
|
+
label: string;
|
|
118
|
+
status: string;
|
|
119
|
+
detail: unknown;
|
|
120
|
+
durationMs: number;
|
|
121
|
+
remediation?: never;
|
|
122
|
+
} | {
|
|
123
|
+
id: string;
|
|
124
|
+
label: string;
|
|
125
|
+
status: string;
|
|
126
|
+
detail: string;
|
|
127
|
+
remediation: string;
|
|
128
|
+
durationMs: number;
|
|
129
|
+
})[];
|
|
130
|
+
ambientHostedVariables: {
|
|
131
|
+
presentButQuarantined: string[];
|
|
132
|
+
note: string;
|
|
133
|
+
};
|
|
134
|
+
}>;
|