@freegamestore/compliance 0.8.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/dist/checks/audio-mute-respect.d.ts.map +1 -1
  2. package/dist/checks/audio-mute-respect.js +1 -5
  3. package/dist/checks/audio-mute-respect.js.map +1 -1
  4. package/dist/checks/brand-fonts.d.ts.map +1 -1
  5. package/dist/checks/brand-fonts.js +1 -5
  6. package/dist/checks/brand-fonts.js.map +1 -1
  7. package/dist/checks/claude-md-slim.js +1 -1
  8. package/dist/checks/claude-md-slim.js.map +1 -1
  9. package/dist/checks/license-mit.d.ts.map +1 -1
  10. package/dist/checks/license-mit.js +8 -1
  11. package/dist/checks/license-mit.js.map +1 -1
  12. package/dist/checks/no-any-types.d.ts.map +1 -1
  13. package/dist/checks/no-any-types.js +1 -5
  14. package/dist/checks/no-any-types.js.map +1 -1
  15. package/dist/checks/no-brand-overrides.d.ts.map +1 -1
  16. package/dist/checks/no-brand-overrides.js +34 -8
  17. package/dist/checks/no-brand-overrides.js.map +1 -1
  18. package/dist/checks/no-console-log.d.ts.map +1 -1
  19. package/dist/checks/no-console-log.js +1 -5
  20. package/dist/checks/no-console-log.js.map +1 -1
  21. package/dist/checks/no-cookies.d.ts.map +1 -1
  22. package/dist/checks/no-cookies.js +1 -5
  23. package/dist/checks/no-cookies.js.map +1 -1
  24. package/dist/checks/no-excessive-inline-styles.d.ts.map +1 -1
  25. package/dist/checks/no-excessive-inline-styles.js +1 -5
  26. package/dist/checks/no-excessive-inline-styles.js.map +1 -1
  27. package/dist/checks/no-external-fetch.d.ts.map +1 -1
  28. package/dist/checks/no-external-fetch.js +1 -5
  29. package/dist/checks/no-external-fetch.js.map +1 -1
  30. package/dist/checks/no-external-scripts.d.ts +2 -2
  31. package/dist/checks/no-external-scripts.d.ts.map +1 -1
  32. package/dist/checks/no-external-scripts.js +26 -12
  33. package/dist/checks/no-external-scripts.js.map +1 -1
  34. package/dist/checks/no-hardcoded-colors.d.ts.map +1 -1
  35. package/dist/checks/no-hardcoded-colors.js +1 -5
  36. package/dist/checks/no-hardcoded-colors.js.map +1 -1
  37. package/dist/checks/no-page-policy.d.ts +17 -0
  38. package/dist/checks/no-page-policy.d.ts.map +1 -0
  39. package/dist/checks/no-page-policy.js +45 -0
  40. package/dist/checks/no-page-policy.js.map +1 -0
  41. package/dist/checks/no-payment-capabilities.d.ts +4 -0
  42. package/dist/checks/no-payment-capabilities.d.ts.map +1 -0
  43. package/dist/checks/no-payment-capabilities.js +129 -0
  44. package/dist/checks/no-payment-capabilities.js.map +1 -0
  45. package/dist/checks/no-payment-sdk.d.ts.map +1 -1
  46. package/dist/checks/no-payment-sdk.js +1 -5
  47. package/dist/checks/no-payment-sdk.js.map +1 -1
  48. package/dist/checks/no-placeholders.d.ts.map +1 -1
  49. package/dist/checks/no-placeholders.js +1 -5
  50. package/dist/checks/no-placeholders.js.map +1 -1
  51. package/dist/checks/no-scroll.d.ts.map +1 -1
  52. package/dist/checks/no-scroll.js +1 -5
  53. package/dist/checks/no-scroll.js.map +1 -1
  54. package/dist/checks/no-tracking.d.ts.map +1 -1
  55. package/dist/checks/no-tracking.js +19 -6
  56. package/dist/checks/no-tracking.js.map +1 -1
  57. package/dist/checks/permissions-declared.d.ts +13 -0
  58. package/dist/checks/permissions-declared.d.ts.map +1 -0
  59. package/dist/checks/permissions-declared.js +43 -0
  60. package/dist/checks/permissions-declared.js.map +1 -0
  61. package/dist/checks/pwa-offline.d.ts.map +1 -1
  62. package/dist/checks/pwa-offline.js +10 -4
  63. package/dist/checks/pwa-offline.js.map +1 -1
  64. package/dist/checks/seo-metadata.d.ts +5 -0
  65. package/dist/checks/seo-metadata.d.ts.map +1 -0
  66. package/dist/checks/seo-metadata.js +23 -0
  67. package/dist/checks/seo-metadata.js.map +1 -0
  68. package/dist/checks/unsafe-vh.d.ts.map +1 -1
  69. package/dist/checks/unsafe-vh.js +1 -5
  70. package/dist/checks/unsafe-vh.js.map +1 -1
  71. package/dist/checks/uses-game-sdk.d.ts.map +1 -1
  72. package/dist/checks/uses-game-sdk.js +1 -5
  73. package/dist/checks/uses-game-sdk.js.map +1 -1
  74. package/dist/checks/uses-localstorage.d.ts +7 -3
  75. package/dist/checks/uses-localstorage.d.ts.map +1 -1
  76. package/dist/checks/uses-localstorage.js +12 -14
  77. package/dist/checks/uses-localstorage.js.map +1 -1
  78. package/dist/game-deploy-workflow.d.ts +12 -0
  79. package/dist/game-deploy-workflow.d.ts.map +1 -0
  80. package/dist/game-deploy-workflow.js +34 -0
  81. package/dist/game-deploy-workflow.js.map +1 -0
  82. package/dist/game-metadata.d.ts +60 -0
  83. package/dist/game-metadata.d.ts.map +1 -0
  84. package/dist/game-metadata.js +194 -0
  85. package/dist/game-metadata.js.map +1 -0
  86. package/dist/index.d.ts +15 -10
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +19 -60
  89. package/dist/index.js.map +1 -1
  90. package/dist/lib/file-source.d.ts +5 -10
  91. package/dist/lib/file-source.d.ts.map +1 -1
  92. package/dist/lib/file-source.js +7 -80
  93. package/dist/lib/file-source.js.map +1 -1
  94. package/dist/lib/fs-file-source.d.ts +21 -0
  95. package/dist/lib/fs-file-source.d.ts.map +1 -0
  96. package/dist/lib/fs-file-source.js +88 -0
  97. package/dist/lib/fs-file-source.js.map +1 -0
  98. package/dist/lib/inline-manifest.d.ts.map +1 -1
  99. package/dist/lib/inline-manifest.js +14 -59
  100. package/dist/lib/inline-manifest.js.map +1 -1
  101. package/dist/lib/path.d.ts +11 -0
  102. package/dist/lib/path.d.ts.map +1 -0
  103. package/dist/lib/path.js +15 -0
  104. package/dist/lib/path.js.map +1 -0
  105. package/dist/lib/permissions.d.ts +44 -0
  106. package/dist/lib/permissions.d.ts.map +1 -0
  107. package/dist/lib/permissions.js +132 -0
  108. package/dist/lib/permissions.js.map +1 -0
  109. package/dist/lib/strip.d.ts.map +1 -1
  110. package/dist/lib/strip.js +20 -26
  111. package/dist/lib/strip.js.map +1 -1
  112. package/dist/live/index.js +1 -1
  113. package/dist/live/index.js.map +1 -1
  114. package/dist/run-checks.d.ts +18 -0
  115. package/dist/run-checks.d.ts.map +1 -0
  116. package/dist/run-checks.js +112 -0
  117. package/dist/run-checks.js.map +1 -0
  118. package/dist/worker.d.ts +60 -0
  119. package/dist/worker.d.ts.map +1 -0
  120. package/dist/worker.js +58 -0
  121. package/dist/worker.js.map +1 -0
  122. package/package.json +7 -2
