@tiangong-lca/cli 0.0.23 → 0.0.25
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 +48 -8
- package/dist/src/cli.js +213 -12
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-alias-request.js +99 -0
- package/dist/src/lib/dataset-maintenance-alias-request.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-apply.js +247 -337
- package/dist/src/lib/dataset-maintenance-apply.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-contract.js +118 -16
- package/dist/src/lib/dataset-maintenance-contract.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-derivatives.js +265 -0
- package/dist/src/lib/dataset-maintenance-derivatives.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-plan.js +38 -6
- package/dist/src/lib/dataset-maintenance-plan.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-contract.js +918 -0
- package/dist/src/lib/dataset-maintenance-protected-contract.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-protected-run.js +771 -0
- package/dist/src/lib/dataset-maintenance-protected-run.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-protected-verify.js +435 -0
- package/dist/src/lib/dataset-maintenance-protected-verify.js.map +1 -0
- package/dist/src/lib/dataset-maintenance-remote.js +140 -1
- package/dist/src/lib/dataset-maintenance-remote.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-verify.js +309 -3
- package/dist/src/lib/dataset-maintenance-verify.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { CliError } from './errors.js';
|
|
2
|
+
import { isJsonObject, readJsonFile, resolveMaintenancePlanArtifactPath, sha256Json, } from './dataset-maintenance-contract.js';
|
|
3
|
+
export function loadMaintenanceDesiredPayload(planDir, action) {
|
|
4
|
+
if (!action.desired_payload) {
|
|
5
|
+
throw new CliError(`Maintenance action lacks desired payload: ${action.action_id}`, {
|
|
6
|
+
code: 'DATASET_MAINTENANCE_PLAN_INVALID',
|
|
7
|
+
exitCode: 2,
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
const payloadPath = resolveMaintenancePlanArtifactPath(planDir, action.desired_payload.path, 'Maintenance desired payload path');
|
|
11
|
+
const payload = readJsonFile(payloadPath, 'Maintenance desired payload');
|
|
12
|
+
if (!isJsonObject(payload) || sha256Json(payload) !== action.desired_payload.sha256) {
|
|
13
|
+
throw new CliError(`Desired payload hash mismatch for action ${action.action_id}.`, {
|
|
14
|
+
code: 'DATASET_MAINTENANCE_DESIRED_PAYLOAD_HASH_MISMATCH',
|
|
15
|
+
exitCode: 1,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return payload;
|
|
19
|
+
}
|
|
20
|
+
export function orderedAliasBatches(plan) {
|
|
21
|
+
const time = plan.alias_batches?.find((batch) => batch.dimension === 'time');
|
|
22
|
+
const lengthTime = plan.alias_batches?.find((batch) => batch.dimension === 'length_time');
|
|
23
|
+
return [time, lengthTime].filter((batch) => batch !== undefined);
|
|
24
|
+
}
|
|
25
|
+
export function buildAliasBatchRequest(options) {
|
|
26
|
+
if (options.plan.target_mode !== 'owner_draft') {
|
|
27
|
+
throw new CliError('Alias batch request requires target_mode=owner_draft.', {
|
|
28
|
+
code: 'DATASET_MAINTENANCE_TARGET_MODE_INVALID',
|
|
29
|
+
exitCode: 2,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const targetSnapshot = (snapshot) => ({
|
|
33
|
+
id: snapshot.id,
|
|
34
|
+
version: snapshot.version,
|
|
35
|
+
expected_modified_at: snapshot.modified_at,
|
|
36
|
+
expected_json_ordered: snapshot.json_ordered,
|
|
37
|
+
});
|
|
38
|
+
const actions = options.batch.action_ids.map((actionId) => {
|
|
39
|
+
const action = options.plan.actions.find((entry) => entry.action_id === actionId);
|
|
40
|
+
if (!action?.before || !action.alias_mutation) {
|
|
41
|
+
throw new CliError(`Alias action is incomplete: ${actionId}`, {
|
|
42
|
+
code: 'DATASET_MAINTENANCE_ALIAS_PLAN_INVALID',
|
|
43
|
+
exitCode: 2,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
action_id: action.action_id,
|
|
48
|
+
action: 'update_json_ordered',
|
|
49
|
+
table: action.table,
|
|
50
|
+
id: action.id,
|
|
51
|
+
version: action.version,
|
|
52
|
+
expected_state_code: 0,
|
|
53
|
+
expected_modified_at: action.before.modified_at,
|
|
54
|
+
expected_json_ordered: action.before.json_ordered,
|
|
55
|
+
desired_json_ordered: loadMaintenanceDesiredPayload(options.planDir, action),
|
|
56
|
+
mutation: action.alias_mutation,
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
schema_version: 'dataset-alias-batch.v1',
|
|
61
|
+
target_visibility: 'owner_draft',
|
|
62
|
+
plan_sha256: options.plan.plan_sha256,
|
|
63
|
+
operation_id: options.plan.operation_id,
|
|
64
|
+
batch_id: options.batch.batch_id,
|
|
65
|
+
dimension: options.batch.dimension,
|
|
66
|
+
factor: options.batch.factor,
|
|
67
|
+
target: {
|
|
68
|
+
flowproperty: targetSnapshot(options.batch.target_snapshots.flowproperty),
|
|
69
|
+
unitgroup: targetSnapshot(options.batch.target_snapshots.unitgroup),
|
|
70
|
+
source_unitgroup: targetSnapshot(options.batch.target_snapshots.source_unitgroup),
|
|
71
|
+
},
|
|
72
|
+
actions,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export function buildAliasPlanRequest(options) {
|
|
76
|
+
if (options.plan.target_mode !== 'owner_draft') {
|
|
77
|
+
throw new CliError('Alias plan request requires target_mode=owner_draft.', {
|
|
78
|
+
code: 'DATASET_MAINTENANCE_TARGET_MODE_INVALID',
|
|
79
|
+
exitCode: 2,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const batches = orderedAliasBatches(options.plan);
|
|
83
|
+
if (batches.length !== 2 ||
|
|
84
|
+
batches[0]?.dimension !== 'time' ||
|
|
85
|
+
batches[1]?.dimension !== 'length_time') {
|
|
86
|
+
throw new CliError('Alias plan request requires time followed by length_time exactly once.', {
|
|
87
|
+
code: 'DATASET_MAINTENANCE_ALIAS_PLAN_INVALID',
|
|
88
|
+
exitCode: 2,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
schema_version: 'dataset-alias-plan.v1',
|
|
93
|
+
plan_sha256: options.plan.plan_sha256,
|
|
94
|
+
operation_id: options.plan.operation_id,
|
|
95
|
+
target_visibility: 'owner_draft',
|
|
96
|
+
batches: batches.map((batch) => buildAliasBatchRequest({ plan: options.plan, batch, planDir: options.planDir })),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=dataset-maintenance-alias-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset-maintenance-alias-request.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-alias-request.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport {\n isJsonObject,\n readJsonFile,\n resolveMaintenancePlanArtifactPath,\n sha256Json,\n type DatasetMaintenanceAliasBatchPlan,\n type DatasetMaintenancePlan,\n type DatasetMaintenancePlanAction,\n type JsonObject,\n} from './dataset-maintenance-contract.js';\n\nexport function loadMaintenanceDesiredPayload(\n planDir: string,\n action: DatasetMaintenancePlanAction,\n): JsonObject {\n if (!action.desired_payload) {\n throw new CliError(`Maintenance action lacks desired payload: ${action.action_id}`, {\n code: 'DATASET_MAINTENANCE_PLAN_INVALID',\n exitCode: 2,\n });\n }\n const payloadPath = resolveMaintenancePlanArtifactPath(\n planDir,\n action.desired_payload.path,\n 'Maintenance desired payload path',\n );\n const payload = readJsonFile(payloadPath, 'Maintenance desired payload');\n if (!isJsonObject(payload) || sha256Json(payload) !== action.desired_payload.sha256) {\n throw new CliError(`Desired payload hash mismatch for action ${action.action_id}.`, {\n code: 'DATASET_MAINTENANCE_DESIRED_PAYLOAD_HASH_MISMATCH',\n exitCode: 1,\n });\n }\n return payload;\n}\n\nexport function orderedAliasBatches(\n plan: DatasetMaintenancePlan,\n): DatasetMaintenanceAliasBatchPlan[] {\n const time = plan.alias_batches?.find((batch) => batch.dimension === 'time');\n const lengthTime = plan.alias_batches?.find((batch) => batch.dimension === 'length_time');\n return [time, lengthTime].filter(\n (batch): batch is DatasetMaintenanceAliasBatchPlan => batch !== undefined,\n );\n}\n\nexport function buildAliasBatchRequest(options: {\n plan: DatasetMaintenancePlan;\n batch: DatasetMaintenanceAliasBatchPlan;\n planDir: string;\n}): JsonObject {\n if (options.plan.target_mode !== 'owner_draft') {\n throw new CliError('Alias batch request requires target_mode=owner_draft.', {\n code: 'DATASET_MAINTENANCE_TARGET_MODE_INVALID',\n exitCode: 2,\n });\n }\n const targetSnapshot = (\n snapshot: NonNullable<DatasetMaintenanceAliasBatchPlan['target_snapshots']['unitgroup']>,\n ): JsonObject => ({\n id: snapshot.id,\n version: snapshot.version,\n expected_modified_at: snapshot.modified_at!,\n expected_json_ordered: snapshot.json_ordered!,\n });\n const actions = options.batch.action_ids.map((actionId) => {\n const action = options.plan.actions.find((entry) => entry.action_id === actionId);\n if (!action?.before || !action.alias_mutation) {\n throw new CliError(`Alias action is incomplete: ${actionId}`, {\n code: 'DATASET_MAINTENANCE_ALIAS_PLAN_INVALID',\n exitCode: 2,\n });\n }\n return {\n action_id: action.action_id,\n action: 'update_json_ordered',\n table: action.table,\n id: action.id,\n version: action.version,\n expected_state_code: 0,\n expected_modified_at: action.before.modified_at!,\n expected_json_ordered: action.before.json_ordered!,\n desired_json_ordered: loadMaintenanceDesiredPayload(options.planDir, action),\n mutation: action.alias_mutation,\n };\n });\n return {\n schema_version: 'dataset-alias-batch.v1',\n target_visibility: 'owner_draft',\n plan_sha256: options.plan.plan_sha256,\n operation_id: options.plan.operation_id,\n batch_id: options.batch.batch_id,\n dimension: options.batch.dimension,\n factor: options.batch.factor,\n target: {\n flowproperty: targetSnapshot(options.batch.target_snapshots.flowproperty!),\n unitgroup: targetSnapshot(options.batch.target_snapshots.unitgroup!),\n source_unitgroup: targetSnapshot(options.batch.target_snapshots.source_unitgroup!),\n },\n actions,\n };\n}\n\nexport function buildAliasPlanRequest(options: {\n plan: DatasetMaintenancePlan;\n planDir: string;\n}): JsonObject {\n if (options.plan.target_mode !== 'owner_draft') {\n throw new CliError('Alias plan request requires target_mode=owner_draft.', {\n code: 'DATASET_MAINTENANCE_TARGET_MODE_INVALID',\n exitCode: 2,\n });\n }\n const batches = orderedAliasBatches(options.plan);\n if (\n batches.length !== 2 ||\n batches[0]?.dimension !== 'time' ||\n batches[1]?.dimension !== 'length_time'\n ) {\n throw new CliError('Alias plan request requires time followed by length_time exactly once.', {\n code: 'DATASET_MAINTENANCE_ALIAS_PLAN_INVALID',\n exitCode: 2,\n });\n }\n return {\n schema_version: 'dataset-alias-plan.v1',\n plan_sha256: options.plan.plan_sha256,\n operation_id: options.plan.operation_id,\n target_visibility: 'owner_draft',\n batches: batches.map((batch) =>\n buildAliasBatchRequest({ plan: options.plan, batch, planDir: options.planDir }),\n ),\n };\n}\n"]}
|