@ploaness/config 1.11.0 → 1.13.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.
Files changed (78) hide show
  1. package/dist/a11y.d.ts +13 -5
  2. package/dist/a11y.d.ts.map +1 -1
  3. package/dist/a11y.js +20 -11
  4. package/dist/a11y.js.map +1 -1
  5. package/dist/clock-preload.d.ts +2 -0
  6. package/dist/clock-preload.d.ts.map +1 -0
  7. package/dist/clock-preload.js +37 -0
  8. package/dist/clock-preload.js.map +1 -0
  9. package/dist/eslint-immutability.d.ts.map +1 -1
  10. package/dist/eslint-immutability.js +37 -4
  11. package/dist/eslint-immutability.js.map +1 -1
  12. package/dist/eslint-library.d.ts.map +1 -1
  13. package/dist/eslint-library.js +6 -1
  14. package/dist/eslint-library.js.map +1 -1
  15. package/dist/eslint-runtime.d.ts +11 -0
  16. package/dist/eslint-runtime.d.ts.map +1 -0
  17. package/dist/eslint-runtime.js +68 -0
  18. package/dist/eslint-runtime.js.map +1 -0
  19. package/dist/eslint.d.ts.map +1 -1
  20. package/dist/eslint.js +6 -1
  21. package/dist/eslint.js.map +1 -1
  22. package/dist/layout.d.ts +34 -16
  23. package/dist/layout.d.ts.map +1 -1
  24. package/dist/layout.js +228 -56
  25. package/dist/layout.js.map +1 -1
  26. package/dist/payload-view.d.ts +16 -0
  27. package/dist/payload-view.d.ts.map +1 -0
  28. package/dist/payload-view.js +35 -0
  29. package/dist/payload-view.js.map +1 -0
  30. package/dist/playwright.d.ts.map +1 -1
  31. package/dist/playwright.js +115 -12
  32. package/dist/playwright.js.map +1 -1
  33. package/dist/scanner.d.ts +99 -0
  34. package/dist/scanner.d.ts.map +1 -0
  35. package/dist/scanner.js +278 -0
  36. package/dist/scanner.js.map +1 -0
  37. package/dist/settle.d.ts +8 -6
  38. package/dist/settle.d.ts.map +1 -1
  39. package/dist/settle.js +55 -42
  40. package/dist/settle.js.map +1 -1
  41. package/dist/sweep-disclosures.d.ts +10 -0
  42. package/dist/sweep-disclosures.d.ts.map +1 -0
  43. package/dist/sweep-disclosures.js +179 -0
  44. package/dist/sweep-disclosures.js.map +1 -0
  45. package/dist/sweep-discovery.d.ts +15 -0
  46. package/dist/sweep-discovery.d.ts.map +1 -0
  47. package/dist/sweep-discovery.js +336 -0
  48. package/dist/sweep-discovery.js.map +1 -0
  49. package/dist/sweep-interaction.d.ts +19 -0
  50. package/dist/sweep-interaction.d.ts.map +1 -0
  51. package/dist/sweep-interaction.js +351 -0
  52. package/dist/sweep-interaction.js.map +1 -0
  53. package/dist/sweep-queue.d.ts +24 -0
  54. package/dist/sweep-queue.d.ts.map +1 -0
  55. package/dist/sweep-queue.js +56 -0
  56. package/dist/sweep-queue.js.map +1 -0
  57. package/dist/sweep-reflow.d.ts +17 -0
  58. package/dist/sweep-reflow.d.ts.map +1 -0
  59. package/dist/sweep-reflow.js +210 -0
  60. package/dist/sweep-reflow.js.map +1 -0
  61. package/dist/sweep-resting.d.ts +25 -0
  62. package/dist/sweep-resting.d.ts.map +1 -0
  63. package/dist/sweep-resting.js +98 -0
  64. package/dist/sweep-resting.js.map +1 -0
  65. package/dist/sweep-shared.d.ts +353 -0
  66. package/dist/sweep-shared.d.ts.map +1 -0
  67. package/dist/sweep-shared.js +434 -0
  68. package/dist/sweep-shared.js.map +1 -0
  69. package/dist/sweep.d.ts +14 -0
  70. package/dist/sweep.d.ts.map +1 -0
  71. package/dist/sweep.js +157 -0
  72. package/dist/sweep.js.map +1 -0
  73. package/dist/vitest-core.d.ts +1 -1
  74. package/dist/vitest-core.js +1 -1
  75. package/dist/vitest-library.d.ts.map +1 -1
  76. package/dist/vitest-library.js +2 -1
  77. package/dist/vitest-library.js.map +1 -1
  78. package/package.json +10 -2