package/dist/index.js CHANGED
@@ -19,16 +19,20 @@ import { checkNoExcessiveInlineStyles } from './checks/no-excessive-inline-style
19
19
  import { checkNoExternalFetch } from './checks/no-external-fetch.js';
20
20
  import { checkNoExternalScripts } from './checks/no-external-scripts.js';
21
21
  import { checkNoHardcodedColors } from './checks/no-hardcoded-colors.js';
22
+ import { checkNoPagePolicy } from './checks/no-page-policy.js';
23
+ import { checkNoPaymentCapabilities } from './checks/no-payment-capabilities.js';
22
24
  import { checkNoPaymentSdk } from './checks/no-payment-sdk.js';
23
25
  import { checkNoPlaceholders } from './checks/no-placeholders.js';
24
26
  import { checkNoScroll } from './checks/no-scroll.js';
25
27
  import { checkNoTracking } from './checks/no-tracking.js';
28
+ import { checkPermissionsDeclared } from './checks/permissions-declared.js';
26
29
  import { checkPwaIcons } from './checks/pwa-icons.js';
27
30
  import { checkMaskableIcon } from './checks/pwa-maskable-icon.js';
28
31
  import { checkPwaMeta } from './checks/pwa-meta.js';
29
32
  import { checkPwaOffline } from './checks/pwa-offline.js';
