@coralreefventures/site-tools 0.4.1 → 0.4.3
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/README.md +5 -2
- package/dist/bin/reef-lighthouse.js +13 -5
- package/dist/bin/reef-lighthouse.js.map +1 -1
- package/dist/door/server.d.ts +2 -0
- package/dist/door/server.d.ts.map +1 -1
- package/dist/door/server.js +17 -5
- package/dist/door/server.js.map +1 -1
- package/dist/lighthouse.d.ts +6 -1
- package/dist/lighthouse.d.ts.map +1 -1
- package/dist/lighthouse.js +19 -6
- package/dist/lighthouse.js.map +1 -1
- package/package.json +1 -1
- package/src/bin/reef-lighthouse.ts +17 -5
- package/src/door/server.ts +18 -5
- package/src/lighthouse.ts +25 -5
package/README.md
CHANGED
|
@@ -25,7 +25,9 @@ default mobile emulation, each of performance, accessibility, best practices and
|
|
|
25
25
|
page under it is measured again, up to `--retries` more times (2 by default), and the median of its runs decides:
|
|
26
26
|
a performance score swings a few points between runs of the same page on a shared runner, and one low run should
|
|
27
27
|
not fail a gate three runs would pass, while a page every run finds low still fails. A page under it then fails the
|
|
28
|
-
run and leaves its last report in `--reports`.
|
|
28
|
+
run and leaves its last report in `--reports`. A category's own floor (`--performance 85`) stands in for the
|
|
29
|
+
threshold for that category alone, where a site's shell puts every page a few points under 90 on a shared runner
|
|
30
|
+
while the other three categories hold at 90. Lighthouse itself is not a dependency, because it
|
|
29
31
|
bundles axe-core (MPL-2.0), which is outside the family's licence allowlist; it runs through `pnpm dlx`, pinned
|
|
30
32
|
(`--lighthouse-version`). Chrome is Playwright's Chromium when `@playwright/test` is installed beside this package,
|
|
31
33
|
or `--chrome`.
|
|
@@ -66,7 +68,8 @@ listening on port 3000. For every request, in order:
|
|
|
66
68
|
top-level navigation starts one (a navigation, or a request without `Sec-Fetch-*` headers that accepts HTML, and
|
|
67
69
|
`Sec-Fetch-Dest: document` when sent); an image, a frame or a fetch gets an empty 401 and no cookie, so another
|
|
68
70
|
site cannot overwrite a visitor's state mid-sign-in.
|
|
69
|
-
5. `/_door/signout?then=<id>` clears all three cookies
|
|
71
|
+
5. `/_door/signout?then=<id>` clears all three cookies (an empty value and an `Expires` at the epoch, with the attributes
|
|
72
|
+
each was set with and no `Max-Age`, which Firefox can keep for a moment as a cookie expiring now) and goes on by a fixed map: to the gate of the site `<id>` in
|
|
70
73
|
`--signout-chain`, naming the site after it, or, for anything else (`door`, the last stop), to the door's
|
|
71
74
|
`/signout/`. It never redirects to a URL from the query.
|
|
72
75
|
6. With a valid session the export is served as Amplify maps it, HTML and `.txt` as `private, no-store` and
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { parseArgs } from "node:util";
|
|
3
|
-
import { runLighthouse } from "../lighthouse.js";
|
|
3
|
+
import { categories, runLighthouse } from "../lighthouse.js";
|
|
4
4
|
/**
|
|
5
|
-
* reef-lighthouse [--root out] [--reports lighthouse] [--port N] [--threshold 90] [--retries 2] [--
|
|
5
|
+
* reef-lighthouse [--root out] [--reports lighthouse] [--port N] [--threshold 90] [--retries 2] [--performance N]
|
|
6
|
+
* [--accessibility N] [--best-practices N] [--seo N] [--chrome <path>] [path ...]
|
|
6
7
|
*
|
|
7
8
|
* Lighthouse on every page in the export's sitemap, or the paths given, each category at the threshold or above. The
|
|
8
9
|
* export is served on a free port unless --port pins one (Streamlane's run met EADDRINUSE on a fixed 3160). A page
|
|
9
10
|
* under the threshold is measured again, up to --retries more times, and the median of its runs decides, since a
|
|
10
11
|
* performance score swings a few points between runs on a shared runner. Exits 1 with the failing pages named when
|
|
11
|
-
* one is under, and leaves their reports in --reports.
|
|
12
|
+
* one is under, and leaves their reports in --reports. A category's own floor (--performance 85) stands in for the
|
|
13
|
+
* threshold for that category alone.
|
|
12
14
|
*/
|
|
13
15
|
const { values, positionals } = parseArgs({
|
|
14
16
|
allowPositionals: true,
|
|
@@ -18,29 +20,35 @@ const { values, positionals } = parseArgs({
|
|
|
18
20
|
port: { type: "string" },
|
|
19
21
|
threshold: { type: "string", default: "90" },
|
|
20
22
|
retries: { type: "string", default: "2" },
|
|
23
|
+
performance: { type: "string" },
|
|
24
|
+
accessibility: { type: "string" },
|
|
25
|
+
"best-practices": { type: "string" },
|
|
26
|
+
seo: { type: "string" },
|
|
21
27
|
chrome: { type: "string" },
|
|
22
28
|
"lighthouse-version": { type: "string", default: "13.5.0" },
|
|
23
29
|
help: { type: "boolean", short: "h" },
|
|
24
30
|
},
|
|
25
31
|
});
|
|
26
32
|
if (values.help) {
|
|
27
|
-
console.log("reef-lighthouse [--root out] [--reports lighthouse] [--port N] [--threshold 90] [--retries 2] [--chrome <path>] [path ...]");
|
|
33
|
+
console.log("reef-lighthouse [--root out] [--reports lighthouse] [--port N] [--threshold 90] [--retries 2] [--performance N] [--accessibility N] [--best-practices N] [--seo N] [--chrome <path>] [path ...]");
|
|
28
34
|
process.exit(0);
|
|
29
35
|
}
|
|
30
36
|
const threshold = Number(values.threshold) / 100;
|
|
37
|
+
const thresholds = Object.fromEntries(categories.flatMap((category) => values[category] === undefined ? [] : [[category, Number(values[category]) / 100]]));
|
|
31
38
|
const results = await runLighthouse({
|
|
32
39
|
root: values.root,
|
|
33
40
|
reportDir: values.reports,
|
|
34
41
|
...(values.port !== undefined && { port: Number(values.port) }),
|
|
35
42
|
threshold,
|
|
36
43
|
retries: Number(values.retries),
|
|
44
|
+
thresholds,
|
|
37
45
|
paths: positionals,
|
|
38
46
|
lighthouseVersion: values["lighthouse-version"],
|
|
39
47
|
...(values.chrome !== undefined && { chrome: values.chrome }),
|
|
40
48
|
});
|
|
41
49
|
const failures = results.filter((result) => result.low.length > 0);
|
|
42
50
|
if (failures.length) {
|
|
43
|
-
console.error(`Under
|
|
51
|
+
console.error(`Under the threshold:\n${failures.map((result) => `${result.path}: ${result.low.join(", ")}`).join("\n")}\nReports in ${values.reports}/`);
|
|
44
52
|
process.exit(1);
|
|
45
53
|
}
|
|
46
54
|
//# sourceMappingURL=reef-lighthouse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reef-lighthouse.js","sourceRoot":"","sources":["../../src/bin/reef-lighthouse.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"reef-lighthouse.js","sourceRoot":"","sources":["../../src/bin/reef-lighthouse.ts"],"names":[],"mappings":"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"}
|
package/dist/door/server.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ export declare const stateLifetimeSeconds = 600;
|
|
|
12
12
|
*/
|
|
13
13
|
export declare const seenCookie = "__Host-crv_door_seen";
|
|
14
14
|
export declare const seenLifetimeSeconds: number;
|
|
15
|
+
/** The three Set-Cookie values sign-out sends, in order: exported for the browser suite's jar test. */
|
|
16
|
+
export declare const signoutCookies: readonly string[];
|
|
15
17
|
/** One value of a cookie, or undefined when it is absent or sent twice (which a `__Host-` cookie never is). */
|
|
16
18
|
export declare const readCookie: (header: string | undefined, name: string) => string | undefined;
|
|
17
19
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/door/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAIvH,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,aAAa,CAAC;AAQ9D,+DAA+D;AAC/D,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAC/C,yGAAyG;AACzG,eAAO,MAAM,WAAW,0BAA0B,CAAC;AACnD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC;;;;GAIG;AACH,eAAO,MAAM,UAAU,yBAAyB,CAAC;AACjD,eAAO,MAAM,mBAAmB,QAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/door/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAIvH,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,aAAa,CAAC;AAQ9D,+DAA+D;AAC/D,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAC/C,yGAAyG;AACzG,eAAO,MAAM,WAAW,0BAA0B,CAAC;AACnD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC;;;;GAIG;AACH,eAAO,MAAM,UAAU,yBAAyB,CAAC;AACjD,eAAO,MAAM,mBAAmB,QAAoB,CAAC;AA+BrD,uGAAuG;AACvG,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAA0C,CAAC;AAEvF,+GAA+G;AAC/G,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAO9E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,KAAG,MAAM,GAAG,IAaxD,CAAC;AAEF,wGAAwG;AACxG,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,KAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAG/E,CAAC;AAKF;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,WACiD,CAAC;AAKxF,yGAAyG;AACzG,eAAO,MAAM,iBAAiB,GAAI,SAAS,eAAe,KAAG,OAK5D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS,eAAe,KAAG,OAI/D,CAAC;AAgCF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAI,wBAIxB,WAAW,KAAG,eAwMhB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wBAAwB;IACxB,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;IACrB,yBAAyB;IACzB,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,gHAAgH;AAChH,eAAO,MAAM,SAAS,GAAU,wBAA+B,gBAAgB,KAAG,OAAO,CAAC,MAAM,CAU/F,CAAC"}
|
package/dist/door/server.js
CHANGED
|
@@ -30,11 +30,23 @@ const securityHeaders = {
|
|
|
30
30
|
"Referrer-Policy": "strict-origin-when-cross-origin",
|
|
31
31
|
"X-Robots-Tag": "noindex, nofollow",
|
|
32
32
|
};
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
const
|
|
33
|
+
/** What every door cookie is set and cleared with; a `__Host-` cookie must be Secure, Path=/ and name no Domain. */
|
|
34
|
+
const attributes = (sameSite) => `Path=/; Secure; HttpOnly; SameSite=${sameSite}`;
|
|
35
|
+
const cookie = (name, value, maxAge, sameSite) => `${name}=${value}; Max-Age=${maxAge}; ${attributes(sameSite)}`;
|
|
36
|
+
/**
|
|
37
|
+
* A cookie cleared: an empty value and an Expires at the epoch, with the attributes it was set with and no Max-Age.
|
|
38
|
+
* `Max-Age=0` is not enough in Firefox: it takes the expiry as the cookie's creation time plus zero, and makes each
|
|
39
|
+
* creation time unique by moving it a microsecond past the last one it handed out, so a clear that lands in the next
|
|
40
|
+
* millisecond is kept, empty, as a cookie expiring now rather than removed (streamlane #1081). An Expires in the past
|
|
41
|
+
* is before any creation time in every browser. Max-Age would override it, so the clear sends none.
|
|
42
|
+
*/
|
|
43
|
+
const clear = (name, sameSite) => `${name}=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; ${attributes(sameSite)}`;
|
|
44
|
+
const clearSession = clear(sessionCookie, "Lax");
|
|
45
|
+
const clearState = clear(stateCookie, "None");
|
|
36
46
|
const markSeen = cookie(seenCookie, "1", seenLifetimeSeconds, "Lax");
|
|
37
|
-
const clearSeen =
|
|
47
|
+
const clearSeen = clear(seenCookie, "Lax");
|
|
48
|
+
/** The three Set-Cookie values sign-out sends, in order: exported for the browser suite's jar test. */
|
|
49
|
+
export const signoutCookies = [clearSession, clearState, clearSeen];
|
|
38
50
|
/** One value of a cookie, or undefined when it is absent or sent twice (which a `__Host-` cookie never is). */
|
|
39
51
|
export const readCookie = (header, name) => {
|
|
40
52
|
const values = (header ?? "")
|
|
@@ -280,7 +292,7 @@ export const createGate = ({ config, site, now = () => Math.floor(Date.now() / 1
|
|
|
280
292
|
return startSignin(request, response, rawQuery, host);
|
|
281
293
|
if (path === "/_door/signout") {
|
|
282
294
|
const then = new URLSearchParams(rawQuery).get("then");
|
|
283
|
-
return redirect(response, 303, signoutTarget(then), [
|
|
295
|
+
return redirect(response, 303, signoutTarget(then), [...signoutCookies]);
|
|
284
296
|
}
|
|
285
297
|
return empty(response, 404);
|
|
286
298
|
};
|
package/dist/door/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/door/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/door/server.ts"],"names":[],"mappings":"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"}
|
package/dist/lighthouse.d.ts
CHANGED
|
@@ -9,6 +9,11 @@ export type LighthouseOptions = {
|
|
|
9
9
|
port?: number;
|
|
10
10
|
/** The least score, 0 to 1, every category must reach on every page; 0.9 by default. */
|
|
11
11
|
threshold?: number;
|
|
12
|
+
/**
|
|
13
|
+
* A category's own floor, 0 to 1, in place of the threshold: a site holds performance at 0.85, say, where the
|
|
14
|
+
* shell's scripts and stylesheets on a shared runner put every page a few points under 90, and the rest at 0.9.
|
|
15
|
+
*/
|
|
16
|
+
thresholds?: Partial<Record<Category, number>>;
|
|
12
17
|
/** The pages to audit; every page in the export's sitemap when none are given. */
|
|
13
18
|
paths?: readonly string[];
|
|
14
19
|
/**
|
|
@@ -36,7 +41,7 @@ export type PageResult = {
|
|
|
36
41
|
/** The median of the scores, which three runs with one low outlier put at the typical run. */
|
|
37
42
|
export declare const median: (values: readonly number[]) => number;
|
|
38
43
|
/** The categories under the threshold, by the median of each one's scores over the runs so far. */
|
|
39
|
-
export declare const judge: (runs: readonly Record<Category, number>[], threshold: number) => {
|
|
44
|
+
export declare const judge: (runs: readonly Record<Category, number>[], threshold: number, thresholds?: Partial<Record<Category, number>>) => {
|
|
40
45
|
scores: Record<Category, number>;
|
|
41
46
|
low: Category[];
|
|
42
47
|
};
|
package/dist/lighthouse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lighthouse.d.ts","sourceRoot":"","sources":["../src/lighthouse.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,UAAU,oEAAqE,CAAC;AAC7F,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kHAAkH;IAClH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjC,0CAA0C;IAC1C,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,MAAM,GAAI,QAAQ,SAAS,MAAM,EAAE,KAAG,MASlD,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,KAAK,GAChB,MAAM,SAAS,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EACzC,WAAW,MAAM,
|
|
1
|
+
{"version":3,"file":"lighthouse.d.ts","sourceRoot":"","sources":["../src/lighthouse.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,UAAU,oEAAqE,CAAC;AAC7F,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kHAAkH;IAClH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,kFAAkF;IAClF,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjC,0CAA0C;IAC1C,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,MAAM,GAAI,QAAQ,SAAS,MAAM,EAAE,KAAG,MASlD,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,KAAK,GAChB,MAAM,SAAS,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EACzC,WAAW,MAAM,EACjB,aAAY,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAM,KACjD;IAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,QAAQ,EAAE,CAAA;CAKrD,CAAC;AAIF,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CAGrE,CAAC;AAEF,yGAAyG;AACzG,eAAO,MAAM,UAAU,GAAI,WAAW,MAAM,EAAE,UAAU,MAAM,WACyB,CAAC;AA4ExF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAU,UAAS,iBAAsB,KAAG,OAAO,CAAC,UAAU,EAAE,CAwCzF,CAAC"}
|
package/dist/lighthouse.js
CHANGED
|
@@ -23,9 +23,9 @@ export const median = (values) => {
|
|
|
23
23
|
: (sorted[middle - 1] + sorted[middle]) / 2;
|
|
24
24
|
};
|
|
25
25
|
/** The categories under the threshold, by the median of each one's scores over the runs so far. */
|
|
26
|
-
export const judge = (runs, threshold) => {
|
|
26
|
+
export const judge = (runs, threshold, thresholds = {}) => {
|
|
27
27
|
const scores = Object.fromEntries(categories.map((category) => [category, median(runs.map((run) => run[category]))]));
|
|
28
|
-
return { scores, low: categories.filter((category) => scores[category] < threshold) };
|
|
28
|
+
return { scores, low: categories.filter((category) => scores[category] < (thresholds[category] ?? threshold)) };
|
|
29
29
|
};
|
|
30
30
|
/** Every page's path from the export's sitemap, whatever origin the sitemap names. */
|
|
31
31
|
export const pagesFromSitemap = async (root) => {
|
|
@@ -72,13 +72,13 @@ const shown = (scores) => categories.map((category) => Math.round(scores[categor
|
|
|
72
72
|
/** One page's verdict: measured again while under the threshold, up to `retries` more times; the median decides. */
|
|
73
73
|
const measurePage = async (pagePath, base, measure) => {
|
|
74
74
|
const runs = [];
|
|
75
|
-
let verdict = judge(runs, measure.threshold);
|
|
75
|
+
let verdict = judge(runs, measure.threshold, measure.thresholds);
|
|
76
76
|
while (runs.length === 0 || (verdict.low.length > 0 && runs.length <= measure.retries)) {
|
|
77
77
|
await audit(`${measure.origin}${pagePath}`, base, measure.version, measure.chrome);
|
|
78
78
|
const report = JSON.parse(await readFile(`${base}.report.json`, "utf8"));
|
|
79
79
|
const scores = Object.fromEntries(categories.map((category) => [category, report.categories[category]?.score ?? 0]));
|
|
80
80
|
runs.push(scores);
|
|
81
|
-
verdict = judge(runs, measure.threshold);
|
|
81
|
+
verdict = judge(runs, measure.threshold, measure.thresholds);
|
|
82
82
|
if (verdict.low.length > 0 && runs.length <= measure.retries) {
|
|
83
83
|
measure.log(`again ${pagePath.padEnd(28)} ${shown(scores)} (run ${runs.length} of ${measure.retries + 1})`);
|
|
84
84
|
}
|
|
@@ -97,6 +97,7 @@ export const runLighthouse = async (options = {}) => {
|
|
|
97
97
|
const reportDir = options.reportDir ?? "lighthouse";
|
|
98
98
|
const threshold = options.threshold ?? 0.9;
|
|
99
99
|
const retries = Math.max(0, options.retries ?? 2);
|
|
100
|
+
const thresholds = options.thresholds ?? {};
|
|
100
101
|
const version = options.lighthouseVersion ?? "13.5.0";
|
|
101
102
|
const log = options.log ?? console.log;
|
|
102
103
|
const paths = options.paths?.length ? options.paths : await pagesFromSitemap(root);
|
|
@@ -107,7 +108,15 @@ export const runLighthouse = async (options = {}) => {
|
|
|
107
108
|
await mkdir(reportDir, { recursive: true });
|
|
108
109
|
for (const pagePath of paths) {
|
|
109
110
|
const base = reportBase(reportDir, pagePath);
|
|
110
|
-
const result = await measurePage(pagePath, base, {
|
|
111
|
+
const result = await measurePage(pagePath, base, {
|
|
112
|
+
origin,
|
|
113
|
+
version,
|
|
114
|
+
chrome,
|
|
115
|
+
threshold,
|
|
116
|
+
thresholds,
|
|
117
|
+
retries,
|
|
118
|
+
log,
|
|
119
|
+
});
|
|
111
120
|
results.push(result);
|
|
112
121
|
if (result.low.length === 0) {
|
|
113
122
|
await rm(`${base}.report.json`);
|
|
@@ -118,7 +127,11 @@ export const runLighthouse = async (options = {}) => {
|
|
|
118
127
|
finally {
|
|
119
128
|
server.close();
|
|
120
129
|
}
|
|
121
|
-
|
|
130
|
+
const floors = categories
|
|
131
|
+
.filter((category) => thresholds[category] !== undefined)
|
|
132
|
+
.map((category) => `, ${category} ${(thresholds[category] ?? 0) * 100}`)
|
|
133
|
+
.join("");
|
|
134
|
+
log(`\n${categories.join(", ")}; ${paths.length} pages, threshold ${threshold * 100}${floors}`);
|
|
122
135
|
return results;
|
|
123
136
|
};
|
|
124
137
|
//# sourceMappingURL=lighthouse.js.map
|
package/dist/lighthouse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lighthouse.js","sourceRoot":"","sources":["../src/lighthouse.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"lighthouse.js","sourceRoot":"","sources":["../src/lighthouse.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coralreefventures/site-tools",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
4
4
|
"description": "Command-line tools for a Coral Reef public site: serve the static export as the host does, gate it with Lighthouse, and lock it behind the door.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { parseArgs } from "node:util";
|
|
3
3
|
|
|
4
|
-
import { runLighthouse } from "../lighthouse.ts";
|
|
4
|
+
import { categories, runLighthouse } from "../lighthouse.ts";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* reef-lighthouse [--root out] [--reports lighthouse] [--port N] [--threshold 90] [--retries 2] [--
|
|
7
|
+
* reef-lighthouse [--root out] [--reports lighthouse] [--port N] [--threshold 90] [--retries 2] [--performance N]
|
|
8
|
+
* [--accessibility N] [--best-practices N] [--seo N] [--chrome <path>] [path ...]
|
|
8
9
|
*
|
|
9
10
|
* Lighthouse on every page in the export's sitemap, or the paths given, each category at the threshold or above. The
|
|
10
11
|
* export is served on a free port unless --port pins one (Streamlane's run met EADDRINUSE on a fixed 3160). A page
|
|
11
12
|
* under the threshold is measured again, up to --retries more times, and the median of its runs decides, since a
|
|
12
13
|
* performance score swings a few points between runs on a shared runner. Exits 1 with the failing pages named when
|
|
13
|
-
* one is under, and leaves their reports in --reports.
|
|
14
|
+
* one is under, and leaves their reports in --reports. A category's own floor (--performance 85) stands in for the
|
|
15
|
+
* threshold for that category alone.
|
|
14
16
|
*/
|
|
15
17
|
const { values, positionals } = parseArgs({
|
|
16
18
|
allowPositionals: true,
|
|
@@ -20,6 +22,10 @@ const { values, positionals } = parseArgs({
|
|
|
20
22
|
port: { type: "string" },
|
|
21
23
|
threshold: { type: "string", default: "90" },
|
|
22
24
|
retries: { type: "string", default: "2" },
|
|
25
|
+
performance: { type: "string" },
|
|
26
|
+
accessibility: { type: "string" },
|
|
27
|
+
"best-practices": { type: "string" },
|
|
28
|
+
seo: { type: "string" },
|
|
23
29
|
chrome: { type: "string" },
|
|
24
30
|
"lighthouse-version": { type: "string", default: "13.5.0" },
|
|
25
31
|
help: { type: "boolean", short: "h" },
|
|
@@ -28,18 +34,24 @@ const { values, positionals } = parseArgs({
|
|
|
28
34
|
|
|
29
35
|
if (values.help) {
|
|
30
36
|
console.log(
|
|
31
|
-
"reef-lighthouse [--root out] [--reports lighthouse] [--port N] [--threshold 90] [--retries 2] [--chrome <path>] [path ...]",
|
|
37
|
+
"reef-lighthouse [--root out] [--reports lighthouse] [--port N] [--threshold 90] [--retries 2] [--performance N] [--accessibility N] [--best-practices N] [--seo N] [--chrome <path>] [path ...]",
|
|
32
38
|
);
|
|
33
39
|
process.exit(0);
|
|
34
40
|
}
|
|
35
41
|
|
|
36
42
|
const threshold = Number(values.threshold) / 100;
|
|
43
|
+
const thresholds = Object.fromEntries(
|
|
44
|
+
categories.flatMap((category) =>
|
|
45
|
+
values[category] === undefined ? [] : [[category, Number(values[category]) / 100]],
|
|
46
|
+
),
|
|
47
|
+
);
|
|
37
48
|
const results = await runLighthouse({
|
|
38
49
|
root: values.root,
|
|
39
50
|
reportDir: values.reports,
|
|
40
51
|
...(values.port !== undefined && { port: Number(values.port) }),
|
|
41
52
|
threshold,
|
|
42
53
|
retries: Number(values.retries),
|
|
54
|
+
thresholds,
|
|
43
55
|
paths: positionals,
|
|
44
56
|
lighthouseVersion: values["lighthouse-version"],
|
|
45
57
|
...(values.chrome !== undefined && { chrome: values.chrome }),
|
|
@@ -48,7 +60,7 @@ const results = await runLighthouse({
|
|
|
48
60
|
const failures = results.filter((result) => result.low.length > 0);
|
|
49
61
|
if (failures.length) {
|
|
50
62
|
console.error(
|
|
51
|
-
`Under
|
|
63
|
+
`Under the threshold:\n${failures.map((result) => `${result.path}: ${result.low.join(", ")}`).join("\n")}\nReports in ${values.reports}/`,
|
|
52
64
|
);
|
|
53
65
|
process.exit(1);
|
|
54
66
|
}
|
package/src/door/server.ts
CHANGED
|
@@ -36,12 +36,25 @@ const securityHeaders = {
|
|
|
36
36
|
"X-Robots-Tag": "noindex, nofollow",
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
+
/** What every door cookie is set and cleared with; a `__Host-` cookie must be Secure, Path=/ and name no Domain. */
|
|
40
|
+
const attributes = (sameSite: "Lax" | "None") => `Path=/; Secure; HttpOnly; SameSite=${sameSite}`;
|
|
39
41
|
const cookie = (name: string, value: string, maxAge: number, sameSite: "Lax" | "None") =>
|
|
40
|
-
`${name}=${value}; Max-Age=${maxAge};
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
`${name}=${value}; Max-Age=${maxAge}; ${attributes(sameSite)}`;
|
|
43
|
+
/**
|
|
44
|
+
* A cookie cleared: an empty value and an Expires at the epoch, with the attributes it was set with and no Max-Age.
|
|
45
|
+
* `Max-Age=0` is not enough in Firefox: it takes the expiry as the cookie's creation time plus zero, and makes each
|
|
46
|
+
* creation time unique by moving it a microsecond past the last one it handed out, so a clear that lands in the next
|
|
47
|
+
* millisecond is kept, empty, as a cookie expiring now rather than removed (streamlane #1081). An Expires in the past
|
|
48
|
+
* is before any creation time in every browser. Max-Age would override it, so the clear sends none.
|
|
49
|
+
*/
|
|
50
|
+
const clear = (name: string, sameSite: "Lax" | "None") =>
|
|
51
|
+
`${name}=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; ${attributes(sameSite)}`;
|
|
52
|
+
const clearSession = clear(sessionCookie, "Lax");
|
|
53
|
+
const clearState = clear(stateCookie, "None");
|
|
43
54
|
const markSeen = cookie(seenCookie, "1", seenLifetimeSeconds, "Lax");
|
|
44
|
-
const clearSeen =
|
|
55
|
+
const clearSeen = clear(seenCookie, "Lax");
|
|
56
|
+
/** The three Set-Cookie values sign-out sends, in order: exported for the browser suite's jar test. */
|
|
57
|
+
export const signoutCookies: readonly string[] = [clearSession, clearState, clearSeen];
|
|
45
58
|
|
|
46
59
|
/** One value of a cookie, or undefined when it is absent or sent twice (which a `__Host-` cookie never is). */
|
|
47
60
|
export const readCookie = (header: string | undefined, name: string): string | undefined => {
|
|
@@ -315,7 +328,7 @@ export const createGate = ({
|
|
|
315
328
|
if (path === "/_door/signin") return startSignin(request, response, rawQuery, host);
|
|
316
329
|
if (path === "/_door/signout") {
|
|
317
330
|
const then = new URLSearchParams(rawQuery).get("then");
|
|
318
|
-
return redirect(response, 303, signoutTarget(then), [
|
|
331
|
+
return redirect(response, 303, signoutTarget(then), [...signoutCookies]);
|
|
319
332
|
}
|
|
320
333
|
return empty(response, 404);
|
|
321
334
|
};
|
package/src/lighthouse.ts
CHANGED
|
@@ -16,6 +16,11 @@ export type LighthouseOptions = {
|
|
|
16
16
|
port?: number;
|
|
17
17
|
/** The least score, 0 to 1, every category must reach on every page; 0.9 by default. */
|
|
18
18
|
threshold?: number;
|
|
19
|
+
/**
|
|
20
|
+
* A category's own floor, 0 to 1, in place of the threshold: a site holds performance at 0.85, say, where the
|
|
21
|
+
* shell's scripts and stylesheets on a shared runner put every page a few points under 90, and the rest at 0.9.
|
|
22
|
+
*/
|
|
23
|
+
thresholds?: Partial<Record<Category, number>>;
|
|
19
24
|
/** The pages to audit; every page in the export's sitemap when none are given. */
|
|
20
25
|
paths?: readonly string[];
|
|
21
26
|
/**
|
|
@@ -58,11 +63,12 @@ export const median = (values: readonly number[]): number => {
|
|
|
58
63
|
export const judge = (
|
|
59
64
|
runs: readonly Record<Category, number>[],
|
|
60
65
|
threshold: number,
|
|
66
|
+
thresholds: Partial<Record<Category, number>> = {},
|
|
61
67
|
): { scores: Record<Category, number>; low: Category[] } => {
|
|
62
68
|
const scores = Object.fromEntries(
|
|
63
69
|
categories.map((category) => [category, median(runs.map((run) => run[category]))]),
|
|
64
70
|
) as Record<Category, number>;
|
|
65
|
-
return { scores, low: categories.filter((category) => scores[category] < threshold) };
|
|
71
|
+
return { scores, low: categories.filter((category) => scores[category] < (thresholds[category] ?? threshold)) };
|
|
66
72
|
};
|
|
67
73
|
|
|
68
74
|
type Report = { categories: Record<string, { score: number | null } | undefined> };
|
|
@@ -122,6 +128,7 @@ type Measure = {
|
|
|
122
128
|
version: string;
|
|
123
129
|
chrome: string | undefined;
|
|
124
130
|
threshold: number;
|
|
131
|
+
thresholds: Partial<Record<Category, number>>;
|
|
125
132
|
retries: number;
|
|
126
133
|
log: (line: string) => void;
|
|
127
134
|
};
|
|
@@ -132,7 +139,7 @@ const shown = (scores: Record<Category, number>) =>
|
|
|
132
139
|
/** One page's verdict: measured again while under the threshold, up to `retries` more times; the median decides. */
|
|
133
140
|
const measurePage = async (pagePath: string, base: string, measure: Measure): Promise<PageResult> => {
|
|
134
141
|
const runs: Record<Category, number>[] = [];
|
|
135
|
-
let verdict = judge(runs, measure.threshold);
|
|
142
|
+
let verdict = judge(runs, measure.threshold, measure.thresholds);
|
|
136
143
|
while (runs.length === 0 || (verdict.low.length > 0 && runs.length <= measure.retries)) {
|
|
137
144
|
await audit(`${measure.origin}${pagePath}`, base, measure.version, measure.chrome);
|
|
138
145
|
const report = JSON.parse(await readFile(`${base}.report.json`, "utf8")) as Report;
|
|
@@ -140,7 +147,7 @@ const measurePage = async (pagePath: string, base: string, measure: Measure): Pr
|
|
|
140
147
|
categories.map((category) => [category, report.categories[category]?.score ?? 0]),
|
|
141
148
|
) as Record<Category, number>;
|
|
142
149
|
runs.push(scores);
|
|
143
|
-
verdict = judge(runs, measure.threshold);
|
|
150
|
+
verdict = judge(runs, measure.threshold, measure.thresholds);
|
|
144
151
|
if (verdict.low.length > 0 && runs.length <= measure.retries) {
|
|
145
152
|
measure.log(`again ${pagePath.padEnd(28)} ${shown(scores)} (run ${runs.length} of ${measure.retries + 1})`);
|
|
146
153
|
}
|
|
@@ -160,6 +167,7 @@ export const runLighthouse = async (options: LighthouseOptions = {}): Promise<Pa
|
|
|
160
167
|
const reportDir = options.reportDir ?? "lighthouse";
|
|
161
168
|
const threshold = options.threshold ?? 0.9;
|
|
162
169
|
const retries = Math.max(0, options.retries ?? 2);
|
|
170
|
+
const thresholds = options.thresholds ?? {};
|
|
163
171
|
const version = options.lighthouseVersion ?? "13.5.0";
|
|
164
172
|
const log = options.log ?? console.log;
|
|
165
173
|
const paths = options.paths?.length ? options.paths : await pagesFromSitemap(root);
|
|
@@ -170,7 +178,15 @@ export const runLighthouse = async (options: LighthouseOptions = {}): Promise<Pa
|
|
|
170
178
|
await mkdir(reportDir, { recursive: true });
|
|
171
179
|
for (const pagePath of paths) {
|
|
172
180
|
const base = reportBase(reportDir, pagePath);
|
|
173
|
-
const result = await measurePage(pagePath, base, {
|
|
181
|
+
const result = await measurePage(pagePath, base, {
|
|
182
|
+
origin,
|
|
183
|
+
version,
|
|
184
|
+
chrome,
|
|
185
|
+
threshold,
|
|
186
|
+
thresholds,
|
|
187
|
+
retries,
|
|
188
|
+
log,
|
|
189
|
+
});
|
|
174
190
|
results.push(result);
|
|
175
191
|
if (result.low.length === 0) {
|
|
176
192
|
await rm(`${base}.report.json`);
|
|
@@ -180,6 +196,10 @@ export const runLighthouse = async (options: LighthouseOptions = {}): Promise<Pa
|
|
|
180
196
|
} finally {
|
|
181
197
|
server.close();
|
|
182
198
|
}
|
|
183
|
-
|
|
199
|
+
const floors = categories
|
|
200
|
+
.filter((category) => thresholds[category] !== undefined)
|
|
201
|
+
.map((category) => `, ${category} ${(thresholds[category] ?? 0) * 100}`)
|
|
202
|
+
.join("");
|
|
203
|
+
log(`\n${categories.join(", ")}; ${paths.length} pages, threshold ${threshold * 100}${floors}`);
|
|
184
204
|
return results;
|
|
185
205
|
};
|