@anselmdk/feature-spec-md 0.6.1 → 0.6.2-rc.1
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/dist/cli.js +35 -141
- package/dist/cli.js.map +1 -1
- package/dist/githubReportMetadata.d.ts +7 -0
- package/dist/githubReportMetadata.d.ts.map +1 -0
- package/dist/githubReportMetadata.js +152 -0
- package/dist/githubReportMetadata.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/playwright.d.ts +3 -3
- package/dist/playwright.d.ts.map +1 -1
- package/dist/playwright.js +62 -15
- package/dist/playwright.js.map +1 -1
- package/dist/reportArtifacts.d.ts +1 -1
- package/dist/reportArtifacts.d.ts.map +1 -1
- package/dist/reportArtifacts.js +1 -1
- package/dist/reportArtifacts.js.map +1 -1
- package/dist/reportHtml.d.ts +3 -1
- package/dist/reportHtml.d.ts.map +1 -1
- package/dist/reportHtml.js +11 -14
- package/dist/reportHtml.js.map +1 -1
- package/dist/reportTemplate.d.ts +0 -1
- package/dist/reportTemplate.d.ts.map +1 -1
- package/dist/reportTemplate.js +146 -192
- package/dist/reportTemplate.js.map +1 -1
- package/dist/reportTemplates/shared.d.ts +6 -0
- package/dist/reportTemplates/shared.d.ts.map +1 -0
- package/dist/reportTemplates/shared.js +15 -0
- package/dist/reportTemplates/shared.js.map +1 -0
- package/dist/screenshots.d.ts +1 -3
- package/dist/screenshots.d.ts.map +1 -1
- package/dist/screenshots.js +20 -23
- package/dist/screenshots.js.map +1 -1
- package/dist/types.d.ts +3 -23
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/mocks/current/screenshots/screenshots.json +19 -1
- package/src/mocks/previous/screenshots/screenshots.json +10 -1
package/dist/playwright.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* and capturing screenshot evidence tied to exact spec lines.
|
|
4
|
-
*/
|
|
5
|
-
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
6
3
|
import path from "node:path";
|
|
7
4
|
import { parseFeatureSpec } from "./featureSpecs.js";
|
|
8
5
|
import { expandFilePatterns } from "./filePatterns.js";
|
|
9
|
-
/** Create a Playwright helper that captures screenshot evidence for spec step lines. */
|
|
10
6
|
export function createPlaywrightSpecEvidence(test, options) {
|
|
11
7
|
const cwd = options.cwd ?? process.cwd();
|
|
12
8
|
const reportDir = path.resolve(cwd, options.reportDir ?? "test-results/spec-report");
|
|
@@ -14,17 +10,25 @@ export function createPlaywrightSpecEvidence(test, options) {
|
|
|
14
10
|
const screenshotDir = path.join(reportDir, screenshotsDirName);
|
|
15
11
|
const stepsPromise = loadSpecSteps(options.specs, cwd);
|
|
16
12
|
const entriesByWorker = new Map();
|
|
13
|
+
const screenStateByScenario = new Map();
|
|
17
14
|
return {
|
|
18
15
|
async specStep(page, testInfo, scenarioId, stepText, body) {
|
|
19
16
|
const step = await findSpecStep(stepsPromise, scenarioId, stepText);
|
|
20
17
|
await test.step(`${step.keyword} ${step.text}`, async () => {
|
|
18
|
+
const stateKey = screenStateKey(testInfo, scenarioId);
|
|
19
|
+
if (!screenStateByScenario.has(stateKey)) {
|
|
20
|
+
const baseline = await capturePageBuffer(page, reportDir, "baseline");
|
|
21
|
+
screenStateByScenario.set(stateKey, { hash: screenshotHash(baseline) });
|
|
22
|
+
}
|
|
21
23
|
await body();
|
|
22
|
-
await
|
|
24
|
+
await captureStepEvidence({
|
|
23
25
|
entriesByWorker,
|
|
24
26
|
page,
|
|
25
27
|
reportDir,
|
|
26
28
|
screenshotDir,
|
|
27
29
|
screenshotsDirName,
|
|
30
|
+
screenStateByScenario,
|
|
31
|
+
stateKey,
|
|
28
32
|
step,
|
|
29
33
|
testInfo,
|
|
30
34
|
});
|
|
@@ -32,7 +36,6 @@ export function createPlaywrightSpecEvidence(test, options) {
|
|
|
32
36
|
},
|
|
33
37
|
};
|
|
34
38
|
}
|
|
35
|
-
/** Parse spec files and return all scenario step lines addressable by Playwright tests. */
|
|
36
39
|
export async function loadSpecSteps(patterns, cwd = process.cwd()) {
|
|
37
40
|
const previousCwd = process.cwd();
|
|
38
41
|
const steps = [];
|
|
@@ -65,31 +68,75 @@ async function findSpecStep(stepsPromise, scenarioId, stepText) {
|
|
|
65
68
|
}
|
|
66
69
|
return step;
|
|
67
70
|
}
|
|
68
|
-
async function
|
|
71
|
+
async function captureStepEvidence(options) {
|
|
72
|
+
const currentBuffer = await capturePageBuffer(options.page, options.reportDir, `line-${options.step.line}`);
|
|
73
|
+
const currentHash = screenshotHash(currentBuffer);
|
|
74
|
+
const previousState = options.screenStateByScenario.get(options.stateKey);
|
|
75
|
+
const title = `${options.step.scenarioId}:${options.step.line} ${options.step.keyword} ${options.step.text}`;
|
|
76
|
+
if (previousState?.hash === currentHash && previousState.line !== undefined) {
|
|
77
|
+
await recordEvidence(options, {
|
|
78
|
+
specPath: options.step.specPath,
|
|
79
|
+
line: options.step.line,
|
|
80
|
+
changed: false,
|
|
81
|
+
title: `${title} (unchanged)`,
|
|
82
|
+
testPath: options.testInfo.file,
|
|
83
|
+
comparedWithLine: previousState.line,
|
|
84
|
+
});
|
|
85
|
+
options.screenStateByScenario.set(options.stateKey, {
|
|
86
|
+
hash: currentHash,
|
|
87
|
+
line: options.step.line,
|
|
88
|
+
});
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
69
91
|
await mkdir(options.screenshotDir, { recursive: true });
|
|
70
92
|
const fileName = `${options.step.scenarioId}-line-${options.step.line}-${slug(options.step.text)}.png`;
|
|
71
93
|
const screenshotPath = path.join(options.screenshotDir, fileName);
|
|
72
94
|
const relativePath = `${options.screenshotsDirName}/${fileName}`;
|
|
73
|
-
|
|
74
|
-
await options.page.screenshot({ fullPage: true, path: screenshotPath });
|
|
95
|
+
await writeFile(screenshotPath, currentBuffer);
|
|
75
96
|
await options.testInfo.attach(title, {
|
|
76
97
|
contentType: "image/png",
|
|
77
98
|
path: screenshotPath,
|
|
78
99
|
});
|
|
79
|
-
|
|
80
|
-
entries.push({
|
|
100
|
+
await recordEvidence(options, {
|
|
81
101
|
specPath: options.step.specPath,
|
|
82
102
|
line: options.step.line,
|
|
103
|
+
changed: true,
|
|
83
104
|
path: relativePath,
|
|
84
105
|
title,
|
|
85
106
|
testPath: options.testInfo.file,
|
|
86
107
|
});
|
|
108
|
+
options.screenStateByScenario.set(options.stateKey, {
|
|
109
|
+
hash: currentHash,
|
|
110
|
+
line: options.step.line,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async function recordEvidence(options, entry) {
|
|
114
|
+
const entries = options.entriesByWorker.get(options.testInfo.workerIndex) ?? [];
|
|
115
|
+
entries.push(entry);
|
|
87
116
|
options.entriesByWorker.set(options.testInfo.workerIndex, entries);
|
|
88
117
|
await writeWorkerManifest(options.reportDir, options.testInfo.workerIndex, entries);
|
|
89
118
|
}
|
|
90
|
-
async function
|
|
119
|
+
async function capturePageBuffer(page, reportDir, label) {
|
|
120
|
+
const tempDir = path.join(reportDir, ".visual-evidence-tmp");
|
|
121
|
+
await mkdir(tempDir, { recursive: true });
|
|
122
|
+
const tempPath = path.join(tempDir, `${process.pid}-${Date.now()}-${slug(label)}.png`);
|
|
123
|
+
try {
|
|
124
|
+
await page.screenshot({ fullPage: true, path: tempPath });
|
|
125
|
+
return await readFile(tempPath);
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
await rm(tempPath, { force: true });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function screenshotHash(buffer) {
|
|
132
|
+
return createHash("sha256").update(buffer).digest("hex");
|
|
133
|
+
}
|
|
134
|
+
function screenStateKey(testInfo, scenarioId) {
|
|
135
|
+
return `${testInfo.workerIndex}:${testInfo.file}:${scenarioId}`;
|
|
136
|
+
}
|
|
137
|
+
async function writeWorkerManifest(reportDir, workerIndex, evidence) {
|
|
91
138
|
await mkdir(reportDir, { recursive: true });
|
|
92
|
-
await writeFile(path.join(reportDir, `screenshots-${workerIndex}.json`), JSON.stringify({
|
|
139
|
+
await writeFile(path.join(reportDir, `screenshots-${workerIndex}.json`), JSON.stringify({ evidence }, null, 2), "utf8");
|
|
93
140
|
}
|
|
94
141
|
function slug(value) {
|
|
95
142
|
return value
|
package/dist/playwright.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reportArtifacts.d.ts","sourceRoot":"","sources":["../src/reportArtifacts.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"reportArtifacts.d.ts","sourceRoot":"","sources":["../src/reportArtifacts.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AAErD,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAAE,iBAuBnB"}
|
package/dist/reportArtifacts.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import { expandFilePatterns } from "./filePatterns.js";
|
|
4
|
-
export const publishedSpecRoot = "__feature-spec-md
|
|
4
|
+
export const publishedSpecRoot = "__feature-spec-md";
|
|
5
5
|
export async function writePublishedFeatureSpecFiles(reportDir, patterns) {
|
|
6
6
|
const files = (await expandFilePatterns(patterns)).filter((file) => file.endsWith(".feature.md"));
|
|
7
7
|
const features = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reportArtifacts.js","sourceRoot":"","sources":["../src/reportArtifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,
|
|
1
|
+
{"version":3,"file":"reportArtifacts.js","sourceRoot":"","sources":["../src/reportArtifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAOrD,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,SAAiB,EACjB,QAAkB;IAElB,MAAM,KAAK,GAAG,CAAC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACjE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAC7B,CAAC;IACF,MAAM,QAAQ,GAAgC,EAAE,CAAC;IAEjD,KAAK,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,aAAa,GAAG,GAAG,iBAAiB,IAAI,QAAQ,EAAE,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACpE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,mBAAmB,EAAE,eAAe,CAAC,CAAC;IAC3E,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,CACb,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAC5E,MAAM,CACP,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,OAAO,QAAQ;SACZ,KAAK,CAAC,QAAQ,CAAC;SACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC;SACvD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
|
package/dist/reportHtml.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { type ReportMetadataItem } from "./reportMetadata.js";
|
|
1
2
|
export type HtmlPageOptions = {
|
|
2
3
|
title: string;
|
|
3
4
|
body: string;
|
|
4
5
|
styles?: string;
|
|
5
6
|
scripts?: string;
|
|
6
7
|
maxWidth?: string;
|
|
8
|
+
metadata?: ReportMetadataItem[];
|
|
7
9
|
};
|
|
8
|
-
export declare function renderHtmlPage({ title, body, styles, scripts, maxWidth, }: HtmlPageOptions): string;
|
|
10
|
+
export declare function renderHtmlPage({ title, body, styles, scripts, maxWidth, metadata, }: HtmlPageOptions): string;
|
|
9
11
|
//# sourceMappingURL=reportHtml.d.ts.map
|
package/dist/reportHtml.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reportHtml.d.ts","sourceRoot":"","sources":["../src/reportHtml.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"reportHtml.d.ts","sourceRoot":"","sources":["../src/reportHtml.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAG7B,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACjC,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,IAAI,EACJ,MAAW,EACX,OAAY,EACZ,QAAQ,EACR,QAAwC,GACzC,EAAE,eAAe,UA4BjB"}
|
package/dist/reportHtml.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { html } from "./html.js";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { githubReportMetadataFromEnv } from "./githubReportMetadata.js";
|
|
3
|
+
import { insertReportMetadata, } from "./reportMetadata.js";
|
|
4
|
+
import { indentTemplateBlock, reportPageDefaults } from "./reportTemplates/shared.js";
|
|
5
|
+
export function renderHtmlPage({ title, body, styles = "", scripts = "", maxWidth, metadata = githubReportMetadataFromEnv(), }) {
|
|
6
|
+
const defaults = reportPageDefaults(maxWidth, styles);
|
|
7
|
+
const page = `<!doctype html>
|
|
4
8
|
<html lang="en">
|
|
5
9
|
<head>
|
|
6
10
|
<meta charset="utf-8">
|
|
@@ -9,28 +13,21 @@ export function renderHtmlPage({ title, body, styles = "", scripts = "", maxWidt
|
|
|
9
13
|
<style>
|
|
10
14
|
body {
|
|
11
15
|
font-family: system-ui, sans-serif;
|
|
12
|
-
max-width: ${maxWidth};
|
|
16
|
+
max-width: ${defaults.maxWidth};
|
|
13
17
|
margin: 0 auto;
|
|
14
18
|
padding: 40px 24px;
|
|
15
19
|
color: #1f2328;
|
|
16
20
|
line-height: 1.5;
|
|
17
21
|
}
|
|
18
|
-
${
|
|
22
|
+
${indentTemplateBlock(defaults.styleText, 4)}
|
|
19
23
|
</style>
|
|
20
24
|
</head>
|
|
21
25
|
<body>
|
|
22
|
-
${
|
|
23
|
-
${scripts ?
|
|
26
|
+
${indentTemplateBlock(body, 2)}
|
|
27
|
+
${scripts ? indentTemplateBlock(scripts, 2) : ""}
|
|
24
28
|
</body>
|
|
25
29
|
</html>
|
|
26
30
|
`;
|
|
27
|
-
|
|
28
|
-
function indent(value, spaces) {
|
|
29
|
-
const prefix = " ".repeat(spaces);
|
|
30
|
-
return value
|
|
31
|
-
.trim()
|
|
32
|
-
.split("\n")
|
|
33
|
-
.map((line) => (line ? `${prefix}${line}` : line))
|
|
34
|
-
.join("\n");
|
|
31
|
+
return insertReportMetadata(page, metadata);
|
|
35
32
|
}
|
|
36
33
|
//# sourceMappingURL=reportHtml.js.map
|
package/dist/reportHtml.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reportHtml.js","sourceRoot":"","sources":["../src/reportHtml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"reportHtml.js","sourceRoot":"","sources":["../src/reportHtml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EACL,oBAAoB,GAErB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAWtF,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,IAAI,EACJ,MAAM,GAAG,EAAE,EACX,OAAO,GAAG,EAAE,EACZ,QAAQ,EACR,QAAQ,GAAG,2BAA2B,EAAE,GACxB;IAChB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG;;;;;WAKJ,IAAI,CAAC,KAAK,CAAC;;;;mBAIH,QAAQ,CAAC,QAAQ;;;;;;EAMlC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;;;;EAI1C,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC;EAC5B,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;;;CAG/C,CAAC;IAEA,OAAO,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC"}
|
package/dist/reportTemplate.d.ts
CHANGED
|
@@ -12,6 +12,5 @@ export type ReportOptions = {
|
|
|
12
12
|
githubRef?: string;
|
|
13
13
|
repositoryUrl?: string;
|
|
14
14
|
};
|
|
15
|
-
/** Render a complete self-contained feature spec report as HTML. */
|
|
16
15
|
export declare function renderHtmlReport(specs: FeatureSpec[], options?: ReportOptions): string;
|
|
17
16
|
//# sourceMappingURL=reportTemplate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reportTemplate.d.ts","sourceRoot":"","sources":["../src/reportTemplate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reportTemplate.d.ts","sourceRoot":"","sources":["../src/reportTemplate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,WAAW,EAEX,SAAS,EACT,cAAc,EACd,SAAS,EAET,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAYF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,aAAkB,UAcjF"}
|