@ploaness/config 1.0.0 → 1.2.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/biome-core.json CHANGED
@@ -62,7 +62,7 @@
62
62
  "kind": "objectLiteralProperty"
63
63
  },
64
64
  "match": "_*(.+)",
65
- "formats": ["camelCase", "CONSTANT_CASE", "PascalCase"]
65
+ "formats": ["camelCase", "CONSTANT_CASE", "PascalCase", "snake_case"]
66
66
  },
67
67
  {
68
68
  "selector": {
@@ -93,7 +93,8 @@
93
93
  },
94
94
  "performance": {
95
95
  "noBarrelFile": "off",
96
- "noJsxPropsBind": "off"
96
+ "noJsxPropsBind": "off",
97
+ "noAccumulatingSpread": "off"
97
98
  },
98
99
  "suspicious": {
99
100
  "noDoubleEquals": "error",
package/dist/a11y.d.ts CHANGED
@@ -1,3 +1,27 @@
1
+ export type { HitTargetClassification, HitTargetProbe, HitTargetVerdict, } from '@ploaness/governance';
2
+ export { classifyHitTarget, findDefiniteIncomplete } from '@ploaness/governance';
3
+ import type { Page } from '@playwright/test';
1
4
  export declare const SKIPPED_ROUTE_PREFIXES: readonly string[];
2
5
  export declare const MAX_SWEEP_ROUTES: number;
6
+ /**
7
+ * Wait for a page to finish rendering, before anything measures it.
8
+ *
9
+ * Call it after a navigation, and after a state change a scan is about to judge. A still document
10
+ * costs two animation frames; one that is animating costs however long its animations have left; a
11
+ * document that never stops changing costs the budget and no more, so a page nobody can settle slows
12
+ * the sweep rather than hanging it.
13
+ * @param page the page about to be scanned, left on whatever route it holds.
14
+ * @returns nothing. It resolves whether the page settled or the budget ran out.
15
+ */
16
+ export declare const settleForScan: (page: Page) => Promise<void>;
17
+ /**
18
+ * The pages this project declares that the sweep did not cover, each with what to do about it.
19
+ *
20
+ * Answers with nothing when the member declares no application routes at all, which is the honest
21
+ * result for a package that has no app directory rather than a claim that its pages are covered.
22
+ * @param visitedRoutes the addresses the crawl reached and scanned.
23
+ * @param answeredRoutes the addresses that answered, forwarding ones included.
24
+ * @returns one sentence per uncovered page, ready to be shown as a failure.
25
+ */
26
+ export declare const unsweptRoutes: (visitedRoutes: readonly string[], answeredRoutes: readonly string[]) => readonly string[];
3
27
  //# sourceMappingURL=a11y.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../src/a11y.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAA4C,CAAA;AAEhG,eAAO,MAAM,gBAAgB,EAAE,MAAiD,CAAA"}
1
+ {"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../src/a11y.ts"],"names":[],"mappings":"AAkBA,YAAY,EACV,uBAAuB,EACvB,cAAc,EACd,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAIhF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAW5C,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAA4C,CAAA;AAEhG,eAAO,MAAM,gBAAgB,EAAE,MAAiD,CAAA;AA8IhF;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,GAAU,MAAM,IAAI,KAAG,OAAO,CAAC,IAAI,CAU5D,CAAA;AAyDD;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GACxB,eAAe,SAAS,MAAM,EAAE,EAChC,gBAAgB,SAAS,MAAM,EAAE,KAChC,SAAS,MAAM,EAgBjB,CAAA"}
package/dist/a11y.js CHANGED
@@ -1,9 +1,228 @@
1
- // The two facts the shipped accessibility sweep cannot know about the project it runs in.
1
+ // What the shipped accessibility sweep cannot know about the project it runs in, and the two decisions
2
+ // it must not make for itself.
2
3
  //
3
- // The sweep itself is a managed file, byte-identical in every consumer, so this module is the whole of
4
- // its configuration surface. Both entries are one-directional: a project may add a route prefix the
5
- // crawl must not follow and may lower the route ceiling, and can do neither in the other direction.
4
+ // The sweep is a managed file, byte-identical in every consumer, so this module is the whole of its
5
+ // configuration surface. The first two entries are one-directional: a project may add a route prefix
6
+ // the crawl must not follow and may lower the route ceiling, and can do neither in the other
7
+ // direction.
8
+ //
9
+ // The last two are not configuration at all. They are rules, so they live in `@ploaness/governance`
10
+ // where a spec exercises them against captured axe output and against probe shapes no browser has to
11
+ // produce on demand, and they are re-exported here because the sweep imports through one entry point.
12
+ //
13
+ // `settleForScan` is a third kind again: neither a setting nor a rule, but the one piece of I/O the
14
+ // sweep cannot do without and cannot keep to itself. It is here rather than in `@ploaness/governance`
15
+ // because that package forbids I/O, and here rather than inside the sweep because a project has to
16
+ // write its own scans for the pages the crawl cannot discover - an unlinked page, a custom admin view -
17
+ // and two definitions of "the page is ready" would drift.
18
+ export { classifyHitTarget, findDefiniteIncomplete } from '@ploaness/governance';
19
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
20
+ import path from 'node:path';
21
+ import { appRootOf, declaredRoutesOf, findUnsweptRoutes, } from '@ploaness/governance';
6
22
  import { projectSettings } from './project-settings.js';
7
23
  export const SKIPPED_ROUTE_PREFIXES = projectSettings.accessibilitySkipRoutes;
8
24
  export const MAX_SWEEP_ROUTES = projectSettings.accessibilityRouteBudget;
25
+ // Why a scan needs a wait at all: `page.goto` resolves at the `load` event, and a React application
26
+ // hydrates after that. axe measured in between reads a tree still being assembled - a heading whose
27
+ // level has not resolved lands in `incomplete`, which a consuming project saw on one run in three -
28
+ // and reads contrast against text the final font has not laid out yet.
29
+ //
30
+ // WHAT IT WAITS FOR, in this order: the document's font set has answered; the element count has held
31
+ // steady across two consecutive animation frames; every animation that will ever end has ended; and
32
+ // the count has held steady once more. Fonts first, because contrast is measured on rendered pixels
33
+ // and a face that arrives late reflows the text being judged. The count before the animations rather
34
+ // than after, for the reason written beside it - an animation cannot be waited for until something has
35
+ // created it, and on a hydrating page the mount is what creates it. Two frames rather than one,
36
+ // because React yields between hydration segments and a
37
+ // yield that happens to straddle a frame boundary is indistinguishable from a finished render if only
38
+ // one frame is asked. A fixed count of frames was the first draft and was wrong in the direction that
39
+ // matters: it settles the pages that were never the problem and gives up on a heavy panel exactly
40
+ // where the defect lives.
41
+ //
42
+ // WHY ANIMATIONS ARE PART OF IT. An element count cannot see an opacity. A page that fades its content
43
+ // in changes no element while it does so, so the count was steady two frames after hydration and a
44
+ // scan then measured a half-transparent paragraph - and axe blends a partial opacity toward the
45
+ // background exactly as an eye does, so it reported a contrast this page never actually renders at
46
+ // rest. That is the harmless direction. The other one is why this is a correctness fix rather than a
47
+ // convenience: text animating TOWARDS a colour too pale to read was measured at its opening frame and
48
+ // PASSED, so the sweep built to catch contrast defects returned green on a page whose resting state is
49
+ // a defect. Waiting for the animations to end measures the state a reader is left looking at.
50
+ //
51
+ // An animation that never ends is excluded rather than waited on, and the distinction is the whole
52
+ // reason this does not simply cost the budget. A spinner has no resting state to wait for, so awaiting
53
+ // it would spend the ceiling below on every settle of every control of every route, in exchange for
54
+ // nothing. `finished` never resolves for one, which is a hang the ceiling would absorb silently. The
55
+ // test for it is `iterations`, which a spinner reports as `Infinity`; a paused or already-finished
56
+ // animation is excluded too, because it is showing the frame a reader is looking at right now.
57
+ //
58
+ // A cancelled animation REJECTS `finished` rather than resolving, and that rejection is swallowed. A
59
+ // cancellation is a state change like any other and the element-count check notices it; ending the
60
+ // whole settle over one cancelled transition would report nothing useful about the page.
61
+ //
62
+ // The two callbacks below are written inline rather than named, which is not a style preference: a
63
+ // named helper closing over nothing is one the shipped rules ask to be hoisted to the outer scope, and
64
+ // the outer scope is the one place this function may not reach.
65
+ //
66
+ // WHY NOT `networkidle`. Playwright's own documentation discourages it; it throws on expiry rather
67
+ // than resolving; and it answers a different question. A page can be network-idle and mid-hydration.
68
+ // It is also unusable here in particular: the sweep runs against `next dev`, whose every page holds a
69
+ // hot-reload socket open, so no page it ever visits goes idle.
70
+ //
71
+ // WHY THE CEILING IS A TIMER. `requestAnimationFrame` does not fire in a page the browser has
72
+ // backgrounded, so a frame-counted ceiling is not a ceiling. A throttled background timer still fires.
73
+ // The race is inside the page for the same reason the hit-target probe does its work in one
74
+ // `evaluate`: a Node-side race would leave the in-page promise pending against a context the next
75
+ // navigation destroys.
76
+ const SETTLE_BUDGET_MS = 1000;
77
+ // Everything this function needs is inside it. Playwright ships a page function to the browser as its
78
+ // own source text, so a reference to anything at module scope here would be a ReferenceError in the
79
+ // page rather than a compile error in this file - the one mistake this shape cannot be checked for.
80
+ // It is also why the animation wait below is written inline rather than as a helper of its own.
81
+ const settleInPage = async (budgetMs) => {
82
+ const quietFrames = 2;
83
+ // Recursive rather than a loop over a counter, because there is no mutable binding to count with:
84
+ // this repository bans `let` and in-place mutation in its own source as well as in a consumer's. Each
85
+ // step awaits a frame, so what grows is frames rather than stack - an awaited recursion returns to
86
+ // the microtask queue every time. The frame is awaited inline because this is its only caller.
87
+ const stable = async (previous, remaining) => {
88
+ await new Promise((resolve) => {
89
+ requestAnimationFrame(() => {
90
+ resolve();
91
+ });
92
+ });
93
+ const current = document.querySelectorAll('*').length;
94
+ if (current !== previous) {
95
+ await stable(current, quietFrames);
96
+ return;
97
+ }
98
+ if (remaining > 1) {
99
+ await stable(current, remaining - 1);
100
+ }
101
+ };
102
+ const settled = async () => {
103
+ // The optional call covers a document carrying no font set at all, which must skip the wait
104
+ // rather than fail the settle.
105
+ await document.fonts?.ready;
106
+ // The element count FIRST, and this order is the whole of it. An animation does not exist until
107
+ // something creates it, and on a hydrating page that something is the mount: measured before the
108
+ // framework has mounted, `getAnimations` answers an honest empty list, and a settle that believed
109
+ // it would scan the very frame the animation is about to start from. Waiting for the tree to stop
110
+ // changing is waiting for the mount, which is what puts the animations on the page to be found.
111
+ await stable(document.querySelectorAll('*').length, quietFrames);
112
+ await Promise.all((document.getAnimations?.() ?? [])
113
+ .filter((animation) => animation.playState === 'running' &&
114
+ animation.effect !== null &&
115
+ Number.isFinite(animation.effect.getComputedTiming().iterations))
116
+ .map(async (animation) => {
117
+ try {
118
+ await animation.finished;
119
+ }
120
+ catch {
121
+ // A cancelled animation rejects rather than resolving. The cancellation is a state change
122
+ // like any other and the count below is what notices it.
123
+ }
124
+ }));
125
+ // And again afterwards, because an animation that ends by revealing a panel adds elements as it
126
+ // finishes. This pass costs two frames on a page where nothing moved.
127
+ await stable(document.querySelectorAll('*').length, quietFrames);
128
+ };
129
+ const deadline = async () => {
130
+ await new Promise((resolve) => {
131
+ setTimeout(() => {
132
+ resolve();
133
+ }, budgetMs);
134
+ });
135
+ };
136
+ await Promise.race([settled(), deadline()]);
137
+ };
138
+ /**
139
+ * Wait for a page to finish rendering, before anything measures it.
140
+ *
141
+ * Call it after a navigation, and after a state change a scan is about to judge. A still document
142
+ * costs two animation frames; one that is animating costs however long its animations have left; a
143
+ * document that never stops changing costs the budget and no more, so a page nobody can settle slows
144
+ * the sweep rather than hanging it.
145
+ * @param page the page about to be scanned, left on whatever route it holds.
146
+ * @returns nothing. It resolves whether the page settled or the budget ran out.
147
+ */
148
+ export const settleForScan = async (page) => {
149
+ try {
150
+ await page.evaluate(settleInPage, SETTLE_BUDGET_MS);
151
+ }
152
+ catch {
153
+ // A route that redirects on mount destroys the execution context while this is in flight, and a
154
+ // closed page cannot be asked anything. Neither is an accessibility finding, and neither should end
155
+ // a sweep: the scan that follows then runs on whatever the page holds, which is what every call
156
+ // site did before this function existed. A page that is genuinely broken still fails at `analyze`,
157
+ // with an axe result to read rather than a protocol error naming no route.
158
+ }
159
+ };
160
+ // What the sweep cannot work out from inside the browser: which pages this project declares.
161
+ //
162
+ // The crawl knows what it reached. Only the file tree knows what exists, so the completeness check
163
+ // needs both, and reading the tree is I/O - which is why the walk is here and every DECISION it feeds
164
+ // is in `@ploaness/governance`, where a coverage floor measures it. What follows is a directory walk
165
+ // and two file reads; which file is a route file, and what address it answers at, are not decided
166
+ // here.
167
+ //
168
+ // This is a function rather than the module-scope constants above it, and that is load-bearing.
169
+ // `ploaness/a11y` is imported by a project's own specs too - that is why `settleForScan` lives here -
170
+ // and a recursive walk evaluated at import time would run once per spec module, in every worker.
171
+ // Where a project's own code can be. Walking from the member root would descend into `node_modules`
172
+ // and `.next`, which are large, and into `dist`, which holds a compiled copy of the same routes.
173
+ const WALKED_ROOTS = ['src', 'app', 'tests'];
174
+ // The extensions a route file or a specification can have. Filtering here rather than in the rule
175
+ // keeps the corpus small; the rule still decides what a `page.tsx` means.
176
+ const READ_EXTENSIONS = ['.ts', '.tsx', '.jsx', '.js', '.mdx'];
177
+ /** Where a project's specifications live, which is a ploaness convention rather than a setting. */
178
+ const SPEC_ROOT = 'tests/';
179
+ const filesUnder = (root, relative) => {
180
+ const entries = readdirSync(path.join(root, relative), {
181
+ withFileTypes: true,
182
+ });
183
+ return entries.flatMap((entry) => {
184
+ // Forward slashes throughout, because the rules receive these paths as addresses-in-waiting and a
185
+ // backslash from a Windows walk would split into segments nothing matches.
186
+ const child = relative === '' ? entry.name : `${relative}/${entry.name}`;
187
+ if (entry.isDirectory()) {
188
+ return filesUnder(root, child);
189
+ }
190
+ return READ_EXTENSIONS.some((extension) => child.endsWith(extension))
191
+ ? [child]
192
+ : [];
193
+ });
194
+ };
195
+ const projectFiles = (root) => WALKED_ROOTS.flatMap((walked) => existsSync(path.join(root, walked)) ? filesUnder(root, walked) : []);
196
+ const readSpecs = (root, paths) => paths
197
+ .filter((file) => file.startsWith(SPEC_ROOT))
198
+ .map((file) => ({
199
+ path: file,
200
+ source: readFileSync(path.join(root, file), 'utf8'),
201
+ }));
202
+ /**
203
+ * The pages this project declares that the sweep did not cover, each with what to do about it.
204
+ *
205
+ * Answers with nothing when the member declares no application routes at all, which is the honest
206
+ * result for a package that has no app directory rather than a claim that its pages are covered.
207
+ * @param visitedRoutes the addresses the crawl reached and scanned.
208
+ * @param answeredRoutes the addresses that answered, forwarding ones included.
209
+ * @returns one sentence per uncovered page, ready to be shown as a failure.
210
+ */
211
+ export const unsweptRoutes = (visitedRoutes, answeredRoutes) => {
212
+ const root = process.cwd();
213
+ const paths = projectFiles(root);
214
+ const appRoot = appRootOf(paths);
215
+ if (appRoot === undefined) {
216
+ return [];
217
+ }
218
+ const specs = readSpecs(root, paths);
219
+ return findUnsweptRoutes({
220
+ declaredRoutes: declaredRoutesOf(paths, appRoot),
221
+ visitedRoutes,
222
+ answeredRoutes,
223
+ skippedPrefixes: SKIPPED_ROUTE_PREFIXES,
224
+ specs,
225
+ everyFile: specs,
226
+ }).map((unswept) => `${unswept.file} [${unswept.rule}] ${unswept.reason}`);
227
+ };
9
228
  //# sourceMappingURL=a11y.js.map
package/dist/a11y.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"a11y.js","sourceRoot":"","sources":["../src/a11y.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,EAAE;AACF,uGAAuG;AACvG,oGAAoG;AACpG,oGAAoG;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,MAAM,CAAC,MAAM,sBAAsB,GAAsB,eAAe,CAAC,uBAAuB,CAAA;AAEhG,MAAM,CAAC,MAAM,gBAAgB,GAAW,eAAe,CAAC,wBAAwB,CAAA"}
1
+ {"version":3,"file":"a11y.js","sourceRoot":"","sources":["../src/a11y.ts"],"names":[],"mappings":"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"}
package/dist/access.d.ts CHANGED
@@ -1,4 +1,18 @@
1
- import type { PublicAccess } from '@ploaness/governance';
2
- export { type AccessReport, undeclaredGrants } from '@ploaness/governance';
1
+ import { type DatalessFields, type PublicAccess } from '@ploaness/governance';
2
+ export { type AccessReport, type DatalessFields, staleDeclarations, undeclaredGrants, } from '@ploaness/governance';
3
3
  export declare const PUBLIC_ACCESS: readonly PublicAccess[];
4
+ /**
5
+ * Every field path the project's Payload configuration reports but stores nothing behind.
6
+ *
7
+ * Resolved from the working directory, which in the Playwright worker is the project root: the
8
+ * `@payload-config` alias in the project tsconfig names the file, and the environment the configuration
9
+ * validates at module scope has already been loaded by the shipped Playwright config.
10
+ *
11
+ * A configuration that cannot be read or imported yields nothing, which judges every reported path and
12
+ * so errs on the side of more findings rather than fewer - the sweep is a security boundary, and a
13
+ * failure here must never quietly widen it. It is also not this sweep's report to make: `payload-defaults`
14
+ * boots the same configuration and names an unbuildable one far better than a browser test could.
15
+ * @returns the dataless paths of each entity that has any, keyed by slug; empty when unreadable.
16
+ */
17
+ export declare const datalessFields: () => Promise<DatalessFields>;
4
18
  //# sourceMappingURL=access.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGxD,OAAO,EAAE,KAAK,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE1E,eAAO,MAAM,aAAa,EAAE,SAAS,YAAY,EAAiC,CAAA"}
1
+ {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,YAAY,EAIlB,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAE7B,eAAO,MAAM,aAAa,EAAE,SAAS,YAAY,EAAiC,CAAA;AAElF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,cAAc,CAa7D,CAAA"}
package/dist/access.js CHANGED
@@ -1,4 +1,52 @@
1
+ // The one fact the shipped access-boundary sweep cannot know about the project it runs in, and the
2
+ // decision it makes about what the running application answered.
3
+ //
4
+ // The sweep itself is a managed file, byte-identical in every consumer, so this module is the whole of
5
+ // its configuration surface. It cannot loosen the sweep in the way an exclusion loosens a gate: every
6
+ // entry names one permission the project grants on purpose and says why, and the sweep still reports
7
+ // every other anonymous permission it finds. A project that declares nothing is judged most strictly.
8
+ //
9
+ // The verdict travels with the setting because the sweep is a spec no unit test can reach: what it does
10
+ // with Payload's answer is decided in `access-boundary.ts` and re-exported here, leaving the spec
11
+ // holding the HTTP call and the assertion.
12
+ //
13
+ // The other fact the sweep needs is which reported fields hold no data. `/api/access` cannot say: a
14
+ // `type: 'ui'` field is reported exactly as a real column is, and no rule can be written against one.
15
+ // Only the BUILT configuration can tell them apart, so it is imported here - the same way the
16
+ // `payload-defaults` probe imports it, and for the same reason, that the configuration Payload boots is
17
+ // the only place the answer exists. Reading it is filesystem work, which is why it sits in this package
18
+ // rather than in the dependency-free judging layer.
19
+ import { readFileSync } from 'node:fs';
20
+ import path from 'node:path';
21
+ import { pathToFileURL } from 'node:url';
22
+ import { datalessFieldsIn, parseJsonc, payloadConfigPathOf, readKey, } from '@ploaness/governance';
1
23
  import { projectSettings } from './project-settings.js';
2
- export { undeclaredGrants } from '@ploaness/governance';
24
+ export { staleDeclarations, undeclaredGrants, } from '@ploaness/governance';
3
25
  export const PUBLIC_ACCESS = projectSettings.publicAccess;
26
+ /**
27
+ * Every field path the project's Payload configuration reports but stores nothing behind.
28
+ *
29
+ * Resolved from the working directory, which in the Playwright worker is the project root: the
30
+ * `@payload-config` alias in the project tsconfig names the file, and the environment the configuration
31
+ * validates at module scope has already been loaded by the shipped Playwright config.
32
+ *
33
+ * A configuration that cannot be read or imported yields nothing, which judges every reported path and
34
+ * so errs on the side of more findings rather than fewer - the sweep is a security boundary, and a
35
+ * failure here must never quietly widen it. It is also not this sweep's report to make: `payload-defaults`
36
+ * boots the same configuration and names an unbuildable one far better than a browser test could.
37
+ * @returns the dataless paths of each entity that has any, keyed by slug; empty when unreadable.
38
+ */
39
+ export const datalessFields = async () => {
40
+ try {
41
+ const root = process.cwd();
42
+ const tsconfig = parseJsonc(readFileSync(path.join(root, 'tsconfig.json'), 'utf8')).value;
43
+ const configFile = path.join(root, payloadConfigPathOf(tsconfig));
44
+ const configModule = await import(pathToFileURL(configFile).href);
45
+ // Awaited either way: `buildConfig` returns a promise, and a plain object is read the same.
46
+ return datalessFieldsIn(await readKey(configModule, 'default'));
47
+ }
48
+ catch {
49
+ return {};
50
+ }
51
+ };
4
52
  //# sourceMappingURL=access.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"access.js","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAAqB,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE1E,MAAM,CAAC,MAAM,aAAa,GAA4B,eAAe,CAAC,YAAY,CAAA"}
1
+ {"version":3,"file":"access.js","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,iEAAiE;AACjE,EAAE;AACF,uGAAuG;AACvG,sGAAsG;AACtG,qGAAqG;AACrG,sGAAsG;AACtG,EAAE;AACF,wGAAwG;AACxG,kGAAkG;AAClG,2CAA2C;AAC3C,EAAE;AACF,oGAAoG;AACpG,sGAAsG;AACtG,8FAA8F;AAC9F,wGAAwG;AACxG,wGAAwG;AACxG,oDAAoD;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAEL,gBAAgB,EAEhB,UAAU,EACV,mBAAmB,EACnB,OAAO,GACR,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAGL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAE7B,MAAM,CAAC,MAAM,aAAa,GAA4B,eAAe,CAAC,YAAY,CAAA;AAElF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAA6B,EAAE;IAChE,IAAI,CAAC;QACH,MAAM,IAAI,GAAW,OAAO,CAAC,GAAG,EAAE,CAAA;QAClC,MAAM,QAAQ,GAAY,UAAU,CAClC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CACvD,CAAC,KAAK,CAAA;QACP,MAAM,UAAU,GAAW,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAA;QACzE,MAAM,YAAY,GAAY,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAA;QAC1E,4FAA4F;QAC5F,OAAO,gBAAgB,CAAC,MAAM,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAA;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import type { Linter } from 'eslint';
2
2
  import { defineConfig } from 'eslint/config';
3
+ import { type RestrictedSyntax } from './eslint-security.js';
3
4
  /**
4
5
  * One flat-config block, described by its shape rather than by the plugins' own declarations.
5
6
  *
@@ -20,11 +21,6 @@ export type FlatConfigBlock = Readonly<Record<string, unknown>>;
20
21
  * because an assertion is uncovered by the type coverage measurement this repository holds at 100%.
21
22
  */
22
23
  export type RuleTable = Partial<Linter.RulesRecord>;
23
- /** One `no-restricted-syntax` entry: the shape to reject, and what to say when it appears. */
24
- export interface RestrictedSyntax {
25
- readonly selector: string;
26
- readonly message: string;
27
- }
28
24
  /**
29
25
  * A whole `no-restricted-syntax` setting: the severity first, then the shapes.
30
26
  *
@@ -64,6 +60,8 @@ declare const NO_LITERAL_ASSERTIONS: readonly RestrictedSyntax[];
64
60
  export declare const compose: typeof defineConfig;
65
61
  /** Formatting is Biome's job; this disables every conflicting stylistic rule and must stay last. */
66
62
  export declare const prettierLast: FlatConfigBlock;
63
+ /** The same layer with every rule it declares raised to `error`; a rule it turns off stays off. */
64
+ export declare const withoutWarnings: (layer: object) => FlatConfigBlock;
67
65
  /** The preset layers every ploaness-governed project runs, none of which may report at `warn`. */
68
66
  export declare const baseLayers: readonly FlatConfigBlock[];
69
67
  /**
@@ -90,11 +88,15 @@ export declare const testIntegrityRules: RuleTable;
90
88
  /**
91
89
  * The framework idiom a spec is written in, which the production rules were never aimed at.
92
90
  *
93
- * Only idiom is relaxed. Every rule that carries a rule of the governing standard - the size caps, the
94
- * explicitness rules, the ban on a non-null assertion, the unsafe-any family - stays ON, because the
95
- * standard says test code passes the same static-analysis checks as production code. A relaxation that
96
- * made a test easier to write by making it less checked would exempt the suite from the contract it
97
- * exists to enforce.
91
+ * Only idiom is relaxed. Every rule that carries a rule of the governing standard - the explicitness
92
+ * rules, the ban on a non-null assertion, the unsafe-any family, and every size cap but one - stays ON,
93
+ * because the standard says test code passes the same static-analysis checks as production code. A
94
+ * relaxation that made a test easier to write by making it less checked would exempt the suite from the
95
+ * contract it exists to enforce.
96
+ *
97
+ * The one exception is `max-lines-per-function`, and it is a role distinction rather than a relaxation:
98
+ * the cap bounds a unit of logic, and a `describe` body is a list of independent declarations. The file
99
+ * cap still applies. See the entry itself for the argument.
98
100
  *
99
101
  * Shared by every shipped config rather than stated in each, because what earns the exemption is being a
100
102
  * SPEC rather than being a Payload application's spec. Stated twice it drifted: a library consumer's
@@ -162,6 +164,16 @@ export declare const processConfigBlock: () => FlatConfigBlock;
162
164
  * catch.
163
165
  */
164
166
  export declare const specEnvironmentBlock: () => FlatConfigBlock;
167
+ /**
168
+ * The hook directories' role, which is to carry a request's state between Payload hooks.
169
+ *
170
+ * Mounted by the Payload configuration alone: a library has no request to carry state on. Built with the
171
+ * shared constructor, so the base carve-out survives the replacement a block that sets this rule
172
+ * performs, and with the plugin re-mounted, for the reason `processConfigBlock` states.
173
+ * @param files the globs the project's hooks live under.
174
+ */
175
+ export declare const hookContextBlock: (files: readonly string[]) => FlatConfigBlock;
176
+ export type { RestrictedSyntax } from './eslint-security.js';
165
177
  /** The shared selectors, re-exported so a scoped block can spread rather than restate them. */
166
178
  export { NO_FAST_CHECK_SEED, NO_INHERITANCE, NO_LITERAL_ASSERTIONS, NO_MOCK_PROPERTIES, NO_NETWORK_GUARD_ESCAPE, NO_TEST_ORDER_ESCAPE, };
167
179
  //# sourceMappingURL=eslint-core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"eslint-core.d.ts","sourceRoot":"","sources":["../src/eslint-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eslint-core.d.ts","sourceRoot":"","sources":["../src/eslint-core.ts"],"names":[],"mappings":"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"}