@bilig/workbook 0.42.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.
@@ -0,0 +1,232 @@
1
+ export const workbookReadbackIssueCodes = Object.freeze([
2
+ 'readback_missing',
3
+ 'duplicate_readback',
4
+ 'value_mismatch',
5
+ 'values_mismatch',
6
+ 'formula_mismatch',
7
+ 'formulas_mismatch',
8
+ ]);
9
+ export function isWorkbookReadbackIssueCode(value) {
10
+ return typeof value === 'string' && workbookReadbackIssueCodes.some((code) => code === value);
11
+ }
12
+ function refKey(ref) {
13
+ return `${ref.kind}:${ref.id}`;
14
+ }
15
+ function readbackKey(readback) {
16
+ return refKey(readback.target);
17
+ }
18
+ function findReadback(readbacks, target) {
19
+ return readbacks.get(refKey(target));
20
+ }
21
+ function hasValue(readback) {
22
+ return Object.prototype.hasOwnProperty.call(readback, 'value');
23
+ }
24
+ function hasFormula(readback) {
25
+ return Object.prototype.hasOwnProperty.call(readback, 'formula');
26
+ }
27
+ function scalarValue(readback) {
28
+ if (hasValue(readback)) {
29
+ return readback.value;
30
+ }
31
+ if (readback.values?.length === 1 && readback.values[0]?.length === 1) {
32
+ return readback.values[0][0];
33
+ }
34
+ return undefined;
35
+ }
36
+ function scalarFormula(readback) {
37
+ if (hasFormula(readback)) {
38
+ return readback.formula;
39
+ }
40
+ if (readback.formulas?.length === 1 && readback.formulas[0]?.length === 1) {
41
+ return readback.formulas[0][0];
42
+ }
43
+ return undefined;
44
+ }
45
+ function valuesMatrix(readback) {
46
+ if (readback.values !== undefined) {
47
+ return readback.values;
48
+ }
49
+ return hasValue(readback) ? [[readback.value]] : undefined;
50
+ }
51
+ function formulasMatrix(readback) {
52
+ if (readback.formulas !== undefined) {
53
+ return readback.formulas;
54
+ }
55
+ return hasFormula(readback) ? [[readback.formula]] : undefined;
56
+ }
57
+ function sameMatrix(left, right) {
58
+ return (left.length === right.length &&
59
+ left.every((leftRow, rowIndex) => leftRow.length === right[rowIndex]?.length &&
60
+ leftRow.every((leftValue, colIndex) => Object.is(leftValue, right[rowIndex]?.[colIndex]))));
61
+ }
62
+ function issue(input) {
63
+ return input;
64
+ }
65
+ function missingReadback(check) {
66
+ return issue({
67
+ code: 'readback_missing',
68
+ check,
69
+ ...(check.target !== undefined ? { target: check.target } : {}),
70
+ message: `${check.target?.label ?? check.kind} has no readback`,
71
+ });
72
+ }
73
+ function duplicateReadback(check, readback) {
74
+ return issue({
75
+ code: 'duplicate_readback',
76
+ check,
77
+ target: readback.target,
78
+ message: `${readback.target.label} has more than one readback`,
79
+ });
80
+ }
81
+ function valueMismatch(check, expected, actual) {
82
+ return issue({
83
+ code: 'value_mismatch',
84
+ check,
85
+ ...(check.target !== undefined ? { target: check.target } : {}),
86
+ expected,
87
+ ...(actual !== undefined ? { actual } : {}),
88
+ message: actual === undefined
89
+ ? `${check.target?.label ?? check.kind} has no value readback`
90
+ : `${check.target?.label ?? check.kind} expected value ${JSON.stringify(expected)} but read ${JSON.stringify(actual)}`,
91
+ });
92
+ }
93
+ function valuesMismatch(check, expected, actual) {
94
+ return issue({
95
+ code: 'values_mismatch',
96
+ check,
97
+ ...(check.target !== undefined ? { target: check.target } : {}),
98
+ expected,
99
+ ...(actual !== undefined ? { actual } : {}),
100
+ message: actual === undefined
101
+ ? `${check.target?.label ?? check.kind} has no values readback`
102
+ : `${check.target?.label ?? check.kind} expected values ${JSON.stringify(expected)} but read ${JSON.stringify(actual)}`,
103
+ });
104
+ }
105
+ function formulaMismatch(check, expected, actual) {
106
+ return issue({
107
+ code: 'formula_mismatch',
108
+ check,
109
+ ...(check.target !== undefined ? { target: check.target } : {}),
110
+ expected,
111
+ ...(actual !== undefined ? { actual } : {}),
112
+ message: actual === undefined
113
+ ? `${check.target?.label ?? check.kind} has no formula readback`
114
+ : `${check.target?.label ?? check.kind} expected formula ${expected} but read ${actual ?? 'null'}`,
115
+ });
116
+ }
117
+ function formulasMismatch(check, expected, actual) {
118
+ return issue({
119
+ code: 'formulas_mismatch',
120
+ check,
121
+ ...(check.target !== undefined ? { target: check.target } : {}),
122
+ expected,
123
+ ...(actual !== undefined ? { actual } : {}),
124
+ message: actual === undefined
125
+ ? `${check.target?.label ?? check.kind} has no formulas readback`
126
+ : `${check.target?.label ?? check.kind} expected formulas ${JSON.stringify(expected)} but read ${JSON.stringify(actual)}`,
127
+ });
128
+ }
129
+ function checked(check, status) {
130
+ return {
131
+ ...check,
132
+ status,
133
+ };
134
+ }
135
+ function verifyCheck(check, readbacks) {
136
+ if (check.expectation === undefined) {
137
+ return { check };
138
+ }
139
+ if (check.target === undefined) {
140
+ return {
141
+ check: checked(check, 'failed'),
142
+ issue: missingReadback(check),
143
+ };
144
+ }
145
+ const readback = findReadback(readbacks, check.target);
146
+ if (readback === undefined) {
147
+ return {
148
+ check: checked(check, 'failed'),
149
+ issue: missingReadback(check),
150
+ };
151
+ }
152
+ if (check.expectation.kind === 'valueEquals') {
153
+ const actual = scalarValue(readback);
154
+ if (actual !== check.expectation.value) {
155
+ return {
156
+ check: checked(check, 'failed'),
157
+ issue: valueMismatch(check, check.expectation.value, actual),
158
+ };
159
+ }
160
+ return { check: checked(check, 'passed') };
161
+ }
162
+ if (check.expectation.kind === 'valuesEqual') {
163
+ const actual = valuesMatrix(readback);
164
+ if (actual === undefined || !sameMatrix(actual, check.expectation.values)) {
165
+ return {
166
+ check: checked(check, 'failed'),
167
+ issue: valuesMismatch(check, check.expectation.values, actual),
168
+ };
169
+ }
170
+ return { check: checked(check, 'passed') };
171
+ }
172
+ if (check.expectation.kind === 'formulaEquals') {
173
+ const actual = scalarFormula(readback);
174
+ if (actual !== check.expectation.formula) {
175
+ return {
176
+ check: checked(check, 'failed'),
177
+ issue: formulaMismatch(check, check.expectation.formula, actual),
178
+ };
179
+ }
180
+ return { check: checked(check, 'passed') };
181
+ }
182
+ const actual = formulasMatrix(readback);
183
+ if (actual === undefined || !sameMatrix(actual, check.expectation.formulas)) {
184
+ return {
185
+ check: checked(check, 'failed'),
186
+ issue: formulasMismatch(check, check.expectation.formulas, actual),
187
+ };
188
+ }
189
+ return { check: checked(check, 'passed') };
190
+ }
191
+ export function verifyWorkbookReadbacks(checks, readbacks) {
192
+ const readbackByTarget = new Map();
193
+ const duplicateReadbacks = new Map();
194
+ readbacks.forEach((readback) => {
195
+ const key = readbackKey(readback);
196
+ if (readbackByTarget.has(key)) {
197
+ duplicateReadbacks.set(key, readback);
198
+ return;
199
+ }
200
+ readbackByTarget.set(key, readback);
201
+ });
202
+ const verifiedChecks = [];
203
+ const issues = [];
204
+ checks.forEach((check, checkIndex) => {
205
+ if (check.target !== undefined) {
206
+ const duplicate = duplicateReadbacks.get(refKey(check.target));
207
+ if (duplicate !== undefined) {
208
+ const failedCheck = checked(check, 'failed');
209
+ verifiedChecks.push(failedCheck);
210
+ issues.push({
211
+ ...duplicateReadback(failedCheck, duplicate),
212
+ path: `checks[${String(checkIndex)}]`,
213
+ });
214
+ return;
215
+ }
216
+ }
217
+ const result = verifyCheck(check, readbackByTarget);
218
+ verifiedChecks.push(result.check);
219
+ if (result.issue !== undefined) {
220
+ issues.push({
221
+ ...result.issue,
222
+ path: `checks[${String(checkIndex)}]`,
223
+ });
224
+ }
225
+ });
226
+ return {
227
+ status: issues.length === 0 ? 'passed' : 'failed',
228
+ checks: verifiedChecks,
229
+ issues,
230
+ };
231
+ }
232
+ //# sourceMappingURL=readback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readback.js","sourceRoot":"","sources":["../src/readback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type WorkbookCheckExpectationDescription, type WorkbookRefDescription } from './describe.js';
2
+ import type { WorkbookActionPlan } from './model.js';
3
+ import type { EngineOp } from './ops.js';
4
+ export type WorkbookRuntimeRequirementKind = 'apply' | 'read' | 'verify';
5
+ export type WorkbookRuntimeCapability = 'writeFormula' | 'writeValue' | 'format' | 'clear' | 'applyOp' | 'read' | 'verifyCheck';
6
+ export type WorkbookRuntimeMaterialization = 'concreteOp' | 'adapterMaterialization' | 'providedOp';
7
+ export interface WorkbookRuntimeRequirement {
8
+ readonly kind: WorkbookRuntimeRequirementKind;
9
+ readonly capability: WorkbookRuntimeCapability;
10
+ readonly path: string;
11
+ readonly message: string;
12
+ readonly materialization?: WorkbookRuntimeMaterialization;
13
+ readonly commandIndex?: number;
14
+ readonly checkIndex?: number;
15
+ readonly opIndex?: number;
16
+ readonly opIndexes?: readonly number[];
17
+ readonly opKind?: string;
18
+ readonly checkKind?: string;
19
+ readonly target?: WorkbookRefDescription;
20
+ readonly refs?: readonly WorkbookRefDescription[];
21
+ readonly expectation?: WorkbookCheckExpectationDescription;
22
+ }
23
+ export interface WorkbookRuntimeRequirements {
24
+ readonly modelName: string;
25
+ readonly actionName: string;
26
+ readonly requirements: readonly WorkbookRuntimeRequirement[];
27
+ }
28
+ export interface WorkbookRuntimePreview {
29
+ readonly modelName: string;
30
+ readonly actionName: string;
31
+ readonly requirements: readonly WorkbookRuntimeRequirement[];
32
+ readonly materializedOps: readonly EngineOp[];
33
+ }
34
+ export declare function describeRuntimeRequirements<Refs>(plan: WorkbookActionPlan<Refs>): WorkbookRuntimeRequirements;
@@ -0,0 +1,223 @@
1
+ import { describeRef } from './describe.js';
2
+ function describedRef(ref) {
3
+ return ref === undefined ? {} : { target: describeRef(ref) };
4
+ }
5
+ function describedRefs(refs) {
6
+ return refs === undefined || refs.length === 0 ? {} : { refs: refs.map(describeRef) };
7
+ }
8
+ function commandCapability(command) {
9
+ switch (command.kind) {
10
+ case 'writeFormula':
11
+ return 'writeFormula';
12
+ case 'writeValue':
13
+ return 'writeValue';
14
+ case 'format':
15
+ return 'format';
16
+ case 'clear':
17
+ return 'clear';
18
+ case 'op':
19
+ return 'applyOp';
20
+ }
21
+ }
22
+ function commandRefs(command) {
23
+ return command.kind === 'writeFormula' ? command.inputs : undefined;
24
+ }
25
+ function commandMessage(command) {
26
+ switch (command.kind) {
27
+ case 'writeFormula':
28
+ return `Apply formula write to ${command.target.label}`;
29
+ case 'writeValue':
30
+ return `Apply value write to ${command.target.label}`;
31
+ case 'format':
32
+ return `Apply format to ${command.target.label}`;
33
+ case 'clear':
34
+ return `Apply clear to ${command.target.label}`;
35
+ case 'op':
36
+ return command.target === undefined
37
+ ? `Apply workbook op ${command.op.kind}`
38
+ : `Apply workbook op ${command.op.kind} to ${command.target.label}`;
39
+ }
40
+ }
41
+ function expectationDescription(expectation) {
42
+ if (expectation.kind === 'valueEquals') {
43
+ return {
44
+ kind: 'valueEquals',
45
+ value: expectation.value,
46
+ };
47
+ }
48
+ if (expectation.kind === 'valuesEqual') {
49
+ return {
50
+ kind: 'valuesEqual',
51
+ values: expectation.values.map((row) => [...row]),
52
+ };
53
+ }
54
+ if (expectation.kind === 'formulaEquals') {
55
+ return {
56
+ kind: 'formulaEquals',
57
+ formula: expectation.formula,
58
+ inputs: expectation.inputs.map(describeRef),
59
+ };
60
+ }
61
+ return {
62
+ kind: 'formulasEqual',
63
+ formulas: expectation.formulas.map((row) => [...row]),
64
+ };
65
+ }
66
+ function concreteSingleCell(target) {
67
+ if (target.kind !== 'range') {
68
+ return null;
69
+ }
70
+ const range = target.range;
71
+ return range.startAddress === range.endAddress ? { sheetName: range.sheetName, address: range.startAddress } : null;
72
+ }
73
+ function expectedConcreteOp(command) {
74
+ if (command.kind === 'op') {
75
+ return command.op;
76
+ }
77
+ const target = concreteSingleCell(command.target);
78
+ if (target === null) {
79
+ return null;
80
+ }
81
+ switch (command.kind) {
82
+ case 'writeFormula':
83
+ return {
84
+ kind: 'setCellFormula',
85
+ sheetName: target.sheetName,
86
+ address: target.address,
87
+ formula: command.formula,
88
+ };
89
+ case 'writeValue':
90
+ return {
91
+ kind: 'setCellValue',
92
+ sheetName: target.sheetName,
93
+ address: target.address,
94
+ value: command.value,
95
+ };
96
+ case 'clear':
97
+ return {
98
+ kind: 'clearCell',
99
+ sheetName: target.sheetName,
100
+ address: target.address,
101
+ };
102
+ case 'format':
103
+ if (command.numberFormat === undefined) {
104
+ return null;
105
+ }
106
+ return {
107
+ kind: 'setCellFormat',
108
+ sheetName: target.sheetName,
109
+ address: target.address,
110
+ format: command.numberFormat,
111
+ };
112
+ }
113
+ }
114
+ function opIndexesFor(command, ops) {
115
+ const expected = expectedConcreteOp(command);
116
+ if (expected === null) {
117
+ return [];
118
+ }
119
+ const expectedKey = opKey(expected);
120
+ return ops.flatMap((op, index) => (opKey(op) === expectedKey ? [index] : []));
121
+ }
122
+ function commandMaterialization(command, opIndexes) {
123
+ if (command.kind === 'op') {
124
+ return 'providedOp';
125
+ }
126
+ return opIndexes.length === 0 ? 'adapterMaterialization' : 'concreteOp';
127
+ }
128
+ function commandRequirement(command, commandIndex, ops) {
129
+ const opIndexes = opIndexesFor(command, ops);
130
+ return {
131
+ kind: 'apply',
132
+ capability: commandCapability(command),
133
+ path: `commands[${String(commandIndex)}]`,
134
+ commandIndex,
135
+ materialization: commandMaterialization(command, opIndexes),
136
+ ...(opIndexes.length > 0 ? { opIndexes } : {}),
137
+ ...(command.kind === 'op' ? { opKind: command.op.kind } : {}),
138
+ ...describedRef(command.target),
139
+ ...describedRefs(commandRefs(command)),
140
+ message: commandMessage(command),
141
+ };
142
+ }
143
+ function readRequirement(check, checkIndex) {
144
+ if (check.expectation === undefined) {
145
+ return null;
146
+ }
147
+ return {
148
+ kind: 'read',
149
+ capability: 'read',
150
+ path: `checks[${String(checkIndex)}]`,
151
+ checkIndex,
152
+ checkKind: check.kind,
153
+ ...describedRef(check.target),
154
+ ...describedRefs(check.expectation.kind === 'formulaEquals' ? check.expectation.inputs : undefined),
155
+ expectation: expectationDescription(check.expectation),
156
+ message: `Read ${check.target?.label ?? check.kind} for ${check.expectation.kind}`,
157
+ };
158
+ }
159
+ function verifyRequirement(check, checkIndex) {
160
+ if (check.expectation !== undefined) {
161
+ return null;
162
+ }
163
+ return {
164
+ kind: 'verify',
165
+ capability: 'verifyCheck',
166
+ path: `checks[${String(checkIndex)}]`,
167
+ checkIndex,
168
+ checkKind: check.kind,
169
+ ...describedRef(check.target),
170
+ ...describedRefs(check.refs),
171
+ message: `Verify ${check.kind} for ${check.target?.label ?? check.kind}`,
172
+ };
173
+ }
174
+ function canonicalValue(value) {
175
+ if (Array.isArray(value)) {
176
+ return value.map(canonicalValue);
177
+ }
178
+ if (typeof value === 'object' && value !== null) {
179
+ return Object.fromEntries(Object.entries(value)
180
+ .toSorted(([left], [right]) => left.localeCompare(right))
181
+ .map(([key, entry]) => [key, canonicalValue(entry)]));
182
+ }
183
+ return value;
184
+ }
185
+ function opKey(op) {
186
+ return JSON.stringify(canonicalValue(op));
187
+ }
188
+ export function describeRuntimeRequirements(plan) {
189
+ const requirements = plan.commands.map((command, commandIndex) => commandRequirement(command, commandIndex, plan.ops));
190
+ const commandBackedOpIndexes = new Set(plan.commands.flatMap((command) => opIndexesFor(command, plan.ops)));
191
+ plan.ops.forEach((op, opIndex) => {
192
+ if (commandBackedOpIndexes.has(opIndex)) {
193
+ return;
194
+ }
195
+ requirements.push({
196
+ kind: 'apply',
197
+ capability: 'applyOp',
198
+ path: `ops[${String(opIndex)}]`,
199
+ opIndex,
200
+ materialization: 'providedOp',
201
+ opKind: op.kind,
202
+ message: `Apply workbook op ${op.kind}`,
203
+ });
204
+ });
205
+ plan.checks.forEach((check, checkIndex) => {
206
+ const read = readRequirement(check, checkIndex);
207
+ if (read !== null) {
208
+ requirements.push(read);
209
+ }
210
+ });
211
+ plan.checks.forEach((check, checkIndex) => {
212
+ const verify = verifyRequirement(check, checkIndex);
213
+ if (verify !== null) {
214
+ requirements.push(verify);
215
+ }
216
+ });
217
+ return {
218
+ modelName: plan.modelName,
219
+ actionName: plan.actionName,
220
+ requirements,
221
+ };
222
+ }
223
+ //# sourceMappingURL=requirements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirements.js","sourceRoot":"","sources":["../src/requirements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { LiteralInput } from '@bilig/protocol';
2
+ import type { WorkbookRef } from './find.js';
3
+ import type { WorkbookActionInput } from './input.js';
4
+ import type { EngineOp } from './ops.js';
5
+ export type WorkbookCheckStatus = 'planned' | 'passed' | 'failed';
6
+ export type WorkbookCheckExpectation = {
7
+ readonly kind: 'valueEquals';
8
+ readonly value: LiteralInput;
9
+ } | {
10
+ readonly kind: 'valuesEqual';
11
+ readonly values: readonly (readonly LiteralInput[])[];
12
+ } | {
13
+ readonly kind: 'formulaEquals';
14
+ readonly formula: string;
15
+ readonly inputs: readonly WorkbookRef[];
16
+ } | {
17
+ readonly kind: 'formulasEqual';
18
+ readonly formulas: readonly (readonly (string | null)[])[];
19
+ };
20
+ export interface WorkbookCheckResult {
21
+ readonly status: WorkbookCheckStatus;
22
+ readonly kind: string;
23
+ readonly target?: WorkbookRef;
24
+ readonly refs?: readonly WorkbookRef[];
25
+ readonly message: string;
26
+ readonly expectation?: WorkbookCheckExpectation;
27
+ }
28
+ export interface WorkbookChangeSummary {
29
+ readonly kind: string;
30
+ readonly target?: WorkbookRef;
31
+ readonly message: string;
32
+ }
33
+ export interface WorkbookUndoRef {
34
+ readonly id: string;
35
+ readonly ops?: readonly EngineOp[];
36
+ }
37
+ export interface WorkbookAppliedSummary {
38
+ readonly opCount: number;
39
+ readonly ops?: readonly EngineOp[];
40
+ }
41
+ export type WorkbookRunErrorCode = 'action_not_found' | 'invalid_action_input' | 'find_failed' | 'checks_failed' | 'action_failed' | 'duplicate_ref' | 'command_target_not_resolved' | 'formula_input_not_resolved' | 'invalid_formula' | 'change_target_not_resolved' | 'check_status_not_planned' | 'check_target_not_resolved' | 'check_ref_not_resolved' | 'check_expectation_input_not_resolved' | 'invalid_check_expectation_formula' | 'invalid_workbook_op' | 'op_target_mismatch' | 'missing_concrete_op' | 'missing_workbook_op' | 'apply_failed' | 'readback_failed' | 'readback_missing' | 'duplicate_readback' | 'value_mismatch' | 'values_mismatch' | 'formula_mismatch' | 'formulas_mismatch' | 'invalid_check_verification' | 'check_verification_failed' | 'check_failed' | 'check_not_verified' | 'invalid_runtime_result' | 'runtime_rejected';
42
+ export declare const workbookRunErrorCodes: readonly ("action_not_found" | "invalid_action_input" | "find_failed" | "checks_failed" | "action_failed" | "duplicate_ref" | "command_target_not_resolved" | "formula_input_not_resolved" | "invalid_formula" | "change_target_not_resolved" | "check_status_not_planned" | "check_target_not_resolved" | "check_ref_not_resolved" | "check_expectation_input_not_resolved" | "invalid_check_expectation_formula" | "invalid_workbook_op" | "op_target_mismatch" | "missing_concrete_op" | "missing_workbook_op" | "apply_failed" | "readback_failed" | "readback_missing" | "duplicate_readback" | "value_mismatch" | "values_mismatch" | "formula_mismatch" | "formulas_mismatch" | "invalid_check_verification" | "check_verification_failed" | "check_failed" | "check_not_verified" | "invalid_runtime_result" | "runtime_rejected")[];
43
+ export declare function isWorkbookRunErrorCode(value: unknown): value is WorkbookRunErrorCode;
44
+ export interface WorkbookRunError {
45
+ readonly code: WorkbookRunErrorCode;
46
+ readonly message: string;
47
+ readonly path?: string;
48
+ readonly target?: WorkbookRef;
49
+ readonly check?: WorkbookCheckResult;
50
+ readonly expected?: WorkbookActionInput;
51
+ readonly actual?: WorkbookActionInput;
52
+ }
53
+ export type WorkbookRunResult = {
54
+ readonly status: 'done';
55
+ readonly changed: readonly WorkbookChangeSummary[];
56
+ readonly checks: readonly WorkbookCheckResult[];
57
+ readonly undo?: WorkbookUndoRef;
58
+ readonly applied?: WorkbookAppliedSummary;
59
+ } | {
60
+ readonly status: 'failed';
61
+ readonly errors: readonly WorkbookRunError[];
62
+ readonly checks: readonly WorkbookCheckResult[];
63
+ };
package/dist/result.js ADDED
@@ -0,0 +1,39 @@
1
+ export const workbookRunErrorCodes = Object.freeze([
2
+ 'action_not_found',
3
+ 'invalid_action_input',
4
+ 'find_failed',
5
+ 'checks_failed',
6
+ 'action_failed',
7
+ 'duplicate_ref',
8
+ 'command_target_not_resolved',
9
+ 'formula_input_not_resolved',
10
+ 'invalid_formula',
11
+ 'change_target_not_resolved',
12
+ 'check_status_not_planned',
13
+ 'check_target_not_resolved',
14
+ 'check_ref_not_resolved',
15
+ 'check_expectation_input_not_resolved',
16
+ 'invalid_check_expectation_formula',
17
+ 'invalid_workbook_op',
18
+ 'op_target_mismatch',
19
+ 'missing_concrete_op',
20
+ 'missing_workbook_op',
21
+ 'apply_failed',
22
+ 'readback_failed',
23
+ 'readback_missing',
24
+ 'duplicate_readback',
25
+ 'value_mismatch',
26
+ 'values_mismatch',
27
+ 'formula_mismatch',
28
+ 'formulas_mismatch',
29
+ 'invalid_check_verification',
30
+ 'check_verification_failed',
31
+ 'check_failed',
32
+ 'check_not_verified',
33
+ 'invalid_runtime_result',
34
+ 'runtime_rejected',
35
+ ]);
36
+ export function isWorkbookRunErrorCode(value) {
37
+ return typeof value === 'string' && workbookRunErrorCodes.some((code) => code === value);
38
+ }
39
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAsFA,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC;IACjD,kBAAkB;IAClB,sBAAsB;IACtB,aAAa;IACb,eAAe;IACf,eAAe;IACf,eAAe;IACf,6BAA6B;IAC7B,4BAA4B;IAC5B,iBAAiB;IACjB,4BAA4B;IAC5B,0BAA0B;IAC1B,2BAA2B;IAC3B,wBAAwB;IACxB,sCAAsC;IACtC,mCAAmC;IACnC,qBAAqB;IACrB,oBAAoB;IACpB,qBAAqB;IACrB,qBAAqB;IACrB,cAAc;IACd,iBAAiB;IACjB,kBAAkB;IAClB,oBAAoB;IACpB,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,mBAAmB;IACnB,4BAA4B;IAC5B,2BAA2B;IAC3B,cAAc;IACd,oBAAoB;IACpB,wBAAwB;IACxB,kBAAkB;CACuB,CAAC,CAAA;AAE5C,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAA;AAC1F,CAAC"}
package/dist/run.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { type WorkbookRef } from './find.js';
2
+ import type { WorkbookActionInput } from './input.js';
3
+ import { type WorkbookActionMap, type WorkbookActionPlan, type WorkbookModel } from './model.js';
4
+ import { type WorkbookRunReadback } from './readback.js';
5
+ import type { WorkbookRuntimePreview } from './requirements.js';
6
+ import { type WorkbookCheckResult, type WorkbookRunError, type WorkbookRunResult, type WorkbookUndoRef } from './result.js';
7
+ type MaybePromise<T> = T | Promise<T>;
8
+ export interface WorkbookRunApplyResult {
9
+ readonly status: 'applied' | 'failed';
10
+ readonly errors?: readonly WorkbookRunError[];
11
+ readonly undo?: WorkbookUndoRef;
12
+ }
13
+ export interface WorkbookRunAdapter<Refs = unknown> {
14
+ readonly preview?: (plan: WorkbookActionPlan<Refs>) => MaybePromise<WorkbookRuntimePreview>;
15
+ readonly apply: (plan: WorkbookActionPlan<Refs>) => MaybePromise<WorkbookRunApplyResult>;
16
+ readonly read?: (targets: readonly WorkbookRef[], plan: WorkbookActionPlan<Refs>) => MaybePromise<readonly WorkbookRunReadback[]>;
17
+ readonly verifyChecks?: (checks: readonly WorkbookCheckResult[], plan: WorkbookActionPlan<Refs>) => MaybePromise<readonly WorkbookCheckResult[]>;
18
+ }
19
+ export declare function runWorkbookPlan<Refs>(plan: WorkbookActionPlan<Refs>, adapter: WorkbookRunAdapter<Refs>): Promise<WorkbookRunResult>;
20
+ export declare function runWorkbookAction<Refs, Actions extends WorkbookActionMap<Refs>>(model: WorkbookModel<Refs, Actions>, actionName: string, adapter: WorkbookRunAdapter<Refs>, input?: WorkbookActionInput): Promise<WorkbookRunResult>;
21
+ export {};