@sequenceholdings/pipeline-spec 0.1.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 +114 -0
- package/dist/authoring/per-table-ingestion.d.ts +74 -0
- package/dist/authoring/per-table-ingestion.d.ts.map +1 -0
- package/dist/authoring/per-table-ingestion.js +122 -0
- package/dist/authoring/per-table-ingestion.js.map +1 -0
- package/dist/authoring/yaml.d.ts +6 -0
- package/dist/authoring/yaml.d.ts.map +1 -0
- package/dist/authoring/yaml.js +15 -0
- package/dist/authoring/yaml.js.map +1 -0
- package/dist/binding-gaps.d.ts +21 -0
- package/dist/binding-gaps.d.ts.map +1 -0
- package/dist/binding-gaps.js +74 -0
- package/dist/binding-gaps.js.map +1 -0
- package/dist/bodies/ingestion.d.ts +359 -0
- package/dist/bodies/ingestion.d.ts.map +1 -0
- package/dist/bodies/ingestion.js +446 -0
- package/dist/bodies/ingestion.js.map +1 -0
- package/dist/bodies/serving.d.ts +316 -0
- package/dist/bodies/serving.d.ts.map +1 -0
- package/dist/bodies/serving.js +290 -0
- package/dist/bodies/serving.js.map +1 -0
- package/dist/bodies/transformation.d.ts +397 -0
- package/dist/bodies/transformation.d.ts.map +1 -0
- package/dist/bodies/transformation.js +278 -0
- package/dist/bodies/transformation.js.map +1 -0
- package/dist/catalog-binding.d.ts +15 -0
- package/dist/catalog-binding.d.ts.map +1 -0
- package/dist/catalog-binding.js +15 -0
- package/dist/catalog-binding.js.map +1 -0
- package/dist/columns.d.ts +177 -0
- package/dist/columns.d.ts.map +1 -0
- package/dist/columns.js +89 -0
- package/dist/columns.js.map +1 -0
- package/dist/compatibility.d.ts +25 -0
- package/dist/compatibility.d.ts.map +1 -0
- package/dist/compatibility.js +108 -0
- package/dist/compatibility.js.map +1 -0
- package/dist/constants.d.ts +95 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +105 -0
- package/dist/constants.js.map +1 -0
- package/dist/diff.d.ts +36 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +300 -0
- package/dist/diff.js.map +1 -0
- package/dist/documentation.d.ts +22 -0
- package/dist/documentation.d.ts.map +1 -0
- package/dist/documentation.js +43 -0
- package/dist/documentation.js.map +1 -0
- package/dist/envelope.d.ts +1241 -0
- package/dist/envelope.d.ts.map +1 -0
- package/dist/envelope.js +163 -0
- package/dist/envelope.js.map +1 -0
- package/dist/errors.d.ts +30 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +47 -0
- package/dist/errors.js.map +1 -0
- package/dist/graph-references.d.ts +34 -0
- package/dist/graph-references.d.ts.map +1 -0
- package/dist/graph-references.js +81 -0
- package/dist/graph-references.js.map +1 -0
- package/dist/graph.d.ts +112 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +546 -0
- package/dist/graph.js.map +1 -0
- package/dist/hash.d.ts +28 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +91 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/issues.d.ts +14 -0
- package/dist/issues.d.ts.map +1 -0
- package/dist/issues.js +27 -0
- package/dist/issues.js.map +1 -0
- package/dist/loader.d.ts +50 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +241 -0
- package/dist/loader.js.map +1 -0
- package/dist/migrations/contracts.d.ts +38 -0
- package/dist/migrations/contracts.d.ts.map +1 -0
- package/dist/migrations/contracts.js +175 -0
- package/dist/migrations/contracts.js.map +1 -0
- package/dist/migrations/manifest.d.ts +137 -0
- package/dist/migrations/manifest.d.ts.map +1 -0
- package/dist/migrations/manifest.js +137 -0
- package/dist/migrations/manifest.js.map +1 -0
- package/dist/operations.d.ts +214 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +275 -0
- package/dist/operations.js.map +1 -0
- package/dist/orm-satisfies.d.ts +132 -0
- package/dist/orm-satisfies.d.ts.map +1 -0
- package/dist/orm-satisfies.js +119 -0
- package/dist/orm-satisfies.js.map +1 -0
- package/dist/primitives.d.ts +11 -0
- package/dist/primitives.d.ts.map +1 -0
- package/dist/primitives.js +20 -0
- package/dist/primitives.js.map +1 -0
- package/dist/resolve.d.ts +124 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +194 -0
- package/dist/resolve.js.map +1 -0
- package/dist/secret-scan.d.ts +34 -0
- package/dist/secret-scan.d.ts.map +1 -0
- package/dist/secret-scan.js +98 -0
- package/dist/secret-scan.js.map +1 -0
- package/dist/serving-compatibility.d.ts +14 -0
- package/dist/serving-compatibility.d.ts.map +1 -0
- package/dist/serving-compatibility.js +19 -0
- package/dist/serving-compatibility.js.map +1 -0
- package/dist/snapshot-transport.d.ts +83 -0
- package/dist/snapshot-transport.d.ts.map +1 -0
- package/dist/snapshot-transport.js +42 -0
- package/dist/snapshot-transport.js.map +1 -0
- package/dist/suggestions.d.ts +3 -0
- package/dist/suggestions.d.ts.map +1 -0
- package/dist/suggestions.js +26 -0
- package/dist/suggestions.js.map +1 -0
- package/dist/types.d.ts +72 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +119 -0
- package/dist/types.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { requireResolvedColumns } from '../columns.js';
|
|
2
|
+
import { diffContracts } from '../diff.js';
|
|
3
|
+
import { validateWriteOwnership } from '../graph.js';
|
|
4
|
+
import { canonicalJson } from '../hash.js';
|
|
5
|
+
import { transformationOutputCatalog } from '../resolve.js';
|
|
6
|
+
const referenceKey = (repo, stage, output, column) => canonicalJson([repo, stage, output, column]);
|
|
7
|
+
/**
|
|
8
|
+
* Contract analysis only: physical inventory and executable capabilities are
|
|
9
|
+
* separate planner gates. A clean report is never authorization to mutate.
|
|
10
|
+
* External writers exclude ONLY the exact participating repositories;
|
|
11
|
+
* combining proposed releases retains the existing shared-writer rules.
|
|
12
|
+
*/
|
|
13
|
+
export function analyzeMigrationContracts(input) {
|
|
14
|
+
const analysis = { ...input, findings: [], changes: [], declarations: new Map(), consumed: new Set() };
|
|
15
|
+
validateParticipants(analysis);
|
|
16
|
+
collectDeclarations(analysis);
|
|
17
|
+
validateCheckReferences(analysis);
|
|
18
|
+
validateBaselineReferences(analysis);
|
|
19
|
+
for (const participant of input.participants)
|
|
20
|
+
analyzeParticipant({ analysis, participant });
|
|
21
|
+
if (input.manifest) {
|
|
22
|
+
for (const key of analysis.declarations.keys())
|
|
23
|
+
if (!analysis.consumed.has(key))
|
|
24
|
+
analysis.findings.push({ code: 'migration_change_unmatched', severity: 'error', message: `declared change ${key} does not match a deployed-to-proposed column transition` });
|
|
25
|
+
for (const finding of validateWriteOwnership(input.participants.flatMap((participant) => participant.after), { catalog: input.catalog, deployTarget: input.deployTarget, externalStages: input.externalWriters }))
|
|
26
|
+
analysis.findings.push({ code: 'migration_writer_conflict', severity: 'error', stage: finding.stage, message: finding.message });
|
|
27
|
+
}
|
|
28
|
+
return { changes: analysis.changes, findings: analysis.findings };
|
|
29
|
+
}
|
|
30
|
+
function validateParticipants({ participants, rootRepo, manifest, findings }) {
|
|
31
|
+
const repos = new Set(participants.map((participant) => participant.repo));
|
|
32
|
+
if (repos.size !== participants.length || !repos.has(rootRepo))
|
|
33
|
+
findings.push({ code: 'migration_participants_invalid', severity: 'error', message: 'participants must contain the root repository exactly once and have unique repositories' });
|
|
34
|
+
if (!manifest)
|
|
35
|
+
return;
|
|
36
|
+
const expected = new Set([rootRepo, ...manifest.participants.map((item) => item.repo)]);
|
|
37
|
+
if (manifest.participants.some((item) => item.repo === rootRepo) || expected.size !== repos.size || [...expected].some((repo) => !repos.has(repo)))
|
|
38
|
+
findings.push({ code: 'migration_participants_invalid', severity: 'error', message: 'materialized participants must match the root and every declared participant exactly' });
|
|
39
|
+
}
|
|
40
|
+
function collectDeclarations({ manifest, rootRepo, declarations, findings }) {
|
|
41
|
+
for (const item of manifest?.changes ?? []) {
|
|
42
|
+
for (const column of item.columns) {
|
|
43
|
+
const key = referenceKey(item.repo ?? rootRepo, item.stage, item.output, column);
|
|
44
|
+
if (declarations.has(key))
|
|
45
|
+
findings.push({ code: 'migration_change_duplicate', severity: 'error', message: `duplicate migration change for '${item.stage}.${item.output}.${column}'` });
|
|
46
|
+
declarations.set(key, item.kind);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function validateCheckReferences({ manifest, participants, rootRepo, findings }) {
|
|
51
|
+
if (!manifest)
|
|
52
|
+
return;
|
|
53
|
+
for (const item of [...manifest.rebuild, ...manifest.checks]) {
|
|
54
|
+
if (!('stage' in item)) {
|
|
55
|
+
if (!manifest.orm.some((project) => project.namespace === item.namespace))
|
|
56
|
+
findings.push({ code: 'migration_orm_missing', severity: 'error', message: `ORM operation check requires a pinned project for namespace '${item.namespace}'` });
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const repo = item.repo ?? rootRepo;
|
|
60
|
+
const stage = participants.find((participant) => participant.repo === repo)?.after.find((stage) => stage.stage === item.stage);
|
|
61
|
+
if (!stage || stage.type !== 'transformation') {
|
|
62
|
+
findings.push({ code: 'migration_stage_missing', severity: 'error', repo, stage: item.stage, message: `migration references missing transformation '${repo}:${item.stage}'` });
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (!('output' in item))
|
|
66
|
+
continue;
|
|
67
|
+
const output = stage.outputs[item.output];
|
|
68
|
+
if (!output) {
|
|
69
|
+
findings.push({ code: 'migration_output_missing', severity: 'error', repo, stage: item.stage, output: item.output, message: `migration check references missing output '${item.output}'` });
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (item.kind !== 'unchanged_values')
|
|
73
|
+
continue;
|
|
74
|
+
const columns = requireResolvedColumns(output.columns, `${stage.stage}.${item.output}`);
|
|
75
|
+
for (const column of item.columns)
|
|
76
|
+
if (!columns[column])
|
|
77
|
+
findings.push({ code: 'migration_check_column_missing', severity: 'error', repo, stage: item.stage, output: item.output, column, message: `unchanged-values check references missing column '${column}'` });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function validateBaselineReferences({ manifest, participants, rootRepo, findings }) {
|
|
81
|
+
const seen = new Set();
|
|
82
|
+
for (const item of manifest?.baseline ?? []) {
|
|
83
|
+
const repo = item.repo ?? rootRepo;
|
|
84
|
+
const key = canonicalJson([repo, item.stage, item.output]);
|
|
85
|
+
const release = participants.find((participant) => participant.repo === repo);
|
|
86
|
+
const before = release?.before.find((spec) => spec.stage === item.stage);
|
|
87
|
+
const after = release?.after.find((spec) => spec.stage === item.stage);
|
|
88
|
+
const oldOutput = before?.type === 'transformation' ? before.outputs[item.output] : undefined;
|
|
89
|
+
const newOutput = after?.type === 'transformation' ? after.outputs[item.output] : undefined;
|
|
90
|
+
const oldColumns = oldOutput ? requireResolvedColumns(oldOutput.columns, `${item.stage}.${item.output}`) : {};
|
|
91
|
+
const newColumns = newOutput ? requireResolvedColumns(newOutput.columns, `${item.stage}.${item.output}`) : {};
|
|
92
|
+
const invalidColumns = item.adopt_existing
|
|
93
|
+
? !before || Boolean(oldOutput) || !newOutput || canonicalJson(Object.keys(item.columns).sort()) !== canonicalJson(Object.keys(newColumns).sort()) || Object.entries(item.columns).some(([name, type]) => type !== newColumns[name]?.type)
|
|
94
|
+
: Object.keys(item.columns).some((column) => !oldColumns[column] || !newColumns[column]);
|
|
95
|
+
if (seen.has(key) || !manifest.rebuild.some((rebuild) => (rebuild.repo ?? rootRepo) === repo && rebuild.stage === item.stage)
|
|
96
|
+
|| invalidColumns) {
|
|
97
|
+
findings.push({ code: 'migration_baseline_invalid', severity: 'error', repo, stage: item.stage, output: item.output,
|
|
98
|
+
message: item.adopt_existing ? 'adoption must describe every unchanged column of a newly declared output on an existing rebuilt stage' : 'baseline corrections must uniquely reference existing columns of participating rebuilt outputs' });
|
|
99
|
+
}
|
|
100
|
+
seen.add(key);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function analyzeParticipant({ analysis, participant }) {
|
|
104
|
+
if (analysis.manifest) {
|
|
105
|
+
for (const before of participant.before) {
|
|
106
|
+
const after = participant.after.find((stage) => stage.stage === before.stage);
|
|
107
|
+
if (!after || after.type !== before.type)
|
|
108
|
+
analysis.findings.push({ code: 'migration_change_unsupported', severity: 'error', repo: participant.repo, stage: before.stage, message: `removing or replacing stage '${before.stage}' is not a column migration` });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const beforeByStage = new Map(participant.before.map((spec) => [spec.stage, spec]));
|
|
112
|
+
for (const proposed of participant.after) {
|
|
113
|
+
const before = beforeByStage.get(proposed.stage);
|
|
114
|
+
// First creation uses the normal deployment path.
|
|
115
|
+
if (before?.type !== 'transformation' || proposed.type !== 'transformation')
|
|
116
|
+
continue;
|
|
117
|
+
for (const [output, diff] of Object.entries(diffContracts(before, proposed).outputs))
|
|
118
|
+
analyzeOutput({ analysis, repo: participant.repo, before, proposed, output, diff });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function validateOutputRebuild({ analysis, context, before, proposed }) {
|
|
122
|
+
const { manifest, findings, rootRepo, catalog, deployTarget } = analysis;
|
|
123
|
+
if (!manifest)
|
|
124
|
+
return;
|
|
125
|
+
const output = proposed.outputs[context.output];
|
|
126
|
+
if (proposed.engine !== 'spark-job' || output.write_pattern !== 'overwrite')
|
|
127
|
+
findings.push({ ...context, code: 'migration_engine_unsupported', severity: 'error', message: 'V1 requires a Spark job capable of fully rebuilding the affected writer scope' });
|
|
128
|
+
if (!manifest.rebuild.some((item) => (item.repo ?? rootRepo) === context.repo && item.stage === proposed.stage))
|
|
129
|
+
findings.push({ ...context, code: 'migration_rebuild_missing', severity: 'error', message: `declare a full_writer_scope rebuild for '${context.repo}:${proposed.stage}'` });
|
|
130
|
+
if (transformationOutputCatalog(before, catalog, deployTarget) !== transformationOutputCatalog(proposed, catalog, deployTarget))
|
|
131
|
+
findings.push({ ...context, code: 'migration_target_changed', severity: 'error', message: 'moving an output to a different physical catalog is not a column migration' });
|
|
132
|
+
}
|
|
133
|
+
function analyzeOutput({ analysis, repo, before, proposed, output, diff }) {
|
|
134
|
+
const oldOutput = before.outputs[output];
|
|
135
|
+
const newOutput = proposed.outputs[output];
|
|
136
|
+
// New outputs are provisioned after their producer runs. Removed outputs
|
|
137
|
+
// cannot be legitimized by declaring a migration for another column.
|
|
138
|
+
if (!oldOutput)
|
|
139
|
+
return;
|
|
140
|
+
const context = { repo, stage: proposed.stage, output, physicalTable: `${transformationOutputCatalog(proposed, analysis.catalog, analysis.deployTarget)}.${output}` };
|
|
141
|
+
const supported = diff.changes.filter((change) => change.code === 'column_added' || change.code === 'type_changed');
|
|
142
|
+
if (analysis.manifest) {
|
|
143
|
+
for (const change of diff.changes) {
|
|
144
|
+
if (change.code === 'column_added' || change.code === 'type_changed' || change.code === 'compatibility_mode_changed')
|
|
145
|
+
continue;
|
|
146
|
+
analysis.findings.push({ ...context, column: change.column, code: 'migration_change_unsupported', severity: 'error', message: `${change.message}; this migration supports column additions and type changes only` });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (!newOutput || supported.length === 0)
|
|
150
|
+
return;
|
|
151
|
+
const oldColumns = requireResolvedColumns(oldOutput.columns, `${before.stage}.${output}`);
|
|
152
|
+
const newColumns = requireResolvedColumns(newOutput.columns, `${proposed.stage}.${output}`);
|
|
153
|
+
validateOutputRebuild({ analysis, context, before, proposed });
|
|
154
|
+
for (const change of supported)
|
|
155
|
+
recordColumnChange({ analysis, context, change, oldColumns, newColumns, scopeColumn: newOutput.write_scope?.column });
|
|
156
|
+
}
|
|
157
|
+
function recordColumnChange({ analysis, context, change, oldColumns, newColumns, scopeColumn }) {
|
|
158
|
+
if (!change.column)
|
|
159
|
+
return;
|
|
160
|
+
const column = newColumns[change.column];
|
|
161
|
+
if (!column)
|
|
162
|
+
return;
|
|
163
|
+
const kind = change.code === 'column_added' ? 'add_column' : 'change_column_type';
|
|
164
|
+
if (analysis.manifest && (column.key || oldColumns[change.column]?.key || scopeColumn === change.column))
|
|
165
|
+
analysis.findings.push({ ...context, column: change.column, code: 'migration_change_unsupported', severity: 'error', message: 'V1 cannot add or change the type of a primary-key or writer-scope column' });
|
|
166
|
+
const key = referenceKey(context.repo, context.stage, context.output, change.column);
|
|
167
|
+
analysis.changes.push({ ...context, column: change.column, kind, oldType: oldColumns[change.column]?.type ?? null, newType: column.type });
|
|
168
|
+
if (!analysis.manifest)
|
|
169
|
+
return;
|
|
170
|
+
if (analysis.declarations.get(key) !== kind)
|
|
171
|
+
analysis.findings.push({ ...context, column: change.column, code: 'migration_change_uncovered', severity: 'error', message: `${change.message}; declare '${kind}' for this column` });
|
|
172
|
+
else
|
|
173
|
+
analysis.consumed.add(key);
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/migrations/contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const MIGRATIONS_DIRECTORY = "migrations";
|
|
3
|
+
/** Execution choice belongs to the approved plan, not a mutable start flag. */
|
|
4
|
+
export declare const migrationExecutionModeSchema: z.ZodEnum<{
|
|
5
|
+
candidate: "candidate";
|
|
6
|
+
in_place: "in_place";
|
|
7
|
+
}>;
|
|
8
|
+
export type MigrationExecutionMode = z.infer<typeof migrationExecutionModeSchema>;
|
|
9
|
+
export declare const MIGRATION_FILE_PATTERN: RegExp;
|
|
10
|
+
export declare const migrationCheckSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
11
|
+
kind: z.ZodLiteral<"row_count">;
|
|
12
|
+
comparison: z.ZodEnum<{
|
|
13
|
+
equal: "equal";
|
|
14
|
+
not_less: "not_less";
|
|
15
|
+
}>;
|
|
16
|
+
output: z.ZodString;
|
|
17
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
18
|
+
stage: z.ZodString;
|
|
19
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
20
|
+
kind: z.ZodLiteral<"unchanged_values">;
|
|
21
|
+
columns: z.ZodArray<z.ZodString>;
|
|
22
|
+
output: z.ZodString;
|
|
23
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
24
|
+
stage: z.ZodString;
|
|
25
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
26
|
+
kind: z.ZodLiteral<"sql_assertion">;
|
|
27
|
+
path: z.ZodString;
|
|
28
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
29
|
+
stage: z.ZodString;
|
|
30
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
31
|
+
kind: z.ZodLiteral<"orm_operation">;
|
|
32
|
+
namespace: z.ZodString;
|
|
33
|
+
operation: z.ZodString;
|
|
34
|
+
}, z.core.$strict>], "kind">;
|
|
35
|
+
export declare const migrationManifestSchema: z.ZodObject<{
|
|
36
|
+
schema_version: z.ZodLiteral<1>;
|
|
37
|
+
id: z.ZodString;
|
|
38
|
+
depends_on: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
39
|
+
participants: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
40
|
+
repo: z.ZodString;
|
|
41
|
+
ref: z.ZodString;
|
|
42
|
+
}, z.core.$strict>>>;
|
|
43
|
+
baseline: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
44
|
+
adopt_existing: z.ZodOptional<z.ZodLiteral<true>>;
|
|
45
|
+
columns: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodEnum<{
|
|
46
|
+
string: "string";
|
|
47
|
+
boolean: "boolean";
|
|
48
|
+
uuid: "uuid";
|
|
49
|
+
int: "int";
|
|
50
|
+
long: "long";
|
|
51
|
+
numeric: "numeric";
|
|
52
|
+
double: "double";
|
|
53
|
+
timestamp: "timestamp";
|
|
54
|
+
date: "date";
|
|
55
|
+
json: "json";
|
|
56
|
+
}>, z.ZodEnum<{
|
|
57
|
+
float: "float";
|
|
58
|
+
timestamp_ntz: "timestamp_ntz";
|
|
59
|
+
array: "array";
|
|
60
|
+
map: "map";
|
|
61
|
+
struct: "struct";
|
|
62
|
+
binary: "binary";
|
|
63
|
+
}>, z.ZodString]>>;
|
|
64
|
+
output: z.ZodString;
|
|
65
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
66
|
+
stage: z.ZodString;
|
|
67
|
+
}, z.core.$strict>>>;
|
|
68
|
+
changes: z.ZodArray<z.ZodObject<{
|
|
69
|
+
kind: z.ZodEnum<{
|
|
70
|
+
add_column: "add_column";
|
|
71
|
+
change_column_type: "change_column_type";
|
|
72
|
+
}>;
|
|
73
|
+
columns: z.ZodArray<z.ZodString>;
|
|
74
|
+
output: z.ZodString;
|
|
75
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
76
|
+
stage: z.ZodString;
|
|
77
|
+
}, z.core.$strict>>;
|
|
78
|
+
rebuild: z.ZodArray<z.ZodObject<{
|
|
79
|
+
mode: z.ZodLiteral<"full_writer_scope">;
|
|
80
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
81
|
+
stage: z.ZodString;
|
|
82
|
+
}, z.core.$strict>>;
|
|
83
|
+
orm: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
84
|
+
repo: z.ZodString;
|
|
85
|
+
ref: z.ZodString;
|
|
86
|
+
path: z.ZodUnion<readonly [z.ZodLiteral<".">, z.ZodString]>;
|
|
87
|
+
namespace: z.ZodString;
|
|
88
|
+
}, z.core.$strict>>>;
|
|
89
|
+
checks: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
90
|
+
kind: z.ZodLiteral<"row_count">;
|
|
91
|
+
comparison: z.ZodEnum<{
|
|
92
|
+
equal: "equal";
|
|
93
|
+
not_less: "not_less";
|
|
94
|
+
}>;
|
|
95
|
+
output: z.ZodString;
|
|
96
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
97
|
+
stage: z.ZodString;
|
|
98
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
99
|
+
kind: z.ZodLiteral<"unchanged_values">;
|
|
100
|
+
columns: z.ZodArray<z.ZodString>;
|
|
101
|
+
output: z.ZodString;
|
|
102
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
103
|
+
stage: z.ZodString;
|
|
104
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
105
|
+
kind: z.ZodLiteral<"sql_assertion">;
|
|
106
|
+
path: z.ZodString;
|
|
107
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
108
|
+
stage: z.ZodString;
|
|
109
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
110
|
+
kind: z.ZodLiteral<"orm_operation">;
|
|
111
|
+
namespace: z.ZodString;
|
|
112
|
+
operation: z.ZodString;
|
|
113
|
+
}, z.core.$strict>], "kind">>>;
|
|
114
|
+
}, z.core.$strict>;
|
|
115
|
+
export type MigrationManifest = z.infer<typeof migrationManifestSchema>;
|
|
116
|
+
export type MigrationCheck = z.infer<typeof migrationCheckSchema>;
|
|
117
|
+
/** Stable predecessor order; referenced history must remain in the repository. */
|
|
118
|
+
export declare function orderMigrationManifests(manifests: readonly MigrationManifest[]): MigrationManifest[];
|
|
119
|
+
export declare function parseMigrationFile(file: string, contents: string): MigrationManifest;
|
|
120
|
+
/** Hash validated semantic contents, not YAML formatting or object key order. */
|
|
121
|
+
export declare function computeMigrationChecksum(manifest: MigrationManifest): string;
|
|
122
|
+
export interface MigrationFinding {
|
|
123
|
+
readonly code: string;
|
|
124
|
+
readonly severity: 'error' | 'warning';
|
|
125
|
+
readonly message: string;
|
|
126
|
+
readonly repo?: string;
|
|
127
|
+
readonly stage?: string;
|
|
128
|
+
readonly output?: string;
|
|
129
|
+
readonly column?: string;
|
|
130
|
+
readonly physicalTable?: string;
|
|
131
|
+
}
|
|
132
|
+
/** The caller supplies successful history for this root repository and target only. */
|
|
133
|
+
export declare function validateMigrationHistory(manifest: MigrationManifest, applied: readonly {
|
|
134
|
+
id: string;
|
|
135
|
+
checksum: string;
|
|
136
|
+
}[]): MigrationFinding[];
|
|
137
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/migrations/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAYvB,eAAO,MAAM,oBAAoB,eAAe,CAAA;AAChD,+EAA+E;AAC/E,eAAO,MAAM,4BAA4B;;;EAAoC,CAAA;AAC7E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAA;AACjF,eAAO,MAAM,sBAAsB,QAA2C,CAAA;AAQ9E,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;4BAQ/B,CAAA;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAqClC,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AACvE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE,kFAAkF;AAClF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAmBpG;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAYpF;AAED,iFAAiF;AACjF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAE5E;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAA;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,uFAAuF;AACvF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,gBAAgB,EAAE,CAQ9I"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { load as loadYaml } from 'js-yaml';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { repoRelativePathSchema } from '../bodies/ingestion.js';
|
|
5
|
+
import { outputAssetNameSchema } from '../bodies/transformation.js';
|
|
6
|
+
import { columnIdentifierSchema, identifierSchema } from '../columns.js';
|
|
7
|
+
import { MAX_SPEC_FILE_BYTES } from '../constants.js';
|
|
8
|
+
import { stageIdSchema } from '../envelope.js';
|
|
9
|
+
import { SpecDefinitionError } from '../errors.js';
|
|
10
|
+
import { canonicalJson } from '../hash.js';
|
|
11
|
+
import { formatSpecIssues } from '../issues.js';
|
|
12
|
+
import { scanForCredentialLikeStrings } from '../secret-scan.js';
|
|
13
|
+
import { pipelineTypeSchema } from '../types.js';
|
|
14
|
+
export const MIGRATIONS_DIRECTORY = 'migrations';
|
|
15
|
+
/** Execution choice belongs to the approved plan, not a mutable start flag. */
|
|
16
|
+
export const migrationExecutionModeSchema = z.enum(['candidate', 'in_place']);
|
|
17
|
+
export const MIGRATION_FILE_PATTERN = /^migrations\/([a-z][a-z0-9-]*)\.ya?ml$/;
|
|
18
|
+
const repoSchema = z.string().max(255).regex(/^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_-]+$/, 'must be a namespace/repository name');
|
|
19
|
+
const pipelineRepoSchema = z.string().max(255).regex(/^pipelines\/[a-z][a-z0-9-]*$/, 'must be a pipelines/<domain> repository');
|
|
20
|
+
const refSchema = z.string().min(1).max(255).refine((ref) => !/[\s\x00-\x1f]/.test(ref), 'must be a git revision without whitespace');
|
|
21
|
+
const uniqueColumns = z.array(columnIdentifierSchema).min(1).refine((columns) => new Set(columns).size === columns.length, 'columns must be unique');
|
|
22
|
+
const stageReference = { repo: pipelineRepoSchema.optional(), stage: stageIdSchema };
|
|
23
|
+
const outputReference = { ...stageReference, output: outputAssetNameSchema };
|
|
24
|
+
export const migrationCheckSchema = z.discriminatedUnion('kind', [
|
|
25
|
+
z.strictObject({ ...outputReference, kind: z.literal('row_count'), comparison: z.enum(['equal', 'not_less']) }),
|
|
26
|
+
z.strictObject({ ...outputReference, kind: z.literal('unchanged_values'), columns: uniqueColumns }),
|
|
27
|
+
// Files are read at the pinned commit. The executor uses a read-only identity;
|
|
28
|
+
// recognizing SELECT text is not a security boundary. Only aggregate pass/fail
|
|
29
|
+
// evidence is retained, never arbitrary query results or example customer rows.
|
|
30
|
+
z.strictObject({ ...stageReference, kind: z.literal('sql_assertion'), path: repoRelativePathSchema }),
|
|
31
|
+
z.strictObject({ kind: z.literal('orm_operation'), namespace: identifierSchema, operation: z.string().regex(/^[_A-Za-z][_0-9A-Za-z]*$/, 'must be a GraphQL operation name') }),
|
|
32
|
+
]);
|
|
33
|
+
export const migrationManifestSchema = z.strictObject({
|
|
34
|
+
schema_version: z.literal(1),
|
|
35
|
+
id: stageIdSchema,
|
|
36
|
+
depends_on: z.array(stageIdSchema).default([]),
|
|
37
|
+
participants: z.array(z.strictObject({ repo: pipelineRepoSchema, ref: refSchema })).default([]),
|
|
38
|
+
/** Explicit observed types when an earlier deployment declaration was wrong.
|
|
39
|
+
* These describe the starting state, never a second source of desired types.
|
|
40
|
+
* Optional (no default) preserves the checksums of historical manifests.
|
|
41
|
+
*/
|
|
42
|
+
baseline: z.array(z.strictObject({
|
|
43
|
+
...outputReference,
|
|
44
|
+
/** Register an existing, previously undeclared output without changing
|
|
45
|
+
* its data contract. Every physical column must be described. */
|
|
46
|
+
adopt_existing: z.literal(true).optional(),
|
|
47
|
+
columns: z.record(columnIdentifierSchema, pipelineTypeSchema).refine((columns) => Object.keys(columns).length > 0, 'baseline needs at least one observed column'),
|
|
48
|
+
})).min(1).optional(),
|
|
49
|
+
changes: z.array(z.strictObject({
|
|
50
|
+
...outputReference,
|
|
51
|
+
kind: z.enum(['add_column', 'change_column_type']),
|
|
52
|
+
columns: uniqueColumns,
|
|
53
|
+
})).min(1),
|
|
54
|
+
rebuild: z.array(z.strictObject({ ...stageReference, mode: z.literal('full_writer_scope') })).min(1),
|
|
55
|
+
orm: z.array(z.strictObject({ repo: repoSchema, ref: refSchema, path: z.union([z.literal('.'), repoRelativePathSchema]), namespace: identifierSchema })).default([]),
|
|
56
|
+
checks: z.array(migrationCheckSchema).default([]),
|
|
57
|
+
}).superRefine((manifest, ctx) => {
|
|
58
|
+
const unique = (values, path) => {
|
|
59
|
+
if (new Set(values).size !== values.length)
|
|
60
|
+
ctx.addIssue({ code: 'custom', path: [path], message: `duplicate migration ${path} declaration` });
|
|
61
|
+
};
|
|
62
|
+
unique(manifest.depends_on, 'depends_on');
|
|
63
|
+
if (manifest.depends_on.includes(manifest.id))
|
|
64
|
+
ctx.addIssue({ code: 'custom', path: ['depends_on'], message: 'a migration cannot depend on itself' });
|
|
65
|
+
unique(manifest.participants.map((participant) => participant.repo), 'participants');
|
|
66
|
+
unique(manifest.orm.map((project) => project.namespace), 'orm');
|
|
67
|
+
unique(manifest.rebuild.map((item) => canonicalJson([item.repo ?? '', item.stage])), 'rebuild');
|
|
68
|
+
unique((manifest.baseline ?? []).map((item) => canonicalJson([item.repo ?? '', item.stage, item.output])), 'baseline');
|
|
69
|
+
// One operation per column, including conflicting kinds, must be unambiguous.
|
|
70
|
+
unique(manifest.changes.flatMap((item) => item.columns.map((column) => canonicalJson([item.repo ?? '', item.stage, item.output, column]))), 'changes');
|
|
71
|
+
for (const finding of scanForCredentialLikeStrings(manifest))
|
|
72
|
+
ctx.addIssue({ code: 'custom', path: [...finding.segments], message: finding.reason });
|
|
73
|
+
});
|
|
74
|
+
/** Stable predecessor order; referenced history must remain in the repository. */
|
|
75
|
+
export function orderMigrationManifests(manifests) {
|
|
76
|
+
const byId = new Map(manifests.map((manifest) => [manifest.id, manifest]));
|
|
77
|
+
if (byId.size !== manifests.length)
|
|
78
|
+
throw new SpecDefinitionError('duplicate migration id');
|
|
79
|
+
const ordered = [];
|
|
80
|
+
const visiting = [];
|
|
81
|
+
const visited = new Set();
|
|
82
|
+
const visit = (id) => {
|
|
83
|
+
if (visited.has(id))
|
|
84
|
+
return;
|
|
85
|
+
if (visiting.includes(id))
|
|
86
|
+
throw new SpecDefinitionError(`migration dependency cycle: ${[...visiting, id].join(' → ')}`);
|
|
87
|
+
const manifest = byId.get(id);
|
|
88
|
+
if (!manifest)
|
|
89
|
+
throw new SpecDefinitionError(`migration predecessor '${id}' is missing; retain applied migration files in the repository`);
|
|
90
|
+
visiting.push(id);
|
|
91
|
+
for (const predecessor of [...manifest.depends_on].sort())
|
|
92
|
+
visit(predecessor);
|
|
93
|
+
visiting.pop();
|
|
94
|
+
visited.add(id);
|
|
95
|
+
ordered.push(manifest);
|
|
96
|
+
};
|
|
97
|
+
for (const id of [...byId.keys()].sort())
|
|
98
|
+
visit(id);
|
|
99
|
+
return ordered;
|
|
100
|
+
}
|
|
101
|
+
export function parseMigrationFile(file, contents) {
|
|
102
|
+
const match = MIGRATION_FILE_PATTERN.exec(file);
|
|
103
|
+
if (!match)
|
|
104
|
+
throw new SpecDefinitionError('expected migrations/<id>.yml', file);
|
|
105
|
+
if (Buffer.byteLength(contents, 'utf8') > MAX_SPEC_FILE_BYTES)
|
|
106
|
+
throw new SpecDefinitionError(`exceeds the maximum spec file size of ${MAX_SPEC_FILE_BYTES} bytes`, file);
|
|
107
|
+
let source;
|
|
108
|
+
try {
|
|
109
|
+
source = loadYaml(contents);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
throw new SpecDefinitionError(error instanceof Error ? error.message : 'invalid YAML', file);
|
|
113
|
+
}
|
|
114
|
+
const parsed = migrationManifestSchema.safeParse(source);
|
|
115
|
+
if (!parsed.success)
|
|
116
|
+
throw new SpecDefinitionError(formatSpecIssues(parsed.error), file);
|
|
117
|
+
if (parsed.data.id !== match[1])
|
|
118
|
+
throw new SpecDefinitionError(`migration id '${parsed.data.id}' must match the file basename '${match[1]}'`, file, 'id');
|
|
119
|
+
return parsed.data;
|
|
120
|
+
}
|
|
121
|
+
/** Hash validated semantic contents, not YAML formatting or object key order. */
|
|
122
|
+
export function computeMigrationChecksum(manifest) {
|
|
123
|
+
return createHash('sha256').update('pipeline-migration:v1\0').update(canonicalJson(manifest)).digest('hex');
|
|
124
|
+
}
|
|
125
|
+
/** The caller supplies successful history for this root repository and target only. */
|
|
126
|
+
export function validateMigrationHistory(manifest, applied) {
|
|
127
|
+
const findings = [];
|
|
128
|
+
const existing = applied.find((entry) => entry.id === manifest.id);
|
|
129
|
+
if (existing && existing.checksum !== computeMigrationChecksum(manifest))
|
|
130
|
+
findings.push({ code: 'migration_id_changed', severity: 'error', message: `applied migration '${manifest.id}' has different contents; create a new migration id` });
|
|
131
|
+
for (const predecessor of manifest.depends_on) {
|
|
132
|
+
if (!applied.some((entry) => entry.id === predecessor))
|
|
133
|
+
findings.push({ code: 'migration_predecessor_missing', severity: 'error', message: `migration '${predecessor}' must succeed in this target before '${manifest.id}'` });
|
|
134
|
+
}
|
|
135
|
+
return findings;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/migrations/manifest.ts"],"names":[],"mappings":"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"}
|