30
33
  import { checkReactStrictMode } from './checks/react-strict-mode.js';
31
34
  import { checkSdkVersion } from './checks/sdk-version.js';
35
+ import { checkSeoMetadata } from './checks/seo-metadata.js';
32
36
  import { checkStoreLink } from './checks/store-link.js';
33
37
  import { checkTechVersions } from './checks/tech-versions.js';
34
38
  import { checkTypescriptStrict } from './checks/typescript-strict.js';
@@ -36,74 +40,29 @@ import { checkUnsafeVh } from './checks/unsafe-vh.js';
36
40
  import { checkUsesGameSdk } from './checks/uses-game-sdk.js';
37
41
  import { checkUsesLocalStorage } from './checks/uses-localstorage.js';
38
42
  import { checkViewportSupport } from './checks/viewport-support.js';
39
- import { fsFileSource, mapFileSource } from './lib/file-source.js';
43
+ import { mapFileSource } from './lib/file-source.js';
44
+ import { fsFileSource } from './lib/fs-file-source.js';
40
45
  import { isGameProject } from './lib/project-type.js';
46
+ import { runChecksFromFiles, runChecksOn } from './run-checks.js';
47
+ export { GAME_CI_WORKFLOW, GAME_DEPLOY_WORKFLOW } from './game-deploy-workflow.js';
48
+ // Game metadata: shared categories and viewports across CLI, console, admin, auditor.
49
+ export { GAME_CATEGORIES, GAME_CATEGORY_LABELS, getCategoryByLabel, getCategoryBySlug, getCategorySlugs, isValidCategorySlug, normalizeCategorySlug, REFERENCE_VIEWPORTS, } from './game-metadata.js';
50
+ export { detectPermissions, detectPermissionsInText, PERMISSION_IDS, PERMISSIONS, parseDeclaredPermissions, } from './lib/permissions.js';
41
51
  // Live-URL audit (used by the compliance audit Worker; runs in
42
52
  // browser/Workers env, no filesystem). Separate export path so callers
43
53
  // don't accidentally pull node:fs in via the file-walking checks.
44
54
  export { auditLive, checkBrandFontsLive, checkBundleSizeLive, checkManifestLive, checkNoTrackingLive, checkUnsafeVhLive, } from './live/index.js';
45
- export { checkAudioMuteRespect, checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkDeployWorkflow, checkGameNaming, checkGitignoreComplete, checkHtmlMeta, checkLicenseMit, checkManifest, checkMaskableIcon, checkNoAnyTypes, checkNoBrandOverrides, checkNoConsoleLog, checkNoCookies, checkNoEnvProduction, checkNoExcessiveInlineStyles, checkNoExternalFetch, checkNoExternalScripts, checkNoHardcodedColors, checkNoPaymentSdk, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPwaIcons, checkPwaMeta, checkPwaOffline, checkReactStrictMode, checkSdkVersion, checkStoreLink, checkTechVersions, checkTypescriptStrict, checkUnsafeVh, checkUsesGameSdk, checkUsesLocalStorage, checkViewportSupport, fsFileSource, isGameProject, mapFileSource, };
55
+ // Check battery + the Map front door live in run-checks.ts (node-free,
56
+ // also re-exported from ./worker for Workers). Re-exported here so
57
+ // existing CLI/back-end importers keep their single import site.
58
+ export { checkAudioMuteRespect, checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkDeployWorkflow, checkGameNaming, checkGitignoreComplete, checkHtmlMeta, checkLicenseMit, checkManifest, checkMaskableIcon, checkNoAnyTypes, checkNoBrandOverrides, checkNoConsoleLog, checkNoCookies, checkNoEnvProduction, checkNoExcessiveInlineStyles, checkNoExternalFetch, checkNoExternalScripts, checkNoHardcodedColors, checkNoPagePolicy, checkNoPaymentCapabilities, checkNoPaymentSdk, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPermissionsDeclared, checkPwaIcons, checkPwaMeta, checkPwaOffline, checkReactStrictMode, checkSdkVersion, checkSeoMetadata, checkStoreLink, checkTechVersions, checkTypescriptStrict, checkUnsafeVh, checkUsesGameSdk, checkUsesLocalStorage, checkViewportSupport, fsFileSource, isGameProject, mapFileSource, runChecksFromFiles, runChecksOn, };
46
59
  /**
47
- * Runs every compliance check against the source. Two front doors:
48
- * - `runChecks(repoDir)` — CLI / CI; reads from disk.
49
- * - `runChecksFromFiles(map)` — VibeCode agent; reads from a Map.
50
- *
51
- * Both call the same underlying check functions via the FileSource
52
- * abstraction, so rules stay in one place. Results are returned in a
53
- * stable order so callers can render predictable output.
60
+ * On-disk front door — CLI / CI. Reads from a real directory via
61
+ * fsFileSource (node:fs). The Map front door (`runChecksFromFiles`)
62
+ * shares the same check battery through the FileSource abstraction, so
63
+ * rules stay in one place regardless of where the files come from.
54
64
  */