@@ -0,0 +1,336 @@
1
+ // The sweep's discovery pass: what the later passes scan, read from the running application.
2
+ import { expect, test } from '@playwright/test';
3
+ import { alternateHrefs, BROKEN_LINK_RULE, breakpointEdges, findingAt, isSweepScope, localAddress, onOrigin, routeReason, SWEEP_SCOPE_ENVIRONMENT_VARIABLE, scopeHeadline, securityHeaderProblems, sitemapEntries, storiesOfIndex, storyFileOf, storyLocation, storyReason, storyUrl, templateSamples, } from '@ploaness/governance';
4
+ import { declaredRoutes, isSkippedSweepRoute, MAX_SWEEP_ROUTES, unsweptRoutes } from './a11y.js';
5
+ import { projectSettings } from './project-settings.js';
6
+ import { engineOf } from './scanner.js';
7
+ import { settleForScan } from './settle.js';
8
+ import { armBudget, CONTROLS, DESKTOP, discoveryFile, discoveryReportFile, loadLocation, origin, placeAt, preparePage, readJson, WHOLE_PASS, writeJson, } from './sweep-shared.js';
9
+ const SEED_ROUTE = '/';
10
+ const STATIC_ASSET = /\.[a-z\d]+$/iu;
11
+ const parseUrl = (href) => {
12
+ try {
13
+ return new URL(href, origin);
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ };
19
+ const toRoute = (href) => {
20
+ const url = parseUrl(href);
21
+ if (url?.origin !== origin) {
22
+ return undefined;
23
+ }
24
+ return isSkippedSweepRoute(url.pathname) || STATIC_ASSET.test(url.pathname) ? undefined : url.pathname;
25
+ };
26
+ // Read through the CSSOM, so a breakpoint in any stylesheet the page loaded counts, nested at-rules
27
+ // included. A stylesheet from another origin cannot be read and has already been blocked anyway.
28
+ const pageFactsInPage = (controls) => {
29
+ const rulesOf = (sheet) => {
30
+ try {
31
+ return Array.from(sheet.cssRules ?? []).flatMap((rule) => [rule, ...rulesOf(rule)]);
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ };
37
+ const rules = Array.from(document.styleSheets).flatMap((sheet) => rulesOf(sheet));
38
+ // A media rule moves this page only when a rule inside it styles an element here. A stylesheet
39
+ // shipping every breakpoint of a utility framework would otherwise add edges no element responds
40
+ // to. State and pseudo-element parts are removed before matching, which can only widen the match.
41
+ const isStyling = (rule) => {
42
+ const selector = (rule.selectorText ?? '').replaceAll(/(?<!\\)::?[a-z-]+(?:\([^)]*\))?/giu, '').trim();
43
+ if (rule.selectorText === undefined) {
44
+ return false;
45
+ }
46
+ try {
47
+ return document.querySelector(selector === '' ? '*' : selector) !== null;
48
+ }
49
+ catch {
50
+ return true;
51
+ }
52
+ };
53
+ const mediaRules = rules.filter((rule) => rule.media !== undefined);
54
+ const mediaTexts = mediaRules
55
+ .filter((rule) => rulesOf(rule).some((inner) => isStyling(inner)))
56
+ .flatMap((rule) => [rule.media?.mediaText ?? '']);
57
+ return {
58
+ mediaTexts: [...new Set(mediaTexts)],
59
+ canonical: document.querySelector('link[rel="canonical"]')?.getAttribute('href') ?? '',
60
+ hasDarkMedia: mediaRules.some((rule) => (rule.media?.mediaText ?? '').includes('prefers-color-scheme')),
61
+ controls: document.querySelectorAll(controls).length,
62
+ hrefs: Array.from(document.querySelectorAll('a[href]'), (anchor) => anchor.getAttribute('href') ?? ''),
63
+ alternates: Array.from(document.querySelectorAll('link[rel="alternate"][hreflang]'), (link) => ({
64
+ hreflang: link.getAttribute('hreflang') ?? '',
65
+ href: link.getAttribute('href') ?? '',
66
+ })),
67
+ };
68
+ };
69
+ const enqueue = (state, hrefs, from) => hrefs.reduce((current, href) => {
70
+ const route = toRoute(href);
71
+ if (route === undefined || current.seen.has(route) || current.dropped.has(route)) {
72
+ return current;
73
+ }
74
+ return current.seen.size >= MAX_SWEEP_ROUTES
75
+ ? { ...current, dropped: new Set([...current.dropped, route]) }
76
+ : {
77
+ ...current,
78
+ seen: new Set([...current.seen, route]),
79
+ queue: [...current.queue, { route, from }],
80
+ };
81
+ }, state);
82
+ const linkFinding = (queued, page, reason) => findingAt({ location: queued.from, state: 'discovery', engine: engineOf(page), viewport: undefined }, BROKEN_LINK_RULE, `link to ${queued.route} ${reason}`);
83
+ const htmlHeaderFindings = (response, route, page) => response.headers()['content-type']?.includes('text/html') === true
84
+ ? securityHeaderProblems(response.headers()).map((problem) => findingAt({ location: route, state: 'discovery', engine: engineOf(page), viewport: undefined }, 'security-headers', problem))
85
+ : [];
86
+ const visited = async (page, url) => {
87
+ try {
88
+ return await page.goto(url);
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ };
94
+ const crawl = async (page, state) => {
95
+ const [queued, ...rest] = state.queue;
96
+ if (queued === undefined) {
97
+ return state;
98
+ }
99
+ const next = { ...state, queue: rest };
100
+ const response = await visited(page, `${origin}${queued.route}`);
101
+ if (response?.ok() !== true) {
102
+ const reason = response === null ? 'did not answer' : `answered ${String(response.status())}`;
103
+ return await crawl(page, queued.route === SEED_ROUTE ? next : { ...next, findings: [...next.findings, linkFinding(queued, page, reason)] });
104
+ }
105
+ const answered = { ...next, answered: new Set([...next.answered, queued.route]) };
106
+ if (toRoute(page.url()) === undefined) {
107
+ return await crawl(page, answered);
108
+ }
109
+ await settleForScan(page);
110
+ const facts = await page.evaluate(pageFactsInPage, CONTROLS);
111
+ const location = {
112
+ location: queued.route,
113
+ url: `${origin}${queued.route}`,
114
+ isStory: false,
115
+ edges: breakpointEdges(facts.mediaTexts),
116
+ hasDarkMedia: facts.hasDarkMedia,
117
+ controls: facts.controls,
118
+ };
119
+ return await crawl(page, enqueue({
120
+ ...answered,
121
+ reachable: [...answered.reachable, location],
122
+ findings: [...answered.findings, ...htmlHeaderFindings(response, queued.route, page)],
123
+ }, [...facts.hrefs, ...alternateHrefs(facts.alternates)].flatMap((href) => {
124
+ const address = localAddress(href, page.url(), facts.canonical, origin);
125
+ return address === undefined ? [] : [address];
126
+ }), queued.route));
127
+ };
128
+ const MAX_SITEMAPS = 50;
129
+ const fetched = async (page, url) => {
130
+ try {
131
+ return await page.request.get(url);
132
+ }
133
+ catch {
134
+ return undefined;
135
+ }
136
+ };
137
+ const NO_ENTRIES = { pages: [], sitemaps: [] };
138
+ const sitemapAt = async (page, url, read) => {
139
+ if (read >= MAX_SITEMAPS || parseUrl(url)?.origin !== origin) {
140
+ return NO_ENTRIES;
141
+ }
142
+ const response = await fetched(page, url);
143
+ return response?.ok() === true ? sitemapEntries(await response.text()) : NO_ENTRIES;
144
+ };
145
+ const sitemapPages = async (page, urls, read = 0) => {
146
+ const [url, ...rest] = urls;
147
+ if (url === undefined) {
148
+ return [];
149
+ }
150
+ const entries = await sitemapAt(page, url, read);
151
+ const local = (locations) => locations.flatMap((location) => {
152
+ const address = onOrigin(location, origin);
153
+ return address === undefined ? [] : [address];
154
+ });
155
+ return [...local(entries.pages), ...(await sitemapPages(page, [...rest, ...local(entries.sitemaps)], read + 1))];
156
+ };
157
+ const storiesOf = async (page) => {
158
+ const lists = await Promise.all(projectSettings.auxiliaryServers.map(async (server) => {
159
+ const serverOrigin = new URL(server.url).origin;
160
+ const response = await fetched(page, `${serverOrigin}/index.json`);
161
+ if (response?.ok() !== true) {
162
+ return [];
163
+ }
164
+ try {
165
+ return storiesOfIndex(await response.json(), serverOrigin) ?? [];
166
+ }
167
+ catch {
168
+ return [];
169
+ }
170
+ }));
171
+ return lists.flat();
172
+ };
173
+ const readStoryLocation = async (page, story) => {
174
+ const location = {
175
+ location: storyLocation(story),
176
+ url: storyUrl(story),
177
+ isStory: true,
178
+ edges: [],
179
+ hasDarkMedia: false,
180
+ controls: 0,
181
+ };
182
+ await loadLocation(page, location, DESKTOP, placeAt(page, location, undefined, 'discovery'));
183
+ await settleForScan(page);
184
+ const facts = await page.evaluate(pageFactsInPage, CONTROLS);
185
+ return {
186
+ ...location,
187
+ edges: breakpointEdges(facts.mediaTexts),
188
+ hasDarkMedia: facts.hasDarkMedia,
189
+ controls: facts.controls,
190
+ };
191
+ };
192
+ // Each story is read on a page of its own, so a story's state cannot reach the next one.
193
+ const storyLocationOf = async (page, story) => {
194
+ const storyPage = await page.context().newPage();
195
+ try {
196
+ await preparePage(storyPage);
197
+ return await readStoryLocation(storyPage, story);
198
+ }
199
+ finally {
200
+ await storyPage.close();
201
+ }
202
+ };
203
+ // Stories are read this many at a time. Each read is one load, independent of the others; the route
204
+ // crawl stays sequential, because the routes it visits next depend on the links it has read.
205
+ const STORY_CONCURRENCY = 4;
206
+ const storyLocations = async (page, stories) => {
207
+ if (stories.length === 0) {
208
+ return [];
209
+ }
210
+ const batch = await Promise.all(stories
211
+ .slice(0, STORY_CONCURRENCY)
212
+ .map(async (story) => await storyLocationOf(page, story)));
213
+ return [...batch, ...(await storyLocations(page, stories.slice(STORY_CONCURRENCY)))];
214
+ };
215
+ // The seed route first, then every page the sitemaps list.
216
+ const crawlStart = (fromSitemap) => enqueue({
217
+ queue: [{ route: SEED_ROUTE, from: SEED_ROUTE }],
218
+ seen: new Set([SEED_ROUTE]),
219
+ dropped: new Set(),
220
+ answered: new Set(),
221
+ reachable: [],
222
+ findings: [],
223
+ }, fromSitemap, 'sitemap.xml');
224
+ const wasRecorded = (file, value) => {
225
+ try {
226
+ writeJson(file, value);
227
+ return true;
228
+ }
229
+ catch {
230
+ return false;
231
+ }
232
+ };
233
+ const problemsOf = (crawled, routes) => [
234
+ ...(crawled.answered.has(SEED_ROUTE) ? [] : [`the crawl could not start: ${SEED_ROUTE} did not answer`]),
235
+ ...(crawled.dropped.size === 0
236
+ ? []
237
+ : [
238
+ `the sweep reached the ${String(MAX_SWEEP_ROUTES)}-route cap; raise the harness limit only after ` +
239
+ 'measuring the resulting run time',
240
+ ]),
241
+ ...unsweptRoutes(routes, [...crawled.answered]).map((unswept) => `a page this project declares that nothing scans: ${unswept}`),
242
+ ];
243
+ // A scope that cannot be read is a problem the summary fails on, and the sweep covers everything.
244
+ const namedScope = () => {
245
+ const file = process.env[SWEEP_SCOPE_ENVIRONMENT_VARIABLE];
246
+ if (file === undefined) {
247
+ return { scope: undefined, problem: undefined };
248
+ }
249
+ const scope = readJson(file, isSweepScope);
250
+ return {
251
+ scope,
252
+ problem: scope === undefined ? `the change scope ${file} could not be read, so the sweep covered everything` : undefined,
253
+ };
254
+ };
255
+ const chosen = (items, reasonOf) => items.flatMap((item) => {
256
+ const reason = reasonOf(item);
257
+ return reason === undefined ? [] : [{ item, reason }];
258
+ });
259
+ // The directory a story's Storybook runs in, relative to this application, which its import path is
260
+ // relative to.
261
+ const storyDirectory = (story) => projectSettings.auxiliaryServers.find((server) => new URL(server.url).origin === story.server)?.cwd ?? '.';
262
+ const storyFile = (story) => story.importPath === '' ? '' : storyFileOf(story.importPath, storyDirectory(story));
263
+ const scopeRecordOf = (scope, finds) => {
264
+ if (scope === undefined) {
265
+ return { isScoped: false, lines: ['complete: no change scope was given, so every route and story is swept'] };
266
+ }
267
+ const changed = scope.changed.map((file) => ` changed ${file}`);
268
+ if (scope.isComplete) {
269
+ return { isScoped: false, lines: [scopeHeadline(scope), ...changed, ' swept every route and story'] };
270
+ }
271
+ const unreached = ` not swept: ${String(finds.everyRoute - finds.routes.length)} of ${String(finds.everyRoute)} routes and ` +
272
+ `${String(finds.everyStory - finds.stories.length)} of ${String(finds.everyStory)} stories, which the change ` +
273
+ 'does not reach';
274
+ return {
275
+ isScoped: true,
276
+ lines: [
277
+ scopeHeadline(scope),
278
+ ...changed,
279
+ ...finds.routes.map((route) => ` swept ${route.item.location}: ${route.reason}`),
280
+ ...finds.stories.map((story) => ` swept ${storyLocation(story.item)}: ${story.reason}`),
281
+ unreached,
282
+ ],
283
+ };
284
+ };
285
+ /**
286
+ * Discover every page the sweep scans, and record it with whatever made the discovery incomplete.
287
+ *
288
+ * Routes come from a link crawl from `/`, every same-origin `hreflang` alternate, and `sitemap.xml`;
289
+ * stories from each auxiliary server that answers `/index.json`; breakpoints and colour schemes from
290
+ * each page's stylesheets. A crawled internal link that does not answer is a broken link. Under a
291
+ * `delta` run's change scope the crawl still reaches and checks every route, and the passes are handed
292
+ * only the routes and stories the change reaches, each with the reason it is swept. Every pass depends
293
+ * on this test, so it fails only when it could not write its record; the summary judges the findings
294
+ * and problems it recorded.
295
+ * @param page the test's page.
296
+ */
297
+ export const expectDiscoveredSite = async (page) => {
298
+ const budget = armBudget(page, 'discovery', WHOLE_PASS, MAX_SWEEP_ROUTES);
299
+ await preparePage(page);
300
+ const { scope, problem } = namedScope();
301
+ const declared = declaredRoutes();
302
+ const fromSitemap = await sitemapPages(page, [`${origin}/sitemap.xml`]);
303
+ const crawled = await crawl(page, crawlStart(fromSitemap));
304
+ const everyStory = await storiesOf(page);
305
+ const finds = {
306
+ routes: chosen(crawled.reachable, (location) => scope === undefined ? '' : routeReason(scope, declared, location.location)),
307
+ stories: chosen(everyStory, (story) => scope === undefined ? '' : storyReason(scope, storyFile(story))),
308
+ everyRoute: crawled.reachable.length,
309
+ everyStory: everyStory.length,
310
+ };
311
+ const routes = finds.routes.map((route) => route.item.location);
312
+ const stories = finds.stories.map((story) => story.item);
313
+ const discovery = {
314
+ routes,
315
+ stories,
316
+ locations: [
317
+ ...finds.routes.map((route) => route.item),
318
+ ...(await storyLocations(page, stories)),
319
+ ],
320
+ samples: templateSamples(routes, declared),
321
+ };
322
+ const report = {
323
+ findings: crawled.findings,
324
+ problems: [
325
+ ...problemsOf(crawled, crawled.reachable.map((location) => location.location)),
326
+ ...(problem === undefined ? [] : [problem]),
327
+ ],
328
+ places: crawled.answered.size + stories.length,
329
+ locations: discovery.locations.map((location) => location.location),
330
+ elapsedMs: Math.round(performance.now() - budget.startedAt),
331
+ scope: scopeRecordOf(scope, finds),
332
+ };
333
+ const isRecorded = wasRecorded(discoveryReportFile(test.info()), report) && wasRecorded(discoveryFile(test.info()), discovery);
334
+ expect(isRecorded, 'discovery could not write its record to the test output directory').toBe(true);
335
+ };
336
+ //# sourceMappingURL=sweep-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sweep-discovery.js","sourceRoot":"","sources":["../src/sweep-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type Page } from '@playwright/test';
2
+ import { type BrowserFinding } from '@ploaness/governance';
3
+ import { type TargetFacts } from './layout.js';
4
+ import { type Shard, type Visit } from './sweep-shared.js';
5
+ /**
6
+ * A finding on a driven element, judged against the exemptions above it.
7
+ * @param finding the finding.
8
+ * @param facts the element and the exemptions above it.
9
+ * @returns the visit carrying the finding, or the exemption that excused it.
10
+ */
11
+ export declare const carried: (finding: BrowserFinding, facts: TargetFacts | undefined) => Visit;
12
+ /**
13
+ * Drive every control of one shard of the locations into hover and keyboard focus, and judge contrast,
14
+ * reach and focus visibility.
15
+ * @param page the test's page.
16
+ * @param shard the part of the pass this test visits.
17
+ */
18
+ export declare const expectInteractionStates: (page: Page, shard: Shard) => Promise<void>;
19
+ //# sourceMappingURL=sweep-interaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sweep-interaction.d.ts","sourceRoot":"","sources":["../src/sweep-interaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,IAAI,EAAQ,MAAM,kBAAkB,CAAA;AAChE,OAAO,EACL,KAAK,cAAc,EAmBpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,aAAa,CAAA;AAG3D,OAAO,EA0BL,KAAK,KAAK,EAKV,KAAK,KAAK,EAEX,MAAM,mBAAmB,CAAA;AA6C1B;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAAI,SAAS,cAAc,EAAE,OAAO,WAAW,GAAG,SAAS,KAAG,KAQjF,CAAA;AAiaD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAAU,MAAM,IAAI,EAAE,OAAO,KAAK,KAAG,OAAO,CAAC,IAAI,CA8BpF,CAAA"}