@freeappstore/compliance 0.7.14 → 0.7.15
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/dist/checks/permissions.d.ts +10 -0
- package/dist/checks/permissions.d.ts.map +1 -0
- package/dist/checks/permissions.js +40 -0
- package/dist/checks/permissions.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/permissions.d.ts +27 -0
- package/dist/lib/permissions.d.ts.map +1 -0
- package/dist/lib/permissions.js +157 -0
- package/dist/lib/permissions.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FileSource } from '../lib/file-source.js';
|
|
2
|
+
import type { CheckResult } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Warns when the app uses a browser permission (microphone, camera, location…)
|
|
5
|
+
* that its manifest doesn't declare (#285). The storefront listing shows the
|
|
6
|
+
* declared and detected permissions, so users know what the app will ask for;
|
|
7
|
+
* declaring adds the one-line reason shown next to each.
|
|
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;AAQxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAmC/E"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { detectPermissions, isPermissionId, PERMISSION_IDS, PERMISSIONS_MANIFEST_PATH, readDeclaredPermissions, } from '../lib/permissions.js';
|
|
2
|
+
const NAME = 'Permissions declared';
|
|
3
|
+
/**
|
|
4
|
+
* Warns when the app uses a browser permission (microphone, camera, location…)
|
|
5
|
+
* that its manifest doesn't declare (#285). The storefront listing shows the
|
|
6
|
+
* declared and detected permissions, so users know what the app will ask for;
|
|
7
|
+
* declaring adds the one-line reason shown next to each.
|
|
8
|
+
*/
|
|
9
|
+
export async function checkPermissions(source) {
|
|
10
|
+
const detected = await detectPermissions(source);
|
|
11
|
+
const declared = (await readDeclaredPermissions(source)) ?? [];
|
|
12
|
+
const declaredNames = new Set(declared.map((d) => d.name));
|
|
13
|
+
const unknown = [...declaredNames].filter((n) => !isPermissionId(n));
|
|
14
|
+
const undeclared = [...detected.keys()].filter((id) => !declaredNames.has(id));
|
|
15
|
+
if (unknown.length === 0 && undeclared.length === 0) {
|
|
16
|
+
const used = [...declaredNames];
|
|
17
|
+
return {
|
|
18
|
+
name: NAME,
|
|
19
|
+
status: 'pass',
|
|
20
|
+
detail: used.length ? `asks for: ${used.join(', ')}` : 'asks for no browser permissions',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const problems = [];
|
|
24
|
+
if (undeclared.length) {
|
|
25
|
+
problems.push(`uses ${undeclared.map((id) => `${id} (${detected.get(id)})`).join(', ')} without declaring it`);
|
|
26
|
+
}
|
|
27
|
+
if (unknown.length)
|
|
28
|
+
problems.push(`unknown permission name(s): ${unknown.join(', ')}`);
|
|
29
|
+
const example = undeclared[0] ?? 'microphone';
|
|
30
|
+
return {
|
|
31
|
+
name: NAME,
|
|
32
|
+
status: 'warn',
|
|
33
|
+
detail: problems.join('; '),
|
|
34
|
+
suggestions: [
|
|
35
|
+
`Add them to "permissions" in ${PERMISSIONS_MANIFEST_PATH}, with a one-line reason shown on your listing: "permissions": [{ "name": "${example}", "reason": "…" }]`,
|
|
36
|
+
`Valid names: ${PERMISSION_IDS.join(', ')}.`,
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/checks/permissions.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAG/B,MAAM,IAAI,GAAG,sBAAsB,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAkB;IACvD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,CAAC,MAAM,uBAAuB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,iCAAiC;SACzF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CACX,QAAQ,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAChG,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM;QAAE,QAAQ,CAAC,IAAI,CAAC,+BAA+B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEvF,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;IAC9C,OAAO;QACL,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,WAAW,EAAE;YACX,gCAAgC,yBAAyB,8EAA8E,OAAO,qBAAqB;YACnK,gBAAgB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SAC7C;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ import { checkNoPayments } from './checks/no-payments.js';
|
|
|
13
13
|
import { checkNoPlaceholders } from './checks/no-placeholders.js';
|
|
14
14
|
import { checkNoScroll } from './checks/no-scroll.js';
|
|
15
15
|
import { checkNoTracking } from './checks/no-tracking.js';
|
|
16
|
+
import { checkPermissions } from './checks/permissions.js';
|
|
16
17
|
import { checkMaskableIcon } from './checks/pwa-maskable-icon.js';
|
|
17
18
|
import { checkPwaMeta } from './checks/pwa-meta.js';
|
|
18
19
|
import { checkPwaOffline } from './checks/pwa-offline.js';
|
|
@@ -25,10 +26,12 @@ import { githubTreeSource } from './lib/github-tree-source.js';
|
|
|
25
26
|
import { isGameProject } from './lib/project-type.js';
|
|
26
27
|
import type { CheckResult } from './types.js';
|
|
27
28
|
export type { FileSource } from './lib/file-source.js';
|
|
29
|
+
export type { DeclaredPermission, PermissionId } from './lib/permissions.js';
|
|
30
|
+
export { detectPermissions, PERMISSION_IDS, readDeclaredPermissions, } from './lib/permissions.js';
|
|
28
31
|
export type { LiveAuditInput, LiveAuditReport } from './live/index.js';
|
|
29
32
|
export { auditLive, checkBrandFontsLive, checkBundleSizeLive, checkManifestLive, checkNoTrackingLive, checkUnsafeVhLive, } from './live/index.js';
|
|
30
33
|
export type { CheckResult, CheckStatus } from './types.js';
|
|
31
|
-
export { checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkHtmlMeta, checkLicenseMit, checkManifest, checkMaskableIcon, checkNoBrandOverrides, checkNoCommittedArtifacts, checkNoEnvProduction, checkNoPayments, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPwaMeta, checkPwaOffline, checkStoreLink, checkTextSelectable, checkUnsafeVh, checkViewportSupport, fsFileSource, githubTreeSource, isGameProject, mapFileSource, };
|
|
34
|
+
export { checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkHtmlMeta, checkLicenseMit, checkManifest, checkMaskableIcon, checkNoBrandOverrides, checkNoCommittedArtifacts, checkNoEnvProduction, checkNoPayments, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPermissions, checkPwaMeta, checkPwaOffline, checkStoreLink, checkTextSelectable, checkUnsafeVh, checkViewportSupport, fsFileSource, githubTreeSource, isGameProject, mapFileSource, };
|
|
32
35
|
/**
|
|
33
36
|
* Runs every compliance check against the source. Two front doors:
|
|
34
37
|
* - `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":"AAAA,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,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,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,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,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,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,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,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,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;AAC3D,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,7 @@ import { checkNoPayments } from './checks/no-payments.js';
|
|
|
13
13
|
import { checkNoPlaceholders } from './checks/no-placeholders.js';
|
|
14
14
|
import { checkNoScroll } from './checks/no-scroll.js';
|
|
15
15
|
import { checkNoTracking } from './checks/no-tracking.js';
|
|
16
|
+
import { checkPermissions } from './checks/permissions.js';
|
|
16
17
|
import { checkMaskableIcon } from './checks/pwa-maskable-icon.js';
|
|
17
18
|
import { checkPwaMeta } from './checks/pwa-meta.js';
|
|
18
19
|
import { checkPwaOffline } from './checks/pwa-offline.js';
|
|
@@ -23,11 +24,12 @@ import { checkViewportSupport } from './checks/viewport-support.js';
|
|
|
23
24
|
import { fsFileSource, mapFileSource } from './lib/file-source.js';
|
|
24
25
|
import { githubTreeSource } from './lib/github-tree-source.js';
|
|
25
26
|
import { isGameProject } from './lib/project-type.js';
|
|
27
|
+
export { detectPermissions, PERMISSION_IDS, readDeclaredPermissions, } from './lib/permissions.js';
|
|
26
28
|
// Live-URL audit (used by the compliance audit Worker; runs in
|
|
27
29
|
// browser/Workers env, no filesystem). Separate export path so callers
|
|
28
30
|
// don't accidentally pull node:fs in via the file-walking checks.
|
|
29
31
|
export { auditLive, checkBrandFontsLive, checkBundleSizeLive, checkManifestLive, checkNoTrackingLive, checkUnsafeVhLive, } from './live/index.js';
|
|
30
|
-
export { checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkHtmlMeta, checkLicenseMit, checkManifest, checkMaskableIcon, checkNoBrandOverrides, checkNoCommittedArtifacts, checkNoEnvProduction, checkNoPayments, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPwaMeta, checkPwaOffline, checkStoreLink, checkTextSelectable, checkUnsafeVh, checkViewportSupport, fsFileSource, githubTreeSource, isGameProject, mapFileSource, };
|
|
32
|
+
export { checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkHtmlMeta, checkLicenseMit, checkManifest, checkMaskableIcon, checkNoBrandOverrides, checkNoCommittedArtifacts, checkNoEnvProduction, checkNoPayments, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPermissions, checkPwaMeta, checkPwaOffline, checkStoreLink, checkTextSelectable, checkUnsafeVh, checkViewportSupport, fsFileSource, githubTreeSource, isGameProject, mapFileSource, };
|
|
31
33
|
/**
|
|
32
34
|
* Runs every compliance check against the source. Two front doors:
|
|
33
35
|
* - `runChecks(repoDir)` — CLI / CI; reads from disk.
|
|
@@ -51,6 +53,7 @@ async function runChecksOn(source) {
|
|
|
51
53
|
checkNoPlaceholders(source),
|
|
52
54
|
checkNoTracking(source),
|
|
53
55
|
checkNoPayments(source),
|
|
56
|
+
checkPermissions(source),
|
|
54
57
|
checkBrandFonts(source),
|
|
55
58
|
checkBrandTokens(source),
|
|
56
59
|
checkNoBrandOverrides(source),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,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,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,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,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,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,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,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,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAKtD,+DAA+D;AAC/D,uEAAuE;AACvE,kEAAkE;AAClE,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,aAAa,GACd,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,OAAO,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAA0B;IACjE,OAAO,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAkB;IAC3C,OAAO,OAAO,CAAC,GAAG,CAAC;QACjB,eAAe,CAAC,MAAM,CAAC;QACvB,yBAAyB,CAAC,MAAM,CAAC;QACjC,oBAAoB,CAAC,MAAM,CAAC;QAC5B,mBAAmB,CAAC,MAAM,CAAC;QAC3B,eAAe,CAAC,MAAM,CAAC;QACvB,eAAe,CAAC,MAAM,CAAC;QACvB,eAAe,CAAC,MAAM,CAAC;QACvB,gBAAgB,CAAC,MAAM,CAAC;QACxB,qBAAqB,CAAC,MAAM,CAAC;QAC7B,aAAa,CAAC,MAAM,CAAC;QACrB,oBAAoB,CAAC,MAAM,CAAC;QAC5B,aAAa,CAAC,MAAM,CAAC;QACrB,aAAa,CAAC,MAAM,CAAC;QACrB,YAAY,CAAC,MAAM,CAAC;QACpB,eAAe,CAAC,MAAM,CAAC;QACvB,aAAa,CAAC,MAAM,CAAC;QACrB,iBAAiB,CAAC,MAAM,CAAC;QACzB,cAAc,CAAC,MAAM,CAAC;QACtB,mBAAmB,CAAC,MAAM,CAAC;QAC3B,aAAa,CAAC,MAAM,CAAC;QACrB,eAAe,CAAC,MAAM,CAAC;QACvB,iBAAiB,CAAC,MAAM,CAAC;KAC1B,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { FileSource } from './file-source.js';
|
|
2
|
+
/**
|
|
3
|
+
* Browser permissions an app can ask the user for, as shown on its storefront
|
|
4
|
+
* listing (#285). Only APIs that make the browser prompt are listed: silent
|
|
5
|
+
* features (fullscreen, wake lock, clipboard write) need no warning.
|
|
6
|
+
*
|
|
7
|
+
* The storefront's labels and icons for these ids live in
|
|
8
|
+
* sites/storefront/build.js PERMISSION_INFO; a test keeps the two in sync.
|
|
9
|
+
*/
|
|
10
|
+
export declare const PERMISSION_IDS: readonly ["microphone", "camera", "location", "motion", "notifications", "midi", "clipboard", "screen", "bluetooth", "usb", "serial", "hid"];
|
|
11
|
+
export type PermissionId = (typeof PERMISSION_IDS)[number];
|
|
12
|
+
export interface DeclaredPermission {
|
|
13
|
+
name: string;
|
|
14
|
+
reason?: string;
|
|
15
|
+
}
|
|
16
|
+
/** Where creators declare permissions: a `permissions` member in the web app manifest. */
|
|
17
|
+
export declare const PERMISSIONS_MANIFEST_PATH = "web/public/manifest.json";
|
|
18
|
+
/** Permissions the app's source uses, each with the first file it was seen in. */
|
|
19
|
+
export declare function detectPermissions(source: FileSource): Promise<Map<PermissionId, string>>;
|
|
20
|
+
/**
|
|
21
|
+
* Permissions declared in the manifest's `permissions` member. Entries are
|
|
22
|
+
* either "camera" or { "name": "microphone", "reason": "live audio effects" }.
|
|
23
|
+
* Returns null when the manifest is missing or unreadable.
|
|
24
|
+
*/
|
|
25
|
+
export declare function readDeclaredPermissions(source: FileSource): Promise<DeclaredPermission[] | null>;
|
|
26
|
+
export declare function isPermissionId(name: string): name is PermissionId;
|
|
27
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/lib/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,8IAajB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,0FAA0F;AAC1F,eAAO,MAAM,yBAAyB,6BAA6B,CAAC;AA8EpE,kFAAkF;AAClF,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAgB9F;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAuBtC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,YAAY,CAEjE"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { stripCommentsForExt } from './strip.js';
|
|
2
|
+
/**
|
|
3
|
+
* Browser permissions an app can ask the user for, as shown on its storefront
|
|
4
|
+
* listing (#285). Only APIs that make the browser prompt are listed: silent
|
|
5
|
+
* features (fullscreen, wake lock, clipboard write) need no warning.
|
|
6
|
+
*
|
|
7
|
+
* The storefront's labels and icons for these ids live in
|
|
8
|
+
* sites/storefront/build.js PERMISSION_INFO; a test keeps the two in sync.
|
|
9
|
+
*/
|
|
10
|
+
export const PERMISSION_IDS = [
|
|
11
|
+
'microphone',
|
|
12
|
+
'camera',
|
|
13
|
+
'location',
|
|
14
|
+
'motion',
|
|
15
|
+
'notifications',
|
|
16
|
+
'midi',
|
|
17
|
+
'clipboard',
|
|
18
|
+
'screen',
|
|
19
|
+
'bluetooth',
|
|
20
|
+
'usb',
|
|
21
|
+
'serial',
|
|
22
|
+
'hid',
|
|
23
|
+
];
|
|
24
|
+
/** Where creators declare permissions: a `permissions` member in the web app manifest. */
|
|
25
|
+
export const PERMISSIONS_MANIFEST_PATH = 'web/public/manifest.json';
|
|
26
|
+
// Patterns run on app SOURCE, not the built bundle: initApp() always
|
|
27
|
+
// constructs the SDK's push client, so every SDK bundle contains
|
|
28
|
+
// Notification.requestPermission whether or not the app uses it.
|
|
29
|
+
const PATTERNS = {
|
|
30
|
+
location: [/\bgeolocation\s*\.\s*(?:getCurrentPosition|watchPosition)\s*\(/],
|
|
31
|
+
motion: [
|
|
32
|
+
/\bDevice(?:Orientation|Motion)Event\b/,
|
|
33
|
+
/['"`]device(?:orientation|orientationabsolute|motion)['"`]/,
|
|
34
|
+
/\bnew\s+(?:Accelerometer|Gyroscope|Magnetometer|AbsoluteOrientationSensor|RelativeOrientationSensor|LinearAccelerationSensor|GravitySensor)\s*\(/,
|
|
35
|
+
],
|
|
36
|
+
notifications: [
|
|
37
|
+
/\bNotification\s*\.\s*requestPermission\s*\(/,
|
|
38
|
+
/\bnew\s+Notification\s*\(/,
|
|
39
|
+
/\bpushManager\s*\.\s*subscribe\s*\(/,
|
|
40
|
+
// The SDK's push client: fas.push.subscribe() / .schedule().
|
|
41
|
+
/\.push\s*\.\s*(?:subscribe|schedule)\s*\(/,
|
|
42
|
+
],
|
|
43
|
+
midi: [/\brequestMIDIAccess\s*\(/],
|
|
44
|
+
clipboard: [/\bclipboard\s*\.\s*(?:readText|read)\s*\(/],
|
|
45
|
+
screen: [/\bgetDisplayMedia\s*\(/],
|
|
46
|
+
bluetooth: [/\bnavigator\s*\.\s*bluetooth\b/],
|
|
47
|
+
usb: [/\bnavigator\s*\.\s*usb\b/],
|
|
48
|
+
serial: [/\bnavigator\s*\.\s*serial\b/],
|
|
49
|
+
hid: [/\bnavigator\s*\.\s*hid\b/],
|
|
50
|
+
};
|
|
51
|
+
const SPEECH = [/\b(?:webkit)?SpeechRecognition\b/, /\buseVoiceInput\s*\(/];
|
|
52
|
+
const GET_USER_MEDIA = /\bgetUserMedia\s*\(/g;
|
|
53
|
+
const SCAN_EXTS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.html', '.vue', '.svelte']);
|
|
54
|
+
function isTestFile(path) {
|
|
55
|
+
return (/(?:^|\/)(?:test|tests|__tests__|e2e)\//.test(path) ||
|
|
56
|
+
/\.(?:test|spec)\.[cm]?[jt]sx?$/.test(path));
|
|
57
|
+
}
|
|
58
|
+
/** The argument text of the call whose "(" ends at `open`, up to its balanced ")". */
|
|
59
|
+
function callArgs(content, open) {
|
|
60
|
+
let depth = 0;
|
|
61
|
+
for (let i = open; i < content.length && i < open + 2000; i++) {
|
|
62
|
+
if (content[i] === '(')
|
|
63
|
+
depth++;
|
|
64
|
+
else if (content[i] === ')' && --depth === 0)
|
|
65
|
+
return content.slice(open + 1, i);
|
|
66
|
+
}
|
|
67
|
+
return content.slice(open + 1, open + 400);
|
|
68
|
+
}
|
|
69
|
+
// `audio: false` / `video: false` asks for nothing.
|
|
70
|
+
const ASKS_AUDIO = /\baudio\b(?!\s*:\s*false\b)/;
|
|
71
|
+
const ASKS_VIDEO = /\b(?:video\b(?!\s*:\s*false\b)|facingMode\b)/;
|
|
72
|
+
/** getUserMedia → microphone and/or camera, from each call's constraints. */
|
|
73
|
+
function mediaPermissions(content) {
|
|
74
|
+
const found = new Set();
|
|
75
|
+
for (const m of content.matchAll(GET_USER_MEDIA)) {
|
|
76
|
+
const args = callArgs(content, m.index + m[0].length - 1);
|
|
77
|
+
const audio = ASKS_AUDIO.test(args);
|
|
78
|
+
const video = ASKS_VIDEO.test(args);
|
|
79
|
+
if (audio)
|
|
80
|
+
found.add('microphone');
|
|
81
|
+
if (video)
|
|
82
|
+
found.add('camera');
|
|
83
|
+
if (!audio && !video) {
|
|
84
|
+
// Constraints built elsewhere (a variable): fall back to the whole file.
|
|
85
|
+
const fileAudio = /\baudio\s*:(?!\s*false\b)/.test(content);
|
|
86
|
+
const fileVideo = /\bvideo\s*:(?!\s*false\b)|\bfacingMode\b/.test(content);
|
|
87
|
+
if (fileAudio)
|
|
88
|
+
found.add('microphone');
|
|
89
|
+
if (fileVideo)
|
|
90
|
+
found.add('camera');
|
|
91
|
+
if (!fileAudio && !fileVideo) {
|
|
92
|
+
found.add('microphone');
|
|
93
|
+
found.add('camera');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return [...found];
|
|
98
|
+
}
|
|
99
|
+
/** Permissions the app's source uses, each with the first file it was seen in. */
|
|
100
|
+
export async function detectPermissions(source) {
|
|
101
|
+
const found = new Map();
|
|
102
|
+
for await (const path of source.list()) {
|
|
103
|
+
const ext = path.slice(path.lastIndexOf('.')).toLowerCase();
|
|
104
|
+
if (!SCAN_EXTS.has(ext) || isTestFile(path))
|
|
105
|
+
continue;
|
|
106
|
+
const raw = await source.read(path);
|
|
107
|
+
if (!raw)
|
|
108
|
+
continue;
|
|
109
|
+
const content = stripCommentsForExt(raw, ext);
|
|
110
|
+
const hits = mediaPermissions(content);
|
|
111
|
+
if (SPEECH.some((re) => re.test(content)))
|
|
112
|
+
hits.push('microphone');
|
|
113
|
+
for (const [id, patterns] of Object.entries(PATTERNS)) {
|
|
114
|
+
if (patterns.some((re) => re.test(content)))
|
|
115
|
+
hits.push(id);
|
|
116
|
+
}
|
|
117
|
+
for (const id of hits)
|
|
118
|
+
if (!found.has(id))
|
|
119
|
+
found.set(id, path);
|
|
120
|
+
}
|
|
121
|
+
return found;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Permissions declared in the manifest's `permissions` member. Entries are
|
|
125
|
+
* either "camera" or { "name": "microphone", "reason": "live audio effects" }.
|
|
126
|
+
* Returns null when the manifest is missing or unreadable.
|
|
127
|
+
*/
|
|
128
|
+
export async function readDeclaredPermissions(source) {
|
|
129
|
+
const raw = await source.read(PERMISSIONS_MANIFEST_PATH);
|
|
130
|
+
if (raw === null)
|
|
131
|
+
return null;
|
|
132
|
+
let manifest;
|
|
133
|
+
try {
|
|
134
|
+
manifest = JSON.parse(raw);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const list = manifest?.permissions;
|
|
140
|
+
if (!Array.isArray(list))
|
|
141
|
+
return [];
|
|
142
|
+
const out = [];
|
|
143
|
+
for (const entry of list) {
|
|
144
|
+
if (typeof entry === 'string')
|
|
145
|
+
out.push({ name: entry });
|
|
146
|
+
else if (entry && typeof entry === 'object' && typeof entry.name === 'string') {
|
|
147
|
+
out.push(typeof entry.reason === 'string' && entry.reason.trim()
|
|
148
|
+
? { name: entry.name, reason: entry.reason.trim() }
|
|
149
|
+
: { name: entry.name });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return out;
|
|
153
|
+
}
|
|
154
|
+
export function isPermissionId(name) {
|
|
155
|
+
return PERMISSION_IDS.includes(name);
|
|
156
|
+
}
|
|
157
|
+
//# 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