55
65
  export async function runChecks(repoDir) {
56
66
  return runChecksOn(fsFileSource(repoDir));
57
67
  }
58
- export async function runChecksFromFiles(files) {
59
- return runChecksOn(mapFileSource(files));
60
- }
61
- async function runChecksOn(source) {
62
- return Promise.all([
63
- // Platform rules (hard fail)
64
- checkLicenseMit(source),
65
- checkNoEnvProduction(source),
66
- checkNoPlaceholders(source),
67
- checkNoTracking(source),
68
- checkNoPaymentSdk(source),
69
- checkNoCookies(source),
70
- checkNoExternalScripts(source),
71
- checkNoExternalFetch(source),
72
- // Brand & design
73
- checkAudioMuteRespect(source),
74
- checkBrandFonts(source),
75
- checkBrandTokens(source),
76
- checkNoBrandOverrides(source),
77
- checkDarkMode(source),
78
- // Layout & viewport
79
- checkNoScroll(source),
80
- checkViewportSupport(source),
81
- checkUnsafeVh(source),
82
- // HTML & PWA
83
- checkHtmlMeta(source),
84
- checkPwaMeta(source),
85
- checkPwaOffline(source),
86
- checkManifest(source),
87
- checkMaskableIcon(source),
88
- checkPwaIcons(source),
89
- // SDK & code quality
90
- checkUsesGameSdk(source),
91
- checkTypescriptStrict(source),
92
- checkStoreLink(source),
93
- checkBundleSize(source),
94
- checkClaudeMdSlim(source),
95
- // Warnings (guidelines, not gates)
96
- checkSdkVersion(source),
97
- checkTechVersions(source),
98
- checkNoAnyTypes(source),
99
- checkNoConsoleLog(source),
100
- checkUsesLocalStorage(source),
101
- checkGameNaming(source),
102
- checkNoHardcodedColors(source),
103
- checkNoExcessiveInlineStyles(source),
104
- checkDeployWorkflow(source),
105
- checkGitignoreComplete(source),
106
- checkReactStrictMode(source),
107
- ]);
108
- }
109
68
  //# 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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -26,17 +26,12 @@ export interface FileSource {
26
26
  listDir?(dir: string): Promise<string[] | null>;
27
27
  }
28
28
  /**
29
- * Filesystem-backed FileSource — used by the CLI and CI. Walks the
30
- * directory tree once on first list() iteration; uses node:fs for
31
- * read/readBytes/listDir.
32
- *
33
- * Paths containing `..` segments are rejected — every read returns
34
- * null. Defense in depth: today's checks only pass paths that came
35
- * from `list()` (which stays inside the root), but a future buggy or
36
- * malicious check could try `source.read('../etc/passwd')`. We refuse
37
- * rather than letting `path.join` resolve outside repoDir.
29
+ * Noise dirs skipped by every FileSource. Exported so the on-disk
30
+ * walker (fs-file-source.ts) shares the same list as the Map adapter
31
+ * below. Kept in this node-free module so importing it (or mapFileSource)
32
+ * never drags node:fs into a Worker bundle.
38
33
  */
