@proappstore/compliance 0.2.20 → 0.2.22
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 +1 -1
- package/dist/checks/no-brand-overrides.d.ts +10 -9
- package/dist/checks/no-brand-overrides.d.ts.map +1 -1
- package/dist/checks/no-brand-overrides.js +14 -151
- package/dist/checks/no-brand-overrides.js.map +1 -1
- package/dist/checks/permissions.d.ts +10 -0
- package/dist/checks/permissions.d.ts.map +1 -0
- package/dist/checks/permissions.js +42 -0
- package/dist/checks/permissions.js.map +1 -0
- package/dist/clause-map.d.ts.map +1 -1
- package/dist/clause-map.js +3 -1
- package/dist/clause-map.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/permissions.d.ts +40 -0
- package/dist/lib/permissions.d.ts.map +1 -0
- package/dist/lib/permissions.js +120 -0
- package/dist/lib/permissions.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -50,7 +50,7 @@ There is also a separate live-URL audit (`auditLive`, exported from
|
|
|
50
50
|
| `No tracking SDKs` | No reference to any of the known trackers (google-analytics, gtag, amplitude, mixpanel, segment, hotjar, plausible, posthog) — hardened word-boundary matching via the shared `TRACKERS` / `matchedTrackers` | **fail** |
|
|
51
51
|
| `Brand fonts present` | Manrope + Fraunces referenced in CSS or HTML | **fail** |
|
|
52
52
|
| `Brand tokens defined` | Canonical brand CSS custom properties (`--paper`, `--ink`, `--accent`, …) are defined in theme CSS | **fail** |
|
|
53
|
-
| `No brand overrides` | App does not redefine the platform-defined brand tokens
|
|
53
|
+
| `No brand overrides` | App does not redefine the platform-defined brand colour tokens (fonts are not checked: FAS keeps its font rule because its store apps must look consistent with each other; PAS apps are each different and may use their own licensed fonts) | **fail** |
|
|
54
54
|
| `No scroll (games only)` | Games fit the viewport — no document-level scroll (games only; skipped for non-games) | **fail** / warn |
|
|
55
55
|
| `Viewport support` | Declares supported screens + orientations for the storefront coverage badge | **fail** / warn |
|
|
56
56
|
| `No unsafe 100vh` | No bare `100vh` (breaks on iOS Safari with the URL bar visible) | warn |
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import type { FileSource } from '../lib/file-source.js';
|
|
2
2
|
import type { CheckResult } from '../types.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* brand
|
|
4
|
+
* Brand colour tokens come from the template, not the app. This check fails
|
|
5
|
+
* when an app redefines a platform-defined CSS variable (--paper, --ink,
|
|
6
|
+
* --accent, --line, --line-strong, --panel, --muted) outside the canonical
|
|
7
|
+
* theme file; such a redefinition changes the brand colours per app.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
9
|
+
* Fonts are deliberately NOT checked here. The font rule has to stay for FAS
|
|
10
|
+
* (Free App Store), because those store apps need to look consistent with
|
|
11
|
+
* each other. PAS (ProAppStore) doesn't: every app is different, so apps may
|
|
12
|
+
* use their own licensed fonts. The font half of this check was therefore
|
|
13
|
+
* removed from the PAS compliance package only.
|
|
14
14
|
*
|
|
15
15
|
* What's allowed:
|
|
16
16
|
* - Using the variables (color: var(--accent)) — that's the whole point.
|
|
17
|
+
* - Any font-family declaration.
|
|
17
18
|
* - Hardcoded colors for non-brand purposes (highlight states, error
|
|
18
19
|
* red, etc.). We don't try to gate every hex literal — too noisy and
|
|
19
20
|
* too many false positives.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-brand-overrides.d.ts","sourceRoot":"","sources":["../../src/checks/no-brand-overrides.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C
|
|
1
|
+
{"version":3,"file":"no-brand-overrides.d.ts","sourceRoot":"","sources":["../../src/checks/no-brand-overrides.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CA2CpF;AAcD,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,MAAM,EAAE,CAiBV"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { stripCommentsOnly, stripCssComments } from '../lib/strip.js';
|
|
2
2
|
import { extOf, lineNumberAt } from '../lib/source-text.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* brand
|
|
4
|
+
* Brand colour tokens come from the template, not the app. This check fails
|
|
5
|
+
* when an app redefines a platform-defined CSS variable (--paper, --ink,
|
|
6
|
+
* --accent, --line, --line-strong, --panel, --muted) outside the canonical
|
|
7
|
+
* theme file; such a redefinition changes the brand colours per app.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
9
|
+
* Fonts are deliberately NOT checked here. The font rule has to stay for FAS
|
|
10
|
+
* (Free App Store), because those store apps need to look consistent with
|
|
11
|
+
* each other. PAS (ProAppStore) doesn't: every app is different, so apps may
|
|
12
|
+
* use their own licensed fonts. The font half of this check was therefore
|
|
13
|
+
* removed from the PAS compliance package only.
|
|
14
14
|
*
|
|
15
15
|
* What's allowed:
|
|
16
16
|
* - Using the variables (color: var(--accent)) — that's the whole point.
|
|
17
|
+
* - Any font-family declaration.
|
|
17
18
|
* - Hardcoded colors for non-brand purposes (highlight states, error
|
|
18
19
|
* red, etc.). We don't try to gate every hex literal — too noisy and
|
|
19
20
|
* too many false positives.
|
|
@@ -27,11 +28,9 @@ export async function checkNoBrandOverrides(source) {
|
|
|
27
28
|
const raw = await source.read(path);
|
|
28
29
|
if (!raw)
|
|
29
30
|
continue;
|
|
30
|
-
// Strip comment bodies so a
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
// we're auditing. For .css/.scss use the css-only stripper (no `//`
|
|
34
|
-
// syntax at the language level).
|
|
31
|
+
// Strip comment bodies so a commented-out `--accent: red` note doesn't
|
|
32
|
+
// fire. For .css/.scss use the css-only stripper (no `//` syntax at the
|
|
33
|
+
// language level).
|
|
35
34
|
const content = ext === '.css' || ext === '.scss' ? stripCssComments(raw) : stripCommentsOnly(raw);
|
|
36
35
|
// Canonical theme file: the platform's CSS variables ARE defined here.
|
|
37
36
|
// Apps own this file post-scaffold (they can technically modify token
|
|
@@ -50,7 +49,7 @@ export async function checkNoBrandOverrides(source) {
|
|
|
50
49
|
return {
|
|
51
50
|
name: 'No brand overrides',
|
|
52
51
|
status: 'pass',
|
|
53
|
-
detail: 'apps inherit
|
|
52
|
+
detail: 'apps inherit brand colour tokens from the template',
|
|
54
53
|
};
|
|
55
54
|
}
|
|
56
55
|
return {
|
|
@@ -61,7 +60,6 @@ export async function checkNoBrandOverrides(source) {
|
|
|
61
60
|
...issues.slice(0, 5),
|
|
62
61
|
...(issues.length > 5 ? [`...and ${issues.length - 5} more`] : []),
|
|
63
62
|
'Use the template tokens (var(--accent), var(--ink), etc.) instead of redefining them.',
|
|
64
|
-
'Brand fonts are Manrope (body) + Fraunces (display). Stick to those + system / monospace.',
|
|
65
63
|
],
|
|
66
64
|
};
|
|
67
65
|
}
|
|
@@ -75,50 +73,6 @@ const PROTECTED_VARS = new Set([
|
|
|
75
73
|
'--line-strong',
|
|
76
74
|
'--panel',
|
|
77
75
|
]);
|
|
78
|
-
/**
|
|
79
|
-
* Whitelist of font-family declarations we accept. Anything outside this
|
|
80
|
-
* set — for ANY font name not in the brand stack and not a generic /
|
|
81
|
-
* system fallback — flags. The check is case-insensitive.
|
|
82
|
-
*/
|
|
83
|
-
const ALLOWED_FONT_TOKENS = new Set([
|
|
84
|
-
// Brand stack
|
|
85
|
-
'manrope',
|
|
86
|
-
'fraunces',
|
|
87
|
-
// Generic/system fallbacks (CSS keywords)
|
|
88
|
-
'serif',
|
|
89
|
-
'sans-serif',
|
|
90
|
-
'monospace',
|
|
91
|
-
'system-ui',
|
|
92
|
-
'ui-monospace',
|
|
93
|
-
'ui-serif',
|
|
94
|
-
'ui-sans-serif',
|
|
95
|
-
'inherit',
|
|
96
|
-
'initial',
|
|
97
|
-
'unset',
|
|
98
|
-
'revert',
|
|
99
|
-
// Common system stack names — these are aliases, not custom fonts.
|
|
100
|
-
'-apple-system',
|
|
101
|
-
'blinkmacsystemfont',
|
|
102
|
-
'segoe ui',
|
|
103
|
-
'roboto',
|
|
104
|
-
'helvetica',
|
|
105
|
-
'helvetica neue',
|
|
106
|
-
'arial',
|
|
107
|
-
'sf mono',
|
|
108
|
-
'sf pro',
|
|
109
|
-
'menlo',
|
|
110
|
-
'monaco',
|
|
111
|
-
'consolas',
|
|
112
|
-
'liberation mono',
|
|
113
|
-
'courier',
|
|
114
|
-
'courier new',
|
|
115
|
-
'georgia',
|
|
116
|
-
'noto sans',
|
|
117
|
-
'noto color emoji',
|
|
118
|
-
'apple color emoji',
|
|
119
|
-
'segoe ui emoji',
|
|
120
|
-
'segoe ui symbol',
|
|
121
|
-
]);
|
|
122
76
|
export function scanContent(filename, content, opts = {}) {
|
|
123
77
|
const out = [];
|
|
124
78
|
// 1. CSS variable overrides for protected tokens.
|
|
@@ -133,97 +87,6 @@ export function scanContent(filename, content, opts = {}) {
|
|
|
133
87
|
}
|
|
134
88
|
}
|
|
135
89
|
}
|
|
136
|
-
// 2. font-family overrides.
|
|
137
|
-
// Capture the value of every font-family / fontFamily declaration, then
|
|
138
|
-
// extract candidate font names. JSX values can be ternaries
|
|
139
|
-
// (`fontFamily: isFoo ? "Fraunces" : "Manrope"`), so we pull out every
|
|
140
|
-
// quoted string in the value and check each one separately. If there are
|
|
141
|
-
// no quoted strings, the value is treated as a CSS-style comma list
|
|
142
|
-
// (`font-family: Comic Sans, serif`).
|
|
143
|
-
// Patterns:
|
|
144
|
-
// - `font-family:` (kebab-case + colon) — real CSS rule
|
|
145
|
-
// - `fontFamily:` (camelCase + colon) — JSX inline style object property
|
|
146
|
-
// - `fontFamily=` (camelCase + equals) — JSX attribute on a styled component
|
|
147
|
-
// Deliberately NOT matched: `font-family=` (kebab + equals). That form
|
|
148
|
-
// only legitimately appears as an SVG/HTML attribute, and in practice
|
|
149
|
-
// shows up most often inside JS template-literal SVG generators —
|
|
150
|
-
// greedily slicing those values picks up adjacent SVG attributes
|
|
151
|
-
// (`font-size="280"`, `fill="rgba(...)"`) as fake "font candidates"
|
|
152
|
-
// and false-positives. Real SVG-in-JSX with kebab fontFamily is rare
|
|
153
|
-
// enough to skip.
|
|
154
|
-
const fontHeadRe = /(font-family\s*:|fontFamily\s*[:=])/g;
|
|
155
|
-
const quotedRe = /(['"`])([^'"`\n]+)\1/g;
|
|
156
|
-
let m;
|
|
157
|
-
while ((m = fontHeadRe.exec(content)) !== null) {
|
|
158
|
-
const isJsx = m[1].startsWith('fontFamily');
|
|
159
|
-
const start = m.index + m[0].length;
|
|
160
|
-
const value = sliceFontValue(content, start, isJsx);
|
|
161
|
-
const quotedStrings = [...value.matchAll(quotedRe)].map((x) => x[2]);
|
|
162
|
-
const candidates = quotedStrings.length > 0 ? quotedStrings : [value];
|
|
163
|
-
let flagged = false;
|
|
164
|
-
for (const cand of candidates) {
|
|
165
|
-
const tokens = cand
|
|
166
|
-
.split(',')
|
|
167
|
-
.map((t) => t
|
|
168
|
-
.trim()
|
|
169
|
-
.replace(/^["']|["']$/g, '')
|
|
170
|
-
.toLowerCase())
|
|
171
|
-
.filter(Boolean);
|
|
172
|
-
for (const t of tokens) {
|
|
173
|
-
if (!ALLOWED_FONT_TOKENS.has(t)) {
|
|
174
|
-
const line = lineNumberAt(content, m.index);
|
|
175
|
-
out.push(`${filename}:${line} non-brand font "${t}"`);
|
|
176
|
-
flagged = true;
|
|
177
|
-
break;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
if (flagged)
|
|
181
|
-
break;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
90
|
return out;
|
|
185
91
|
}
|
|
186
|
-
/**
|
|
187
|
-
* Walk forward from `start` until we hit the end of the font-family value.
|
|
188
|
-
*
|
|
189
|
-
* CSS values end at `;` or `}` or newline.
|
|
190
|
-
* JSX values end at `}` or at a `,` followed by another identifier+colon
|
|
191
|
-
* (the next style property). Commas inside quoted strings or before
|
|
192
|
-
* non-identifiers (e.g. font fallbacks) are part of the value.
|
|
193
|
-
*/
|
|
194
|
-
function sliceFontValue(content, start, isJsx) {
|
|
195
|
-
let i = start;
|
|
196
|
-
let quote = null;
|
|
197
|
-
while (i < content.length) {
|
|
198
|
-
const c = content[i];
|
|
199
|
-
if (quote) {
|
|
200
|
-
if (c === '\\') {
|
|
201
|
-
i += 2;
|
|
202
|
-
continue;
|
|
203
|
-
}
|
|
204
|
-
if (c === quote)
|
|
205
|
-
quote = null;
|
|
206
|
-
i++;
|
|
207
|
-
continue;
|
|
208
|
-
}
|
|
209
|
-
if (c === '"' || c === "'" || c === '`') {
|
|
210
|
-
quote = c;
|
|
211
|
-
i++;
|
|
212
|
-
continue;
|
|
213
|
-
}
|
|
214
|
-
if (c === '\n' || c === ';' || c === '}')
|
|
215
|
-
break;
|
|
216
|
-
if (isJsx && c === ',') {
|
|
217
|
-
// Lookahead: is this `,` followed by `identifier:`? If yes, end of value.
|
|
218
|
-
let j = i + 1;
|
|
219
|
-
while (j < content.length && (content[j] === ' ' || content[j] === '\t'))
|
|
220
|
-
j++;
|
|
221
|
-
const rest = content.slice(j, j + 64);
|
|
222
|
-
if (/^[A-Za-z_$][\w$]*\s*:/.test(rest))
|
|
223
|
-
break;
|
|
224
|
-
}
|
|
225
|
-
i++;
|
|
226
|
-
}
|
|
227
|
-
return content.slice(start, i);
|
|
228
|
-
}
|
|
229
92
|
//# sourceMappingURL=no-brand-overrides.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-brand-overrides.js","sourceRoot":"","sources":["../../src/checks/no-brand-overrides.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE5D
|
|
1
|
+
{"version":3,"file":"no-brand-overrides.js","sourceRoot":"","sources":["../../src/checks/no-brand-overrides.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FileSource } from '../lib/file-source.js';
|
|
2
|
+
import type { CheckResult } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* #437: every browser permission the app's code uses is declared in mcp.json
|
|
5
|
+
* `permissions`, with a one-line reason, so its storefront listing can say why.
|
|
6
|
+
* The listing shows declared and detected permissions together, so an undeclared
|
|
7
|
+
* one still appears, just without a reason: this is a warning, never a failure.
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkPermissions(source: FileSource): Promise<CheckResult>;
|
|
10
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/checks/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CA0B/E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { detectPermissions, permissionInfo, validatePermissions } from '../lib/permissions.js';
|
|
2
|
+
const NAME = 'Permissions declared';
|
|
3
|
+
/**
|
|
4
|
+
* #437: every browser permission the app's code uses is declared in mcp.json
|
|
5
|
+
* `permissions`, with a one-line reason, so its storefront listing can say why.
|
|
6
|
+
* The listing shows declared and detected permissions together, so an undeclared
|
|
7
|
+
* one still appears, just without a reason: this is a warning, never a failure.
|
|
8
|
+
*/
|
|
9
|
+
export async function checkPermissions(source) {
|
|
10
|
+
const files = [];
|
|
11
|
+
for await (const path of source.list()) {
|
|
12
|
+
const text = await source.read(path);
|
|
13
|
+
if (text !== null)
|
|
14
|
+
files.push([path, text]);
|
|
15
|
+
}
|
|
16
|
+
const detected = detectPermissions(files);
|
|
17
|
+
const raw = await source.read('mcp.json');
|
|
18
|
+
let declaredRaw;
|
|
19
|
+
try {
|
|
20
|
+
declaredRaw = raw ? JSON.parse(raw).permissions : undefined;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
declaredRaw = undefined;
|
|
24
|
+
}
|
|
25
|
+
const validated = validatePermissions(declaredRaw);
|
|
26
|
+
if ('error' in validated) {
|
|
27
|
+
return { name: NAME, status: 'warn', detail: `mcp.json ${validated.error}`, suggestions: ['Declare as "permissions": [{ "id": "microphone", "reason": "Record voice notes" }].'] };
|
|
28
|
+
}
|
|
29
|
+
const declared = new Set(validated.permissions.map((p) => p.id));
|
|
30
|
+
const undeclared = detected.filter((id) => !declared.has(id));
|
|
31
|
+
if (undeclared.length) {
|
|
32
|
+
return {
|
|
33
|
+
name: NAME,
|
|
34
|
+
status: 'warn',
|
|
35
|
+
detail: `uses ${undeclared.map((id) => permissionInfo(id).name.toLowerCase()).join(', ')} without declaring it in mcp.json permissions: the listing shows it with no reason`,
|
|
36
|
+
suggestions: [`Add to mcp.json: "permissions": [${undeclared.map((id) => `{ "id": "${id}", "reason": "…" }`).join(', ')}]`],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const all = [...new Set([...detected, ...declared])];
|
|
40
|
+
return { name: NAME, status: 'pass', detail: all.length ? `declares ${all.join(', ')}` : 'uses no special browser permissions' };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/checks/permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG/F,MAAM,IAAI,GAAG,sBAAsB,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAkB;IACvD,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,WAAoB,CAAC;IACzB,IAAI,CAAC;QAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAA+B,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,WAAW,GAAG,SAAS,CAAC;IAAC,CAAC;IACtI,MAAM,SAAS,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACnD,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,SAAS,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,qFAAqF,CAAC,EAAE,CAAC;IACrL,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,QAAQ,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,oFAAoF;YAC7K,WAAW,EAAE,CAAC,oCAAoC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SAC5H,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,qCAAqC,EAAE,CAAC;AACnI,CAAC"}
|
package/dist/clause-map.d.ts.map
CHANGED
|
@@ -1 +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,oEAAoE;IACpE,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,
|
|
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,oEAAoE;IACpE,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,EA0DtC,CAAC;AAKF,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"}
|
package/dist/clause-map.js
CHANGED
|
@@ -24,7 +24,7 @@ export const CHECKS = [
|
|
|
24
24
|
{ id: 'brand-tokens', name: 'Brand tokens defined', clauses: ['PAS-UI-001', 'PAS-STACK-022'], automation: 'partial', evidenceClass: 'source', scope: 'all',
|
|
25
25
|
limits: 'That the canonical tokens are defined; not that the app uses them instead of hard-coded colours.' },
|
|
26
26
|
{ id: 'no-brand-overrides', name: 'No brand overrides', clauses: ['PAS-UI-001', 'PAS-STACK-022'], automation: 'partial', evidenceClass: 'source', scope: 'all',
|
|
27
|
-
limits: '
|
|
27
|
+
limits: 'Brand colour-token redefinitions only; the banned alias names themselves are caught by the platform design-system lint, not here. Fonts are no longer checked: the font rule has to stay for FAS (Free App Store), because those store apps need to look consistent with each other, but PAS (ProAppStore) doesn\'t — every app is different, so apps may use their own licensed fonts.' },
|
|
28
28
|
{ id: 'no-scroll', name: 'No scroll (games only)', clauses: ['PAS-UI-009'], automation: 'partial', evidenceClass: 'source', scope: 'games',
|
|
29
29
|
limits: 'Games only; static CSS anti-patterns. Real document scroll is measured only in a browser.' },
|
|
30
30
|
{ id: 'viewport-support', name: 'Viewport support', clauses: ['PAS-UI-008'], automation: 'partial', evidenceClass: 'configuration', scope: 'all',
|
|
@@ -53,6 +53,8 @@ export const CHECKS = [
|
|
|
53
53
|
limits: 'Reads mcp.json only: personal data is judged by output column names, and approval proves a review was recorded, not that it was sound. Without the registry it cannot tell a grandfathered action from a new one, so it warns where registration may refuse.' },
|
|
54
54
|
{ id: 'deploy-workflow', name: 'Deploy workflow', clauses: ['PAS-OPS-005', 'PAS-OPS-006'], automation: 'partial', evidenceClass: 'configuration', scope: 'all',
|
|
55
55
|
limits: 'Warn-only (#427): pattern match on .github/workflows for the reusable-pipeline caller and for wrangler, the Workers scripts API, platform Worker names and platform secrets; not what a workflow does at run time.' },
|
|
56
|
+
{ id: 'permissions', name: 'Permissions declared', clauses: ['PAS-OPS-016'], automation: 'partial', evidenceClass: 'source', scope: 'all',
|
|
57
|
+
limits: 'Warn-only (#437): static pattern detection of browser permission APIs in app source, compared with mcp.json permissions; dynamic or minified-away calls are not seen.' },
|
|
56
58
|
// Live-URL audit (auditLive) — a post-publish subset run against the deployed app.
|
|
57
59
|
{ id: 'reachable', name: 'Reachable', clauses: ['PAS-OPS-010'], automation: 'partial', evidenceClass: 'runtime', scope: 'all', live: true,
|
|
58
60
|
limits: 'HTTP 200 from the live URL; not that the app works (that is the post-deploy smoke).' },
|
package/dist/clause-map.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clause-map.js","sourceRoot":"","sources":["../src/clause-map.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAC,MAAM,iBAAiB,GAAG,2CAA2C,CAAC;AAE7E,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK;CACtF,CAAC;AAEF,2EAA2E;AAC3E,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,MAAM,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;IAC5D,OAAO,GAAG,iBAAiB,GAAG,IAAI,KAAK,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;AAClE,CAAC;AAmBD,MAAM,CAAC,MAAM,MAAM,GAAyB;IAC1C,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK;QACpI,MAAM,EAAE,qJAAqJ,EAAE;IACjK,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK;QACjL,MAAM,EAAE,uGAAuG,EAAE;IACnH,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK;QAC3I,MAAM,EAAE,yCAAyC,EAAE;IACrD,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK;QAClK,MAAM,EAAE,oFAAoF,EAAE;IAChG,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK;QACtJ,MAAM,EAAE,6EAA6E,EAAE;IACzF,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK;QACxJ,MAAM,EAAE,kGAAkG,EAAE;IAC9G,EAAE,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK;QAC5J,MAAM,EAAE,
|
|
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
|
@@ -15,6 +15,7 @@ import { checkNoEnvProduction } from './checks/no-env-production.js';
|
|
|
15
15
|
import { checkNoPlaceholders } from './checks/no-placeholders.js';
|
|
16
16
|
import { checkNoScroll } from './checks/no-scroll.js';
|
|
17
17
|
import { checkNoTracking } from './checks/no-tracking.js';
|
|
18
|
+
import { checkPermissions } from './checks/permissions.js';
|
|
18
19
|
import { checkPwaMeta } from './checks/pwa-meta.js';
|
|
19
20
|
import { checkPwaOffline } from './checks/pwa-offline.js';
|
|
20
21
|
import { checkUnsafeVh } from './checks/unsafe-vh.js';
|
|
@@ -24,6 +25,8 @@ import { isGameProject } from './lib/project-type.js';
|
|
|
24
25
|
import { CHECKS, annotate, annotateByName, getCheckMeta, getCheckMetaForName, citationsFor, clauseUrl, complianceMap, STANDARD_BASE_URL } from './clause-map.js';
|
|
25
26
|
import type { CheckResult } from './types.js';
|
|
26
27
|
export type { FileSource } from './lib/file-source.js';
|
|
28
|
+
export { detectPermissions, detectPermissionsInSource, isAppSourcePath, MAX_PERMISSION_REASON, PERMISSION_CATALOGUE, PERMISSION_IDS, permissionInfo, validatePermissions, } from './lib/permissions.js';
|
|
29
|
+
export type { DeclaredPermission, PermissionInfo } from './lib/permissions.js';
|
|
27
30
|
export { actionPersonalData, describeExposure, evaluateUnscoped, isOpenUnscoped, MAX_UNSCOPED_APPROVALS, PERSONAL_DATA_COLUMN_PARTS, personalDataExposure, validateApprovals, } from './lib/unscoped-policy.js';
|
|
28
31
|
export type { PersonalDataExposure, UnscopedApproval, UnscopedEvaluation, UnscopedPolicyTool } from './lib/unscoped-policy.js';
|
|
29
32
|
export type { LiveAuditInput, LiveAuditReport } from './live/index.js';
|
|
@@ -31,7 +34,7 @@ export { auditLive, checkBrandFontsLive, checkBundleSizeLive, checkManifestLive,
|
|
|
31
34
|
export type { CheckAutomation, CheckResult, CheckStatus, EvidenceClass, StandardCitation } from './types.js';
|
|
32
35
|
export type { CheckMeta } from './clause-map.js';
|
|
33
36
|
export { CHECKS, annotate, annotateByName, getCheckMeta, getCheckMetaForName, citationsFor, clauseUrl, complianceMap, STANDARD_BASE_URL };
|
|
34
|
-
export { checkAccessibilityStatic, checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkDeployWorkflow, checkHtmlMeta, checkLicenseMit, checkManifest, checkMaskableIcon, checkMcpUnscoped, checkNoBrandOverrides, checkNoEnvProduction, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPwaMeta, checkPwaOffline, checkUnsafeVh, checkViewportSupport, fsFileSource, isGameProject, mapFileSource, };
|
|
37
|
+
export { checkAccessibilityStatic, checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkDeployWorkflow, checkHtmlMeta, checkLicenseMit, checkManifest, checkMaskableIcon, checkMcpUnscoped, checkNoBrandOverrides, checkNoEnvProduction, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPermissions, checkPwaMeta, checkPwaOffline, checkUnsafeVh, checkViewportSupport, fsFileSource, isGameProject, mapFileSource, };
|
|
35
38
|
/**
|
|
36
39
|
* Runs every compliance check against the source. Two front doors:
|
|
37
40
|
* - `runChecks(repoDir)` — CLI / CI; reads from disk.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,7 @@ import { checkNoEnvProduction } from './checks/no-env-production.js';
|
|
|
15
15
|
import { checkNoPlaceholders } from './checks/no-placeholders.js';
|
|
16
16
|
import { checkNoScroll } from './checks/no-scroll.js';
|
|
17
17
|
import { checkNoTracking } from './checks/no-tracking.js';
|
|
18
|
+
import { checkPermissions } from './checks/permissions.js';
|
|
18
19
|
import { checkPwaMeta } from './checks/pwa-meta.js';
|
|
19
20
|
import { checkPwaOffline } from './checks/pwa-offline.js';
|
|
20
21
|
import { checkUnsafeVh } from './checks/unsafe-vh.js';
|
|
@@ -22,6 +23,8 @@ import { checkViewportSupport } from './checks/viewport-support.js';
|
|
|
22
23
|
import { fsFileSource, mapFileSource } from './lib/file-source.js';
|
|
23
24
|
import { isGameProject } from './lib/project-type.js';
|
|
24
25
|
import { CHECKS, annotate, annotateByName, getCheckMeta, getCheckMetaForName, citationsFor, clauseUrl, complianceMap, STANDARD_BASE_URL } from './clause-map.js';
|
|
26
|
+
// #437: the permission catalogue and detector, shared with the platform and the deploy pipeline.
|
|
27
|
+
export { detectPermissions, detectPermissionsInSource, isAppSourcePath, MAX_PERMISSION_REASON, PERMISSION_CATALOGUE, PERMISSION_IDS, permissionInfo, validatePermissions, } from './lib/permissions.js';
|
|
25
28
|
// #426: the caller_unscoped policy, shared with the platform's registration gate.
|
|
26
29
|
export { actionPersonalData, describeExposure, evaluateUnscoped, isOpenUnscoped, MAX_UNSCOPED_APPROVALS, PERSONAL_DATA_COLUMN_PARTS, personalDataExposure, validateApprovals, } from './lib/unscoped-policy.js';
|
|
27
30
|
// Live-URL audit (used by the compliance audit Worker; runs in
|
|
@@ -29,7 +32,7 @@ export { actionPersonalData, describeExposure, evaluateUnscoped, isOpenUnscoped,
|
|
|
29
32
|
// don't accidentally pull node:fs in via the file-walking checks.
|
|
30
33
|
export { auditLive, checkBrandFontsLive, checkBundleSizeLive, checkManifestLive, checkNoTrackingLive, checkUnsafeVhLive, } from './live/index.js';
|
|
31
34
|
export { CHECKS, annotate, annotateByName, getCheckMeta, getCheckMetaForName, citationsFor, clauseUrl, complianceMap, STANDARD_BASE_URL };
|
|
32
|
-
export { checkAccessibilityStatic, checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkDeployWorkflow, checkHtmlMeta, checkLicenseMit, checkManifest, checkMaskableIcon, checkMcpUnscoped, checkNoBrandOverrides, checkNoEnvProduction, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPwaMeta, checkPwaOffline, checkUnsafeVh, checkViewportSupport, fsFileSource, isGameProject, mapFileSource, };
|
|
35
|
+
export { checkAccessibilityStatic, checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkDeployWorkflow, checkHtmlMeta, checkLicenseMit, checkManifest, checkMaskableIcon, checkMcpUnscoped, checkNoBrandOverrides, checkNoEnvProduction, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPermissions, checkPwaMeta, checkPwaOffline, checkUnsafeVh, checkViewportSupport, fsFileSource, isGameProject, mapFileSource, };
|
|
33
36
|
/**
|
|
34
37
|
* Runs every compliance check against the source. Two front doors:
|
|
35
38
|
* - `runChecks(repoDir)` — CLI / CI; reads from disk.
|
|
@@ -72,6 +75,7 @@ const RUNNERS = [
|
|
|
72
75
|
{ id: 'claude-md-slim', run: checkClaudeMdSlim },
|
|
73
76
|
{ id: 'mcp-unscoped', run: checkMcpUnscoped },
|
|
74
77
|
{ id: 'deploy-workflow', run: checkDeployWorkflow },
|
|
78
|
+
{ id: 'permissions', run: checkPermissions },
|
|
75
79
|
];
|
|
76
80
|
/** Ids of the source-side checks, in output order. */
|
|
77
81
|
export const SOURCE_CHECK_IDS = RUNNERS.map((r) => r.id);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App permissions (#437): what an app will ask the browser for, so a storefront
|
|
3
|
+
* listing can say so up front and the prompt is no surprise.
|
|
4
|
+
*
|
|
5
|
+
* One catalogue and one detector, shared by `pas check` (the `permissions`
|
|
6
|
+
* compliance check), the deploy pipeline (which reports what it detected) and the
|
|
7
|
+
* platform (which validates declarations and serves the listing).
|
|
8
|
+
*/
|
|
9
|
+
export interface PermissionInfo {
|
|
10
|
+
/** Stable id used in mcp.json `permissions` and in the API. */
|
|
11
|
+
id: string;
|
|
12
|
+
/** Plain name shown to users. */
|
|
13
|
+
name: string;
|
|
14
|
+
/** A small icon for the listing and the app card. */
|
|
15
|
+
icon: string;
|
|
16
|
+
}
|
|
17
|
+
export declare const PERMISSION_CATALOGUE: readonly PermissionInfo[];
|
|
18
|
+
export declare const PERMISSION_IDS: readonly string[];
|
|
19
|
+
export declare function permissionInfo(id: string): PermissionInfo | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* The permissions one source file uses. getUserMedia is split by its
|
|
22
|
+
* constraints: `audio` → microphone, `video` → camera, both when it cannot tell.
|
|
23
|
+
*/
|
|
24
|
+
export declare function detectPermissionsInSource(source: string): Set<string>;
|
|
25
|
+
/** Source files an app ships to the browser; tests, configs and tooling excluded. */
|
|
26
|
+
export declare function isAppSourcePath(path: string): boolean;
|
|
27
|
+
/** The catalogue ids detected across an app's sources, in catalogue order. */
|
|
28
|
+
export declare function detectPermissions(files: Iterable<[path: string, source: string]>): string[];
|
|
29
|
+
export interface DeclaredPermission {
|
|
30
|
+
id: string;
|
|
31
|
+
reason?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare const MAX_PERMISSION_REASON = 120;
|
|
34
|
+
/** Validate mcp.json `permissions`. Absent is an empty list. */
|
|
35
|
+
export declare function validatePermissions(raw: unknown): {
|
|
36
|
+
error: string;
|
|
37
|
+
} | {
|
|
38
|
+
permissions: DeclaredPermission[];
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/lib/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,EAAE,EAAE,MAAM,CAAC;IACX,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,oBAAoB,EAAE,SAAS,cAAc,EAiBzD,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAA0C,CAAC;AAEvF,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAErE;AAyBD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAYrE;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKrD;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,CAO3F;AAED,MAAM,WAAW,kBAAkB;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AACnE,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,WAAW,EAAE,kBAAkB,EAAE,CAAA;CAAE,CAiB3G"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App permissions (#437): what an app will ask the browser for, so a storefront
|
|
3
|
+
* listing can say so up front and the prompt is no surprise.
|
|
4
|
+
*
|
|
5
|
+
* One catalogue and one detector, shared by `pas check` (the `permissions`
|
|
6
|
+
* compliance check), the deploy pipeline (which reports what it detected) and the
|
|
7
|
+
* platform (which validates declarations and serves the listing).
|
|
8
|
+
*/
|
|
9
|
+
export const PERMISSION_CATALOGUE = [
|
|
10
|
+
{ id: 'microphone', name: 'Microphone', icon: '🎤' },
|
|
11
|
+
{ id: 'camera', name: 'Camera', icon: '📷' },
|
|
12
|
+
{ id: 'screen-capture', name: 'Screen sharing', icon: '🖥️' },
|
|
13
|
+
{ id: 'location', name: 'Location', icon: '📍' },
|
|
14
|
+
{ id: 'motion', name: 'Motion sensors', icon: '📱' },
|
|
15
|
+
{ id: 'midi', name: 'MIDI devices', icon: '🎹' },
|
|
16
|
+
{ id: 'notifications', name: 'Notifications', icon: '🔔' },
|
|
17
|
+
{ id: 'clipboard', name: 'Read clipboard', icon: '📋' },
|
|
18
|
+
{ id: 'wake-lock', name: 'Keep screen on', icon: '💡' },
|
|
19
|
+
{ id: 'bluetooth', name: 'Bluetooth devices', icon: '🔵' },
|
|
20
|
+
{ id: 'usb', name: 'USB devices', icon: '🔌' },
|
|
21
|
+
{ id: 'serial', name: 'Serial devices', icon: '🔌' },
|
|
22
|
+
{ id: 'hid', name: 'Game controllers & HID devices', icon: '🎮' },
|
|
23
|
+
{ id: 'payment', name: 'Payments', icon: '💳' },
|
|
24
|
+
{ id: 'idle-detection', name: 'Idle detection', icon: '⏱️' },
|
|
25
|
+
{ id: 'local-fonts', name: 'Installed fonts', icon: '🔤' },
|
|
26
|
+
];
|
|
27
|
+
export const PERMISSION_IDS = PERMISSION_CATALOGUE.map((p) => p.id);
|
|
28
|
+
const BY_ID = new Map(PERMISSION_CATALOGUE.map((p) => [p.id, p]));
|
|
29
|
+
export function permissionInfo(id) {
|
|
30
|
+
return BY_ID.get(id);
|
|
31
|
+
}
|
|
32
|
+
/** API usage that implies a permission. Matched on comment-stripped source. */
|
|
33
|
+
const DETECTORS = [
|
|
34
|
+
['microphone', /\b(?:webkit)?SpeechRecognition\b/],
|
|
35
|
+
['screen-capture', /\bgetDisplayMedia\s*\(/],
|
|
36
|
+
['location', /\bnavigator\s*\.\s*geolocation\b/],
|
|
37
|
+
['motion', /\bDevice(?:Motion|Orientation)Event\b|['"`]device(?:motion|orientation)(?:absolute)?['"`]|\bnew\s+(?:Accelerometer|LinearAccelerationSensor|Gyroscope|Magnetometer|AbsoluteOrientationSensor|RelativeOrientationSensor|GravitySensor)\s*\(/],
|
|
38
|
+
['midi', /\brequestMIDIAccess\s*\(/],
|
|
39
|
+
['notifications', /\bNotification\s*\.\s*requestPermission\s*\(|\bpushManager\s*\.\s*subscribe\s*\(|\bnotifications\s*\.\s*subscribe\s*\(/],
|
|
40
|
+
['clipboard', /\bclipboard\s*\.\s*read(?:Text)?\s*\(/],
|
|
41
|
+
['wake-lock', /\bwakeLock\s*\.\s*request\s*\(/],
|
|
42
|
+
['bluetooth', /\bnavigator\s*\.\s*bluetooth\b/],
|
|
43
|
+
['usb', /\bnavigator\s*\.\s*usb\b/],
|
|
44
|
+
['serial', /\bnavigator\s*\.\s*serial\b/],
|
|
45
|
+
['hid', /\bnavigator\s*\.\s*hid\b/],
|
|
46
|
+
['payment', /\bnew\s+PaymentRequest\s*\(/],
|
|
47
|
+
['idle-detection', /\bIdleDetector\b/],
|
|
48
|
+
['local-fonts', /\bqueryLocalFonts\s*\(/],
|
|
49
|
+
];
|
|
50
|
+
function stripComments(src) {
|
|
51
|
+
return src.replace(/\/\*[\s\S]*?\*\//g, ' ').replace(/(^|[^:\\])\/\/[^\n]*/g, '$1');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The permissions one source file uses. getUserMedia is split by its
|
|
55
|
+
* constraints: `audio` → microphone, `video` → camera, both when it cannot tell.
|
|
56
|
+
*/
|
|
57
|
+
export function detectPermissionsInSource(source) {
|
|
58
|
+
const code = stripComments(source);
|
|
59
|
+
const found = new Set();
|
|
60
|
+
for (const [id, re] of DETECTORS)
|
|
61
|
+
if (re.test(code))
|
|
62
|
+
found.add(id);
|
|
63
|
+
for (const m of code.matchAll(/\bgetUserMedia\s*\(([^)]{0,300})/g)) {
|
|
64
|
+
const args = m[1] ?? '';
|
|
65
|
+
const audio = /\baudio\b/.test(args);
|
|
66
|
+
const video = /\bvideo\b/.test(args);
|
|
67
|
+
if (audio || !video)
|
|
68
|
+
found.add('microphone');
|
|
69
|
+
if (video || !audio)
|
|
70
|
+
found.add('camera');
|
|
71
|
+
}
|
|
72
|
+
return found;
|
|
73
|
+
}
|
|
74
|
+
/** Source files an app ships to the browser; tests, configs and tooling excluded. */
|
|
75
|
+
export function isAppSourcePath(path) {
|
|
76
|
+
if (!/\.(?:[cm]?[jt]sx?|vue|svelte|html)$/.test(path))
|
|
77
|
+
return false;
|
|
78
|
+
if (/(?:^|\/)(?:node_modules|dist|build|coverage|e2e|tests?|__tests__|scripts|worker|marketing)\//.test(path))
|
|
79
|
+
return false;
|
|
80
|
+
if (/\.(?:test|spec)\.[cm]?[jt]sx?$/.test(path) || /(?:^|\/)(?:vite|vitest|playwright|eslint|tailwind|postcss)\.config\./.test(path))
|
|
81
|
+
return false;
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
/** The catalogue ids detected across an app's sources, in catalogue order. */
|
|
85
|
+
export function detectPermissions(files) {
|
|
86
|
+
const found = new Set();
|
|
87
|
+
for (const [path, source] of files) {
|
|
88
|
+
if (!isAppSourcePath(path))
|
|
89
|
+
continue;
|
|
90
|
+
for (const id of detectPermissionsInSource(source))
|
|
91
|
+
found.add(id);
|
|
92
|
+
}
|
|
93
|
+
return PERMISSION_IDS.filter((id) => found.has(id));
|
|
94
|
+
}
|
|
95
|
+
export const MAX_PERMISSION_REASON = 120;
|
|
96
|
+
/** Validate mcp.json `permissions`. Absent is an empty list. */
|
|
97
|
+
export function validatePermissions(raw) {
|
|
98
|
+
if (raw === undefined || raw === null)
|
|
99
|
+
return { permissions: [] };
|
|
100
|
+
if (!Array.isArray(raw))
|
|
101
|
+
return { error: 'permissions must be an array of { id, reason? }' };
|
|
102
|
+
const out = [];
|
|
103
|
+
for (const [i, entry] of raw.entries()) {
|
|
104
|
+
const at = `permissions[${i}]`;
|
|
105
|
+
const e = typeof entry === 'string' ? { id: entry } : entry;
|
|
106
|
+
if (!e || typeof e !== 'object' || Array.isArray(e))
|
|
107
|
+
return { error: `${at} must be an object { id, reason? } or an id` };
|
|
108
|
+
const { id, reason } = e;
|
|
109
|
+
if (typeof id !== 'string' || !BY_ID.has(id))
|
|
110
|
+
return { error: `${at}.id must be one of: ${PERMISSION_IDS.join(', ')}` };
|
|
111
|
+
if (out.some((p) => p.id === id))
|
|
112
|
+
return { error: `${at}: ${id} is declared twice` };
|
|
113
|
+
if (reason !== undefined && (typeof reason !== 'string' || !reason.trim() || reason.length > MAX_PERMISSION_REASON || /[\r\n<>]/.test(reason))) {
|
|
114
|
+
return { error: `${at}.reason must be one line of plain text, at most ${MAX_PERMISSION_REASON} characters` };
|
|
115
|
+
}
|
|
116
|
+
out.push(reason === undefined ? { id } : { id, reason: reason.trim() });
|
|
117
|
+
}
|
|
118
|
+
return { permissions: out };
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/lib/permissions.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED