Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/tests/verify-snapshot.ts
3544 views
1
/*
2
* verify-snapshot.ts
3
*
4
* Copyright (C) 2024 Posit Software, PBC
5
*/
6
7
import { extname } from "../src/deno_ral/path.ts";
8
import { normalizeNewlines } from "../src/core/text.ts";
9
import { withDocxContent } from "./verify.ts";
10
11
import * as slimdom from "slimdom";
12
import xpath from "fontoxpath";
13
14
type Canonicalizer = (file: string) => Promise<string>;
15
16
const ipynbCanonicalizer = (file: string) => {
17
const json = JSON.parse(Deno.readTextFileSync(file));
18
for (const cell of json.cells) {
19
if (cell.id.match(/^[0-9a-f-]+$/)) {
20
cell.id = "<uuid>";
21
}
22
}
23
return Promise.resolve(JSON.stringify(json, null, 2));
24
}
25
26
const docxCanonicalizer = async (fileName: string) => {
27
return withDocxContent(fileName, async (content) => {
28
const xmlDoc = slimdom.parseXmlDocument(content);
29
for await (const element of xpath.evaluateXPathToAsyncIterator("//pic:cNvPr", xmlDoc)) {
30
element.setAttribute("descr", "<uuid>");
31
}
32
return slimdom.serializeToWellFormedString(xmlDoc);
33
});
34
}
35
36
const canonicalizers: Record<string, Canonicalizer> = {
37
"ipynb": ipynbCanonicalizer,
38
"docx": docxCanonicalizer,
39
};
40
41
const readAndNormalizeNewlines = (file: string) => {
42
return normalizeNewlines(Deno.readTextFileSync(file));
43
}
44
45
export const canonicalizeSnapshot = async (file: string) => {
46
const origFile = file;
47
if (file.endsWith(".snapshot")) {
48
file = file.slice(0, -9);
49
}
50
let ext = extname(file).slice(1);
51
const canonicalizer = canonicalizers[ext] || readAndNormalizeNewlines;
52
return canonicalizer(origFile);
53
}
54
55
export const checkSnapshot = async (file: string) => {
56
const outputCanonical = await canonicalizeSnapshot(file);
57
const snapshotCanonical = await canonicalizeSnapshot(file + ".snapshot");
58
return outputCanonical === snapshotCanonical;
59
}
60
61