@proappstore/compliance 0.2.9 → 0.2.11
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 +12 -0
- package/dist/clause-map.d.ts +57 -0
- package/dist/clause-map.d.ts.map +1 -0
- package/dist/clause-map.js +108 -0
- package/dist/clause-map.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -22
- package/dist/index.js.map +1 -1
- package/dist/lib/file-source.d.ts +17 -0
- package/dist/lib/file-source.d.ts.map +1 -1
- package/dist/lib/file-source.js +62 -3
- package/dist/lib/file-source.js.map +1 -1
- package/dist/lib/gitignore.d.ts +60 -0
- package/dist/lib/gitignore.d.ts.map +1 -0
- package/dist/lib/gitignore.js +222 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/live/index.d.ts.map +1 -1
- package/dist/live/index.js +7 -0
- package/dist/live/index.js.map +1 -1
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,6 +12,18 @@ for (const r of results) {
|
|
|
12
12
|
}
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
+
## Check ids and standard citations
|
|
16
|
+
|
|
17
|
+
Every result is decorated with a stable `checkId`, `citations[]` into the
|
|
18
|
+
public [Application Standard](https://docs.proappstore.online/standard/)
|
|
19
|
+
(`{ clauseId, url }`), an `automation` level (`full` | `partial`) and
|
|
20
|
+
`evidence` (`{ class, detail }`). The mapping lives in `src/clause-map.ts` and
|
|
21
|
+
is published at
|
|
22
|
+
<https://docs.proappstore.online/standard/compliance-checks.json>; `CHECKS`,
|
|
23
|
+
`clauseUrl()`, `annotateByName()` and `complianceMap()` are exported. Ids are
|
|
24
|
+
never renamed. These checks are hygiene scans, not a security audit — see
|
|
25
|
+
[automation levels](https://docs.proappstore.online/standard/audit-model/#automation-levels).
|
|
26
|
+
|
|
15
27
|
## Checks
|
|
16
28
|
|
|
17
29
|
`runChecks(dir)` (and `runChecksFromFiles(map)`) runs the full suite below.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stable check IDs and their mapping to the public Application Standard (#166).
|
|
3
|
+
*
|
|
4
|
+
* Every compliance check — source-side and live — has a kebab-case id that is
|
|
5
|
+
* never renamed, one or more clause ids from docs/standard, and a statement of
|
|
6
|
+
* how much of those clauses it proves. The runner decorates each CheckResult
|
|
7
|
+
* with this so `pas check`, CI output and the publish gate can cite the exact
|
|
8
|
+
* public clause a failure breaches.
|
|
9
|
+
*
|
|
10
|
+
* The standard's clause ids and URLs are the source of truth
|
|
11
|
+
* (docs/standard/standard.json); clause-map.test.ts fails if a mapped clause
|
|
12
|
+
* does not exist there or if docs/standard/compliance-checks.json (the
|
|
13
|
+
* published copy of this table) drifts from it.
|
|
14
|
+
*
|
|
15
|
+
* Keep this file dependency-free: scripts/build-compliance-map.mjs imports it
|
|
16
|
+
* directly to publish the JSON.
|
|
17
|
+
*/
|
|
18
|
+
import type { CheckAutomation, CheckResult, EvidenceClass, StandardCitation } from './types.js';
|
|
19
|
+
export declare const STANDARD_BASE_URL = "https://docs.proappstore.online/standard/";
|
|
20
|
+
/** Public URL of a clause: `<base>/<chapter page>/#<id in lower case>`. */
|
|
21
|
+
export declare function clauseUrl(clauseId: string): string;
|
|
22
|
+
export interface CheckMeta {
|
|
23
|
+
/** Stable id. Never renamed; a retired check keeps its id in `RETIRED_CHECK_IDS`. */
|
|
24
|
+
id: string;
|
|
25
|
+
/** The `name` the check emits on its results (the historical, human-facing label). */
|
|
26
|
+
name: string;
|
|
27
|
+
/** Clause ids this check evidences, most specific first. */
|
|
28
|
+
clauses: string[];
|
|
29
|
+
automation: CheckAutomation;
|
|
30
|
+
evidenceClass: EvidenceClass;
|
|
31
|
+
/** `apps`, `games` or `all` — which project types the check is meaningful for. */
|
|
32
|
+
scope: 'apps' | 'games' | 'all';
|
|
33
|
+
/** What the check does NOT prove, or a known caveat. Shown in docs, not in CLI output. */
|
|
34
|
+
limits: string;
|
|
35
|
+
/** True for the live-URL audit variants. */
|
|
36
|
+
live?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare const CHECKS: readonly CheckMeta[];
|
|
39
|
+
/** Ids that once existed; kept so a consumer storing results by id never sees a reused meaning. */
|
|
40
|
+
export declare const RETIRED_CHECK_IDS: readonly string[];
|
|
41
|
+
export declare function getCheckMeta(id: string): CheckMeta | undefined;
|
|
42
|
+
export declare function getCheckMetaForName(name: string): CheckMeta | undefined;
|
|
43
|
+
export declare function citationsFor(meta: CheckMeta): StandardCitation[];
|
|
44
|
+
/** Decorate a raw check result with its id, citations, automation level and evidence. */
|
|
45
|
+
export declare function annotate(result: CheckResult, meta: CheckMeta): CheckResult;
|
|
46
|
+
/** Decorate by the emitted name; results with no mapping are returned unchanged. */
|
|
47
|
+
export declare function annotateByName(result: CheckResult): CheckResult;
|
|
48
|
+
/** The mapping in the shape published at docs/standard/compliance-checks.json. */
|
|
49
|
+
export declare function complianceMap(): {
|
|
50
|
+
$schema: string;
|
|
51
|
+
standard_base_url: string;
|
|
52
|
+
automation_levels: Record<CheckAutomation, string>;
|
|
53
|
+
checks: Array<Omit<CheckMeta, 'clauses'> & {
|
|
54
|
+
clauses: StandardCitation[];
|
|
55
|
+
}>;
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=clause-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clause-map.d.ts","sourceRoot":"","sources":["../src/clause-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEhG,eAAO,MAAM,iBAAiB,8CAA8C,CAAC;AAM7E,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,MAAM,WAAW,SAAS;IACxB,qFAAqF;IACrF,EAAE,EAAE,MAAM,CAAC;IACX,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,eAAe,CAAC;IAC5B,aAAa,EAAE,aAAa,CAAC;IAC7B,kFAAkF;IAClF,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;IAChC,0FAA0F;IAC1F,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,MAAM,EAAE,SAAS,SAAS,EAsDtC,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAAO,CAAC;AAKvD,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE9D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEvE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,EAAE,CAEhE;AAED,yFAAyF;AACzF,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,GAAG,WAAW,CAQ1E;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAG/D;AAED,kFAAkF;AAClF,wBAAgB,aAAa,IAAI;IAC/B,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC/F,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG;QAAE,OAAO,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC,CAAC;CAC7E,CAUA"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
export const STANDARD_BASE_URL = 'https://docs.proappstore.online/standard/';
|
|
2
|
+
const CHAPTER_PAGES = {
|
|
3
|
+
STACK: 'stack', AUTH: 'auth', DATA: 'data', INT: 'integrations', UI: 'ui', OPS: 'ops',
|
|
4
|
+
};
|
|
5
|
+
/** Public URL of a clause: `<base>/<chapter page>/#<id in lower case>`. */
|
|
6
|
+
export function clauseUrl(clauseId) {
|
|
7
|
+
const m = /^PAS-([A-Z]+)-\d{3}$/.exec(clauseId);
|
|
8
|
+
const page = m ? CHAPTER_PAGES[m[1]] : undefined;
|
|
9
|
+
if (!page)
|
|
10
|
+
throw new Error(`unknown clause id ${clauseId}`);
|
|
11
|
+
return `${STANDARD_BASE_URL}${page}/#${clauseId.toLowerCase()}`;
|
|
12
|
+
}
|
|
13
|
+
export const CHECKS = [
|
|
14
|
+
{ id: 'license-mit', name: 'MIT License', clauses: ['PAS-UI-022'], automation: 'partial', evidenceClass: 'documentation', scope: 'all',
|
|
15
|
+
limits: 'Assumes MIT while the Pro tier permits proprietary source; a proprietary licence records this as a known platform inconsistency, not an app defect.' },
|
|
16
|
+
{ id: 'no-env-production', name: 'No .env.production', clauses: ['PAS-OPS-006', 'PAS-STACK-015', 'PAS-UI-022'], automation: 'partial', evidenceClass: 'configuration', scope: 'all',
|
|
17
|
+
limits: 'Only the one file name; keys in source, in VITE_* variables, or in other .env files are not detected.' },
|
|
18
|
+
{ id: 'no-placeholders', name: 'No template placeholders', clauses: ['PAS-UI-020'], automation: 'full', evidenceClass: 'source', scope: 'all',
|
|
19
|
+
limits: 'Detects the literal APPNAME token only.' },
|
|
20
|
+
{ id: 'no-tracking', name: 'No tracking SDKs', clauses: ['PAS-UI-022', 'PAS-STACK-021', 'PAS-OPS-018'], automation: 'partial', evidenceClass: 'source', scope: 'all',
|
|
21
|
+
limits: 'A fixed list of known trackers; a self-hosted or unlisted tracker is not detected.' },
|
|
22
|
+
{ id: 'brand-fonts', name: 'Brand fonts present', clauses: ['PAS-UI-001', 'PAS-STACK-022'], automation: 'partial', evidenceClass: 'source', scope: 'all',
|
|
23
|
+
limits: 'Presence of the font names in CSS/HTML; not that they are actually applied.' },
|
|
24
|
+
{ id: 'brand-tokens', name: 'Brand tokens defined', clauses: ['PAS-UI-001', 'PAS-STACK-022'], automation: 'partial', evidenceClass: 'source', scope: 'all',
|
|
25
|
+
limits: 'That the canonical tokens are defined; not that the app uses them instead of hard-coded colours.' },
|
|
26
|
+
{ id: 'no-brand-overrides', name: 'No brand overrides', clauses: ['PAS-UI-001', 'PAS-STACK-022'], automation: 'partial', evidenceClass: 'source', scope: 'all',
|
|
27
|
+
limits: 'Common override forms only; the banned alias names themselves are caught by the platform design-system lint, not here.' },
|
|
28
|
+
{ id: 'no-scroll', name: 'No scroll (games only)', clauses: ['PAS-UI-009'], automation: 'partial', evidenceClass: 'source', scope: 'games',
|
|
29
|
+
limits: 'Games only; static CSS anti-patterns. Real document scroll is measured only in a browser.' },
|
|
30
|
+
{ id: 'viewport-support', name: 'Viewport support', clauses: ['PAS-UI-008'], automation: 'partial', evidenceClass: 'configuration', scope: 'all',
|
|
31
|
+
limits: 'That orientation and min_viewport_width are declared; not that the layout works at that width.' },
|
|
32
|
+
{ id: 'unsafe-vh', name: 'No unsafe 100vh', clauses: ['PAS-UI-010'], automation: 'partial', evidenceClass: 'source', scope: 'all',
|
|
33
|
+
limits: '100vh in source only; safe-area padding and the iOS first-load scroll need a device.' },
|
|
34
|
+
{ id: 'accessibility-static', name: 'Accessibility static', clauses: ['PAS-UI-004'], automation: 'partial', evidenceClass: 'source', scope: 'all',
|
|
35
|
+
limits: 'Missing alt text, unnamed buttons and unlabeled text controls only. Contrast, focus order, keyboard traps and rendered ARIA need a browser and a person (PAS-UI-005, 006, 023).' },
|
|
36
|
+
{ id: 'html-meta', name: 'HTML meta tags', clauses: ['PAS-UI-008', 'PAS-UI-020'], automation: 'partial', evidenceClass: 'configuration', scope: 'all',
|
|
37
|
+
limits: 'Presence of lang, viewport, title and preview images; not the viewport\'s content (user-scalable=no is PAS-UI-007, a manual check).' },
|
|
38
|
+
{ id: 'pwa-meta', name: 'PWA meta tags', clauses: ['PAS-UI-020'], automation: 'partial', evidenceClass: 'configuration', scope: 'all',
|
|
39
|
+
limits: 'The iOS install metas only; install behaviour is verified on a device.' },
|
|
40
|
+
{ id: 'pwa-offline', name: 'PWA offline correctness', clauses: ['PAS-UI-018', 'PAS-UI-019'], automation: 'partial', evidenceClass: 'configuration', scope: 'all',
|
|
41
|
+
limits: 'That a service worker is registered and the workbox config is sane; not that /.pas/* or authenticated responses stay uncached at runtime.' },
|
|
42
|
+
{ id: 'pwa-manifest', name: 'PWA manifest', clauses: ['PAS-UI-020'], automation: 'partial', evidenceClass: 'configuration', scope: 'all',
|
|
43
|
+
limits: 'The four required fields; the rest of the manifest is reviewed manually.' },
|
|
44
|
+
{ id: 'pwa-maskable-icon', name: 'PWA maskable icon', clauses: ['PAS-UI-020'], automation: 'full', evidenceClass: 'configuration', scope: 'all',
|
|
45
|
+
limits: 'Declaration only; the icon\'s safe zone is not rendered.' },
|
|
46
|
+
{ id: 'store-link', name: 'Store link', clauses: ['PAS-UI-001', 'PAS-STACK-022'], automation: 'full', evidenceClass: 'source', scope: 'all',
|
|
47
|
+
limits: 'That the domain appears somewhere under web/src; not that it is visible.' },
|
|
48
|
+
{ id: 'dark-mode', name: 'Dark mode support', clauses: ['PAS-UI-002'], automation: 'partial', evidenceClass: 'source', scope: 'apps',
|
|
49
|
+
limits: 'Warn-only signal detection; the storage-key split (fas:theme vs stores-theme) and dark-scheme contrast are manual.' },
|
|
50
|
+
{ id: 'bundle-size', name: 'Bundle size', clauses: ['PAS-UI-021', 'PAS-STACK-024'], automation: 'partial', evidenceClass: 'process', scope: 'all',
|
|
51
|
+
limits: 'Warns when web/dist is unbuilt; measures the largest JS chunk only.' },
|
|
52
|
+
{ id: 'claude-md-slim', name: 'CLAUDE.md is slim (no platform boilerplate)', clauses: ['PAS-STACK-001'], automation: 'partial', evidenceClass: 'documentation', scope: 'all',
|
|
53
|
+
limits: 'Documentation hygiene of the scaffold\'s agent guide; warn-only and not a security signal.' },
|
|
54
|
+
// Live-URL audit (auditLive) — a post-publish subset run against the deployed app.
|
|
55
|
+
{ id: 'reachable', name: 'Reachable', clauses: ['PAS-OPS-010'], automation: 'partial', evidenceClass: 'runtime', scope: 'all', live: true,
|
|
56
|
+
limits: 'HTTP 200 from the live URL; not that the app works (that is the post-deploy smoke).' },
|
|
57
|
+
{ id: 'brand-fonts-live', name: 'Brand fonts (live)', clauses: ['PAS-UI-001'], automation: 'partial', evidenceClass: 'runtime', scope: 'all', live: true,
|
|
58
|
+
limits: 'The fonts link in the served HTML only.' },
|
|
59
|
+
{ id: 'bundle-size-live', name: 'Bundle size (live)', clauses: ['PAS-UI-021'], automation: 'partial', evidenceClass: 'runtime', scope: 'all', live: true,
|
|
60
|
+
limits: 'HEAD size of the main bundle only.' },
|
|
61
|
+
{ id: 'pwa-manifest-live', name: 'PWA manifest (live)', clauses: ['PAS-UI-020'], automation: 'partial', evidenceClass: 'runtime', scope: 'all', live: true,
|
|
62
|
+
limits: 'Manifest reachable and minimally valid.' },
|
|
63
|
+
{ id: 'no-tracking-live', name: 'No tracking SDKs (live)', clauses: ['PAS-UI-022', 'PAS-STACK-021'], automation: 'partial', evidenceClass: 'runtime', scope: 'all', live: true,
|
|
64
|
+
limits: 'Known trackers in the served HTML and fetched scripts only.' },
|
|
65
|
+
{ id: 'unsafe-vh-live', name: 'No unsafe 100vh (live)', clauses: ['PAS-UI-010'], automation: 'partial', evidenceClass: 'runtime', scope: 'all', live: true,
|
|
66
|
+
limits: 'Served CSS text only.' },
|
|
67
|
+
];
|
|
68
|
+
/** Ids that once existed; kept so a consumer storing results by id never sees a reused meaning. */
|
|
69
|
+
export const RETIRED_CHECK_IDS = [];
|
|
70
|
+
const BY_NAME = new Map(CHECKS.map((m) => [m.name, m]));
|
|
71
|
+
const BY_ID = new Map(CHECKS.map((m) => [m.id, m]));
|
|
72
|
+
export function getCheckMeta(id) {
|
|
73
|
+
return BY_ID.get(id);
|
|
74
|
+
}
|
|
75
|
+
export function getCheckMetaForName(name) {
|
|
76
|
+
return BY_NAME.get(name);
|
|
77
|
+
}
|
|
78
|
+
export function citationsFor(meta) {
|
|
79
|
+
return meta.clauses.map((clauseId) => ({ clauseId, url: clauseUrl(clauseId) }));
|
|
80
|
+
}
|
|
81
|
+
/** Decorate a raw check result with its id, citations, automation level and evidence. */
|
|
82
|
+
export function annotate(result, meta) {
|
|
83
|
+
return {
|
|
84
|
+
...result,
|
|
85
|
+
checkId: meta.id,
|
|
86
|
+
citations: citationsFor(meta),
|
|
87
|
+
automation: meta.automation,
|
|
88
|
+
evidence: { class: meta.evidenceClass, detail: result.detail },
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/** Decorate by the emitted name; results with no mapping are returned unchanged. */
|
|
92
|
+
export function annotateByName(result) {
|
|
93
|
+
const meta = BY_NAME.get(result.name);
|
|
94
|
+
return meta ? annotate(result, meta) : result;
|
|
95
|
+
}
|
|
96
|
+
/** The mapping in the shape published at docs/standard/compliance-checks.json. */
|
|
97
|
+
export function complianceMap() {
|
|
98
|
+
return {
|
|
99
|
+
$schema: `${STANDARD_BASE_URL}compliance-checks.schema.json`,
|
|
100
|
+
standard_base_url: STANDARD_BASE_URL,
|
|
101
|
+
automation_levels: {
|
|
102
|
+
full: 'The check is the clause\'s automated enforcement; a pass is the clause\'s evidence.',
|
|
103
|
+
partial: 'The check proves one observable facet of the clause; the rest needs the manual or human review the clause names.',
|
|
104
|
+
},
|
|
105
|
+
checks: CHECKS.map((m) => ({ ...m, live: m.live ?? false, clauses: citationsFor(m) })),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=clause-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clause-map.js","sourceRoot":"","sources":["../src/clause-map.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,11 +20,14 @@ import { checkUnsafeVh } from './checks/unsafe-vh.js';
|
|
|
20
20
|
import { checkViewportSupport } from './checks/viewport-support.js';
|
|
21
21
|
import { fsFileSource, mapFileSource } from './lib/file-source.js';
|
|
22
22
|
import { isGameProject } from './lib/project-type.js';
|
|
23
|
+
import { CHECKS, annotate, annotateByName, getCheckMeta, getCheckMetaForName, citationsFor, clauseUrl, complianceMap, STANDARD_BASE_URL } from './clause-map.js';
|
|
23
24
|
import type { CheckResult } from './types.js';
|
|
24
25
|
export type { FileSource } from './lib/file-source.js';
|
|
25
26
|
export type { LiveAuditInput, LiveAuditReport } from './live/index.js';
|
|
26
27
|
export { auditLive, checkBrandFontsLive, checkBundleSizeLive, checkManifestLive, checkNoTrackingLive, checkUnsafeVhLive, } from './live/index.js';
|
|
27
|
-
export type { CheckResult, CheckStatus } from './types.js';
|
|
28
|
+
export type { CheckAutomation, CheckResult, CheckStatus, EvidenceClass, StandardCitation } from './types.js';
|
|
29
|
+
export type { CheckMeta } from './clause-map.js';
|
|
30
|
+
export { CHECKS, annotate, annotateByName, getCheckMeta, getCheckMetaForName, citationsFor, clauseUrl, complianceMap, STANDARD_BASE_URL };
|
|
28
31
|
export { checkAccessibilityStatic, checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkHtmlMeta, checkLicenseMit, checkManifest, checkMaskableIcon, checkNoBrandOverrides, checkNoEnvProduction, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPwaMeta, checkPwaOffline, checkStoreLink, checkUnsafeVh, checkViewportSupport, fsFileSource, isGameProject, mapFileSource, };
|
|
29
32
|
/**
|
|
30
33
|
* Runs every compliance check against the source. Two front doors:
|
|
@@ -37,4 +40,6 @@ export { checkAccessibilityStatic, checkBrandFonts, checkBrandTokens, checkBundl
|
|
|
37
40
|
*/
|
|
38
41
|
export declare function runChecks(repoDir: string): Promise<CheckResult[]>;
|
|
39
42
|
export declare function runChecksFromFiles(files: Map<string, string>): Promise<CheckResult[]>;
|
|
43
|
+
/** Ids of the source-side checks, in output order. */
|
|
44
|
+
export declare const SOURCE_CHECK_IDS: readonly string[];
|
|
40
45
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAmB,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIvE,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAmB,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACjK,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIvE,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC7G,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC;AAC1I,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,aAAa,GACd,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAEvE;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAE3F;AA8BD,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAA6B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -20,10 +20,12 @@ import { checkUnsafeVh } from './checks/unsafe-vh.js';
|
|
|
20
20
|
import { checkViewportSupport } from './checks/viewport-support.js';
|
|
21
21
|
import { fsFileSource, mapFileSource } from './lib/file-source.js';
|
|
22
22
|
import { isGameProject } from './lib/project-type.js';
|
|
23
|
+
import { CHECKS, annotate, annotateByName, getCheckMeta, getCheckMetaForName, citationsFor, clauseUrl, complianceMap, STANDARD_BASE_URL } from './clause-map.js';
|
|
23
24
|
// Live-URL audit (used by the compliance audit Worker; runs in
|
|
24
25
|
// browser/Workers env, no filesystem). Separate export path so callers
|
|
25
26
|
// don't accidentally pull node:fs in via the file-walking checks.
|
|
26
27
|
export { auditLive, checkBrandFontsLive, checkBundleSizeLive, checkManifestLive, checkNoTrackingLive, checkUnsafeVhLive, } from './live/index.js';
|
|
28
|
+
export { CHECKS, annotate, annotateByName, getCheckMeta, getCheckMetaForName, citationsFor, clauseUrl, complianceMap, STANDARD_BASE_URL };
|
|
27
29
|
export { checkAccessibilityStatic, checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkHtmlMeta, checkLicenseMit, checkManifest, checkMaskableIcon, checkNoBrandOverrides, checkNoEnvProduction, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPwaMeta, checkPwaOffline, checkStoreLink, checkUnsafeVh, checkViewportSupport, fsFileSource, isGameProject, mapFileSource, };
|
|
28
30
|
/**
|
|
29
31
|
* Runs every compliance check against the source. Two front doors:
|
|
@@ -40,28 +42,41 @@ export async function runChecks(repoDir) {
|
|
|
40
42
|
export async function runChecksFromFiles(files) {
|
|
41
43
|
return runChecksOn(mapFileSource(files));
|
|
42
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Source-side checks in their stable output order, keyed by the id each result
|
|
47
|
+
* is decorated with (#166). Adding a check means adding it here AND to
|
|
48
|
+
* clause-map.ts; clause-map.test.ts fails on either half missing.
|
|
49
|
+
*/
|
|
50
|
+
const RUNNERS = [
|
|
51
|
+
{ id: 'license-mit', run: checkLicenseMit },
|
|
52
|
+
{ id: 'no-env-production', run: checkNoEnvProduction },
|
|
53
|
+
{ id: 'no-placeholders', run: checkNoPlaceholders },
|
|
54
|
+
{ id: 'no-tracking', run: checkNoTracking },
|
|
55
|
+
{ id: 'brand-fonts', run: checkBrandFonts },
|
|
56
|
+
{ id: 'brand-tokens', run: checkBrandTokens },
|
|
57
|
+
{ id: 'no-brand-overrides', run: checkNoBrandOverrides },
|
|
58
|
+
{ id: 'no-scroll', run: checkNoScroll },
|
|
59
|
+
{ id: 'viewport-support', run: checkViewportSupport },
|
|
60
|
+
{ id: 'unsafe-vh', run: checkUnsafeVh },
|
|
61
|
+
{ id: 'accessibility-static', run: checkAccessibilityStatic },
|
|
62
|
+
{ id: 'html-meta', run: checkHtmlMeta },
|
|
63
|
+
{ id: 'pwa-meta', run: checkPwaMeta },
|
|
64
|
+
{ id: 'pwa-offline', run: checkPwaOffline },
|
|
65
|
+
{ id: 'pwa-manifest', run: checkManifest },
|
|
66
|
+
{ id: 'pwa-maskable-icon', run: checkMaskableIcon },
|
|
67
|
+
{ id: 'store-link', run: checkStoreLink },
|
|
68
|
+
{ id: 'dark-mode', run: checkDarkMode },
|
|
69
|
+
{ id: 'bundle-size', run: checkBundleSize },
|
|
70
|
+
{ id: 'claude-md-slim', run: checkClaudeMdSlim },
|
|
71
|
+
];
|
|
72
|
+
/** Ids of the source-side checks, in output order. */
|
|
73
|
+
export const SOURCE_CHECK_IDS = RUNNERS.map((r) => r.id);
|
|
43
74
|
async function runChecksOn(source) {
|
|
44
|
-
return Promise.all(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
checkBrandTokens(source),
|
|
51
|
-
checkNoBrandOverrides(source),
|
|
52
|
-
checkNoScroll(source),
|
|
53
|
-
checkViewportSupport(source),
|
|
54
|
-
checkUnsafeVh(source),
|
|
55
|
-
checkAccessibilityStatic(source),
|
|
56
|
-
checkHtmlMeta(source),
|
|
57
|
-
checkPwaMeta(source),
|
|
58
|
-
checkPwaOffline(source),
|
|
59
|
-
checkManifest(source),
|
|
60
|
-
checkMaskableIcon(source),
|
|
61
|
-
checkStoreLink(source),
|
|
62
|
-
checkDarkMode(source),
|
|
63
|
-
checkBundleSize(source),
|
|
64
|
-
checkClaudeMdSlim(source),
|
|
65
|
-
]);
|
|
75
|
+
return Promise.all(RUNNERS.map(async ({ id, run }) => {
|
|
76
|
+
const meta = getCheckMeta(id);
|
|
77
|
+
if (!meta)
|
|
78
|
+
throw new Error(`compliance check ${id} has no clause mapping (clause-map.ts)`);
|
|
79
|
+
return annotate(await run(source), meta);
|
|
80
|
+
}));
|
|
66
81
|
}
|
|
67
82
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAmB,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
* missing == fail or missing == not-applicable.
|
|
13
13
|
* - `list()` already excludes noise dirs (.git, node_modules, dist,
|
|
14
14
|
* etc.). Implementations are responsible for that filtering.
|
|
15
|
+
* - `fsFileSource` additionally honours `.gitignore`; `mapFileSource`
|
|
16
|
+
* deliberately does not. See the note on `mapFileSource` for why (#122).
|
|
15
17
|
*/
|
|
16
18
|
export interface FileSource {
|
|
17
19
|
/** Yield every relevant file path. Implementations skip noise dirs. */
|
|
@@ -47,6 +49,21 @@ export declare function fsFileSource(repoDir: string): FileSource;
|
|
|
47
49
|
* deploy), so bundle-size will return its "not built yet" warn anyway.
|
|
48
50
|
*
|
|
49
51
|
* `listDir` synthesises directory listings from the Map keys.
|
|
52
|
+
*
|
|
53
|
+
* DELIBERATELY DOES NOT HONOUR `.gitignore` (#122), unlike `fsFileSource`.
|
|
54
|
+
* The asymmetry is the point, not an oversight:
|
|
55
|
+
*
|
|
56
|
+
* - This source is fed by `fetchRepoFiles`, i.e. files that are actually IN the
|
|
57
|
+
* repository. Git ignore rules only ever applied to untracked files, so a
|
|
58
|
+
* tracked file listed in `.gitignore` still ships — skipping it here would
|
|
59
|
+
* teach the publish gate to overlook real source.
|
|
60
|
+
* - Ignored artefacts never reach this Map in the first place; they are not in
|
|
61
|
+
* the repo to fetch. There is nothing for `.gitignore` to exclude.
|
|
62
|
+
* - `fsFileSource` scans a working directory, where generated output sits
|
|
63
|
+
* beside source, so there the ignore file is genuinely informative.
|
|
64
|
+
*
|
|
65
|
+
* Net effect: honouring `.gitignore` can only weaken local feedback, never the
|
|
66
|
+
* gate that blocks publishing. SKIP_DIRS still applies here as the floor.
|
|
50
67
|
*/
|
|
51
68
|
export declare function mapFileSource(files: Map<string, string>): FileSource;
|
|
52
69
|
//# sourceMappingURL=file-source.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-source.d.ts","sourceRoot":"","sources":["../../src/lib/file-source.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"file-source.d.ts","sourceRoot":"","sources":["../../src/lib/file-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,IAAI,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9B,0DAA0D;IAC1D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3C;iDAC6C;IAC7C,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrD;mEAC+D;IAC/D,OAAO,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;CACjD;AAgCD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CA+BxD;AAuDD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,CA8BpE"}
|
package/dist/lib/file-source.js
CHANGED
|
@@ -12,9 +12,25 @@
|
|
|
12
12
|
* missing == fail or missing == not-applicable.
|
|
13
13
|
* - `list()` already excludes noise dirs (.git, node_modules, dist,
|
|
14
14
|
* etc.). Implementations are responsible for that filtering.
|
|
15
|
+
* - `fsFileSource` additionally honours `.gitignore`; `mapFileSource`
|
|
16
|
+
* deliberately does not. See the note on `mapFileSource` for why (#122).
|
|
15
17
|
*/
|
|
16
18
|
import { readdir, readFile } from 'node:fs/promises';
|
|
17
19
|
import { join, relative, sep } from 'node:path';
|
|
20
|
+
import { isIgnored, parseGitignore } from './gitignore.js';
|
|
21
|
+
/**
|
|
22
|
+
* Directories never worth scanning, regardless of `.gitignore` (#122).
|
|
23
|
+
*
|
|
24
|
+
* This is the floor, not the policy. `fsFileSource` also honours `.gitignore`,
|
|
25
|
+
* which is the general answer; this list still matters for two cases that file
|
|
26
|
+
* cannot cover: a repo with no `.gitignore` at all, and `mapFileSource`, which
|
|
27
|
+
* deliberately does not consult one.
|
|
28
|
+
*
|
|
29
|
+
* The generated-report directories are here because their output is HTML with
|
|
30
|
+
* inline CSS custom properties and webfonts — precisely what `no-brand-overrides`
|
|
31
|
+
* and `brand-fonts` match on — so a developer who merely ran a QA tool locally
|
|
32
|
+
* would fail checks on a file they never wrote.
|
|
33
|
+
*/
|
|
18
34
|
const SKIP_DIRS = new Set([
|
|
19
35
|
'.git',
|
|
20
36
|
'node_modules',
|
|
@@ -23,6 +39,13 @@ const SKIP_DIRS = new Set([
|
|
|
23
39
|
'.cache',
|
|
24
40
|
'.wrangler',
|
|
25
41
|
'.turbo',
|
|
42
|
+
// Generated reports and caches (#122).
|
|
43
|
+
'.vibe-check',
|
|
44
|
+
'playwright-report',
|
|
45
|
+
'test-results',
|
|
46
|
+
'coverage',
|
|
47
|
+
'.vite',
|
|
48
|
+
'graphify-out',
|
|
26
49
|
]);
|
|
27
50
|
/**
|
|
28
51
|
* Filesystem-backed FileSource — used by the CLI and CI. Walks the
|
|
@@ -79,7 +102,11 @@ function hasTraversal(path) {
|
|
|
79
102
|
return true; // absolute
|
|
80
103
|
return path.split(/[/\\]/).some((seg) => seg === '..');
|
|
81
104
|
}
|
|
82
|
-
|
|
105
|
+
/** POSIX path of `full` relative to `root` — the form checks and rules expect. */
|
|
106
|
+
function toRelPosix(full, root) {
|
|
107
|
+
return relative(root, full).split(sep).join('/');
|
|
108
|
+
}
|
|
109
|
+
async function* walk(dir, root, layers = []) {
|
|
83
110
|
let entries;
|
|
84
111
|
try {
|
|
85
112
|
entries = await readdir(dir, { withFileTypes: true });
|
|
@@ -87,17 +114,34 @@ async function* walk(dir, root) {
|
|
|
87
114
|
catch {
|
|
88
115
|
return;
|
|
89
116
|
}
|
|
117
|
+
// Pick up this directory's .gitignore before deciding anything in it, so its
|
|
118
|
+
// rules govern its own siblings. Deeper files are appended, and `isIgnored`
|
|
119
|
+
// evaluates last-match-wins, which is how they come to override shallower ones.
|
|
120
|
+
let active = layers;
|
|
121
|
+
const hasGitignore = entries.some((e) => e.isFile() && e.name === '.gitignore');
|
|
122
|
+
if (hasGitignore) {
|
|
123
|
+
const text = await readFile(join(dir, '.gitignore'), 'utf8').catch(() => null);
|
|
124
|
+
if (text !== null) {
|
|
125
|
+
active = [...layers, { base: toRelPosix(dir, root), rules: parseGitignore(text) }];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
90
128
|
for (const entry of entries) {
|
|
91
129
|
const full = join(dir, entry.name);
|
|
130
|
+
const rel = toRelPosix(full, root);
|
|
92
131
|
if (entry.isDirectory()) {
|
|
132
|
+
// `.git` is not negotiable and never appears in a .gitignore.
|
|
93
133
|
if (SKIP_DIRS.has(entry.name))
|
|
94
134
|
continue;
|
|
95
|
-
|
|
135
|
+
if (isIgnored(active, rel, true))
|
|
136
|
+
continue;
|
|
137
|
+
yield* walk(full, root, active);
|
|
96
138
|
}
|
|
97
139
|
else if (entry.isFile()) {
|
|
140
|
+
if (isIgnored(active, rel, false))
|
|
141
|
+
continue;
|
|
98
142
|
// Always emit POSIX-style paths so checks can rely on consistent
|
|
99
143
|
// separators across platforms.
|
|
100
|
-
yield
|
|
144
|
+
yield rel;
|
|
101
145
|
}
|
|
102
146
|
}
|
|
103
147
|
}
|
|
@@ -111,6 +155,21 @@ async function* walk(dir, root) {
|
|
|
111
155
|
* deploy), so bundle-size will return its "not built yet" warn anyway.
|
|
112
156
|
*
|
|
113
157
|
* `listDir` synthesises directory listings from the Map keys.
|
|
158
|
+
*
|
|
159
|
+
* DELIBERATELY DOES NOT HONOUR `.gitignore` (#122), unlike `fsFileSource`.
|
|
160
|
+
* The asymmetry is the point, not an oversight:
|
|
161
|
+
*
|
|
162
|
+
* - This source is fed by `fetchRepoFiles`, i.e. files that are actually IN the
|
|
163
|
+
* repository. Git ignore rules only ever applied to untracked files, so a
|
|
164
|
+
* tracked file listed in `.gitignore` still ships — skipping it here would
|
|
165
|
+
* teach the publish gate to overlook real source.
|
|
166
|
+
* - Ignored artefacts never reach this Map in the first place; they are not in
|
|
167
|
+
* the repo to fetch. There is nothing for `.gitignore` to exclude.
|
|
168
|
+
* - `fsFileSource` scans a working directory, where generated output sits
|
|
169
|
+
* beside source, so there the ignore file is genuinely informative.
|
|
170
|
+
*
|
|
171
|
+
* Net effect: honouring `.gitignore` can only weaken local feedback, never the
|
|
172
|
+
* gate that blocks publishing. SKIP_DIRS still applies here as the floor.
|
|
114
173
|
*/
|
|
115
174
|
export function mapFileSource(files) {
|
|
116
175
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-source.js","sourceRoot":"","sources":["../../src/lib/file-source.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"file-source.js","sourceRoot":"","sources":["../../src/lib/file-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `.gitignore` matcher, hand-written and dependency-free (#122).
|
|
3
|
+
*
|
|
4
|
+
* Why this exists: the walker used to filter directories against a hardcoded
|
|
5
|
+
* SKIP_DIRS list, so generated-but-git-ignored artefacts were scanned as if a
|
|
6
|
+
* developer had written them. The worst offenders are HTML reports
|
|
7
|
+
* (`.vibe-check/`, `playwright-report/`, `coverage/`) because they inline CSS
|
|
8
|
+
* custom properties and webfonts — exactly what `no-brand-overrides` and
|
|
9
|
+
* `brand-fonts` look for. An app's own ignore file is the best available
|
|
10
|
+
* statement of "this isn't source".
|
|
11
|
+
*
|
|
12
|
+
* Why no dependency: `@proappstore/compliance` has zero runtime dependencies
|
|
13
|
+
* and is consumed by both the CLI and a Workers-bound bundle. Adding one for a
|
|
14
|
+
* few hundred lines of pattern matching is a worse trade than owning it.
|
|
15
|
+
*
|
|
16
|
+
* SUPPORTED: comments and blanks, `\#`/`\!` escapes, trailing-space stripping,
|
|
17
|
+
* `!` negation with last-match-wins, leading `/` anchoring, trailing `/`
|
|
18
|
+
* (directory-only), `*`, `?`, `**` (leading, trailing, and as a whole segment),
|
|
19
|
+
* character classes including `[!...]` negation, and nested `.gitignore` files
|
|
20
|
+
* with deeper files overriding shallower ones.
|
|
21
|
+
*
|
|
22
|
+
* NOT SUPPORTED, deliberately: `.git/info/exclude`, the global
|
|
23
|
+
* `core.excludesFile`, and `.gitattributes`. All of them live outside the tree
|
|
24
|
+
* being scanned or need git itself to resolve.
|
|
25
|
+
*
|
|
26
|
+
* KNOWN LIMIT, inherited from git: ignore rules apply to UNTRACKED files. A
|
|
27
|
+
* file that is already tracked stays tracked even if listed in `.gitignore`, so
|
|
28
|
+
* this is not a sound proxy for "not in the repo". That is why only
|
|
29
|
+
* `fsFileSource` consults it — see the asymmetry note in file-source.ts.
|
|
30
|
+
*/
|
|
31
|
+
export interface IgnoreRule {
|
|
32
|
+
/** `!pattern` — re-includes a path an earlier rule excluded. */
|
|
33
|
+
negated: boolean;
|
|
34
|
+
/** Pattern ended in `/` — matches directories only. */
|
|
35
|
+
dirOnly: boolean;
|
|
36
|
+
regex: RegExp;
|
|
37
|
+
/** The original line, for debugging a surprising match. */
|
|
38
|
+
source: string;
|
|
39
|
+
}
|
|
40
|
+
/** Rules from one `.gitignore`, plus where that file lived. */
|
|
41
|
+
export interface IgnoreLayer {
|
|
42
|
+
/** POSIX path of the containing directory, relative to the scan root. `''` at root. */
|
|
43
|
+
base: string;
|
|
44
|
+
rules: IgnoreRule[];
|
|
45
|
+
}
|
|
46
|
+
/** Parse one `.gitignore` body into ordered rules. */
|
|
47
|
+
export declare function parseGitignore(text: string): IgnoreRule[];
|
|
48
|
+
/**
|
|
49
|
+
* Is `relPath` (POSIX, relative to the scan root) ignored by `layers`?
|
|
50
|
+
*
|
|
51
|
+
* Layers must be ordered shallowest-first. Evaluation is last-match-wins across
|
|
52
|
+
* the whole ordered set, which gives both of git's precedence rules at once:
|
|
53
|
+
* a later line in one file beats an earlier one, and a deeper `.gitignore`
|
|
54
|
+
* beats a shallower one.
|
|
55
|
+
*
|
|
56
|
+
* Note git's rule that a file under an excluded directory cannot be re-included.
|
|
57
|
+
* The walker gets that for free by never descending into an ignored directory.
|
|
58
|
+
*/
|
|
59
|
+
export declare function isIgnored(layers: IgnoreLayer[], relPath: string, isDir: boolean): boolean;
|
|
60
|
+
//# sourceMappingURL=gitignore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/lib/gitignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,MAAM,WAAW,UAAU;IACzB,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AA6FD,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAsCzD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAoBzF"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `.gitignore` matcher, hand-written and dependency-free (#122).
|
|
3
|
+
*
|
|
4
|
+
* Why this exists: the walker used to filter directories against a hardcoded
|
|
5
|
+
* SKIP_DIRS list, so generated-but-git-ignored artefacts were scanned as if a
|
|
6
|
+
* developer had written them. The worst offenders are HTML reports
|
|
7
|
+
* (`.vibe-check/`, `playwright-report/`, `coverage/`) because they inline CSS
|
|
8
|
+
* custom properties and webfonts — exactly what `no-brand-overrides` and
|
|
9
|
+
* `brand-fonts` look for. An app's own ignore file is the best available
|
|
10
|
+
* statement of "this isn't source".
|
|
11
|
+
*
|
|
12
|
+
* Why no dependency: `@proappstore/compliance` has zero runtime dependencies
|
|
13
|
+
* and is consumed by both the CLI and a Workers-bound bundle. Adding one for a
|
|
14
|
+
* few hundred lines of pattern matching is a worse trade than owning it.
|
|
15
|
+
*
|
|
16
|
+
* SUPPORTED: comments and blanks, `\#`/`\!` escapes, trailing-space stripping,
|
|
17
|
+
* `!` negation with last-match-wins, leading `/` anchoring, trailing `/`
|
|
18
|
+
* (directory-only), `*`, `?`, `**` (leading, trailing, and as a whole segment),
|
|
19
|
+
* character classes including `[!...]` negation, and nested `.gitignore` files
|
|
20
|
+
* with deeper files overriding shallower ones.
|
|
21
|
+
*
|
|
22
|
+
* NOT SUPPORTED, deliberately: `.git/info/exclude`, the global
|
|
23
|
+
* `core.excludesFile`, and `.gitattributes`. All of them live outside the tree
|
|
24
|
+
* being scanned or need git itself to resolve.
|
|
25
|
+
*
|
|
26
|
+
* KNOWN LIMIT, inherited from git: ignore rules apply to UNTRACKED files. A
|
|
27
|
+
* file that is already tracked stays tracked even if listed in `.gitignore`, so
|
|
28
|
+
* this is not a sound proxy for "not in the repo". That is why only
|
|
29
|
+
* `fsFileSource` consults it — see the asymmetry note in file-source.ts.
|
|
30
|
+
*/
|
|
31
|
+
const REGEX_SPECIAL = /[.*+?^${}()|[\]\\]/g;
|
|
32
|
+
function escapeLiteral(char) {
|
|
33
|
+
return char.replace(REGEX_SPECIAL, '\\$&');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Strip trailing spaces, which git ignores unless backslash-escaped. Leading
|
|
37
|
+
* whitespace is significant and is left alone.
|
|
38
|
+
*/
|
|
39
|
+
function stripTrailingSpaces(line) {
|
|
40
|
+
let end = line.length;
|
|
41
|
+
while (end > 0 && line[end - 1] === ' ') {
|
|
42
|
+
// A space is literal when preceded by an odd number of backslashes.
|
|
43
|
+
let backslashes = 0;
|
|
44
|
+
let i = end - 2;
|
|
45
|
+
while (i >= 0 && line[i] === '\\') {
|
|
46
|
+
backslashes++;
|
|
47
|
+
i--;
|
|
48
|
+
}
|
|
49
|
+
if (backslashes % 2 === 1)
|
|
50
|
+
break;
|
|
51
|
+
end--;
|
|
52
|
+
}
|
|
53
|
+
return line.slice(0, end);
|
|
54
|
+
}
|
|
55
|
+
/** Translate a glob body into regex source. Never anchors — the caller does. */
|
|
56
|
+
function translate(pattern) {
|
|
57
|
+
let out = '';
|
|
58
|
+
let i = 0;
|
|
59
|
+
while (i < pattern.length) {
|
|
60
|
+
const char = pattern[i];
|
|
61
|
+
if (char === '*') {
|
|
62
|
+
let j = i;
|
|
63
|
+
while (pattern[j] === '*')
|
|
64
|
+
j++;
|
|
65
|
+
const isDoubled = j - i >= 2;
|
|
66
|
+
const atSegmentStart = i === 0 || pattern[i - 1] === '/';
|
|
67
|
+
const atSegmentEnd = j >= pattern.length || pattern[j] === '/';
|
|
68
|
+
if (isDoubled && atSegmentStart && atSegmentEnd) {
|
|
69
|
+
if (j >= pattern.length) {
|
|
70
|
+
// Trailing `/**` — everything below this point.
|
|
71
|
+
out += '.*';
|
|
72
|
+
i = j;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// `**/` — zero or more whole directory segments.
|
|
76
|
+
out += '(?:[^/]+/)*';
|
|
77
|
+
i = j + 1;
|
|
78
|
+
}
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// `**` that is not a whole segment degrades to `*`, as git does.
|
|
82
|
+
out += '[^/]*';
|
|
83
|
+
i = j;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (char === '?') {
|
|
87
|
+
out += '[^/]';
|
|
88
|
+
i++;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (char === '[') {
|
|
92
|
+
let j = i + 1;
|
|
93
|
+
if (pattern[j] === '!' || pattern[j] === '^')
|
|
94
|
+
j++;
|
|
95
|
+
if (pattern[j] === ']')
|
|
96
|
+
j++; // a `]` first in the class is literal
|
|
97
|
+
while (j < pattern.length && pattern[j] !== ']')
|
|
98
|
+
j++;
|
|
99
|
+
if (j >= pattern.length) {
|
|
100
|
+
// Unterminated class — git treats the `[` as literal.
|
|
101
|
+
out += '\\[';
|
|
102
|
+
i++;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
let cls = pattern.slice(i, j + 1);
|
|
106
|
+
if (cls[1] === '!')
|
|
107
|
+
cls = `[^${cls.slice(2)}`; // git spells negation `[!…]`
|
|
108
|
+
out += cls;
|
|
109
|
+
i = j + 1;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (char === '\\') {
|
|
113
|
+
const next = pattern[i + 1];
|
|
114
|
+
if (next !== undefined) {
|
|
115
|
+
out += escapeLiteral(next);
|
|
116
|
+
i += 2;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
out += '\\\\';
|
|
120
|
+
i++;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
out += escapeLiteral(char);
|
|
124
|
+
i++;
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
/** Parse one `.gitignore` body into ordered rules. */
|
|
129
|
+
export function parseGitignore(text) {
|
|
130
|
+
const rules = [];
|
|
131
|
+
for (const raw of text.split(/\r?\n/)) {
|
|
132
|
+
let line = stripTrailingSpaces(raw);
|
|
133
|
+
if (line === '' || line.startsWith('#'))
|
|
134
|
+
continue;
|
|
135
|
+
let negated = false;
|
|
136
|
+
if (line.startsWith('!')) {
|
|
137
|
+
negated = true;
|
|
138
|
+
line = line.slice(1);
|
|
139
|
+
}
|
|
140
|
+
else if (line.startsWith('\\#') || line.startsWith('\\!')) {
|
|
141
|
+
line = line.slice(1); // escaped literal `#` / `!`
|
|
142
|
+
}
|
|
143
|
+
if (line === '')
|
|
144
|
+
continue;
|
|
145
|
+
let dirOnly = false;
|
|
146
|
+
if (line.endsWith('/')) {
|
|
147
|
+
dirOnly = true;
|
|
148
|
+
line = line.slice(0, -1);
|
|
149
|
+
}
|
|
150
|
+
if (line === '')
|
|
151
|
+
continue;
|
|
152
|
+
// A slash anywhere (other than the trailing one already removed) anchors the
|
|
153
|
+
// pattern to the .gitignore's own directory. Otherwise it matches at any depth.
|
|
154
|
+
const anchored = line.includes('/');
|
|
155
|
+
if (line.startsWith('/'))
|
|
156
|
+
line = line.slice(1);
|
|
157
|
+
const body = translate(line);
|
|
158
|
+
rules.push({
|
|
159
|
+
negated,
|
|
160
|
+
dirOnly,
|
|
161
|
+
source: raw,
|
|
162
|
+
regex: new RegExp(anchored ? `^${body}$` : `(?:^|.*/)${body}$`),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return rules;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Is `relPath` (POSIX, relative to the scan root) ignored by `layers`?
|
|
169
|
+
*
|
|
170
|
+
* Layers must be ordered shallowest-first. Evaluation is last-match-wins across
|
|
171
|
+
* the whole ordered set, which gives both of git's precedence rules at once:
|
|
172
|
+
* a later line in one file beats an earlier one, and a deeper `.gitignore`
|
|
173
|
+
* beats a shallower one.
|
|
174
|
+
*
|
|
175
|
+
* Note git's rule that a file under an excluded directory cannot be re-included.
|
|
176
|
+
* The walker gets that for free by never descending into an ignored directory.
|
|
177
|
+
*/
|
|
178
|
+
export function isIgnored(layers, relPath, isDir) {
|
|
179
|
+
// Evaluate each ancestor directory before the path itself. A rule like
|
|
180
|
+
// `.vibe-check/` matches only the directory, yet everything beneath it is
|
|
181
|
+
// ignored too — the walker gets that by not descending, but a direct query
|
|
182
|
+
// for `.vibe-check/report/actions.html` has to reach the same answer, which
|
|
183
|
+
// is what `git check-ignore` reports.
|
|
184
|
+
const segments = relPath.split('/');
|
|
185
|
+
let ignored = false;
|
|
186
|
+
for (let i = 0; i < segments.length; i++) {
|
|
187
|
+
const isLast = i === segments.length - 1;
|
|
188
|
+
const partial = segments.slice(0, i + 1).join('/');
|
|
189
|
+
const verdict = matchPath(layers, partial, isLast ? isDir : true);
|
|
190
|
+
if (verdict !== null)
|
|
191
|
+
ignored = verdict;
|
|
192
|
+
// Git does not allow re-including anything under an excluded directory, so
|
|
193
|
+
// once an ancestor is ignored the answer is settled.
|
|
194
|
+
if (ignored && !isLast)
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
return ignored;
|
|
198
|
+
}
|
|
199
|
+
/** Last-match-wins across all applicable layers, or null if nothing matched. */
|
|
200
|
+
function matchPath(layers, path, isDir) {
|
|
201
|
+
let result = null;
|
|
202
|
+
for (const layer of layers) {
|
|
203
|
+
let subject;
|
|
204
|
+
if (layer.base === '') {
|
|
205
|
+
subject = path;
|
|
206
|
+
}
|
|
207
|
+
else if (path.startsWith(`${layer.base}/`)) {
|
|
208
|
+
subject = path.slice(layer.base.length + 1);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
continue; // this layer governs a different subtree
|
|
212
|
+
}
|
|
213
|
+
for (const rule of layer.rules) {
|
|
214
|
+
if (rule.dirOnly && !isDir)
|
|
215
|
+
continue;
|
|
216
|
+
if (rule.regex.test(subject))
|
|
217
|
+
result = !rule.negated;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=gitignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/lib/gitignore.ts"],"names":[],"mappings":"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"}
|
package/dist/live/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AA2BD,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAK/E;AA+DD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAgB7D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAe7D;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA8C3F;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoD7F;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoD3F"}
|
package/dist/live/index.js
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { gzipByteLength } from '../lib/gzip.js';
|
|
21
21
|
import { matchedTrackers } from '../checks/no-tracking.js';
|
|
22
|
+
import { annotateByName } from '../clause-map.js';
|
|
22
23
|
/**
|
|
23
24
|
* Fetch with a timeout — Workers' default fetch waits 30s+, too slow
|
|
24
25
|
* when iterating 50+ apps in one cron tick.
|
|
@@ -44,6 +45,12 @@ function isSubrequestCapError(err) {
|
|
|
44
45
|
return /too many subrequests|subrequest.*limit/i.test(msg);
|
|
45
46
|
}
|
|
46
47
|
export async function auditLive(input) {
|
|
48
|
+
const report = await auditLiveRaw(input);
|
|
49
|
+
// #166: every live result carries its stable id + clause citations too.
|
|
50
|
+
report.results = report.results.map(annotateByName);
|
|
51
|
+
return report;
|
|
52
|
+
}
|
|
53
|
+
async function auditLiveRaw(input) {
|
|
47
54
|
const checkedAt = Date.now();
|
|
48
55
|
const report = {
|
|
49
56
|
appId: input.appId,
|
package/dist/live/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
export type CheckStatus = 'pass' | 'warn' | 'fail';
|
|
2
|
+
/** Where a check's evidence comes from — the standard's evidence classes
|
|
3
|
+
* (docs/standard/audit-model.md#evidence-classes). */
|
|
4
|
+
export type EvidenceClass = 'configuration' | 'source' | 'process' | 'runtime' | 'documentation';
|
|
5
|
+
/**
|
|
6
|
+
* How much of the cited clause the check proves.
|
|
7
|
+
* full — the check is the clause's automated enforcement; a pass is the clause's evidence.
|
|
8
|
+
* partial — the check proves one observable facet; the rest of the clause needs a
|
|
9
|
+
* manual or human review (see the clause's Verification line).
|
|
10
|
+
*/
|
|
11
|
+
export type CheckAutomation = 'full' | 'partial';
|
|
12
|
+
/** A clickable citation into the public Application Standard. */
|
|
13
|
+
export interface StandardCitation {
|
|
14
|
+
/** Stable clause id, e.g. `PAS-UI-007`. */
|
|
15
|
+
clauseId: string;
|
|
16
|
+
/** Public URL with the clause anchor, e.g. https://docs.proappstore.online/standard/ui/#pas-ui-007 */
|
|
17
|
+
url: string;
|
|
18
|
+
}
|
|
2
19
|
export interface CheckResult {
|
|
3
20
|
/** Short human-readable name. */
|
|
4
21
|
name: string;
|
|
@@ -8,5 +25,16 @@ export interface CheckResult {
|
|
|
8
25
|
detail: string;
|
|
9
26
|
/** Optional actionable advice for fixing a fail/warn. */
|
|
10
27
|
suggestions?: string[];
|
|
28
|
+
/** Stable check id (kebab-case, never renamed), e.g. `no-tracking`. Added by the runner (#166). */
|
|
29
|
+
checkId?: string;
|
|
30
|
+
/** Clauses of the Application Standard this check evidences, with public URLs. */
|
|
31
|
+
citations?: StandardCitation[];
|
|
32
|
+
/** Whether the check is the clause's full automated enforcement or only a partial signal. */
|
|
33
|
+
automation?: CheckAutomation;
|
|
34
|
+
/** The evidence the result rests on: its class and the `detail` text as the observation. */
|
|
35
|
+
evidence?: {
|
|
36
|
+
class: EvidenceClass;
|
|
37
|
+
detail: string;
|
|
38
|
+
};
|
|
11
39
|
}
|
|
12
40
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,MAAM,EAAE,WAAW,CAAC;IACpB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD;uDACuD;AACvD,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,eAAe,CAAC;AAEjG;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,CAAC;AAEjD,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,sGAAsG;IACtG,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,MAAM,EAAE,WAAW,CAAC;IACpB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,6FAA6F;IAC7F,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,4FAA4F;IAC5F,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD"}
|
package/package.json
CHANGED