@jevitate/cli 0.10.0 → 0.11.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.
- package/dist/approved-demo.d.ts +86 -0
- package/dist/approved-demo.js +184 -0
- package/dist/approved-demo.js.map +1 -0
- package/dist/bin.js +3371 -1221
- package/dist/build-info.generated.js +2 -2
- package/dist/campaign-api.d.ts +15 -0
- package/dist/campaign-api.js +67 -6
- package/dist/campaign-api.js.map +1 -1
- package/dist/campaign-cli.js +7 -2
- package/dist/campaign-cli.js.map +1 -1
- package/dist/campaign-preflight.d.ts +76 -0
- package/dist/campaign-preflight.js +117 -0
- package/dist/campaign-preflight.js.map +1 -0
- package/dist/catalog-bundle-api.d.ts +15 -5
- package/dist/catalog-bundle-api.js +117 -14
- package/dist/catalog-bundle-api.js.map +1 -1
- package/dist/catalog-bundle-findings.d.ts +10 -0
- package/dist/catalog-bundle-findings.js +75 -1
- package/dist/catalog-bundle-findings.js.map +1 -1
- package/dist/catalog-bundle.d.ts +111 -7
- package/dist/catalog-bundle.js +208 -9
- package/dist/catalog-bundle.js.map +1 -1
- package/dist/catalog-cli.js +3 -2
- package/dist/catalog-cli.js.map +1 -1
- package/dist/check-api.js +20 -2
- package/dist/check-api.js.map +1 -1
- package/dist/check-cli.d.ts +2 -0
- package/dist/check-cli.js +25 -0
- package/dist/check-cli.js.map +1 -1
- package/dist/check-execute.d.ts +6 -0
- package/dist/check-execute.js +1 -0
- package/dist/check-execute.js.map +1 -1
- package/dist/check-types.d.ts +7 -0
- package/dist/check-types.js.map +1 -1
- package/dist/cli-output.js +15 -1
- package/dist/cli-output.js.map +1 -1
- package/dist/cold-start-report.d.ts +32 -0
- package/dist/cold-start-report.js +31 -0
- package/dist/cold-start-report.js.map +1 -0
- package/dist/defect-evidence.js +10 -5
- package/dist/defect-evidence.js.map +1 -1
- package/dist/demo-aspect-api.d.ts +11 -0
- package/dist/demo-aspect-api.js +27 -2
- package/dist/demo-aspect-api.js.map +1 -1
- package/dist/demo-aspect-cli.js +5 -0
- package/dist/demo-aspect-cli.js.map +1 -1
- package/dist/demo-capture.d.ts +79 -2
- package/dist/demo-capture.js +504 -12
- package/dist/demo-capture.js.map +1 -1
- package/dist/environments.d.ts +8 -1
- package/dist/environments.js +14 -3
- package/dist/environments.js.map +1 -1
- package/dist/exit-codes.js +1 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/explore-adversarial.js +2 -2
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-shared.d.ts +11 -0
- package/dist/explore-shared.js +9 -0
- package/dist/explore-shared.js.map +1 -1
- package/dist/findings-filing.js +7 -3
- package/dist/findings-filing.js.map +1 -1
- package/dist/github-issue-filer.js +15 -9
- package/dist/github-issue-filer.js.map +1 -1
- package/dist/journeeze-api.d.ts +8 -2
- package/dist/journeeze-api.js +105 -19
- package/dist/journeeze-api.js.map +1 -1
- package/dist/journey-anchor-api.d.ts +37 -0
- package/dist/journey-anchor-api.js +58 -0
- package/dist/journey-anchor-api.js.map +1 -0
- package/dist/journey-anchor-cli.d.ts +17 -0
- package/dist/journey-anchor-cli.js +104 -0
- package/dist/journey-anchor-cli.js.map +1 -0
- package/dist/journey-api.d.ts +29 -1
- package/dist/journey-api.js +82 -7
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.js +36 -5
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-demo-api.d.ts +29 -0
- package/dist/journey-demo-api.js +29 -7
- package/dist/journey-demo-api.js.map +1 -1
- package/dist/journey-lint-sarif.js +2 -0
- package/dist/journey-lint-sarif.js.map +1 -1
- package/dist/journey-network-checks.d.ts +11 -0
- package/dist/journey-network-checks.js +36 -13
- package/dist/journey-network-checks.js.map +1 -1
- package/dist/load-api.js +4 -2
- package/dist/load-api.js.map +1 -1
- package/dist/mcp-api.d.ts +3 -1
- package/dist/mcp-api.js +21 -2
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-cli-tools.d.ts +1 -0
- package/dist/mcp-cli-tools.js +30 -8
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/openrouter-call.d.ts +23 -10
- package/dist/openrouter-call.js +14 -11
- package/dist/openrouter-call.js.map +1 -1
- package/dist/png-pixels.d.ts +12 -0
- package/dist/png-pixels.js +96 -0
- package/dist/png-pixels.js.map +1 -0
- package/dist/regression-api.js +2 -1
- package/dist/regression-api.js.map +1 -1
- package/dist/server-log-verify.js +2 -1
- package/dist/server-log-verify.js.map +1 -1
- package/dist/signal-triage.js +7 -3
- package/dist/signal-triage.js.map +1 -1
- package/dist/source-run-api.js +2 -2
- package/dist/source-run-api.js.map +1 -1
- package/dist/verify-fix-api.d.ts +29 -0
- package/dist/verify-fix-api.js +43 -2
- package/dist/verify-fix-api.js.map +1 -1
- package/dist/verify-fix-cli.js +4 -0
- package/dist/verify-fix-cli.js.map +1 -1
- package/dist/zip-store.d.ts +15 -0
- package/dist/zip-store.js +93 -0
- package/dist/zip-store.js.map +1 -0
- package/package.json +11 -11
- package/skills/jevitate-demo/SKILL.md +4 -1
- package/skills/jevitate-run-journey/SKILL.md +4 -0
- package/skills/jevitate-test-campaign/SKILL.md +13 -0
- package/skills/jevitate-verify-fix/SKILL.md +5 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { type DemoJourneyResult } from "./journey-demo-api.js";
|
|
2
|
+
/**
|
|
3
|
+
* #471 — the approved demo's media record: what `catalog export --format journeeze-bundle` ships for a
|
|
4
|
+
* Journey with an approved demo (journeeze-saas `docs/contract/catalog-bundle-v1.md` §4.2, §7).
|
|
5
|
+
*
|
|
6
|
+
* `demo approve` writes it after the Journey is promoted, ONLY when the final render ran on an
|
|
7
|
+
* environment that declares `synthetic: true` (the data half of the attestation) and under
|
|
8
|
+
* jz-mask-v1 (the mask half). It lives beside the Journeys at `<journeys>/.demos/<id>/`:
|
|
9
|
+
* `demo.json` plus copies of the media that were PROVEN masked — each step screenshot whose capture
|
|
10
|
+
* was proven, and the video (with captions-only subtitles) only when every frame and every screenshot
|
|
11
|
+
* was. Anything unproven is never copied: it is listed in `leftOut` with why. A draft demo never gets
|
|
12
|
+
* a record; re-approving replaces it; a demo approved elsewhere (non-synthetic) removes it.
|
|
13
|
+
*
|
|
14
|
+
* Every file's sha256 is recorded at render time: the export re-hashes and leaves out a file that
|
|
15
|
+
* changed since (it could have been replaced by an unmasked one).
|
|
16
|
+
*/
|
|
17
|
+
export declare const APPROVED_DEMOS_DIR = ".demos";
|
|
18
|
+
export declare const APPROVED_DEMO_FILE = "demo.json";
|
|
19
|
+
export interface ApprovedDemoStep {
|
|
20
|
+
/** 1-based. */
|
|
21
|
+
readonly number: number;
|
|
22
|
+
readonly caption: string;
|
|
23
|
+
readonly expected?: string;
|
|
24
|
+
/** A file name in the record's folder (`step-NN.png`), present only when that capture was proven. */
|
|
25
|
+
readonly screenshot?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ApprovedDemoRecord {
|
|
28
|
+
readonly kind: "jevitate.demo.approved";
|
|
29
|
+
readonly version: 1;
|
|
30
|
+
readonly journey: string;
|
|
31
|
+
/** `journeyReviewHash` of the Journey as promoted (the approval's contentHash). */
|
|
32
|
+
readonly renderedFrom: string;
|
|
33
|
+
readonly approvedAtIso: string;
|
|
34
|
+
/** The environment's name (declared `synthetic: true`). */
|
|
35
|
+
readonly environment: string;
|
|
36
|
+
readonly title?: string;
|
|
37
|
+
readonly privacy: {
|
|
38
|
+
readonly mask: "jz-mask-v1";
|
|
39
|
+
readonly data: "synthetic";
|
|
40
|
+
readonly method: "dom-before-capture";
|
|
41
|
+
readonly regions: number;
|
|
42
|
+
};
|
|
43
|
+
readonly steps: readonly ApprovedDemoStep[];
|
|
44
|
+
readonly video?: "demo.webm";
|
|
45
|
+
readonly subtitles?: "demo.vtt";
|
|
46
|
+
/** sha256 and size of every media file in the folder, by name. */
|
|
47
|
+
readonly files: Readonly<Record<string, {
|
|
48
|
+
readonly sha256: string;
|
|
49
|
+
readonly bytes: number;
|
|
50
|
+
}>>;
|
|
51
|
+
/** Media left out at render time, each with why (never sent anywhere). */
|
|
52
|
+
readonly leftOut: readonly string[];
|
|
53
|
+
}
|
|
54
|
+
export declare function approvedDemoDir(journeysDir: string, id: string): string;
|
|
55
|
+
/** Removes `id`'s approved-demo record and media (no-op when absent). */
|
|
56
|
+
export declare function clearApprovedDemo(journeysDir: string, id: string): Promise<void>;
|
|
57
|
+
export interface RecordApprovedDemoInput {
|
|
58
|
+
readonly journeysDir: string;
|
|
59
|
+
readonly id: string;
|
|
60
|
+
readonly renderedFrom: string;
|
|
61
|
+
readonly approvedAtIso: string;
|
|
62
|
+
readonly environment: string;
|
|
63
|
+
readonly title?: string;
|
|
64
|
+
/** The final render (`demoJourney` with `jzMask`). */
|
|
65
|
+
readonly demo: DemoJourneyResult;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Writes `id`'s record from a jz-mask-v1 final render (replacing any older one). Throws when the
|
|
69
|
+
* render carries no jz-mask-v1 proof — the caller never records an unmasked render.
|
|
70
|
+
*/
|
|
71
|
+
export declare function recordApprovedDemo(input: RecordApprovedDemoInput): Promise<ApprovedDemoRecord>;
|
|
72
|
+
/** Why `v` is not an {@link ApprovedDemoRecord} for `id`, or null. */
|
|
73
|
+
export declare function approvedDemoProblem(v: unknown, id: string): string | null;
|
|
74
|
+
/**
|
|
75
|
+
* Reads `id`'s record: null when there is none (no approved demo on a synthetic environment).
|
|
76
|
+
* Throws on an unreadable or invalid record (the export leaves the demo out with that reason).
|
|
77
|
+
*/
|
|
78
|
+
export declare function readApprovedDemo(journeysDir: string, id: string): Promise<{
|
|
79
|
+
record: ApprovedDemoRecord;
|
|
80
|
+
dir: string;
|
|
81
|
+
} | null>;
|
|
82
|
+
/** The file's current sha256 and size, or null when it is missing or not a plain file (a symlink is not). */
|
|
83
|
+
export declare function currentDigest(path: string): Promise<{
|
|
84
|
+
sha256: string;
|
|
85
|
+
bytes: number;
|
|
86
|
+
} | null>;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { copyFile, lstat, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { demoSubtitles } from "./journey-demo-api.js";
|
|
5
|
+
/**
|
|
6
|
+
* #471 — the approved demo's media record: what `catalog export --format journeeze-bundle` ships for a
|
|
7
|
+
* Journey with an approved demo (journeeze-saas `docs/contract/catalog-bundle-v1.md` §4.2, §7).
|
|
8
|
+
*
|
|
9
|
+
* `demo approve` writes it after the Journey is promoted, ONLY when the final render ran on an
|
|
10
|
+
* environment that declares `synthetic: true` (the data half of the attestation) and under
|
|
11
|
+
* jz-mask-v1 (the mask half). It lives beside the Journeys at `<journeys>/.demos/<id>/`:
|
|
12
|
+
* `demo.json` plus copies of the media that were PROVEN masked — each step screenshot whose capture
|
|
13
|
+
* was proven, and the video (with captions-only subtitles) only when every frame and every screenshot
|
|
14
|
+
* was. Anything unproven is never copied: it is listed in `leftOut` with why. A draft demo never gets
|
|
15
|
+
* a record; re-approving replaces it; a demo approved elsewhere (non-synthetic) removes it.
|
|
16
|
+
*
|
|
17
|
+
* Every file's sha256 is recorded at render time: the export re-hashes and leaves out a file that
|
|
18
|
+
* changed since (it could have been replaced by an unmasked one).
|
|
19
|
+
*/
|
|
20
|
+
export const APPROVED_DEMOS_DIR = ".demos";
|
|
21
|
+
export const APPROVED_DEMO_FILE = "demo.json";
|
|
22
|
+
const ID_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/;
|
|
23
|
+
const SHA256_RE = /^[0-9a-f]{64}$/;
|
|
24
|
+
const SHOT_RE = /^step-[0-9]{2,3}\.png$/;
|
|
25
|
+
export function approvedDemoDir(journeysDir, id) {
|
|
26
|
+
if (!ID_RE.test(id))
|
|
27
|
+
throw new Error(`not a Journey id: ${JSON.stringify(id)}`);
|
|
28
|
+
return join(journeysDir, APPROVED_DEMOS_DIR, id);
|
|
29
|
+
}
|
|
30
|
+
/** Removes `id`'s approved-demo record and media (no-op when absent). */
|
|
31
|
+
export async function clearApprovedDemo(journeysDir, id) {
|
|
32
|
+
await rm(approvedDemoDir(journeysDir, id), { recursive: true, force: true });
|
|
33
|
+
}
|
|
34
|
+
async function fileDigest(path) {
|
|
35
|
+
const buf = await readFile(path);
|
|
36
|
+
return { sha256: createHash("sha256").update(buf).digest("hex"), bytes: buf.byteLength };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Writes `id`'s record from a jz-mask-v1 final render (replacing any older one). Throws when the
|
|
40
|
+
* render carries no jz-mask-v1 proof — the caller never records an unmasked render.
|
|
41
|
+
*/
|
|
42
|
+
export async function recordApprovedDemo(input) {
|
|
43
|
+
const { demo } = input;
|
|
44
|
+
if (demo.jz === undefined)
|
|
45
|
+
throw new Error("the final demo was not rendered under jz-mask-v1 — nothing is recorded for export");
|
|
46
|
+
const dir = approvedDemoDir(input.journeysDir, input.id);
|
|
47
|
+
const stage = `${dir}.${randomBytes(6).toString("hex")}.tmp`;
|
|
48
|
+
await mkdir(stage, { recursive: true });
|
|
49
|
+
try {
|
|
50
|
+
const files = {};
|
|
51
|
+
const leftOut = [];
|
|
52
|
+
let regions = 0;
|
|
53
|
+
const proof = new Map(demo.jz.steps.map((s) => [s.step, s]));
|
|
54
|
+
const steps = [];
|
|
55
|
+
for (const s of demo.steps) {
|
|
56
|
+
const name = `step-${String(s.number).padStart(2, "0")}.png`;
|
|
57
|
+
const p = proof.get(s.number);
|
|
58
|
+
let screenshot;
|
|
59
|
+
if (p !== undefined && "leftOut" in p)
|
|
60
|
+
leftOut.push(`step ${s.number} screenshot: ${p.leftOut}`);
|
|
61
|
+
else if (p !== undefined && s.screenshot !== undefined) {
|
|
62
|
+
await copyFile(s.screenshot, join(stage, name));
|
|
63
|
+
files[name] = await fileDigest(join(stage, name));
|
|
64
|
+
regions += p.regions;
|
|
65
|
+
screenshot = name;
|
|
66
|
+
}
|
|
67
|
+
steps.push({ number: s.number, caption: s.caption, ...(s.expectedResult === undefined ? {} : { expected: s.expectedResult }), ...(screenshot === undefined ? {} : { screenshot }) });
|
|
68
|
+
}
|
|
69
|
+
let video;
|
|
70
|
+
let subtitles;
|
|
71
|
+
if (!demo.jz.video.proven)
|
|
72
|
+
leftOut.push(`video: ${demo.jz.video.reason ?? "not proven"}`);
|
|
73
|
+
else if (demo.video !== undefined) {
|
|
74
|
+
await copyFile(demo.video, join(stage, "demo.webm"));
|
|
75
|
+
files["demo.webm"] = await fileDigest(join(stage, "demo.webm"));
|
|
76
|
+
// Captions only: no goal NOTE and no observed lines — exactly the steps' captions, one cue each.
|
|
77
|
+
const vtt = demoSubtitles("", demo.steps.map(({ observed: _o, ...s }) => s), false);
|
|
78
|
+
await writeFile(join(stage, "demo.vtt"), vtt);
|
|
79
|
+
files["demo.vtt"] = await fileDigest(join(stage, "demo.vtt"));
|
|
80
|
+
video = "demo.webm";
|
|
81
|
+
subtitles = "demo.vtt";
|
|
82
|
+
}
|
|
83
|
+
const record = {
|
|
84
|
+
kind: "jevitate.demo.approved",
|
|
85
|
+
version: 1,
|
|
86
|
+
journey: input.id,
|
|
87
|
+
renderedFrom: input.renderedFrom,
|
|
88
|
+
approvedAtIso: input.approvedAtIso,
|
|
89
|
+
environment: input.environment,
|
|
90
|
+
...(input.title === undefined ? {} : { title: input.title }),
|
|
91
|
+
privacy: { mask: "jz-mask-v1", data: "synthetic", method: demo.jz.method, regions },
|
|
92
|
+
steps,
|
|
93
|
+
...(video === undefined ? {} : { video }),
|
|
94
|
+
...(subtitles === undefined ? {} : { subtitles }),
|
|
95
|
+
files,
|
|
96
|
+
leftOut,
|
|
97
|
+
};
|
|
98
|
+
await writeFile(join(stage, APPROVED_DEMO_FILE), `${JSON.stringify(record, null, 2)}\n`);
|
|
99
|
+
await rm(dir, { recursive: true, force: true });
|
|
100
|
+
await rename(stage, dir);
|
|
101
|
+
return record;
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
await rm(stage, { recursive: true, force: true });
|
|
105
|
+
throw err;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Why `v` is not an {@link ApprovedDemoRecord} for `id`, or null. */
|
|
109
|
+
export function approvedDemoProblem(v, id) {
|
|
110
|
+
if (v === null || typeof v !== "object" || Array.isArray(v))
|
|
111
|
+
return "not an object";
|
|
112
|
+
const o = v;
|
|
113
|
+
if (o.kind !== "jevitate.demo.approved" || o.version !== 1)
|
|
114
|
+
return "not an approved-demo record (kind jevitate.demo.approved, version 1)";
|
|
115
|
+
if (o.journey !== id)
|
|
116
|
+
return `it is the record of ${JSON.stringify(o.journey)}`;
|
|
117
|
+
if (typeof o.renderedFrom !== "string" || !SHA256_RE.test(o.renderedFrom))
|
|
118
|
+
return "renderedFrom is not a sha256";
|
|
119
|
+
const p = o.privacy;
|
|
120
|
+
if (p === undefined || p.mask !== "jz-mask-v1" || p.data !== "synthetic" || p.method !== "dom-before-capture" || !Number.isSafeInteger(p.regions) || p.regions < 0) {
|
|
121
|
+
return "privacy is not a jz-mask-v1 / synthetic attestation";
|
|
122
|
+
}
|
|
123
|
+
if (!Array.isArray(o.steps) || o.steps.length === 0)
|
|
124
|
+
return "steps: expected a non-empty list";
|
|
125
|
+
const files = o.files;
|
|
126
|
+
if (files === null || typeof files !== "object" || Array.isArray(files))
|
|
127
|
+
return "files: expected an object";
|
|
128
|
+
for (const [name, f] of Object.entries(files)) {
|
|
129
|
+
if (!SHOT_RE.test(name) && name !== "demo.webm" && name !== "demo.vtt")
|
|
130
|
+
return `files: unexpected file ${JSON.stringify(name)}`;
|
|
131
|
+
const d = f;
|
|
132
|
+
if (d === null || typeof d !== "object" || typeof d.sha256 !== "string" || !SHA256_RE.test(d.sha256) || !Number.isSafeInteger(d.bytes))
|
|
133
|
+
return `files.${name}: expected { sha256, bytes }`;
|
|
134
|
+
}
|
|
135
|
+
for (const [i, s] of o.steps.entries()) {
|
|
136
|
+
const st = s;
|
|
137
|
+
if (st === null || typeof st !== "object" || st.number !== i + 1 || typeof st.caption !== "string")
|
|
138
|
+
return `steps[${i}]: expected { number: ${i + 1}, caption }`;
|
|
139
|
+
if (st.expected !== undefined && typeof st.expected !== "string")
|
|
140
|
+
return `steps[${i}].expected: expected text`;
|
|
141
|
+
if (st.screenshot !== undefined && (typeof st.screenshot !== "string" || !SHOT_RE.test(st.screenshot) || !(st.screenshot in files)))
|
|
142
|
+
return `steps[${i}].screenshot: not a listed step-NN.png`;
|
|
143
|
+
}
|
|
144
|
+
if (o.video !== undefined && (o.video !== "demo.webm" || !("demo.webm" in files)))
|
|
145
|
+
return "video: not a listed demo.webm";
|
|
146
|
+
if (o.subtitles !== undefined && (o.subtitles !== "demo.vtt" || !("demo.vtt" in files)))
|
|
147
|
+
return "subtitles: not a listed demo.vtt";
|
|
148
|
+
if (o.title !== undefined && typeof o.title !== "string")
|
|
149
|
+
return "title: expected text";
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Reads `id`'s record: null when there is none (no approved demo on a synthetic environment).
|
|
154
|
+
* Throws on an unreadable or invalid record (the export leaves the demo out with that reason).
|
|
155
|
+
*/
|
|
156
|
+
export async function readApprovedDemo(journeysDir, id) {
|
|
157
|
+
const dir = approvedDemoDir(journeysDir, id);
|
|
158
|
+
let raw;
|
|
159
|
+
try {
|
|
160
|
+
raw = await readFile(join(dir, APPROVED_DEMO_FILE), "utf8");
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
if (err.code === "ENOENT")
|
|
164
|
+
return null;
|
|
165
|
+
throw err;
|
|
166
|
+
}
|
|
167
|
+
const parsed = JSON.parse(raw);
|
|
168
|
+
const problem = approvedDemoProblem(parsed, id);
|
|
169
|
+
if (problem !== null)
|
|
170
|
+
throw new Error(`${join(dir, APPROVED_DEMO_FILE)}: ${problem}`);
|
|
171
|
+
return { record: parsed, dir };
|
|
172
|
+
}
|
|
173
|
+
/** The file's current sha256 and size, or null when it is missing or not a plain file (a symlink is not). */
|
|
174
|
+
export async function currentDigest(path) {
|
|
175
|
+
try {
|
|
176
|
+
if (!(await lstat(path)).isFile())
|
|
177
|
+
return null;
|
|
178
|
+
return await fileDigest(path);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=approved-demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approved-demo.js","sourceRoot":"","sources":["../src/approved-demo.ts"],"names":[],"mappings":"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"}
|