@opengeni/artifact-tool 0.2.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/LICENSE +190 -0
- package/README.md +104 -0
- package/dist/bounded-zip.d.ts +28 -0
- package/dist/chunk-4BSENMAE.js +39 -0
- package/dist/chunk-4BSENMAE.js.map +1 -0
- package/dist/chunk-4FRFNNBM.js +276 -0
- package/dist/chunk-4FRFNNBM.js.map +1 -0
- package/dist/chunk-5XIA6KHZ.js +49 -0
- package/dist/chunk-5XIA6KHZ.js.map +1 -0
- package/dist/chunk-66CT2ZRP.js +2229 -0
- package/dist/chunk-66CT2ZRP.js.map +1 -0
- package/dist/chunk-72SYDU4O.js +319 -0
- package/dist/chunk-72SYDU4O.js.map +1 -0
- package/dist/chunk-B2ZJRZDA.js +279 -0
- package/dist/chunk-B2ZJRZDA.js.map +1 -0
- package/dist/chunk-DCTLTNPW.js +2458 -0
- package/dist/chunk-DCTLTNPW.js.map +1 -0
- package/dist/chunk-FGZM4FQ6.js +473 -0
- package/dist/chunk-FGZM4FQ6.js.map +1 -0
- package/dist/chunk-HTJBLBDE.js +591 -0
- package/dist/chunk-HTJBLBDE.js.map +1 -0
- package/dist/chunk-IYFXZQ34.js +5306 -0
- package/dist/chunk-IYFXZQ34.js.map +1 -0
- package/dist/chunk-J6N7IR44.js +172 -0
- package/dist/chunk-J6N7IR44.js.map +1 -0
- package/dist/chunk-N2IHNWBS.js +1002 -0
- package/dist/chunk-N2IHNWBS.js.map +1 -0
- package/dist/chunk-NAG44K67.js +549 -0
- package/dist/chunk-NAG44K67.js.map +1 -0
- package/dist/chunk-O24KTEGP.js +33 -0
- package/dist/chunk-O24KTEGP.js.map +1 -0
- package/dist/chunk-PI2AZVGK.js +2074 -0
- package/dist/chunk-PI2AZVGK.js.map +1 -0
- package/dist/chunk-Q2FFHEY7.js +40 -0
- package/dist/chunk-Q2FFHEY7.js.map +1 -0
- package/dist/chunk-RBGQADXA.js +57 -0
- package/dist/chunk-RBGQADXA.js.map +1 -0
- package/dist/chunk-U5G2BKM2.js +613 -0
- package/dist/chunk-U5G2BKM2.js.map +1 -0
- package/dist/chunk-VOJHMSM3.js +39 -0
- package/dist/chunk-VOJHMSM3.js.map +1 -0
- package/dist/chunk-VUNV25KB.js +16 -0
- package/dist/chunk-VUNV25KB.js.map +1 -0
- package/dist/chunk-XIFUNVBO.js +101 -0
- package/dist/chunk-XIFUNVBO.js.map +1 -0
- package/dist/chunk-ZCJYRJGB.js +489 -0
- package/dist/chunk-ZCJYRJGB.js.map +1 -0
- package/dist/chunk-ZZXPEE4S.js +2260 -0
- package/dist/chunk-ZZXPEE4S.js.map +1 -0
- package/dist/document-docx-api.d.ts +49 -0
- package/dist/document-docx-codec.d.ts +9 -0
- package/dist/document-docx-codec.js +4765 -0
- package/dist/document-docx-codec.js.map +1 -0
- package/dist/document-docx-import.d.ts +261 -0
- package/dist/document-docx-packer.d.ts +18 -0
- package/dist/document-docx-state.d.ts +12 -0
- package/dist/document-render.d.ts +3 -0
- package/dist/document-render.js +492 -0
- package/dist/document-render.js.map +1 -0
- package/dist/document.d.ts +432 -0
- package/dist/document.js +37 -0
- package/dist/document.js.map +1 -0
- package/dist/errors.d.ts +23 -0
- package/dist/file-blob.d.ts +11 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +186 -0
- package/dist/index.js.map +1 -0
- package/dist/inspection.d.ts +12 -0
- package/dist/kernel.d.ts +101 -0
- package/dist/lib-GQLPACFK.js +9746 -0
- package/dist/lib-GQLPACFK.js.map +1 -0
- package/dist/materializer-cli-entry.d.ts +2 -0
- package/dist/materializer-cli-entry.js +29 -0
- package/dist/materializer-cli-entry.js.map +1 -0
- package/dist/materializer-cli.d.ts +24 -0
- package/dist/materializer-cli.js +24 -0
- package/dist/materializer-cli.js.map +1 -0
- package/dist/native-raster.d.ts +10 -0
- package/dist/native.d.ts +129 -0
- package/dist/native.js +31 -0
- package/dist/native.js.map +1 -0
- package/dist/office-import.d.ts +48 -0
- package/dist/office-import.js +154 -0
- package/dist/office-import.js.map +1 -0
- package/dist/presentation-pptx-api.d.ts +60 -0
- package/dist/presentation-pptx-import.d.ts +5 -0
- package/dist/presentation-pptx-state-digest-765CZZED.js +10 -0
- package/dist/presentation-pptx-state-digest-765CZZED.js.map +1 -0
- package/dist/presentation-pptx-state-digest.d.ts +3 -0
- package/dist/presentation-pptx-state.d.ts +4 -0
- package/dist/presentation-pptx-xml.d.ts +29 -0
- package/dist/presentation-pptx.d.ts +5 -0
- package/dist/presentation-pptx.js +2365 -0
- package/dist/presentation-pptx.js.map +1 -0
- package/dist/presentation-render.d.ts +29 -0
- package/dist/presentation-render.js +375 -0
- package/dist/presentation-render.js.map +1 -0
- package/dist/presentation.d.ts +565 -0
- package/dist/presentation.js +71 -0
- package/dist/presentation.js.map +1 -0
- package/dist/production-composite.d.ts +68 -0
- package/dist/production-document.d.ts +2 -0
- package/dist/production-document.js +176 -0
- package/dist/production-document.js.map +1 -0
- package/dist/production-native-codecs.d.ts +94 -0
- package/dist/production-presentation.d.ts +2 -0
- package/dist/production-presentation.js +176 -0
- package/dist/production-presentation.js.map +1 -0
- package/dist/production-sha256.d.ts +2 -0
- package/dist/production-spreadsheet-native.d.ts +12 -0
- package/dist/production-spreadsheet.d.ts +2 -0
- package/dist/production-spreadsheet.js +176 -0
- package/dist/production-spreadsheet.js.map +1 -0
- package/dist/production.d.ts +96 -0
- package/dist/raster-image.d.ts +34 -0
- package/dist/reference.d.ts +17 -0
- package/dist/reference.js +574 -0
- package/dist/reference.js.map +1 -0
- package/dist/runtime-cli-entry.d.ts +2 -0
- package/dist/runtime-cli-entry.js +21 -0
- package/dist/runtime-cli-entry.js.map +1 -0
- package/dist/runtime-cli.d.ts +76 -0
- package/dist/runtime-cli.js +26 -0
- package/dist/runtime-cli.js.map +1 -0
- package/dist/runtime-development.d.ts +73 -0
- package/dist/runtime-development.js +30 -0
- package/dist/runtime-development.js.map +1 -0
- package/dist/runtime-receipt.d.ts +19 -0
- package/dist/runtime.d.ts +355 -0
- package/dist/runtime.js +42 -0
- package/dist/runtime.js.map +1 -0
- package/dist/snapshot.d.ts +26 -0
- package/dist/snapshot.js +61 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/spreadsheet-address.d.ts +18 -0
- package/dist/spreadsheet-file.d.ts +17 -0
- package/dist/spreadsheet-formula.d.ts +67 -0
- package/dist/spreadsheet-image.d.ts +17 -0
- package/dist/spreadsheet-render.d.ts +5 -0
- package/dist/spreadsheet-render.js +752 -0
- package/dist/spreadsheet-render.js.map +1 -0
- package/dist/spreadsheet-types.d.ts +155 -0
- package/dist/spreadsheet-xlsx-api.d.ts +88 -0
- package/dist/spreadsheet-xlsx-codec.d.ts +16 -0
- package/dist/spreadsheet-xlsx-codec.js +16 -0
- package/dist/spreadsheet-xlsx-codec.js.map +1 -0
- package/dist/spreadsheet-xlsx-state.d.ts +16 -0
- package/dist/spreadsheet.d.ts +724 -0
- package/dist/spreadsheet.js +67 -0
- package/dist/spreadsheet.js.map +1 -0
- package/package.json +129 -0
- package/src/bounded-zip.ts +450 -0
- package/src/document-docx-api.ts +64 -0
- package/src/document-docx-codec.ts +2253 -0
- package/src/document-docx-import.ts +3814 -0
- package/src/document-docx-packer.ts +72 -0
- package/src/document-docx-state.ts +59 -0
- package/src/document-render.ts +615 -0
- package/src/document.ts +2800 -0
- package/src/errors.ts +45 -0
- package/src/file-blob.ts +43 -0
- package/src/index.ts +4 -0
- package/src/inspection.ts +50 -0
- package/src/kernel.ts +525 -0
- package/src/materializer-cli-entry.ts +11 -0
- package/src/materializer-cli.ts +743 -0
- package/src/native-raster.ts +141 -0
- package/src/native.ts +390 -0
- package/src/office-import.ts +243 -0
- package/src/presentation-pptx-api.ts +107 -0
- package/src/presentation-pptx-import.ts +2065 -0
- package/src/presentation-pptx-state-digest.ts +46 -0
- package/src/presentation-pptx-state.ts +18 -0
- package/src/presentation-pptx-xml.ts +473 -0
- package/src/presentation-pptx.ts +447 -0
- package/src/presentation-render.ts +532 -0
- package/src/presentation.ts +2599 -0
- package/src/production-composite.ts +805 -0
- package/src/production-document.ts +2 -0
- package/src/production-native-codecs.ts +1141 -0
- package/src/production-presentation.ts +2 -0
- package/src/production-sha256.ts +150 -0
- package/src/production-spreadsheet-native.ts +686 -0
- package/src/production-spreadsheet.ts +2 -0
- package/src/production.ts +1022 -0
- package/src/raster-image.ts +586 -0
- package/src/reference.ts +17 -0
- package/src/runtime-cli-entry.ts +13 -0
- package/src/runtime-cli.ts +670 -0
- package/src/runtime-development.ts +689 -0
- package/src/runtime-receipt.ts +169 -0
- package/src/runtime.ts +1463 -0
- package/src/snapshot.ts +88 -0
- package/src/spreadsheet-address.ts +90 -0
- package/src/spreadsheet-file.ts +71 -0
- package/src/spreadsheet-formula.ts +1212 -0
- package/src/spreadsheet-image.ts +242 -0
- package/src/spreadsheet-render.ts +985 -0
- package/src/spreadsheet-types.ts +171 -0
- package/src/spreadsheet-xlsx-api.ts +123 -0
- package/src/spreadsheet-xlsx-codec.ts +3063 -0
- package/src/spreadsheet-xlsx-state.ts +191 -0
- package/src/spreadsheet.ts +5195 -0
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SpreadsheetXlsxCodec
|
|
3
|
+
} from "./chunk-DCTLTNPW.js";
|
|
4
|
+
import {
|
|
5
|
+
loadConfiguredArtifactKernelRuntime
|
|
6
|
+
} from "./chunk-U5G2BKM2.js";
|
|
7
|
+
import {
|
|
8
|
+
NativeSpreadsheetSession
|
|
9
|
+
} from "./chunk-B2ZJRZDA.js";
|
|
10
|
+
import {
|
|
11
|
+
Workbook
|
|
12
|
+
} from "./chunk-IYFXZQ34.js";
|
|
13
|
+
|
|
14
|
+
// src/materializer-cli.ts
|
|
15
|
+
import { createHash } from "crypto";
|
|
16
|
+
import { once } from "events";
|
|
17
|
+
import {
|
|
18
|
+
SPREADSHEET_ARTIFACT_PROJECTION_MAX_BYTES,
|
|
19
|
+
SPREADSHEET_ARTIFACT_VIEWPORT_MAX_CELLS,
|
|
20
|
+
decodeSpreadsheetMetadataKernelProjection,
|
|
21
|
+
decodeSpreadsheetViewportKernelProjection,
|
|
22
|
+
encodeSpreadsheetMetadataKernelQuery,
|
|
23
|
+
encodeSpreadsheetViewportKernelQuery
|
|
24
|
+
} from "@opengeni/contracts/editable-artifacts";
|
|
25
|
+
var IDENTITY_ARGUMENT = "--opengeni-materializer-identity-v1";
|
|
26
|
+
var MATERIALIZE_ARGUMENT = "--opengeni-materialize-v1";
|
|
27
|
+
var VERIFY_ARGUMENT = "--opengeni-verify-materialization-v1";
|
|
28
|
+
var INPUT_MAGIC = bytes("OGAMI001");
|
|
29
|
+
var VERIFY_INPUT_MAGIC = bytes("OGAVI001");
|
|
30
|
+
var OUTPUT_MAGIC = bytes("OGAMO001");
|
|
31
|
+
var VERIFY_OUTPUT_MAGIC = bytes("OGAVO001");
|
|
32
|
+
var ERROR_MAGIC = bytes("OGAME001");
|
|
33
|
+
var MAX_METADATA_BYTES = 256 * 1024;
|
|
34
|
+
var MAX_SOURCE_BYTES = 512 * 1024 * 1024;
|
|
35
|
+
var MAX_OUTPUT_BYTES = 512 * 1024 * 1024;
|
|
36
|
+
var MAX_PROJECTED_RECTANGLE_CELLS = 1e6;
|
|
37
|
+
var VIEWPORT_EDGE = 128;
|
|
38
|
+
var XLSX_CODEC_ID = "opengeni.xlsx";
|
|
39
|
+
var EMPTY_FONT_REGISTRY_HASH = sha256(bytes("opengeni:no-font-registry:v1"));
|
|
40
|
+
var POLICY_HASH = sha256(bytes("opengeni:materializer:xlsx-native-projection:v1"));
|
|
41
|
+
async function runArtifactMaterializerCli(args, environment = process.env) {
|
|
42
|
+
if (args.length !== 1) throw new Error("unsupported materializer command");
|
|
43
|
+
const command = args[0];
|
|
44
|
+
if (command === IDENTITY_ARGUMENT) {
|
|
45
|
+
const capabilities = await loadCapabilities(environment);
|
|
46
|
+
process.stdout.write(JSON.stringify(capabilities));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (command === MATERIALIZE_ARGUMENT) {
|
|
50
|
+
try {
|
|
51
|
+
await materialize(environment);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
if (!(error instanceof MaterializerCliError)) throw error;
|
|
54
|
+
await writeTypedError(error.code, error.diagnosticSubcode);
|
|
55
|
+
}
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (command === VERIFY_ARGUMENT) {
|
|
59
|
+
try {
|
|
60
|
+
await verifyMaterialization(environment);
|
|
61
|
+
} catch (error) {
|
|
62
|
+
if (!(error instanceof MaterializerCliError)) throw error;
|
|
63
|
+
await writeTypedError(error.code, error.diagnosticSubcode);
|
|
64
|
+
}
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
throw new Error("unsupported materializer command");
|
|
68
|
+
}
|
|
69
|
+
async function loadCapabilities(environment) {
|
|
70
|
+
const loaded = await loadRuntime(environment);
|
|
71
|
+
return editableArtifactMaterializerCapabilitiesForRuntime(
|
|
72
|
+
loaded.runtime,
|
|
73
|
+
loaded.location.artifactTool.packageVersion
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
async function materialize(environment) {
|
|
77
|
+
let manifest;
|
|
78
|
+
let source;
|
|
79
|
+
try {
|
|
80
|
+
const reader = new InputReader(process.stdin);
|
|
81
|
+
assertBytes(await reader.readExactly(INPUT_MAGIC.byteLength), INPUT_MAGIC, "input protocol");
|
|
82
|
+
const header = await reader.readExactly(12);
|
|
83
|
+
const headerView = new DataView(header.buffer, header.byteOffset, header.byteLength);
|
|
84
|
+
const metadataLength = headerView.getUint32(0, true);
|
|
85
|
+
const sourceLength = safeU64(headerView, 4, "source length");
|
|
86
|
+
if (metadataLength < 2 || metadataLength > MAX_METADATA_BYTES) throw invalidSource();
|
|
87
|
+
if (sourceLength <= 0 || sourceLength > MAX_SOURCE_BYTES) throw unsupported();
|
|
88
|
+
manifest = decodeManifest(await reader.readExactly(metadataLength));
|
|
89
|
+
if (sourceLength !== manifest.sourceByteSize) throw invalidSource();
|
|
90
|
+
source = await reader.readExactly(sourceLength);
|
|
91
|
+
await reader.assertEof();
|
|
92
|
+
if (sha256(source) !== manifest.sourceContentHash) throw invalidSource();
|
|
93
|
+
} catch (error) {
|
|
94
|
+
throw classifyInvalidSource(error, "input_framing");
|
|
95
|
+
}
|
|
96
|
+
const loaded = await loadRuntime(environment);
|
|
97
|
+
const capabilities = editableArtifactMaterializerCapabilitiesForRuntime(
|
|
98
|
+
loaded.runtime,
|
|
99
|
+
loaded.location.artifactTool.packageVersion
|
|
100
|
+
);
|
|
101
|
+
assertManifestCompatibility(manifest, capabilities);
|
|
102
|
+
if (manifest.modality !== "spreadsheet" || manifest.format !== "xlsx") throw unsupported();
|
|
103
|
+
const projected = projectSpreadsheet(loaded.runtime, source, manifest);
|
|
104
|
+
const outputBlob = await SpreadsheetXlsxCodec.exportXlsx(projected.workbook, {
|
|
105
|
+
unsupportedContent: "error",
|
|
106
|
+
fileName: "workbook.xlsx"
|
|
107
|
+
});
|
|
108
|
+
const output = new Uint8Array(await outputBlob.arrayBuffer());
|
|
109
|
+
if (output.byteLength <= 0 || output.byteLength > MAX_OUTPUT_BYTES) throw unsupported();
|
|
110
|
+
const imported = await SpreadsheetXlsxCodec.importXlsx(output, { unsupportedContent: "error" });
|
|
111
|
+
if (semanticHashForWorkbook(imported) !== projected.semanticHash) throw unsupported();
|
|
112
|
+
const metadata = canonicalBytes({
|
|
113
|
+
byteSize: output.byteLength,
|
|
114
|
+
codecId: manifest.codecId,
|
|
115
|
+
codecVersion: manifest.codecVersion,
|
|
116
|
+
contentHash: sha256(output),
|
|
117
|
+
fontRegistryHash: manifest.fontRegistryHash,
|
|
118
|
+
format: manifest.format,
|
|
119
|
+
headSequence: manifest.targetHeadSequence,
|
|
120
|
+
kernelVersion: manifest.kernelVersion,
|
|
121
|
+
mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
122
|
+
policyHash: manifest.policyHash,
|
|
123
|
+
protocol: "OGAMR001",
|
|
124
|
+
semanticHash: projected.semanticHash,
|
|
125
|
+
stateHash: manifest.stateHash
|
|
126
|
+
});
|
|
127
|
+
await writeFrame(OUTPUT_MAGIC, metadata, output);
|
|
128
|
+
}
|
|
129
|
+
async function verifyMaterialization(environment) {
|
|
130
|
+
const reader = new InputReader(process.stdin);
|
|
131
|
+
assertBytes(
|
|
132
|
+
await reader.readExactly(VERIFY_INPUT_MAGIC.byteLength),
|
|
133
|
+
VERIFY_INPUT_MAGIC,
|
|
134
|
+
"verification protocol"
|
|
135
|
+
);
|
|
136
|
+
const header = await reader.readExactly(12);
|
|
137
|
+
const view = new DataView(header.buffer, header.byteOffset, header.byteLength);
|
|
138
|
+
const metadataLength = view.getUint32(0, true);
|
|
139
|
+
const outputLength = safeU64(view, 4, "verification output length");
|
|
140
|
+
if (metadataLength < 2 || metadataLength > MAX_METADATA_BYTES) throw invalidSource();
|
|
141
|
+
if (outputLength <= 0 || outputLength > MAX_OUTPUT_BYTES) throw unsupported();
|
|
142
|
+
const metadata = decodeVerificationManifest(await reader.readExactly(metadataLength));
|
|
143
|
+
const output = await reader.readExactly(outputLength);
|
|
144
|
+
await reader.assertEof();
|
|
145
|
+
const loaded = await loadCapabilities(environment);
|
|
146
|
+
if (metadata.format !== "xlsx" || metadata.codecId !== XLSX_CODEC_ID || loaded.codecVersions[XLSX_CODEC_ID] !== metadata.codecVersion) {
|
|
147
|
+
throw unsupported();
|
|
148
|
+
}
|
|
149
|
+
let semanticHash;
|
|
150
|
+
try {
|
|
151
|
+
const imported = await SpreadsheetXlsxCodec.importXlsx(output, { unsupportedContent: "error" });
|
|
152
|
+
semanticHash = semanticHashForWorkbook(imported);
|
|
153
|
+
} catch {
|
|
154
|
+
throw invalidOutput();
|
|
155
|
+
}
|
|
156
|
+
if (semanticHash !== metadata.expectedSemanticHash) throw invalidOutput();
|
|
157
|
+
await writeFrame(
|
|
158
|
+
VERIFY_OUTPUT_MAGIC,
|
|
159
|
+
canonicalBytes({ protocol: "OGAVR001", semanticHash }),
|
|
160
|
+
new Uint8Array(0)
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
function projectSpreadsheet(runtime, source, manifest) {
|
|
164
|
+
let session;
|
|
165
|
+
try {
|
|
166
|
+
session = NativeSpreadsheetSession.open(runtime, source);
|
|
167
|
+
} catch {
|
|
168
|
+
throw invalidSource("snapshot_open");
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
if (session.stateHash() !== manifest.stateHash) throw invalidSource("state_mismatch");
|
|
172
|
+
const metadataLimit = Math.min(
|
|
173
|
+
session.capabilities.maxQueryResponseBytes,
|
|
174
|
+
SPREADSHEET_ARTIFACT_PROJECTION_MAX_BYTES
|
|
175
|
+
);
|
|
176
|
+
const metadata = decodeSpreadsheetMetadataKernelProjection(
|
|
177
|
+
session.query(
|
|
178
|
+
encodeSpreadsheetMetadataKernelQuery({
|
|
179
|
+
maxSheets: Math.max(1, session.capabilities.maxMetadataSheets),
|
|
180
|
+
maxBytes: metadataLimit
|
|
181
|
+
})
|
|
182
|
+
),
|
|
183
|
+
{
|
|
184
|
+
maxSheets: Math.max(1, session.capabilities.maxMetadataSheets),
|
|
185
|
+
maxBytes: metadataLimit
|
|
186
|
+
}
|
|
187
|
+
);
|
|
188
|
+
if (metadata.modeledFeatures.dimensions !== false || metadata.modeledFeatures.hidden !== false || metadata.modeledFeatures.merges !== false) {
|
|
189
|
+
throw unsupported();
|
|
190
|
+
}
|
|
191
|
+
let projectedRectangleCells = 0;
|
|
192
|
+
const semanticSheets = [];
|
|
193
|
+
for (const sheet of metadata.sheets) {
|
|
194
|
+
const cells = [];
|
|
195
|
+
if (sheet.usedBounds) {
|
|
196
|
+
const rows = sheet.usedBounds.endRow - sheet.usedBounds.startRow + 1;
|
|
197
|
+
const columns = sheet.usedBounds.endColumn - sheet.usedBounds.startColumn + 1;
|
|
198
|
+
const area = rows * columns;
|
|
199
|
+
if (!Number.isSafeInteger(area) || area <= 0) throw invalidSource();
|
|
200
|
+
projectedRectangleCells += area;
|
|
201
|
+
if (projectedRectangleCells > MAX_PROJECTED_RECTANGLE_CELLS) throw unsupported();
|
|
202
|
+
for (let row = sheet.usedBounds.startRow; row <= sheet.usedBounds.endRow; row += VIEWPORT_EDGE) {
|
|
203
|
+
const rowCount = Math.min(VIEWPORT_EDGE, sheet.usedBounds.endRow - row + 1);
|
|
204
|
+
for (let column = sheet.usedBounds.startColumn; column <= sheet.usedBounds.endColumn; column += VIEWPORT_EDGE) {
|
|
205
|
+
const columnCount = Math.min(VIEWPORT_EDGE, sheet.usedBounds.endColumn - column + 1);
|
|
206
|
+
const maxCells = rowCount * columnCount;
|
|
207
|
+
if (maxCells > SPREADSHEET_ARTIFACT_VIEWPORT_MAX_CELLS) throw unsupported();
|
|
208
|
+
const query = {
|
|
209
|
+
sheetId: sheet.sheetId,
|
|
210
|
+
startRow: row,
|
|
211
|
+
startColumn: column,
|
|
212
|
+
rowCount,
|
|
213
|
+
columnCount,
|
|
214
|
+
maxCells,
|
|
215
|
+
maxBytes: metadataLimit
|
|
216
|
+
};
|
|
217
|
+
const viewport = decodeSpreadsheetViewportKernelProjection(
|
|
218
|
+
session.query(encodeSpreadsheetViewportKernelQuery(query)),
|
|
219
|
+
query
|
|
220
|
+
);
|
|
221
|
+
for (const cell of viewport.cells) {
|
|
222
|
+
assertRepresentableValue(cell.value);
|
|
223
|
+
cells.push({
|
|
224
|
+
row: cell.row,
|
|
225
|
+
column: cell.column,
|
|
226
|
+
formula: cell.formula,
|
|
227
|
+
value: cell.value
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
cells.sort((left, right) => left.row - right.row || left.column - right.column);
|
|
234
|
+
semanticSheets.push({ name: sheet.name, cells });
|
|
235
|
+
}
|
|
236
|
+
const semantic = Object.freeze({ version: 1, sheets: semanticSheets });
|
|
237
|
+
const workbook = Workbook.fromJSON(toSerializedWorkbook(semantic));
|
|
238
|
+
const semanticHash = sha256(canonicalBytes(semantic));
|
|
239
|
+
if (semanticHashForWorkbook(workbook) !== semanticHash) throw unsupported();
|
|
240
|
+
return Object.freeze({ workbook, semanticHash });
|
|
241
|
+
} finally {
|
|
242
|
+
session.dispose();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
function toSerializedWorkbook(semantic) {
|
|
246
|
+
return {
|
|
247
|
+
version: 1,
|
|
248
|
+
worksheets: semantic.sheets.map((sheet, index) => ({
|
|
249
|
+
id: `ws/native-${index + 1}`,
|
|
250
|
+
name: sheet.name,
|
|
251
|
+
showGridLines: true,
|
|
252
|
+
freezePanes: { rows: 0, columns: 0 },
|
|
253
|
+
cells: sheet.cells.map((cell) => ({
|
|
254
|
+
row: cell.row,
|
|
255
|
+
col: cell.column,
|
|
256
|
+
value: cell.formula ? null : hostValue(cell.value),
|
|
257
|
+
formula: cell.formula,
|
|
258
|
+
format: {}
|
|
259
|
+
})),
|
|
260
|
+
merges: [],
|
|
261
|
+
columnWidths: [],
|
|
262
|
+
rowHeights: [],
|
|
263
|
+
tables: [],
|
|
264
|
+
charts: [],
|
|
265
|
+
sparklines: [],
|
|
266
|
+
dataValidations: [],
|
|
267
|
+
conditionalFormattings: [],
|
|
268
|
+
images: []
|
|
269
|
+
})),
|
|
270
|
+
comments: []
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
function semanticHashForWorkbook(workbook) {
|
|
274
|
+
const sheets = workbook.worksheets.items.map((sheet) => {
|
|
275
|
+
const cells = [];
|
|
276
|
+
for (const { row, col, data } of sheet.cellEntries()) {
|
|
277
|
+
const value = data.formula ? workbook.valueAt(sheet, { row, col }) : data.value;
|
|
278
|
+
cells.push({
|
|
279
|
+
row,
|
|
280
|
+
column: col,
|
|
281
|
+
formula: data.formula,
|
|
282
|
+
value: semanticValue(value, data.formula !== null)
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
cells.sort((left, right) => left.row - right.row || left.column - right.column);
|
|
286
|
+
return { name: sheet.name, cells };
|
|
287
|
+
});
|
|
288
|
+
return sha256(canonicalBytes({ version: 1, sheets }));
|
|
289
|
+
}
|
|
290
|
+
function semanticValue(value, formula) {
|
|
291
|
+
if (value === null || value === void 0) return { kind: "empty" };
|
|
292
|
+
if (typeof value === "boolean") return { kind: "boolean", value };
|
|
293
|
+
if (typeof value === "number" && Number.isFinite(value)) return { kind: "number", value };
|
|
294
|
+
if (value instanceof Date) {
|
|
295
|
+
const milliseconds = Date.prototype.getTime.call(value);
|
|
296
|
+
if (!Number.isSafeInteger(milliseconds)) throw unsupported();
|
|
297
|
+
return { kind: "date", value: new Date(milliseconds).toISOString() };
|
|
298
|
+
}
|
|
299
|
+
if (typeof value === "string") {
|
|
300
|
+
if (formula) {
|
|
301
|
+
const error = FORMULA_ERROR_TO_NATIVE[value];
|
|
302
|
+
if (error) return { kind: "error", value: error };
|
|
303
|
+
if (value === "#CYCLE!") return { kind: "error", value: { custom: value } };
|
|
304
|
+
}
|
|
305
|
+
return { kind: "text", value };
|
|
306
|
+
}
|
|
307
|
+
throw unsupported();
|
|
308
|
+
}
|
|
309
|
+
function hostValue(value) {
|
|
310
|
+
switch (value.kind) {
|
|
311
|
+
case "empty":
|
|
312
|
+
return null;
|
|
313
|
+
case "boolean":
|
|
314
|
+
case "number":
|
|
315
|
+
case "text":
|
|
316
|
+
return value.value;
|
|
317
|
+
case "date":
|
|
318
|
+
return new Date(value.value);
|
|
319
|
+
case "error": {
|
|
320
|
+
if (typeof value.value === "object") return value.value.custom;
|
|
321
|
+
const projected = NATIVE_ERROR_TO_FORMULA[value.value];
|
|
322
|
+
if (!projected) throw unsupported();
|
|
323
|
+
return projected;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
function assertRepresentableValue(value) {
|
|
328
|
+
hostValue(value);
|
|
329
|
+
}
|
|
330
|
+
var NATIVE_ERROR_TO_FORMULA = Object.freeze({
|
|
331
|
+
divide_by_zero: "#DIV/0!",
|
|
332
|
+
value: "#VALUE!",
|
|
333
|
+
reference: "#REF!",
|
|
334
|
+
name: "#NAME?",
|
|
335
|
+
number: "#NUM!",
|
|
336
|
+
not_available: "#N/A"
|
|
337
|
+
});
|
|
338
|
+
var FORMULA_ERROR_TO_NATIVE = Object.freeze({
|
|
339
|
+
"#DIV/0!": "divide_by_zero",
|
|
340
|
+
"#VALUE!": "value",
|
|
341
|
+
"#REF!": "reference",
|
|
342
|
+
"#NAME?": "name",
|
|
343
|
+
"#NUM!": "number",
|
|
344
|
+
"#N/A": "not_available"
|
|
345
|
+
});
|
|
346
|
+
function editableArtifactMaterializerCapabilitiesForRuntime(runtime, packageVersion) {
|
|
347
|
+
return Object.freeze({
|
|
348
|
+
protocol: "OGAMC001",
|
|
349
|
+
runtimeKind: "native",
|
|
350
|
+
runtimeTarget: runtime.target,
|
|
351
|
+
kernelVersion: runtime.buildIdentity,
|
|
352
|
+
codecVersions: Object.freeze({ [XLSX_CODEC_ID]: codecVersion(packageVersion) }),
|
|
353
|
+
fontRegistryHash: EMPTY_FONT_REGISTRY_HASH,
|
|
354
|
+
policyHash: POLICY_HASH,
|
|
355
|
+
maxOutputBytes: MAX_OUTPUT_BYTES,
|
|
356
|
+
supportedModelSchemaVersions: Object.freeze([1]),
|
|
357
|
+
supportedOperationProtocolVersions: Object.freeze([1]),
|
|
358
|
+
supportedSnapshotProtocolVersions: Object.freeze([1])
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
function assertManifestCompatibility(manifest, capabilities) {
|
|
362
|
+
if (manifest.modelSchemaVersion !== 1 || manifest.operationProtocolVersion !== 1 || manifest.snapshotProtocolVersion !== 1 || manifest.kernelVersion !== capabilities.kernelVersion || manifest.codecVersion !== capabilities.codecVersions[manifest.codecId] || manifest.fontRegistryHash !== capabilities.fontRegistryHash || manifest.policyHash !== capabilities.policyHash || Object.keys(manifest.normalizedOptions).length !== 0) {
|
|
363
|
+
throw incompatible();
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
function decodeManifest(value) {
|
|
367
|
+
const record = strictCanonicalRecord(value, [
|
|
368
|
+
"artifactId",
|
|
369
|
+
"codecId",
|
|
370
|
+
"codecVersion",
|
|
371
|
+
"fontRegistryHash",
|
|
372
|
+
"format",
|
|
373
|
+
"inputSnapshotId",
|
|
374
|
+
"jobId",
|
|
375
|
+
"kernelVersion",
|
|
376
|
+
"modality",
|
|
377
|
+
"modelSchemaVersion",
|
|
378
|
+
"normalizedOptions",
|
|
379
|
+
"operationProtocolVersion",
|
|
380
|
+
"optionsHash",
|
|
381
|
+
"policyHash",
|
|
382
|
+
"protocol",
|
|
383
|
+
"snapshotProtocolVersion",
|
|
384
|
+
"sourceByteSize",
|
|
385
|
+
"sourceContentHash",
|
|
386
|
+
"stateHash",
|
|
387
|
+
"targetHeadSequence",
|
|
388
|
+
"versionId"
|
|
389
|
+
]);
|
|
390
|
+
if (record.protocol !== "OGAMJ001" || !positiveInteger(record.sourceByteSize) || !positiveInteger(record.targetHeadSequence) || !isHash(record.sourceContentHash) || !isHash(record.stateHash) || !isHash(record.optionsHash) || !isHash(record.fontRegistryHash) || !isHash(record.policyHash) || !plainRecord(record.normalizedOptions)) {
|
|
391
|
+
throw invalidSource();
|
|
392
|
+
}
|
|
393
|
+
return record;
|
|
394
|
+
}
|
|
395
|
+
function decodeVerificationManifest(value) {
|
|
396
|
+
const record = strictCanonicalRecord(value, [
|
|
397
|
+
"codecId",
|
|
398
|
+
"codecVersion",
|
|
399
|
+
"expectedSemanticHash",
|
|
400
|
+
"format",
|
|
401
|
+
"protocol"
|
|
402
|
+
]);
|
|
403
|
+
if (record.protocol !== "OGAVJ001" || !isHash(record.expectedSemanticHash)) {
|
|
404
|
+
throw invalidSource();
|
|
405
|
+
}
|
|
406
|
+
return record;
|
|
407
|
+
}
|
|
408
|
+
function strictCanonicalRecord(value, keys) {
|
|
409
|
+
const text = new TextDecoder("utf-8", { fatal: true }).decode(value);
|
|
410
|
+
const parsed = JSON.parse(text);
|
|
411
|
+
if (!plainRecord(parsed) || JSON.stringify(parsed) !== text) throw invalidSource();
|
|
412
|
+
if (Object.keys(parsed).sort().join("\0") !== [...keys].sort().join("\0")) throw invalidSource();
|
|
413
|
+
return parsed;
|
|
414
|
+
}
|
|
415
|
+
async function writeTypedError(code, diagnosticSubcode) {
|
|
416
|
+
await writeFrame(
|
|
417
|
+
ERROR_MAGIC,
|
|
418
|
+
canonicalBytes({
|
|
419
|
+
code,
|
|
420
|
+
protocol: "OGAMERR1",
|
|
421
|
+
...diagnosticSubcode ? { subcode: diagnosticSubcode } : {}
|
|
422
|
+
}),
|
|
423
|
+
new Uint8Array(0)
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
async function writeFrame(magic, metadata, payload) {
|
|
427
|
+
const header = new Uint8Array(12);
|
|
428
|
+
const view = new DataView(header.buffer);
|
|
429
|
+
view.setUint32(0, metadata.byteLength, true);
|
|
430
|
+
view.setBigUint64(4, BigInt(payload.byteLength), true);
|
|
431
|
+
await writeStdout(magic);
|
|
432
|
+
await writeStdout(header);
|
|
433
|
+
await writeStdout(metadata);
|
|
434
|
+
for (let offset = 0; offset < payload.byteLength; offset += 1024 * 1024) {
|
|
435
|
+
await writeStdout(payload.subarray(offset, Math.min(payload.byteLength, offset + 1024 * 1024)));
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
async function writeStdout(value) {
|
|
439
|
+
if (!process.stdout.write(value)) await once(process.stdout, "drain");
|
|
440
|
+
}
|
|
441
|
+
var InputReader = class {
|
|
442
|
+
#iterator;
|
|
443
|
+
#buffer = new Uint8Array(0);
|
|
444
|
+
#done = false;
|
|
445
|
+
constructor(stream) {
|
|
446
|
+
this.#iterator = stream[Symbol.asyncIterator]();
|
|
447
|
+
}
|
|
448
|
+
async readExactly(length) {
|
|
449
|
+
if (!Number.isSafeInteger(length) || length < 0 || length > MAX_SOURCE_BYTES)
|
|
450
|
+
throw invalidSource();
|
|
451
|
+
const result = new Uint8Array(length);
|
|
452
|
+
let offset = 0;
|
|
453
|
+
while (offset < length) {
|
|
454
|
+
if (this.#buffer.byteLength === 0) await this.#fill();
|
|
455
|
+
if (this.#buffer.byteLength === 0) throw invalidSource();
|
|
456
|
+
const count = Math.min(length - offset, this.#buffer.byteLength);
|
|
457
|
+
result.set(this.#buffer.subarray(0, count), offset);
|
|
458
|
+
this.#buffer = this.#buffer.subarray(count);
|
|
459
|
+
offset += count;
|
|
460
|
+
}
|
|
461
|
+
return result;
|
|
462
|
+
}
|
|
463
|
+
async assertEof() {
|
|
464
|
+
if (this.#buffer.byteLength > 0) throw invalidSource();
|
|
465
|
+
if (!this.#done) await this.#fill();
|
|
466
|
+
if (!this.#done || this.#buffer.byteLength > 0) throw invalidSource();
|
|
467
|
+
}
|
|
468
|
+
async #fill() {
|
|
469
|
+
const next = await this.#iterator.next();
|
|
470
|
+
if (next.done) {
|
|
471
|
+
this.#done = true;
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
if (typeof next.value === "string") throw invalidSource();
|
|
475
|
+
this.#buffer = new Uint8Array(
|
|
476
|
+
next.value.buffer,
|
|
477
|
+
next.value.byteOffset,
|
|
478
|
+
next.value.byteLength
|
|
479
|
+
).slice();
|
|
480
|
+
}
|
|
481
|
+
};
|
|
482
|
+
function codecVersion(packageVersion) {
|
|
483
|
+
return `xlsx-v1@${packageVersion}`;
|
|
484
|
+
}
|
|
485
|
+
function canonicalBytes(value) {
|
|
486
|
+
return bytes(JSON.stringify(value));
|
|
487
|
+
}
|
|
488
|
+
function bytes(value) {
|
|
489
|
+
return new TextEncoder().encode(value);
|
|
490
|
+
}
|
|
491
|
+
function sha256(value) {
|
|
492
|
+
return `sha256:${createHash("sha256").update(value).digest("hex")}`;
|
|
493
|
+
}
|
|
494
|
+
function safeU64(view, offset, label) {
|
|
495
|
+
const value = view.getBigUint64(offset, true);
|
|
496
|
+
if (value > BigInt(Number.MAX_SAFE_INTEGER)) throw new Error(`${label} exceeds safe integer`);
|
|
497
|
+
return Number(value);
|
|
498
|
+
}
|
|
499
|
+
function assertBytes(actual, expected, label) {
|
|
500
|
+
if (actual.byteLength !== expected.byteLength || !actual.every((byte, index) => byte === expected[index])) {
|
|
501
|
+
throw new Error(`${label} is invalid`);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
function plainRecord(value) {
|
|
505
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
|
|
506
|
+
}
|
|
507
|
+
function positiveInteger(value) {
|
|
508
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
509
|
+
}
|
|
510
|
+
function isHash(value) {
|
|
511
|
+
return typeof value === "string" && /^sha256:[0-9a-f]{64}$/u.test(value);
|
|
512
|
+
}
|
|
513
|
+
var MaterializerCliError = class extends Error {
|
|
514
|
+
constructor(code, diagnosticSubcode) {
|
|
515
|
+
super(code);
|
|
516
|
+
this.diagnosticSubcode = diagnosticSubcode;
|
|
517
|
+
this.name = "MaterializerCliError";
|
|
518
|
+
this.code = code;
|
|
519
|
+
}
|
|
520
|
+
code;
|
|
521
|
+
};
|
|
522
|
+
function unsupported() {
|
|
523
|
+
return new MaterializerCliError("unsupported_semantics");
|
|
524
|
+
}
|
|
525
|
+
function invalidSource(diagnosticSubcode) {
|
|
526
|
+
return new MaterializerCliError("source_identity_mismatch", diagnosticSubcode);
|
|
527
|
+
}
|
|
528
|
+
function incompatible() {
|
|
529
|
+
return new MaterializerCliError("kernel_incompatible");
|
|
530
|
+
}
|
|
531
|
+
function invalidOutput() {
|
|
532
|
+
return new MaterializerCliError("output_verification_failed");
|
|
533
|
+
}
|
|
534
|
+
function classifyInvalidSource(error, diagnosticSubcode) {
|
|
535
|
+
return error instanceof MaterializerCliError && error.code === "source_identity_mismatch" ? invalidSource(error.diagnosticSubcode ?? diagnosticSubcode) : error;
|
|
536
|
+
}
|
|
537
|
+
async function loadRuntime(environment) {
|
|
538
|
+
try {
|
|
539
|
+
return await loadConfiguredArtifactKernelRuntime(environment);
|
|
540
|
+
} catch {
|
|
541
|
+
throw incompatible();
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
export {
|
|
546
|
+
runArtifactMaterializerCli,
|
|
547
|
+
editableArtifactMaterializerCapabilitiesForRuntime
|
|
548
|
+
};
|
|
549
|
+
//# sourceMappingURL=chunk-NAG44K67.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/materializer-cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { createHash } from \"node:crypto\";\nimport { once } from \"node:events\";\n\nimport {\n SPREADSHEET_ARTIFACT_PROJECTION_MAX_BYTES,\n SPREADSHEET_ARTIFACT_VIEWPORT_MAX_CELLS,\n decodeSpreadsheetMetadataKernelProjection,\n decodeSpreadsheetViewportKernelProjection,\n encodeSpreadsheetMetadataKernelQuery,\n encodeSpreadsheetViewportKernelQuery,\n type SpreadsheetArtifactProjectedCellValue,\n type SpreadsheetArtifactFormulaError,\n} from \"@opengeni/contracts/editable-artifacts\";\n\nimport { NativeSpreadsheetSession } from \"./native\";\nimport { SpreadsheetXlsxCodec } from \"./spreadsheet-xlsx-codec\";\nimport { Workbook, type SerializedWorkbook } from \"./spreadsheet\";\nimport { loadConfiguredArtifactKernelRuntime } from \"./runtime-development\";\nimport type { ArtifactKernelRuntime } from \"./runtime\";\n\nconst IDENTITY_ARGUMENT = \"--opengeni-materializer-identity-v1\";\nconst MATERIALIZE_ARGUMENT = \"--opengeni-materialize-v1\";\nconst VERIFY_ARGUMENT = \"--opengeni-verify-materialization-v1\";\nconst INPUT_MAGIC = bytes(\"OGAMI001\");\nconst VERIFY_INPUT_MAGIC = bytes(\"OGAVI001\");\nconst OUTPUT_MAGIC = bytes(\"OGAMO001\");\nconst VERIFY_OUTPUT_MAGIC = bytes(\"OGAVO001\");\nconst ERROR_MAGIC = bytes(\"OGAME001\");\nconst MAX_METADATA_BYTES = 256 * 1024;\nconst MAX_SOURCE_BYTES = 512 * 1024 * 1024;\nconst MAX_OUTPUT_BYTES = 512 * 1024 * 1024;\nconst MAX_PROJECTED_RECTANGLE_CELLS = 1_000_000;\nconst VIEWPORT_EDGE = 128;\nconst XLSX_CODEC_ID = \"opengeni.xlsx\";\nconst EMPTY_FONT_REGISTRY_HASH = sha256(bytes(\"opengeni:no-font-registry:v1\"));\nconst POLICY_HASH = sha256(bytes(\"opengeni:materializer:xlsx-native-projection:v1\"));\n\nexport type EditableArtifactNativeMaterializerCapabilities = Readonly<{\n protocol: \"OGAMC001\";\n runtimeKind: \"native\";\n runtimeTarget: string;\n kernelVersion: string;\n codecVersions: Readonly<Record<typeof XLSX_CODEC_ID, string>>;\n fontRegistryHash: string;\n policyHash: string;\n maxOutputBytes: number;\n supportedModelSchemaVersions: readonly [1];\n supportedOperationProtocolVersions: readonly [1];\n supportedSnapshotProtocolVersions: readonly [1];\n}>;\n\ntype MaterializationManifest = Readonly<{\n protocol: \"OGAMJ001\";\n artifactId: string;\n jobId: string;\n versionId: string;\n modality: \"spreadsheet\" | \"document\" | \"presentation\";\n inputSnapshotId: string;\n targetHeadSequence: number;\n stateHash: string;\n sourceByteSize: number;\n sourceContentHash: string;\n modelSchemaVersion: number;\n operationProtocolVersion: number;\n snapshotProtocolVersion: number;\n format: \"xlsx\" | \"pptx\" | \"docx\" | \"pdf\" | \"png\" | \"webp\";\n codecId: string;\n normalizedOptions: Readonly<Record<string, never>>;\n optionsHash: string;\n codecVersion: string;\n kernelVersion: string;\n fontRegistryHash: string;\n policyHash: string;\n}>;\n\ntype SemanticCell = Readonly<{\n row: number;\n column: number;\n formula: string | null;\n value: SpreadsheetArtifactProjectedCellValue;\n}>;\n\ntype SemanticWorkbook = Readonly<{\n version: 1;\n sheets: readonly Readonly<{ name: string; cells: readonly SemanticCell[] }>[];\n}>;\n\ntype ProjectedWorkbook = Readonly<{\n workbook: Workbook;\n semanticHash: string;\n}>;\n\ntype NativeSourceDiagnosticSubcode = \"input_framing\" | \"snapshot_open\" | \"state_mismatch\";\n\nexport async function runArtifactMaterializerCli(\n args: readonly string[],\n environment: Readonly<Record<string, string | undefined>> = process.env,\n): Promise<void> {\n if (args.length !== 1) throw new Error(\"unsupported materializer command\");\n const command = args[0];\n if (command === IDENTITY_ARGUMENT) {\n const capabilities = await loadCapabilities(environment);\n process.stdout.write(JSON.stringify(capabilities));\n return;\n }\n if (command === MATERIALIZE_ARGUMENT) {\n try {\n await materialize(environment);\n } catch (error) {\n if (!(error instanceof MaterializerCliError)) throw error;\n await writeTypedError(error.code, error.diagnosticSubcode);\n }\n return;\n }\n if (command === VERIFY_ARGUMENT) {\n try {\n await verifyMaterialization(environment);\n } catch (error) {\n if (!(error instanceof MaterializerCliError)) throw error;\n await writeTypedError(error.code, error.diagnosticSubcode);\n }\n return;\n }\n throw new Error(\"unsupported materializer command\");\n}\n\nasync function loadCapabilities(\n environment: Readonly<Record<string, string | undefined>>,\n): Promise<EditableArtifactNativeMaterializerCapabilities> {\n const loaded = await loadRuntime(environment);\n return editableArtifactMaterializerCapabilitiesForRuntime(\n loaded.runtime,\n loaded.location.artifactTool.packageVersion,\n );\n}\n\nasync function materialize(\n environment: Readonly<Record<string, string | undefined>>,\n): Promise<void> {\n let manifest: MaterializationManifest;\n let source: Uint8Array;\n try {\n const reader = new InputReader(process.stdin);\n assertBytes(await reader.readExactly(INPUT_MAGIC.byteLength), INPUT_MAGIC, \"input protocol\");\n const header = await reader.readExactly(12);\n const headerView = new DataView(header.buffer, header.byteOffset, header.byteLength);\n const metadataLength = headerView.getUint32(0, true);\n const sourceLength = safeU64(headerView, 4, \"source length\");\n if (metadataLength < 2 || metadataLength > MAX_METADATA_BYTES) throw invalidSource();\n if (sourceLength <= 0 || sourceLength > MAX_SOURCE_BYTES) throw unsupported();\n manifest = decodeManifest(await reader.readExactly(metadataLength));\n if (sourceLength !== manifest.sourceByteSize) throw invalidSource();\n source = await reader.readExactly(sourceLength);\n await reader.assertEof();\n if (sha256(source) !== manifest.sourceContentHash) throw invalidSource();\n } catch (error) {\n throw classifyInvalidSource(error, \"input_framing\");\n }\n\n const loaded = await loadRuntime(environment);\n const capabilities = editableArtifactMaterializerCapabilitiesForRuntime(\n loaded.runtime,\n loaded.location.artifactTool.packageVersion,\n );\n assertManifestCompatibility(manifest, capabilities);\n if (manifest.modality !== \"spreadsheet\" || manifest.format !== \"xlsx\") throw unsupported();\n\n const projected = projectSpreadsheet(loaded.runtime, source, manifest);\n const outputBlob = await SpreadsheetXlsxCodec.exportXlsx(projected.workbook, {\n unsupportedContent: \"error\",\n fileName: \"workbook.xlsx\",\n });\n const output = new Uint8Array(await outputBlob.arrayBuffer());\n if (output.byteLength <= 0 || output.byteLength > MAX_OUTPUT_BYTES) throw unsupported();\n // Export/import equivalence is checked here for early failure and again by a\n // distinct verifier process after immutable object publication.\n const imported = await SpreadsheetXlsxCodec.importXlsx(output, { unsupportedContent: \"error\" });\n if (semanticHashForWorkbook(imported) !== projected.semanticHash) throw unsupported();\n\n const metadata = canonicalBytes({\n byteSize: output.byteLength,\n codecId: manifest.codecId,\n codecVersion: manifest.codecVersion,\n contentHash: sha256(output),\n fontRegistryHash: manifest.fontRegistryHash,\n format: manifest.format,\n headSequence: manifest.targetHeadSequence,\n kernelVersion: manifest.kernelVersion,\n mimeType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n policyHash: manifest.policyHash,\n protocol: \"OGAMR001\",\n semanticHash: projected.semanticHash,\n stateHash: manifest.stateHash,\n });\n await writeFrame(OUTPUT_MAGIC, metadata, output);\n}\n\nasync function verifyMaterialization(\n environment: Readonly<Record<string, string | undefined>>,\n): Promise<void> {\n const reader = new InputReader(process.stdin);\n assertBytes(\n await reader.readExactly(VERIFY_INPUT_MAGIC.byteLength),\n VERIFY_INPUT_MAGIC,\n \"verification protocol\",\n );\n const header = await reader.readExactly(12);\n const view = new DataView(header.buffer, header.byteOffset, header.byteLength);\n const metadataLength = view.getUint32(0, true);\n const outputLength = safeU64(view, 4, \"verification output length\");\n if (metadataLength < 2 || metadataLength > MAX_METADATA_BYTES) throw invalidSource();\n if (outputLength <= 0 || outputLength > MAX_OUTPUT_BYTES) throw unsupported();\n const metadata = decodeVerificationManifest(await reader.readExactly(metadataLength));\n const output = await reader.readExactly(outputLength);\n await reader.assertEof();\n const loaded = await loadCapabilities(environment);\n if (\n metadata.format !== \"xlsx\" ||\n metadata.codecId !== XLSX_CODEC_ID ||\n loaded.codecVersions[XLSX_CODEC_ID] !== metadata.codecVersion\n ) {\n throw unsupported();\n }\n let semanticHash: string;\n try {\n const imported = await SpreadsheetXlsxCodec.importXlsx(output, { unsupportedContent: \"error\" });\n semanticHash = semanticHashForWorkbook(imported);\n } catch {\n throw invalidOutput();\n }\n if (semanticHash !== metadata.expectedSemanticHash) throw invalidOutput();\n await writeFrame(\n VERIFY_OUTPUT_MAGIC,\n canonicalBytes({ protocol: \"OGAVR001\", semanticHash }),\n new Uint8Array(0),\n );\n}\n\nfunction projectSpreadsheet(\n runtime: ArtifactKernelRuntime,\n source: Uint8Array,\n manifest: MaterializationManifest,\n): ProjectedWorkbook {\n let session: NativeSpreadsheetSession;\n try {\n session = NativeSpreadsheetSession.open(runtime, source);\n } catch {\n throw invalidSource(\"snapshot_open\");\n }\n try {\n if (session.stateHash() !== manifest.stateHash) throw invalidSource(\"state_mismatch\");\n const metadataLimit = Math.min(\n session.capabilities.maxQueryResponseBytes,\n SPREADSHEET_ARTIFACT_PROJECTION_MAX_BYTES,\n );\n const metadata = decodeSpreadsheetMetadataKernelProjection(\n session.query(\n encodeSpreadsheetMetadataKernelQuery({\n maxSheets: Math.max(1, session.capabilities.maxMetadataSheets),\n maxBytes: metadataLimit,\n }),\n ),\n {\n maxSheets: Math.max(1, session.capabilities.maxMetadataSheets),\n maxBytes: metadataLimit,\n },\n );\n if (\n metadata.modeledFeatures.dimensions !== false ||\n metadata.modeledFeatures.hidden !== false ||\n metadata.modeledFeatures.merges !== false\n ) {\n throw unsupported();\n }\n let projectedRectangleCells = 0;\n const semanticSheets: Array<{ name: string; cells: SemanticCell[] }> = [];\n for (const sheet of metadata.sheets) {\n const cells: SemanticCell[] = [];\n if (sheet.usedBounds) {\n const rows = sheet.usedBounds.endRow - sheet.usedBounds.startRow + 1;\n const columns = sheet.usedBounds.endColumn - sheet.usedBounds.startColumn + 1;\n const area = rows * columns;\n if (!Number.isSafeInteger(area) || area <= 0) throw invalidSource();\n projectedRectangleCells += area;\n if (projectedRectangleCells > MAX_PROJECTED_RECTANGLE_CELLS) throw unsupported();\n for (\n let row = sheet.usedBounds.startRow;\n row <= sheet.usedBounds.endRow;\n row += VIEWPORT_EDGE\n ) {\n const rowCount = Math.min(VIEWPORT_EDGE, sheet.usedBounds.endRow - row + 1);\n for (\n let column = sheet.usedBounds.startColumn;\n column <= sheet.usedBounds.endColumn;\n column += VIEWPORT_EDGE\n ) {\n const columnCount = Math.min(VIEWPORT_EDGE, sheet.usedBounds.endColumn - column + 1);\n const maxCells = rowCount * columnCount;\n if (maxCells > SPREADSHEET_ARTIFACT_VIEWPORT_MAX_CELLS) throw unsupported();\n const query = {\n sheetId: sheet.sheetId,\n startRow: row,\n startColumn: column,\n rowCount,\n columnCount,\n maxCells,\n maxBytes: metadataLimit,\n } as const;\n const viewport = decodeSpreadsheetViewportKernelProjection(\n session.query(encodeSpreadsheetViewportKernelQuery(query)),\n query,\n );\n for (const cell of viewport.cells) {\n assertRepresentableValue(cell.value);\n cells.push({\n row: cell.row,\n column: cell.column,\n formula: cell.formula,\n value: cell.value,\n });\n }\n }\n }\n }\n cells.sort((left, right) => left.row - right.row || left.column - right.column);\n semanticSheets.push({ name: sheet.name, cells });\n }\n const semantic: SemanticWorkbook = Object.freeze({ version: 1, sheets: semanticSheets });\n const workbook = Workbook.fromJSON(toSerializedWorkbook(semantic));\n const semanticHash = sha256(canonicalBytes(semantic));\n // Recalculation through the host projection must agree with every native\n // formula result before the Office codec is allowed to run.\n if (semanticHashForWorkbook(workbook) !== semanticHash) throw unsupported();\n return Object.freeze({ workbook, semanticHash });\n } finally {\n session.dispose();\n }\n}\n\nfunction toSerializedWorkbook(semantic: SemanticWorkbook): SerializedWorkbook {\n return {\n version: 1,\n worksheets: semantic.sheets.map((sheet, index) => ({\n id: `ws/native-${index + 1}`,\n name: sheet.name,\n showGridLines: true,\n freezePanes: { rows: 0, columns: 0 },\n cells: sheet.cells.map((cell) => ({\n row: cell.row,\n col: cell.column,\n value: cell.formula ? null : hostValue(cell.value),\n formula: cell.formula,\n format: {},\n })),\n merges: [],\n columnWidths: [],\n rowHeights: [],\n tables: [],\n charts: [],\n sparklines: [],\n dataValidations: [],\n conditionalFormattings: [],\n images: [],\n })),\n comments: [],\n } as SerializedWorkbook;\n}\n\nfunction semanticHashForWorkbook(workbook: Workbook): string {\n const sheets = workbook.worksheets.items.map((sheet) => {\n const cells: SemanticCell[] = [];\n for (const { row, col, data } of sheet.cellEntries()) {\n const value = data.formula ? workbook.valueAt(sheet, { row, col }) : data.value;\n cells.push({\n row,\n column: col,\n formula: data.formula,\n value: semanticValue(value, data.formula !== null),\n });\n }\n cells.sort((left, right) => left.row - right.row || left.column - right.column);\n return { name: sheet.name, cells };\n });\n return sha256(canonicalBytes({ version: 1, sheets } satisfies SemanticWorkbook));\n}\n\nfunction semanticValue(value: unknown, formula: boolean): SpreadsheetArtifactProjectedCellValue {\n if (value === null || value === undefined) return { kind: \"empty\" };\n if (typeof value === \"boolean\") return { kind: \"boolean\", value };\n if (typeof value === \"number\" && Number.isFinite(value)) return { kind: \"number\", value };\n if (value instanceof Date) {\n const milliseconds = Date.prototype.getTime.call(value);\n if (!Number.isSafeInteger(milliseconds)) throw unsupported();\n return { kind: \"date\", value: new Date(milliseconds).toISOString() };\n }\n if (typeof value === \"string\") {\n if (formula) {\n const error = FORMULA_ERROR_TO_NATIVE[value];\n if (error) return { kind: \"error\", value: error };\n if (value === \"#CYCLE!\") return { kind: \"error\", value: { custom: value } };\n }\n return { kind: \"text\", value };\n }\n throw unsupported();\n}\n\nfunction hostValue(\n value: SpreadsheetArtifactProjectedCellValue,\n): string | number | boolean | Date | null {\n switch (value.kind) {\n case \"empty\":\n return null;\n case \"boolean\":\n case \"number\":\n case \"text\":\n return value.value;\n case \"date\":\n return new Date(value.value);\n case \"error\": {\n if (typeof value.value === \"object\") return value.value.custom;\n const projected = NATIVE_ERROR_TO_FORMULA[value.value];\n if (!projected) throw unsupported();\n return projected;\n }\n }\n}\n\nfunction assertRepresentableValue(value: SpreadsheetArtifactProjectedCellValue): void {\n hostValue(value);\n}\n\nconst NATIVE_ERROR_TO_FORMULA: Readonly<Record<string, string>> = Object.freeze({\n divide_by_zero: \"#DIV/0!\",\n value: \"#VALUE!\",\n reference: \"#REF!\",\n name: \"#NAME?\",\n number: \"#NUM!\",\n not_available: \"#N/A\",\n});\nconst FORMULA_ERROR_TO_NATIVE: Readonly<Record<string, SpreadsheetArtifactFormulaError>> =\n Object.freeze({\n \"#DIV/0!\": \"divide_by_zero\",\n \"#VALUE!\": \"value\",\n \"#REF!\": \"reference\",\n \"#NAME?\": \"name\",\n \"#NUM!\": \"number\",\n \"#N/A\": \"not_available\",\n });\n\n/**\n * Exact producer profile derived from the same verified native runtime used by\n * the materializer child. The API uses this rather than accepting job identity\n * facts from clients.\n */\nexport function editableArtifactMaterializerCapabilitiesForRuntime(\n runtime: ArtifactKernelRuntime,\n packageVersion: string,\n): EditableArtifactNativeMaterializerCapabilities {\n return Object.freeze({\n protocol: \"OGAMC001\",\n runtimeKind: \"native\",\n runtimeTarget: runtime.target,\n kernelVersion: runtime.buildIdentity,\n codecVersions: Object.freeze({ [XLSX_CODEC_ID]: codecVersion(packageVersion) }),\n fontRegistryHash: EMPTY_FONT_REGISTRY_HASH,\n policyHash: POLICY_HASH,\n maxOutputBytes: MAX_OUTPUT_BYTES,\n supportedModelSchemaVersions: Object.freeze([1] as const),\n supportedOperationProtocolVersions: Object.freeze([1] as const),\n supportedSnapshotProtocolVersions: Object.freeze([1] as const),\n });\n}\n\nfunction assertManifestCompatibility(\n manifest: MaterializationManifest,\n capabilities: EditableArtifactNativeMaterializerCapabilities,\n): void {\n if (\n manifest.modelSchemaVersion !== 1 ||\n manifest.operationProtocolVersion !== 1 ||\n manifest.snapshotProtocolVersion !== 1 ||\n manifest.kernelVersion !== capabilities.kernelVersion ||\n manifest.codecVersion !==\n (capabilities.codecVersions as Readonly<Record<string, string>>)[manifest.codecId] ||\n manifest.fontRegistryHash !== capabilities.fontRegistryHash ||\n manifest.policyHash !== capabilities.policyHash ||\n Object.keys(manifest.normalizedOptions).length !== 0\n ) {\n throw incompatible();\n }\n}\n\nfunction decodeManifest(value: Uint8Array): MaterializationManifest {\n const record = strictCanonicalRecord(value, [\n \"artifactId\",\n \"codecId\",\n \"codecVersion\",\n \"fontRegistryHash\",\n \"format\",\n \"inputSnapshotId\",\n \"jobId\",\n \"kernelVersion\",\n \"modality\",\n \"modelSchemaVersion\",\n \"normalizedOptions\",\n \"operationProtocolVersion\",\n \"optionsHash\",\n \"policyHash\",\n \"protocol\",\n \"snapshotProtocolVersion\",\n \"sourceByteSize\",\n \"sourceContentHash\",\n \"stateHash\",\n \"targetHeadSequence\",\n \"versionId\",\n ]);\n if (\n record.protocol !== \"OGAMJ001\" ||\n !positiveInteger(record.sourceByteSize) ||\n !positiveInteger(record.targetHeadSequence) ||\n !isHash(record.sourceContentHash) ||\n !isHash(record.stateHash) ||\n !isHash(record.optionsHash) ||\n !isHash(record.fontRegistryHash) ||\n !isHash(record.policyHash) ||\n !plainRecord(record.normalizedOptions)\n ) {\n throw invalidSource();\n }\n return record as MaterializationManifest;\n}\n\nfunction decodeVerificationManifest(value: Uint8Array): Readonly<{\n protocol: \"OGAVJ001\";\n format: string;\n codecId: string;\n codecVersion: string;\n expectedSemanticHash: string;\n}> {\n const record = strictCanonicalRecord(value, [\n \"codecId\",\n \"codecVersion\",\n \"expectedSemanticHash\",\n \"format\",\n \"protocol\",\n ]);\n if (record.protocol !== \"OGAVJ001\" || !isHash(record.expectedSemanticHash)) {\n throw invalidSource();\n }\n return record as never;\n}\n\nfunction strictCanonicalRecord(\n value: Uint8Array,\n keys: readonly string[],\n): Record<string, unknown> {\n const text = new TextDecoder(\"utf-8\", { fatal: true }).decode(value);\n const parsed = JSON.parse(text) as unknown;\n if (!plainRecord(parsed) || JSON.stringify(parsed) !== text) throw invalidSource();\n if (Object.keys(parsed).sort().join(\"\\0\") !== [...keys].sort().join(\"\\0\")) throw invalidSource();\n return parsed;\n}\n\nasync function writeTypedError(\n code: string,\n diagnosticSubcode?: NativeSourceDiagnosticSubcode,\n): Promise<void> {\n await writeFrame(\n ERROR_MAGIC,\n canonicalBytes({\n code,\n protocol: \"OGAMERR1\",\n ...(diagnosticSubcode ? { subcode: diagnosticSubcode } : {}),\n }),\n new Uint8Array(0),\n );\n}\n\nasync function writeFrame(\n magic: Uint8Array,\n metadata: Uint8Array,\n payload: Uint8Array,\n): Promise<void> {\n const header = new Uint8Array(12);\n const view = new DataView(header.buffer);\n view.setUint32(0, metadata.byteLength, true);\n view.setBigUint64(4, BigInt(payload.byteLength), true);\n await writeStdout(magic);\n await writeStdout(header);\n await writeStdout(metadata);\n for (let offset = 0; offset < payload.byteLength; offset += 1024 * 1024) {\n await writeStdout(payload.subarray(offset, Math.min(payload.byteLength, offset + 1024 * 1024)));\n }\n}\n\nasync function writeStdout(value: Uint8Array): Promise<void> {\n if (!process.stdout.write(value)) await once(process.stdout, \"drain\");\n}\n\nclass InputReader {\n readonly #iterator: AsyncIterator<Buffer | string>;\n #buffer = new Uint8Array(0);\n #done = false;\n\n constructor(stream: NodeJS.ReadableStream & AsyncIterable<Buffer | string>) {\n this.#iterator = stream[Symbol.asyncIterator]();\n }\n\n async readExactly(length: number): Promise<Uint8Array> {\n if (!Number.isSafeInteger(length) || length < 0 || length > MAX_SOURCE_BYTES)\n throw invalidSource();\n const result = new Uint8Array(length);\n let offset = 0;\n while (offset < length) {\n if (this.#buffer.byteLength === 0) await this.#fill();\n if (this.#buffer.byteLength === 0) throw invalidSource();\n const count = Math.min(length - offset, this.#buffer.byteLength);\n result.set(this.#buffer.subarray(0, count), offset);\n this.#buffer = this.#buffer.subarray(count);\n offset += count;\n }\n return result;\n }\n\n async assertEof(): Promise<void> {\n if (this.#buffer.byteLength > 0) throw invalidSource();\n if (!this.#done) await this.#fill();\n if (!this.#done || this.#buffer.byteLength > 0) throw invalidSource();\n }\n\n async #fill(): Promise<void> {\n const next = await this.#iterator.next();\n if (next.done) {\n this.#done = true;\n return;\n }\n if (typeof next.value === \"string\") throw invalidSource();\n this.#buffer = new Uint8Array(\n next.value.buffer,\n next.value.byteOffset,\n next.value.byteLength,\n ).slice();\n }\n}\n\nfunction codecVersion(packageVersion: string): string {\n return `xlsx-v1@${packageVersion}`;\n}\n\nfunction canonicalBytes(value: unknown): Uint8Array {\n return bytes(JSON.stringify(value));\n}\n\nfunction bytes(value: string): Uint8Array {\n return new TextEncoder().encode(value);\n}\n\nfunction sha256(value: Uint8Array): string {\n return `sha256:${createHash(\"sha256\").update(value).digest(\"hex\")}`;\n}\n\nfunction safeU64(view: DataView, offset: number, label: string): number {\n const value = view.getBigUint64(offset, true);\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) throw new Error(`${label} exceeds safe integer`);\n return Number(value);\n}\n\nfunction assertBytes(actual: Uint8Array, expected: Uint8Array, label: string): void {\n if (\n actual.byteLength !== expected.byteLength ||\n !actual.every((byte, index) => byte === expected[index])\n ) {\n throw new Error(`${label} is invalid`);\n }\n}\n\nfunction plainRecord(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction positiveInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0;\n}\n\nfunction isHash(value: unknown): value is string {\n return typeof value === \"string\" && /^sha256:[0-9a-f]{64}$/u.test(value);\n}\n\nclass MaterializerCliError extends Error {\n readonly code:\n | \"unsupported_semantics\"\n | \"source_identity_mismatch\"\n | \"kernel_incompatible\"\n | \"output_verification_failed\";\n\n constructor(\n code: MaterializerCliError[\"code\"],\n readonly diagnosticSubcode?: NativeSourceDiagnosticSubcode,\n ) {\n super(code);\n this.name = \"MaterializerCliError\";\n this.code = code;\n }\n}\n\nfunction unsupported(): MaterializerCliError {\n return new MaterializerCliError(\"unsupported_semantics\");\n}\nfunction invalidSource(diagnosticSubcode?: NativeSourceDiagnosticSubcode): MaterializerCliError {\n return new MaterializerCliError(\"source_identity_mismatch\", diagnosticSubcode);\n}\nfunction incompatible(): MaterializerCliError {\n return new MaterializerCliError(\"kernel_incompatible\");\n}\nfunction invalidOutput(): MaterializerCliError {\n return new MaterializerCliError(\"output_verification_failed\");\n}\n\nfunction classifyInvalidSource(\n error: unknown,\n diagnosticSubcode: NativeSourceDiagnosticSubcode,\n): unknown {\n return error instanceof MaterializerCliError && error.code === \"source_identity_mismatch\"\n ? invalidSource(error.diagnosticSubcode ?? diagnosticSubcode)\n : error;\n}\n\nasync function loadRuntime(\n environment: Readonly<Record<string, string | undefined>>,\n): Promise<Awaited<ReturnType<typeof loadConfiguredArtifactKernelRuntime>>> {\n try {\n return await loadConfiguredArtifactKernelRuntime(environment);\n } catch {\n throw incompatible();\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
var UnsupportedArtifactFeatureError = class extends Error {
|
|
3
|
+
constructor(area, feature, backend) {
|
|
4
|
+
super(`${feature} is not supported by the ${backend} ${area} backend`);
|
|
5
|
+
this.area = area;
|
|
6
|
+
this.feature = feature;
|
|
7
|
+
this.backend = backend;
|
|
8
|
+
}
|
|
9
|
+
name = "UnsupportedArtifactFeatureError";
|
|
10
|
+
};
|
|
11
|
+
var ArtifactLimitError = class extends Error {
|
|
12
|
+
constructor(limit, actual, maximum) {
|
|
13
|
+
super(`${limit} exceeds the maximum (${actual} > ${maximum})`);
|
|
14
|
+
this.limit = limit;
|
|
15
|
+
this.actual = actual;
|
|
16
|
+
this.maximum = maximum;
|
|
17
|
+
}
|
|
18
|
+
name = "ArtifactLimitError";
|
|
19
|
+
};
|
|
20
|
+
var ArtifactConflictError = class extends Error {
|
|
21
|
+
constructor(message, objectIds) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.objectIds = objectIds;
|
|
24
|
+
}
|
|
25
|
+
name = "ArtifactConflictError";
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export {
|
|
29
|
+
UnsupportedArtifactFeatureError,
|
|
30
|
+
ArtifactLimitError,
|
|
31
|
+
ArtifactConflictError
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=chunk-O24KTEGP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts"],"sourcesContent":["export type ArtifactFeatureArea =\n | \"spreadsheet\"\n | \"presentation\"\n | \"document\"\n | \"codec\"\n | \"render\"\n | \"collaboration\";\n\n/** A requested feature cannot be represented faithfully by the active kernel. */\nexport class UnsupportedArtifactFeatureError extends Error {\n readonly name = \"UnsupportedArtifactFeatureError\";\n\n constructor(\n readonly area: ArtifactFeatureArea,\n readonly feature: string,\n readonly backend: string,\n ) {\n super(`${feature} is not supported by the ${backend} ${area} backend`);\n }\n}\n\n/** Artifact bytes or commands exceeded a declared safety/resource boundary. */\nexport class ArtifactLimitError extends Error {\n readonly name = \"ArtifactLimitError\";\n\n constructor(\n readonly limit: string,\n readonly actual: number,\n readonly maximum: number,\n ) {\n super(`${limit} exceeds the maximum (${actual} > ${maximum})`);\n }\n}\n\n/** A command's structural precondition no longer matches canonical state. */\nexport class ArtifactConflictError extends Error {\n readonly name = \"ArtifactConflictError\";\n\n constructor(\n message: string,\n readonly objectIds: readonly string[],\n ) {\n super(message);\n }\n}\n"],"mappings":";AASO,IAAM,kCAAN,cAA8C,MAAM;AAAA,EAGzD,YACW,MACA,SACA,SACT;AACA,UAAM,GAAG,OAAO,4BAA4B,OAAO,IAAI,IAAI,UAAU;AAJ5D;AACA;AACA;AAAA,EAGX;AAAA,EARS,OAAO;AASlB;AAGO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAG5C,YACW,OACA,QACA,SACT;AACA,UAAM,GAAG,KAAK,yBAAyB,MAAM,MAAM,OAAO,GAAG;AAJpD;AACA;AACA;AAAA,EAGX;AAAA,EARS,OAAO;AASlB;AAGO,IAAM,wBAAN,cAAoC,MAAM;AAAA,EAG/C,YACE,SACS,WACT;AACA,UAAM,OAAO;AAFJ;AAAA,EAGX;AAAA,EAPS,OAAO;AAQlB;","names":[]}
|