@prosopo/scripts 3.1.141 → 3.1.143
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/.turbo/turbo-build$colon$cjs.log +3 -3
- package/.turbo/turbo-build$colon$tsc.log +28 -28
- package/.turbo/turbo-build.log +4 -4
- package/CHANGELOG.md +24 -0
- package/dist/cjs/scripts/setVersion.cjs +21 -4
- package/dist/scripts/setVersion.d.ts.map +1 -1
- package/dist/scripts/setVersion.js +21 -3
- package/dist/scripts/setVersion.js.map +1 -1
- package/dist/scripts/setVersion.test.d.ts +2 -0
- package/dist/scripts/setVersion.test.d.ts.map +1 -0
- package/dist/scripts/setVersion.test.js +203 -0
- package/dist/scripts/setVersion.test.js.map +1 -0
- package/dist/setup/setup.test.d.ts +2 -0
- package/dist/setup/setup.test.d.ts.map +1 -0
- package/dist/setup/setup.test.js +96 -0
- package/dist/setup/setup.test.js.map +1 -0
- package/dist/setup/site.test.d.ts +2 -0
- package/dist/setup/site.test.d.ts.map +1 -0
- package/dist/setup/site.test.js +91 -0
- package/dist/setup/site.test.js.map +1 -0
- package/dist/util/exec.test.d.ts +2 -0
- package/dist/util/exec.test.d.ts.map +1 -0
- package/dist/util/exec.test.js +89 -0
- package/dist/util/exec.test.js.map +1 -0
- package/dist/util/fluxLogDappDetails.test.d.ts +2 -0
- package/dist/util/fluxLogDappDetails.test.d.ts.map +1 -0
- package/dist/util/fluxLogDappDetails.test.js +45 -0
- package/dist/util/fluxLogDappDetails.test.js.map +1 -0
- package/dist/util/updateEnv.test.d.ts +2 -0
- package/dist/util/updateEnv.test.d.ts.map +1 -0
- package/dist/util/updateEnv.test.js +147 -0
- package/dist/util/updateEnv.test.js.map +1 -0
- package/dist/util/util.test-d.d.ts +2 -0
- package/dist/util/util.test-d.d.ts.map +1 -0
- package/dist/util/util.test-d.js +56 -0
- package/dist/util/util.test-d.js.map +1 -0
- package/package.json +10 -9
- package/vite.test.config.ts +18 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
vi.mock("@prosopo/cli", () => ({
|
|
6
|
+
defaultConfig: () => {
|
|
7
|
+
throw new Error("defaultConfig is not used by these tests");
|
|
8
|
+
},
|
|
9
|
+
getSecret: () => "",
|
|
10
|
+
}));
|
|
11
|
+
vi.mock("@prosopo/env", () => ({
|
|
12
|
+
ProviderEnvironment: class {
|
|
13
|
+
},
|
|
14
|
+
}));
|
|
15
|
+
vi.mock("@prosopo/keyring", () => ({
|
|
16
|
+
generateMnemonic: () => Promise.resolve(["", ""]),
|
|
17
|
+
getDefaultSiteKeys: () => [],
|
|
18
|
+
getPair: () => undefined,
|
|
19
|
+
}));
|
|
20
|
+
vi.mock("./provider.js", () => ({
|
|
21
|
+
setupProvider: () => Promise.resolve(),
|
|
22
|
+
}));
|
|
23
|
+
vi.mock("./site.js", () => ({
|
|
24
|
+
registerSiteKey: () => Promise.resolve(),
|
|
25
|
+
}));
|
|
26
|
+
const { updateEnvFile } = await import("./setup.js");
|
|
27
|
+
const ENV_FILE = ".env.test";
|
|
28
|
+
let root = "";
|
|
29
|
+
const write = (contents) => {
|
|
30
|
+
fs.writeFileSync(path.join(root, ENV_FILE), contents);
|
|
31
|
+
};
|
|
32
|
+
const read = () => fs.readFileSync(path.join(root, ENV_FILE), "utf8");
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
root = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), "setup-")));
|
|
35
|
+
vi.stubEnv("PROSOPO_ROOT_DIR", root);
|
|
36
|
+
});
|
|
37
|
+
afterEach(() => {
|
|
38
|
+
vi.unstubAllEnvs();
|
|
39
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
40
|
+
});
|
|
41
|
+
describe("updateEnvFile", () => {
|
|
42
|
+
it("replaces the value of an existing variable", async () => {
|
|
43
|
+
write("A=old\n");
|
|
44
|
+
await updateEnvFile({ A: "new" });
|
|
45
|
+
expect(read()).toBe("A=new\n");
|
|
46
|
+
});
|
|
47
|
+
it("appends a variable that is not already present", async () => {
|
|
48
|
+
write("A=1");
|
|
49
|
+
await updateEnvFile({ B: "2" });
|
|
50
|
+
expect(read()).toBe("A=1\nB=2");
|
|
51
|
+
});
|
|
52
|
+
it("updates several variables in one call", async () => {
|
|
53
|
+
write("A=1\nB=2\n");
|
|
54
|
+
await updateEnvFile({ A: "x", B: "y" });
|
|
55
|
+
expect(read()).toBe("A=x\nB=y\n");
|
|
56
|
+
});
|
|
57
|
+
it("mixes replacement and appending", async () => {
|
|
58
|
+
write("A=1\n");
|
|
59
|
+
await updateEnvFile({ A: "x", B: "y" });
|
|
60
|
+
expect(read()).toBe("A=x\n\nB=y");
|
|
61
|
+
});
|
|
62
|
+
it("leaves the file untouched when given no variables", async () => {
|
|
63
|
+
write("A=1\n");
|
|
64
|
+
await updateEnvFile({});
|
|
65
|
+
expect(read()).toBe("A=1\n");
|
|
66
|
+
});
|
|
67
|
+
it("writes an empty value", async () => {
|
|
68
|
+
write("A=1\n");
|
|
69
|
+
await updateEnvFile({ A: "" });
|
|
70
|
+
expect(read()).toBe("A=\n");
|
|
71
|
+
});
|
|
72
|
+
it("replaces every occurrence of a repeated variable", async () => {
|
|
73
|
+
write("A=1\nA=2\n");
|
|
74
|
+
await updateEnvFile({ A: "3" });
|
|
75
|
+
expect(read()).toBe("A=3\nA=3\n");
|
|
76
|
+
});
|
|
77
|
+
it("keeps quotes supplied by the caller", async () => {
|
|
78
|
+
write("MNEMONIC=old\n");
|
|
79
|
+
await updateEnvFile({ MNEMONIC: '"a b c"' });
|
|
80
|
+
expect(read()).toBe('MNEMONIC="a b c"\n');
|
|
81
|
+
});
|
|
82
|
+
it("also rewrites a commented out assignment, as the matcher is loose", async () => {
|
|
83
|
+
write("# A=1\n");
|
|
84
|
+
await updateEnvFile({ A: "2" });
|
|
85
|
+
expect(read()).toBe("A=2\n");
|
|
86
|
+
});
|
|
87
|
+
it("appends to an empty file", async () => {
|
|
88
|
+
write("");
|
|
89
|
+
await updateEnvFile({ A: "1" });
|
|
90
|
+
expect(read()).toBe("\nA=1");
|
|
91
|
+
});
|
|
92
|
+
it("rejects when the env file does not exist", async () => {
|
|
93
|
+
await expect(updateEnvFile({ A: "1" })).rejects.toThrow();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=setup.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.test.js","sourceRoot":"","sources":["../../src/setup/setup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site.test.d.ts","sourceRoot":"","sources":["../../src/setup/site.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { LogLevel, getLogger } from "@prosopo/logger";
|
|
2
|
+
import { CaptchaType } from "@prosopo/types";
|
|
3
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
const calls = [];
|
|
5
|
+
vi.mock("@prosopo/provider", () => ({
|
|
6
|
+
Tasks: class {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.clientTaskManager = {
|
|
9
|
+
registerSiteKey: (siteKey, tier, settings) => {
|
|
10
|
+
calls.push({ siteKey, tier, settings });
|
|
11
|
+
return Promise.resolve();
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
}));
|
|
17
|
+
const { registerSiteKey } = await import("./site.js");
|
|
18
|
+
const env = {
|
|
19
|
+
logger: getLogger(LogLevel.enum.error, "site.test"),
|
|
20
|
+
};
|
|
21
|
+
const lastCall = () => {
|
|
22
|
+
const call = calls[calls.length - 1];
|
|
23
|
+
if (!call) {
|
|
24
|
+
throw new Error("registerSiteKey was never called");
|
|
25
|
+
}
|
|
26
|
+
return call;
|
|
27
|
+
};
|
|
28
|
+
const register = async (settings = {}) => {
|
|
29
|
+
await registerSiteKey(env, "site-key", settings);
|
|
30
|
+
return lastCall();
|
|
31
|
+
};
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
calls.length = 0;
|
|
34
|
+
});
|
|
35
|
+
describe("registerSiteKey", () => {
|
|
36
|
+
it("passes the site key through unchanged", async () => {
|
|
37
|
+
expect((await register()).siteKey).toBe("site-key");
|
|
38
|
+
});
|
|
39
|
+
it("registers at the professional tier", async () => {
|
|
40
|
+
expect((await register()).tier).toBe("professional");
|
|
41
|
+
});
|
|
42
|
+
it("defaults to the frictionless captcha type", async () => {
|
|
43
|
+
expect((await register()).settings.captchaType).toBe(CaptchaType.frictionless);
|
|
44
|
+
});
|
|
45
|
+
it("applies the default thresholds and difficulty", async () => {
|
|
46
|
+
const { settings } = await register();
|
|
47
|
+
expect(settings.frictionlessThreshold).toBe(0.8);
|
|
48
|
+
expect(settings.imageThreshold).toBe(0.8);
|
|
49
|
+
expect(settings.powDifficulty).toBe(4);
|
|
50
|
+
});
|
|
51
|
+
it("defaults to the local domains when none are given", async () => {
|
|
52
|
+
expect((await register()).settings.domains).toEqual([
|
|
53
|
+
"localhost",
|
|
54
|
+
"0.0.0.0",
|
|
55
|
+
]);
|
|
56
|
+
});
|
|
57
|
+
it("falls back to the local domains for an empty domain list", async () => {
|
|
58
|
+
expect((await register({ domains: [] })).settings.domains).toEqual([
|
|
59
|
+
"localhost",
|
|
60
|
+
"0.0.0.0",
|
|
61
|
+
]);
|
|
62
|
+
});
|
|
63
|
+
it("keeps caller supplied domains", async () => {
|
|
64
|
+
expect((await register({ domains: ["example.com"] })).settings.domains).toEqual(["example.com"]);
|
|
65
|
+
});
|
|
66
|
+
it("lets the caller override the captcha type", async () => {
|
|
67
|
+
expect((await register({ captchaType: CaptchaType.image })).settings.captchaType).toBe(CaptchaType.image);
|
|
68
|
+
});
|
|
69
|
+
it("lets the caller override the thresholds", async () => {
|
|
70
|
+
const { settings } = await register({
|
|
71
|
+
frictionlessThreshold: 0.1,
|
|
72
|
+
imageThreshold: 0.2,
|
|
73
|
+
powDifficulty: 9,
|
|
74
|
+
});
|
|
75
|
+
expect(settings.frictionlessThreshold).toBe(0.1);
|
|
76
|
+
expect(settings.imageThreshold).toBe(0.2);
|
|
77
|
+
expect(settings.powDifficulty).toBe(9);
|
|
78
|
+
});
|
|
79
|
+
it("rejects settings that fail schema validation", async () => {
|
|
80
|
+
await expect(registerSiteKey(env, "site-key", {
|
|
81
|
+
frictionlessThreshold: "high",
|
|
82
|
+
})).rejects.toThrow();
|
|
83
|
+
expect(calls).toHaveLength(0);
|
|
84
|
+
});
|
|
85
|
+
it("registers once per call", async () => {
|
|
86
|
+
await register();
|
|
87
|
+
await register();
|
|
88
|
+
expect(calls).toHaveLength(2);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=site.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site.test.js","sourceRoot":"","sources":["../../src/setup/site.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAiC,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAQ9D,MAAM,KAAK,GAAmB,EAAE,CAAC;AAIjC,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,KAAK,EAAE;QAAA;YACN,sBAAiB,GAAG;gBACnB,eAAe,EAAE,CAChB,OAAe,EACf,IAAU,EACV,QAAuB,EACP,EAAE;oBAClB,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACxC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC1B,CAAC;aACD,CAAC;QACH,CAAC;KAAA;CACD,CAAC,CAAC,CAAC;AAEJ,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;AAEtD,MAAM,GAAG,GAAG;IACX,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;CACjB,CAAC;AAEpC,MAAM,QAAQ,GAAG,GAAiB,EAAE;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,KAAK,EACrB,WAAmC,EAAE,EACb,EAAE;IAC1B,MAAM,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACjD,OAAO,QAAQ,EAAE,CAAC;AACnB,CAAC,CAAC;AAEF,UAAU,CAAC,GAAG,EAAE;IACf,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,CAAC,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,CAAC,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,CAAC,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CACnD,WAAW,CAAC,YAAY,CACxB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,CAAC,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACnD,WAAW;YACX,SAAS;SACT,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,CAAC,CAAC,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YAClE,WAAW;YACX,SAAS;SACT,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,CACL,CAAC,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAC/D,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,CACL,CAAC,MAAM,QAAQ,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CACzE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC;YACnC,qBAAqB,EAAE,GAAG;YAC1B,cAAc,EAAE,GAAG;YACnB,aAAa,EAAE,CAAC;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,CACX,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE;YAChC,qBAAqB,EAAE,MAA2B;SAClD,CAAC,CACF,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,QAAQ,EAAE,CAAC;QACjB,MAAM,QAAQ,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.test.d.ts","sourceRoot":"","sources":["../../src/util/exec.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { exec } from "./exec.js";
|
|
3
|
+
const expectRejection = async (promise) => {
|
|
4
|
+
try {
|
|
5
|
+
await promise;
|
|
6
|
+
}
|
|
7
|
+
catch (error) {
|
|
8
|
+
return error;
|
|
9
|
+
}
|
|
10
|
+
throw new Error("expected the command to reject");
|
|
11
|
+
};
|
|
12
|
+
describe("exec", () => {
|
|
13
|
+
let logs = [];
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
logs = [];
|
|
16
|
+
vi.spyOn(console, "log").mockImplementation((...args) => {
|
|
17
|
+
logs.push(args.map(String).join(" "));
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
afterEach(() => {
|
|
21
|
+
vi.restoreAllMocks();
|
|
22
|
+
});
|
|
23
|
+
it("resolves with the captured stdout on success", async () => {
|
|
24
|
+
const output = await exec("echo hello", { pipe: false, printCmd: false });
|
|
25
|
+
expect(output.stdout).toBe("hello\n");
|
|
26
|
+
expect(output.stderr).toBe("");
|
|
27
|
+
expect(output.code).toBe(0);
|
|
28
|
+
});
|
|
29
|
+
it("captures stderr on success", async () => {
|
|
30
|
+
const output = await exec("echo oops 1>&2", {
|
|
31
|
+
pipe: false,
|
|
32
|
+
printCmd: false,
|
|
33
|
+
});
|
|
34
|
+
expect(output.stderr).toBe("oops\n");
|
|
35
|
+
expect(output.stdout).toBe("");
|
|
36
|
+
});
|
|
37
|
+
it("rejects with the output object on a non-zero exit code", async () => {
|
|
38
|
+
const output = await expectRejection(exec("echo bad 1>&2; exit 3", { pipe: false, printCmd: false }));
|
|
39
|
+
expect(output.code).toBe(3);
|
|
40
|
+
expect(output.stderr).toBe("bad\n");
|
|
41
|
+
});
|
|
42
|
+
it("rejects rather than throwing for an unknown command", async () => {
|
|
43
|
+
const output = await expectRejection(exec("this-command-does-not-exist-xyz", {
|
|
44
|
+
pipe: false,
|
|
45
|
+
printCmd: false,
|
|
46
|
+
}));
|
|
47
|
+
expect(output.code).not.toBe(0);
|
|
48
|
+
});
|
|
49
|
+
it("concatenates output arriving in multiple chunks", async () => {
|
|
50
|
+
const output = await exec("echo one; echo two; echo three", {
|
|
51
|
+
pipe: false,
|
|
52
|
+
printCmd: false,
|
|
53
|
+
});
|
|
54
|
+
expect(output.stdout).toBe("one\ntwo\nthree\n");
|
|
55
|
+
});
|
|
56
|
+
it("resolves with empty strings when the command produces no output", async () => {
|
|
57
|
+
const output = await exec("true", { pipe: false, printCmd: false });
|
|
58
|
+
expect(output).toEqual({ stdout: "", stderr: "", code: 0 });
|
|
59
|
+
});
|
|
60
|
+
it("prints the command by default", async () => {
|
|
61
|
+
await exec("true", { pipe: false });
|
|
62
|
+
expect(logs).toContain("[exec] true");
|
|
63
|
+
});
|
|
64
|
+
it("prints the command when printCmd is explicitly true", async () => {
|
|
65
|
+
await exec("true", { pipe: false, printCmd: true });
|
|
66
|
+
expect(logs).toContain("[exec] true");
|
|
67
|
+
});
|
|
68
|
+
it("does not print the command when printCmd is false", async () => {
|
|
69
|
+
await exec("true", { pipe: false, printCmd: false });
|
|
70
|
+
expect(logs).toEqual([]);
|
|
71
|
+
});
|
|
72
|
+
it("treats a missing options object as pipe and printCmd enabled", async () => {
|
|
73
|
+
await exec("true");
|
|
74
|
+
expect(logs).toEqual(["[exec] true", ""]);
|
|
75
|
+
});
|
|
76
|
+
it("emits the trailing blank line only when piping", async () => {
|
|
77
|
+
await exec("true", { pipe: false });
|
|
78
|
+
expect(logs).not.toContain("");
|
|
79
|
+
});
|
|
80
|
+
it("still captures output while piping", async () => {
|
|
81
|
+
const output = await exec("echo piped", { printCmd: false });
|
|
82
|
+
expect(output.stdout).toBe("piped\n");
|
|
83
|
+
});
|
|
84
|
+
it("prints the command even when the command fails", async () => {
|
|
85
|
+
await expectRejection(exec("exit 1", { pipe: false }));
|
|
86
|
+
expect(logs).toContain("[exec] exit 1");
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=exec.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.test.js","sourceRoot":"","sources":["../../src/util/exec.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fluxLogDappDetails.test.d.ts","sourceRoot":"","sources":["../../src/util/fluxLogDappDetails.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { extractReferrersFromLogs } from "./fluxLogDappDetails.js";
|
|
3
|
+
const SEPARATOR = " ";
|
|
4
|
+
describe("extractReferrersFromLogs", () => {
|
|
5
|
+
it("returns an empty string for empty input", () => {
|
|
6
|
+
expect(extractReferrersFromLogs("")).toBe("");
|
|
7
|
+
});
|
|
8
|
+
it("returns an empty string when no quoted url is present", () => {
|
|
9
|
+
expect(extractReferrersFromLogs("no urls here\njust text")).toBe("");
|
|
10
|
+
});
|
|
11
|
+
it("ignores urls that are not wrapped in double quotes", () => {
|
|
12
|
+
expect(extractReferrersFromLogs("referrer: https://example.com")).toBe("");
|
|
13
|
+
});
|
|
14
|
+
it("extracts a single quoted url", () => {
|
|
15
|
+
expect(extractReferrersFromLogs('referrer "https://example.com"')).toBe("https://example.com");
|
|
16
|
+
});
|
|
17
|
+
it("extracts http as well as https", () => {
|
|
18
|
+
expect(extractReferrersFromLogs('"http://example.com"')).toBe("http://example.com");
|
|
19
|
+
});
|
|
20
|
+
it("joins multiple distinct urls with the fixed separator", () => {
|
|
21
|
+
const logs = ['"https://a.com"', '"https://b.com"'].join("\n");
|
|
22
|
+
expect(extractReferrersFromLogs(logs)).toBe(`https://a.com${SEPARATOR}https://b.com`);
|
|
23
|
+
});
|
|
24
|
+
it("deduplicates urls seen on different lines", () => {
|
|
25
|
+
const logs = ['"https://a.com"', '"https://a.com"'].join("\n");
|
|
26
|
+
expect(extractReferrersFromLogs(logs)).toBe("https://a.com");
|
|
27
|
+
});
|
|
28
|
+
it("extracts several urls from a single line", () => {
|
|
29
|
+
expect(extractReferrersFromLogs('"https://a.com" and "https://b.com"')).toBe(`https://a.com${SEPARATOR}https://b.com`);
|
|
30
|
+
});
|
|
31
|
+
it("preserves insertion order", () => {
|
|
32
|
+
const logs = '"https://z.com"\n"https://a.com"';
|
|
33
|
+
expect(extractReferrersFromLogs(logs)).toBe(`https://z.com${SEPARATOR}https://a.com`);
|
|
34
|
+
});
|
|
35
|
+
it("keeps query strings and paths intact", () => {
|
|
36
|
+
expect(extractReferrersFromLogs('"https://a.com/p?q=1&r=2"')).toBe("https://a.com/p?q=1&r=2");
|
|
37
|
+
});
|
|
38
|
+
it("stops the match at the closing quote", () => {
|
|
39
|
+
expect(extractReferrersFromLogs('"https://a.com" trailing "text"')).toBe("https://a.com");
|
|
40
|
+
});
|
|
41
|
+
it("does not match a url whose quote is never closed", () => {
|
|
42
|
+
expect(extractReferrersFromLogs('"https://a.com')).toBe("");
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=fluxLogDappDetails.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fluxLogDappDetails.test.js","sourceRoot":"","sources":["../../src/util/fluxLogDappDetails.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateEnv.test.d.ts","sourceRoot":"","sources":["../../src/util/updateEnv.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { LogLevel, getLogger } from "@prosopo/logger";
|
|
5
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
6
|
+
import { findEnvFiles, updateDemoHTMLFiles, updateEnvFiles, } from "./updateEnv.js";
|
|
7
|
+
const ENV_FILE = ".env.test";
|
|
8
|
+
const logger = getLogger(LogLevel.enum.error, "updateEnv.test");
|
|
9
|
+
let root = "";
|
|
10
|
+
let cwd = "";
|
|
11
|
+
const write = (relative, contents) => {
|
|
12
|
+
const full = path.join(root, relative);
|
|
13
|
+
fs.mkdirSync(path.dirname(full), { recursive: true });
|
|
14
|
+
fs.writeFileSync(full, contents);
|
|
15
|
+
return full;
|
|
16
|
+
};
|
|
17
|
+
const read = (relative) => fs.readFileSync(path.join(root, relative), "utf8");
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
cwd = process.cwd();
|
|
20
|
+
root = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), "updateEnv-")));
|
|
21
|
+
});
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
process.chdir(cwd);
|
|
24
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
25
|
+
});
|
|
26
|
+
describe("findEnvFiles", () => {
|
|
27
|
+
it("returns an empty list when the tree holds no env files", async () => {
|
|
28
|
+
expect(await findEnvFiles(logger, root)).toEqual([]);
|
|
29
|
+
});
|
|
30
|
+
it("finds an env file nested in the tree", async () => {
|
|
31
|
+
write(`a/b/${ENV_FILE}`, "A=1");
|
|
32
|
+
expect(await findEnvFiles(logger, root)).toEqual([
|
|
33
|
+
`${root}/a/b/${ENV_FILE}`,
|
|
34
|
+
]);
|
|
35
|
+
});
|
|
36
|
+
it("finds every env file in the tree", async () => {
|
|
37
|
+
write(`a/${ENV_FILE}`, "A=1");
|
|
38
|
+
write(`b/${ENV_FILE}`, "A=2");
|
|
39
|
+
expect((await findEnvFiles(logger, root)).sort()).toEqual([
|
|
40
|
+
`${root}/a/${ENV_FILE}`,
|
|
41
|
+
`${root}/b/${ENV_FILE}`,
|
|
42
|
+
]);
|
|
43
|
+
});
|
|
44
|
+
it("ignores env files inside node_modules", async () => {
|
|
45
|
+
write(`node_modules/pkg/${ENV_FILE}`, "A=1");
|
|
46
|
+
expect(await findEnvFiles(logger, root)).toEqual([]);
|
|
47
|
+
});
|
|
48
|
+
it("ignores env files for other environments", async () => {
|
|
49
|
+
write("a/.env.production", "A=1");
|
|
50
|
+
expect(await findEnvFiles(logger, root)).toEqual([]);
|
|
51
|
+
});
|
|
52
|
+
it("matches a file sitting directly at the search root", async () => {
|
|
53
|
+
write(ENV_FILE, "A=1");
|
|
54
|
+
expect(await findEnvFiles(logger, root)).toEqual([`${root}/${ENV_FILE}`]);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe("updateEnvFiles", () => {
|
|
58
|
+
it("replaces the value of a matching variable", async () => {
|
|
59
|
+
write(`a/${ENV_FILE}`, "SITE_KEY=old\nOTHER=keep");
|
|
60
|
+
await updateEnvFiles(["SITE_KEY"], "new", logger, root);
|
|
61
|
+
expect(read(`a/${ENV_FILE}`)).toBe("SITE_KEY=new\nOTHER=keep");
|
|
62
|
+
});
|
|
63
|
+
it("leaves a file with no matching variable untouched", async () => {
|
|
64
|
+
const original = "OTHER=keep\n# comment\n";
|
|
65
|
+
write(`a/${ENV_FILE}`, original);
|
|
66
|
+
await updateEnvFiles(["SITE_KEY"], "new", logger, root);
|
|
67
|
+
expect(read(`a/${ENV_FILE}`)).toBe(original);
|
|
68
|
+
});
|
|
69
|
+
it("replaces several variables in one pass", async () => {
|
|
70
|
+
write(`a/${ENV_FILE}`, "ONE=a\nTWO=b");
|
|
71
|
+
await updateEnvFiles(["ONE", "TWO"], "z", logger, root);
|
|
72
|
+
expect(read(`a/${ENV_FILE}`)).toBe("ONE=z\nTWO=z");
|
|
73
|
+
});
|
|
74
|
+
it("updates every matching file found", async () => {
|
|
75
|
+
write(`a/${ENV_FILE}`, "K=1");
|
|
76
|
+
write(`b/${ENV_FILE}`, "K=2");
|
|
77
|
+
await updateEnvFiles(["K"], "3", logger, root);
|
|
78
|
+
expect(read(`a/${ENV_FILE}`)).toBe("K=3");
|
|
79
|
+
expect(read(`b/${ENV_FILE}`)).toBe("K=3");
|
|
80
|
+
});
|
|
81
|
+
it("accepts an empty list of variable names without writing", async () => {
|
|
82
|
+
const original = "K=1\n";
|
|
83
|
+
write(`a/${ENV_FILE}`, original);
|
|
84
|
+
await updateEnvFiles([], "3", logger, root);
|
|
85
|
+
expect(read(`a/${ENV_FILE}`)).toBe(original);
|
|
86
|
+
});
|
|
87
|
+
it("drops comments and blank lines from a file it rewrites", async () => {
|
|
88
|
+
write(`a/${ENV_FILE}`, "# a comment\n\nK=1\n");
|
|
89
|
+
await updateEnvFiles(["K"], "2", logger, root);
|
|
90
|
+
expect(read(`a/${ENV_FILE}`)).toBe("K=2");
|
|
91
|
+
});
|
|
92
|
+
it("writes an empty value when asked to", async () => {
|
|
93
|
+
write(`a/${ENV_FILE}`, "K=1");
|
|
94
|
+
await updateEnvFiles(["K"], "", logger, root);
|
|
95
|
+
expect(read(`a/${ENV_FILE}`)).toBe("K=");
|
|
96
|
+
});
|
|
97
|
+
it("resolves without error when no env files exist", async () => {
|
|
98
|
+
await expect(updateEnvFiles(["K"], "1", logger, root)).resolves.toBeUndefined();
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe("updateDemoHTMLFiles", () => {
|
|
102
|
+
const SITE_KEY = "A".repeat(48);
|
|
103
|
+
const NEW_KEY = "B".repeat(48);
|
|
104
|
+
const inDemos = (relative, contents) => {
|
|
105
|
+
const full = write(path.join("demos", relative), contents);
|
|
106
|
+
fs.mkdirSync(path.join(root, "dev", "scripts"), { recursive: true });
|
|
107
|
+
process.chdir(path.join(root, "dev", "scripts"));
|
|
108
|
+
return full;
|
|
109
|
+
};
|
|
110
|
+
const matchers = [/data-sitekey="(\w{48})"/, /siteKey:\s*'(\w{48})'/];
|
|
111
|
+
it("replaces a site key in an html attribute", async () => {
|
|
112
|
+
inDemos("app/index.html", `<div data-sitekey="${SITE_KEY}"></div>`);
|
|
113
|
+
await updateDemoHTMLFiles(matchers, NEW_KEY, logger);
|
|
114
|
+
expect(read("demos/app/index.html")).toBe(`<div data-sitekey="${NEW_KEY}"></div>`);
|
|
115
|
+
});
|
|
116
|
+
it("replaces a site key matched by the second matcher", async () => {
|
|
117
|
+
inDemos("app/index.html", `<script>siteKey: '${SITE_KEY}'</script>`);
|
|
118
|
+
await updateDemoHTMLFiles(matchers, NEW_KEY, logger);
|
|
119
|
+
expect(read("demos/app/index.html")).toBe(`<script>siteKey: '${NEW_KEY}'</script>`);
|
|
120
|
+
});
|
|
121
|
+
it("replaces every occurrence of the matched key", async () => {
|
|
122
|
+
inDemos("app/index.html", `<a data-sitekey="${SITE_KEY}"></a><b>${SITE_KEY}</b>`);
|
|
123
|
+
await updateDemoHTMLFiles(matchers, NEW_KEY, logger);
|
|
124
|
+
expect(read("demos/app/index.html")).toBe(`<a data-sitekey="${NEW_KEY}"></a><b>${NEW_KEY}</b>`);
|
|
125
|
+
});
|
|
126
|
+
it("leaves a file with no match untouched", async () => {
|
|
127
|
+
inDemos("app/index.html", "<div></div>");
|
|
128
|
+
await updateDemoHTMLFiles(matchers, NEW_KEY, logger);
|
|
129
|
+
expect(read("demos/app/index.html")).toBe("<div></div>");
|
|
130
|
+
});
|
|
131
|
+
it("does nothing when the matcher list is empty", async () => {
|
|
132
|
+
inDemos("app/index.html", `<div data-sitekey="${SITE_KEY}"></div>`);
|
|
133
|
+
await updateDemoHTMLFiles([], NEW_KEY, logger);
|
|
134
|
+
expect(read("demos/app/index.html")).toBe(`<div data-sitekey="${SITE_KEY}"></div>`);
|
|
135
|
+
});
|
|
136
|
+
it("resolves when no html files exist", async () => {
|
|
137
|
+
fs.mkdirSync(path.join(root, "dev", "scripts"), { recursive: true });
|
|
138
|
+
process.chdir(path.join(root, "dev", "scripts"));
|
|
139
|
+
await expect(updateDemoHTMLFiles(matchers, NEW_KEY, logger)).resolves.toBeUndefined();
|
|
140
|
+
});
|
|
141
|
+
it("stops at the first matcher that hits", async () => {
|
|
142
|
+
inDemos("app/index.html", `<div data-sitekey="${SITE_KEY}"></div><script>siteKey: '${"C".repeat(48)}'</script>`);
|
|
143
|
+
await updateDemoHTMLFiles(matchers, NEW_KEY, logger);
|
|
144
|
+
expect(read("demos/app/index.html")).toBe(`<div data-sitekey="${NEW_KEY}"></div><script>siteKey: '${"C".repeat(48)}'</script>`);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=updateEnv.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateEnv.test.js","sourceRoot":"","sources":["../../src/util/updateEnv.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.test-d.d.ts","sourceRoot":"","sources":["../../src/util/util.test-d.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { assertType, describe, expectTypeOf, it } from "vitest";
|
|
2
|
+
import { exec, extractReferrersFromLogs, findEnvFiles, updateDemoHTMLFiles, updateEnvFiles, } from "./index.js";
|
|
3
|
+
describe("ExecOutput", () => {
|
|
4
|
+
it("carries the captured streams and the exit code", () => {
|
|
5
|
+
expectTypeOf().toExtend();
|
|
6
|
+
});
|
|
7
|
+
it("models a signalled process, which has no exit code", () => {
|
|
8
|
+
expectTypeOf().toEqualTypeOf();
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
describe("exec", () => {
|
|
12
|
+
it("takes a command and optional flags", () => {
|
|
13
|
+
expectTypeOf(exec).toBeCallableWith("ls");
|
|
14
|
+
expectTypeOf(exec).toBeCallableWith("ls", {});
|
|
15
|
+
expectTypeOf(exec).toBeCallableWith("ls", { pipe: false });
|
|
16
|
+
expectTypeOf(exec).toBeCallableWith("ls", { printCmd: false });
|
|
17
|
+
});
|
|
18
|
+
it("resolves to the output object", () => {
|
|
19
|
+
expectTypeOf(exec).returns.resolves.toExtend();
|
|
20
|
+
});
|
|
21
|
+
it("rejects a non-string command", () => {
|
|
22
|
+
assertType(exec(1));
|
|
23
|
+
});
|
|
24
|
+
it("rejects an unknown option", () => {
|
|
25
|
+
assertType(exec("ls", { quiet: true }));
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe("env helpers", () => {
|
|
29
|
+
it("finds env files, optionally scoped to a directory", () => {
|
|
30
|
+
expectTypeOf(findEnvFiles).toBeCallableWith(logger);
|
|
31
|
+
expectTypeOf(findEnvFiles).toBeCallableWith(logger, "/tmp");
|
|
32
|
+
expectTypeOf(findEnvFiles).returns.resolves.toEqualTypeOf();
|
|
33
|
+
});
|
|
34
|
+
it("updates env files from a list of variable names", () => {
|
|
35
|
+
expectTypeOf(updateEnvFiles).toBeCallableWith(["A"], "1", logger);
|
|
36
|
+
expectTypeOf(updateEnvFiles).toBeCallableWith(["A"], "1", logger, "/tmp");
|
|
37
|
+
expectTypeOf(updateEnvFiles).returns.resolves.toEqualTypeOf();
|
|
38
|
+
});
|
|
39
|
+
it("requires a logger", () => {
|
|
40
|
+
assertType(updateEnvFiles(["A"], "1"));
|
|
41
|
+
});
|
|
42
|
+
it("updates demo html from a list of regular expressions", () => {
|
|
43
|
+
expectTypeOf(updateDemoHTMLFiles).toBeCallableWith([/a/], "1", logger);
|
|
44
|
+
expectTypeOf(updateDemoHTMLFiles).returns.resolves.toEqualTypeOf();
|
|
45
|
+
});
|
|
46
|
+
it("rejects plain strings in place of matchers", () => {
|
|
47
|
+
assertType(updateDemoHTMLFiles(["a"], "1", logger));
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe("extractReferrersFromLogs", () => {
|
|
51
|
+
it("maps log text to a single joined string", () => {
|
|
52
|
+
expectTypeOf(extractReferrersFromLogs).toBeCallableWith("");
|
|
53
|
+
expectTypeOf(extractReferrersFromLogs).returns.toEqualTypeOf();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=util.test-d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.test-d.js","sourceRoot":"","sources":["../../src/util/util.test-d.ts"],"names":[],"mappings":"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"}
|