39
- export declare function fsFileSource(repoDir: string): FileSource;
34
+ export declare const SKIP_DIRS: Set<string>;
40
35
  /**
41
36
  * Map-backed FileSource — used by the VibeCode agent (Workers env).
42
37
  * The agent's session DO holds the virtual filesystem as a Map; this
@@ -1 +1 @@
1
- {"version":3,"file":"file-source.d.ts","sourceRoot":"","sources":["../../src/lib/file-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,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;AAYD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CA+BxD;AA4BD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,CA8BpE"}
1
+ {"version":3,"file":"file-source.d.ts","sourceRoot":"","sources":["../../src/lib/file-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,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;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,aAQpB,CAAC;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,CA8BpE"}
@@ -13,9 +13,13 @@
13
13
  * - `list()` already excludes noise dirs (.git, node_modules, dist,
14
14
  * etc.). Implementations are responsible for that filtering.
15
15
  */
16
- import { readdir, readFile } from 'node:fs/promises';
17
- import { join, relative, sep } from 'node:path';
18
- const SKIP_DIRS = new Set([
16
+ /**
17
+ * Noise dirs skipped by every FileSource. Exported so the on-disk
18
+ * walker (fs-file-source.ts) shares the same list as the Map adapter
19
+ * below. Kept in this node-free module so importing it (or mapFileSource)
20
+ * never drags node:fs into a Worker bundle.
21
+ */
22
+ export const SKIP_DIRS = new Set([
19
23
  '.git',
20
24
  'node_modules',
21
25
  'dist',
@@ -24,83 +28,6 @@ const SKIP_DIRS = new Set([
24
28
  '.wrangler',
25
29
  '.turbo',
26
30
  ]);
27
- /**
28
- * Filesystem-backed FileSource — used by the CLI and CI. Walks the
29
- * directory tree once on first list() iteration; uses node:fs for
30
- * read/readBytes/listDir.
31
- *
32
- * Paths containing `..` segments are rejected — every read returns
33
- * null. Defense in depth: today's checks only pass paths that came
34
- * from `list()` (which stays inside the root), but a future buggy or
35
- * malicious check could try `source.read('../etc/passwd')`. We refuse
36
- * rather than letting `path.join` resolve outside repoDir.
37
- */
38
- export function fsFileSource(repoDir) {
39
- return {
40
- async *list() {
41
- yield* walk(repoDir, repoDir);
42
- },
43
- async read(path) {
44
- if (hasTraversal(path))
45
- return null;
46
- try {
47
- return await readFile(join(repoDir, path), 'utf8');
48
- }
49
- catch {
50
- return null;
51
- }
52
- },
53
- async readBytes(path) {
54
- if (hasTraversal(path))
55
- return null;
56
- try {
57
- const buf = await readFile(join(repoDir, path));
58
- return new Uint8Array(buf);
59
- }
60
- catch {
61
- return null;
62
- }
63
- },
64
- async listDir(dir) {
65
- if (hasTraversal(dir))
66
- return null;
67
- try {
68
- return await readdir(join(repoDir, dir));
69
- }
70
- catch {
71
- return null;
72
- }
73
- },
74
- };
75
- }
76
- /** True if `path` contains a `..` segment or is absolute. */
77
- function hasTraversal(path) {
78
- if (path.startsWith('/') || /^[a-zA-Z]:/.test(path))
79
- return true; // absolute
80
- return path.split(/[/\\]/).some((seg) => seg === '..');
81
- }
82
- async function* walk(dir, root) {
83
- let entries;
84
- try {
85
- entries = await readdir(dir, { withFileTypes: true });
86
- }
87
- catch {
88
- return;
89
- }
90
- for (const entry of entries) {
91
- const full = join(dir, entry.name);
92
- if (entry.isDirectory()) {
93
- if (SKIP_DIRS.has(entry.name))
94
- continue;
95
- yield* walk(full, root);
96
- }
97
- else if (entry.isFile()) {
98
- // Always emit POSIX-style paths so checks can rely on consistent
99
- // separators across platforms.
100
- yield relative(root, full).split(sep).join('/');
101
- }
102
- }
103
- }
104
31
  /**
105
32
  * Map-backed FileSource — used by the VibeCode agent (Workers env).
106
33
  * The agent's session DO holds the virtual filesystem as a Map; this
@@ -1 +1 @@
1
- {"version":3,"file":"file-source.js","sourceRoot":"","sources":["../../src/lib/file-source.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-source.js","sourceRoot":"","sources":["../../src/lib/file-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAeH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IAC/B,MAAM;IACN,cAAc;IACd,MAAM;IACN,OAAO;IACP,QAAQ;IACR,WAAW;IACX,QAAQ;CACT,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,KAA0B;IACtD,OAAO;QACL,KAAK,CAAC,CAAC,IAAI;YACT,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChC,IAAI,aAAa,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAClC,MAAM,IAAI,CAAC;YACb,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI;YACb,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,IAAI;YAClB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YACpC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,GAAG;YACf,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;YACnC,IAAI,GAAG,GAAG,KAAK,CAAC;YAChB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,SAAS;gBACvC,GAAG,GAAG,IAAI,CAAC;gBACX,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACvC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,QAAQ,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3D,CAAC;YACD,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Filesystem-backed FileSource — used by the CLI and CI.
3
+ *
4
+ * Split out of file-source.ts so the node:fs / node:path imports live
5
+ * in a module that only the CLI path pulls in. The Worker path (the
6
+ * VibeCode agent) imports mapFileSource + the checks, which stay
7
+ * node-free, so bundling for Cloudflare Workers never hits node:fs.
8
+ */
9
+ import { type FileSource } from './file-source.js';
10
+ /**
11
+ * Walks the directory tree once on first list() iteration; uses node:fs
12
+ * for read/readBytes/listDir.
13
+ *
14
+ * Paths containing `..` segments are rejected — every read returns
15
+ * null. Defense in depth: today's checks only pass paths that came
16
+ * from `list()` (which stays inside the root), but a future buggy or
17
+ * malicious check could try `source.read('../etc/passwd')`. We refuse
18
+ * rather than letting `path.join` resolve outside repoDir.
19
+ */
20
+ export declare function fsFileSource(repoDir: string): FileSource;
21
+ //# sourceMappingURL=fs-file-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-file-source.d.ts","sourceRoot":"","sources":["../../src/lib/fs-file-source.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,KAAK,UAAU,EAAa,MAAM,kBAAkB,CAAC;AAE9D;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CA+BxD"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Filesystem-backed FileSource — used by the CLI and CI.
3
+ *
4
+ * Split out of file-source.ts so the node:fs / node:path imports live
5
+ * in a module that only the CLI path pulls in. The Worker path (the
6
+ * VibeCode agent) imports mapFileSource + the checks, which stay
7
+ * node-free, so bundling for Cloudflare Workers never hits node:fs.
8
+ */
9
+ import { readdir, readFile } from 'node:fs/promises';
10
+ import { join, relative, sep } from 'node:path';
11
+ import { SKIP_DIRS } from './file-source.js';
12
+ /**
13
+ * Walks the directory tree once on first list() iteration; uses node:fs
14
+ * for read/readBytes/listDir.
15
+ *
16
+ * Paths containing `..` segments are rejected — every read returns
17
+ * null. Defense in depth: today's checks only pass paths that came
18
+ * from `list()` (which stays inside the root), but a future buggy or
19
+ * malicious check could try `source.read('../etc/passwd')`. We refuse
20
+ * rather than letting `path.join` resolve outside repoDir.
21
+ */
22
+ export function fsFileSource(repoDir) {
23
+ return {
24
+ async *list() {
25
+ yield* walk(repoDir, repoDir);
26
+ },
27
+ async read(path) {
28
+ if (hasTraversal(path))
29
+ return null;
30
+ try {
31
+ return await readFile(join(repoDir, path), 'utf8');
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ },
37
+ async readBytes(path) {
38
+ if (hasTraversal(path))
39
+ return null;
40
+ try {
41
+ const buf = await readFile(join(repoDir, path));
42
+ return new Uint8Array(buf);
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ },
48
+ async listDir(dir) {
49
+ if (hasTraversal(dir))
50
+ return null;
51
+ try {
52
+ return await readdir(join(repoDir, dir));
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ },
58
+ };
59
+ }
60
+ /** True if `path` contains a `..` segment or is absolute. */
61
+ function hasTraversal(path) {
62
+ if (path.startsWith('/') || /^[a-zA-Z]:/.test(path))
63
+ return true; // absolute
64
+ return path.split(/[/\\]/).some((seg) => seg === '..');
65
+ }
66
+ async function* walk(dir, root) {
67
+ let entries;
68
+ try {
69
+ entries = await readdir(dir, { withFileTypes: true });
70
+ }
71
+ catch {
72
+ return;
73
+ }
74
+ for (const entry of entries) {
75
+ const full = join(dir, entry.name);
76
+ if (entry.isDirectory()) {
77
+ if (SKIP_DIRS.has(entry.name))
78
+ continue;
79
+ yield* walk(full, root);
80
+ }
81
+ else if (entry.isFile()) {
82
+ // Always emit POSIX-style paths so checks can rely on consistent
83
+ // separators across platforms.
84
+ yield relative(root, full).split(sep).join('/');
85
+ }
86
+ }
87
+ }
88
+ //# sourceMappingURL=fs-file-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-file-source.js","sourceRoot":"","sources":["../../src/lib/fs-file-source.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"inline-manifest.d.ts","sourceRoot":"","sources":["../../src/lib/inline-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;oEACgE;IAChE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAqF/E"}
1
+ {"version":3,"file":"inline-manifest.d.ts","sourceRoot":"","sources":["../../src/lib/inline-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;oEACgE;IAChE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAqC/E"}
@@ -29,59 +29,7 @@ export function extractInlineManifest(viteConfig) {
29
29
  // Balance braces to find the end of the manifest object literal.
30
30
  // Handles nested objects (icons array entries) and quoted strings
31
31
  // (so a `}` inside a quoted value isn't counted).
32
- let depth = 0;
33
- let inSingle = false;
34
- let inDouble = false;
35
- let inBacktick = false;
36
- let escaped = false;
37
- let endIdx = -1;
38
- for (let i = openIdx; i < viteConfig.length; i++) {
39
- const ch = viteConfig[i];
40
- if (escaped) {
41
- escaped = false;
42
- continue;
43
- }
44
- if (ch === '\\') {
45
- escaped = true;
46
- continue;
47
- }
48
- if (inSingle) {
49
- if (ch === "'")
50
- inSingle = false;
51
- continue;
52
- }
53
- if (inDouble) {
54
- if (ch === '"')
55
- inDouble = false;
56
- continue;
57
- }
58
- if (inBacktick) {
59
- if (ch === '`')
60
- inBacktick = false;
61
- continue;
62
- }
63
- if (ch === "'") {
64
- inSingle = true;
65
- continue;
66
- }
67
- if (ch === '"') {
68
- inDouble = true;
69
- continue;
70
- }
71
- if (ch === '`') {
72
- inBacktick = true;
73
- continue;
74
- }
75
- if (ch === '{')
76
- depth++;
77
- else if (ch === '}') {
78
- depth--;
79
- if (depth === 0) {
80
- endIdx = i;
81
- break;
82
- }
83
- }
84
- }
32
+ const endIdx = findClosing(viteConfig, openIdx, '{', '}');
85
33
  if (endIdx < 0)
86
34
  return null;
87
35
  const block = viteConfig.slice(openIdx + 1, endIdx);
@@ -118,13 +66,20 @@ function extractIconsArray(block) {
118
66
  const openIdx = block.indexOf('[', m.index);
119
67
  if (openIdx < 0)
120
68
  return undefined;
69
+ const closeIdx = findClosing(block, openIdx, '[', ']');
70
+ return closeIdx < 0 ? undefined : block.slice(openIdx, closeIdx + 1);
71
+ }
72
+ /** Index of the bracket that closes the one at `openIdx`, or -1. Skips quoted
73
+ * strings (single, double, backtick) and backslash escapes, so a bracket
74
+ * inside a value isn't counted. */
75
+ function findClosing(src, openIdx, open, close) {
121
76
  let depth = 0;
122
77
  let inSingle = false;
123
78
  let inDouble = false;
124
79
  let inBacktick = false;
125
80
  let escaped = false;
126
- for (let i = openIdx; i < block.length; i++) {
127
- const ch = block[i];
81
+ for (let i = openIdx; i < src.length; i++) {
82
+ const ch = src[i];
128
83
  if (escaped) {
129
84
  escaped = false;
130
85
  continue;
@@ -160,14 +115,14 @@ function extractIconsArray(block) {
160
115
  inBacktick = true;
161
116
  continue;
162
117
  }
163
- if (ch === '[')
118
+ if (ch === open)
164
119
  depth++;
165
- else if (ch === ']') {
120
+ else if (ch === close) {
166
121
  depth--;
167
122
  if (depth === 0)
168
- return block.slice(openIdx, i + 1);
123
+ return i;
169
124
  }
170
125
  }
171
- return undefined;
126
+ return -1;
172
127
  }
173
128
  //# sourceMappingURL=inline-manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"inline-manifest.js","sourceRoot":"","sources":["../../src/lib/inline-manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inline-manifest.js","sourceRoot":"","sources":["../../src/lib/inline-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Lower-cased extension of a repo path, with its dot (`web/src/App.TSX` →
3
+ * `.tsx`), or '' when the last segment has none. A dot in a directory name
4
+ * doesn't count (`web/.vite/cache` → '').
5
+ *
6
+ * Shared by the checks that filter files by type (#368: it was copied into 15 of
7
+ * them). pwa-offline keeps its own variant, which returns the extension
8
+ * without the dot.
9
+ */
10
+ export declare function extOf(path: string): string;
11
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/lib/path.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1C"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Lower-cased extension of a repo path, with its dot (`web/src/App.TSX` →
3
+ * `.tsx`), or '' when the last segment has none. A dot in a directory name
4
+ * doesn't count (`web/.vite/cache` → '').
5
+ *
6
+ * Shared by the checks that filter files by type (#368: it was copied into 15 of
7
+ * them). pwa-offline keeps its own variant, which returns the extension
8
+ * without the dot.
9
+ */
10
+ export function extOf(path) {
11
+ const dot = path.lastIndexOf('.');
12
+ const slash = path.lastIndexOf('/');
13
+ return dot > slash ? path.slice(dot).toLowerCase() : '';
14
+ }
15
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/lib/path.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { FileSource } from './file-source.js';
2
+ /**
3
+ * Browser permissions a game may ask the player for, and how to spot them in
4
+ * source (#370). Shared by `fgs check` (warns on an undeclared one), the
5
+ * storefront listing scan (scripts/scan-game-permissions.mjs) and the listing
6
+ * itself, so the ids, names and icons stay in one place.
7
+ *
8
+ * Detection is static and deliberately simple: it reads the game's own source
9
+ * (`web/src/**` and `web/index.html`), never node_modules or a built bundle.
10
+ * Engine bundles (Phaser, Babylon…) carry gamepad, orientation and camera code
11
+ * whether a game uses it or not, so scanning them would tell players a game
12
+ * wants the microphone when it never asks.
13
+ */
14
+ export interface PermissionInfo {
15
+ /** Stable id, used in `package.json` declarations and the listing data. */
16
+ id: string;
17
+ /** Plain name shown to players. */
18
+ name: string;
19
+ /** Emoji shown on the listing and on game cards. */
20
+ icon: string;
21
+ /** Whether the browser shows the player a prompt before granting it. */
22
+ prompts: boolean;
23
+ }
24
+ export declare const PERMISSIONS: readonly PermissionInfo[];
25
+ export declare const PERMISSION_IDS: Set<string>;
26
+ /** Permissions the given source text uses. */
27
+ export declare function detectPermissionsInText(raw: string): Set<string>;
28
+ /** Permissions used anywhere in the game's own source, sorted by catalog order. */
29
+ export declare function detectPermissions(source: FileSource): Promise<string[]>;
30
+ export interface DeclaredPermissions {
31
+ /** id → one-line reason ('' when none was given). Known ids only. */
32
+ declared: Record<string, string>;
33
+ /** Ids in the declaration that aren't in PERMISSIONS. */
34
+ unknown: string[];
35
+ /** Set when package.json exists but the declaration can't be read. */
36
+ error?: string;
37
+ }
38
+ /**
39
+ * Reads `"freegamestore": { "permissions": … }` from the repo-root package.json.
40
+ * Accepts an object (`{ "motion": "Tilt to steer" }`) or an array of ids or
41
+ * `{ id, reason }` entries. Reasons are trimmed to one line of 120 chars.
42
+ */
43
+ export declare function parseDeclaredPermissions(packageJson: string | null): DeclaredPermissions;
44
+ //# 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;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,WAAW,EAAE,SAAS,cAAc,EAehD,CAAC;AAEF,eAAO,MAAM,cAAc,aAAwC,CAAC;AAgCpE,8CAA8C;AAC9C,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAgBhE;AAID,mFAAmF;AACnF,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ7E;AAED,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,yDAAyD;IACzD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,mBAAmB,CAuCxF"}