@freegamestore/compliance 0.1.0 → 0.3.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 (52) hide show
  1. package/dist/checks/audio-mute-respect.d.ts +4 -0
  2. package/dist/checks/audio-mute-respect.d.ts.map +1 -0
  3. package/dist/checks/audio-mute-respect.js +65 -0
  4. package/dist/checks/audio-mute-respect.js.map +1 -0
  5. package/dist/checks/claude-md-slim.js +1 -1
  6. package/dist/checks/claude-md-slim.js.map +1 -1
  7. package/dist/checks/license-mit.d.ts.map +1 -1
  8. package/dist/checks/license-mit.js +8 -1
  9. package/dist/checks/license-mit.js.map +1 -1
  10. package/dist/checks/manifest.d.ts +9 -3
  11. package/dist/checks/manifest.d.ts.map +1 -1
  12. package/dist/checks/manifest.js +61 -18
  13. package/dist/checks/manifest.js.map +1 -1
  14. package/dist/checks/no-brand-overrides.d.ts.map +1 -1
  15. package/dist/checks/no-brand-overrides.js +4 -1
  16. package/dist/checks/no-brand-overrides.js.map +1 -1
  17. package/dist/checks/no-env-production.d.ts.map +1 -1
  18. package/dist/checks/no-env-production.js +5 -1
  19. package/dist/checks/no-env-production.js.map +1 -1
  20. package/dist/checks/no-placeholders.d.ts.map +1 -1
  21. package/dist/checks/no-placeholders.js +16 -3
  22. package/dist/checks/no-placeholders.js.map +1 -1
  23. package/dist/checks/no-scroll.js +1 -3
  24. package/dist/checks/no-scroll.js.map +1 -1
  25. package/dist/checks/no-tracking.d.ts.map +1 -1
  26. package/dist/checks/no-tracking.js +8 -0
  27. package/dist/checks/no-tracking.js.map +1 -1
  28. package/dist/checks/pwa-offline.d.ts +29 -0
  29. package/dist/checks/pwa-offline.d.ts.map +1 -0
  30. package/dist/checks/pwa-offline.js +444 -0
  31. package/dist/checks/pwa-offline.js.map +1 -0
  32. package/dist/checks/store-link.js +1 -1
  33. package/dist/checks/store-link.js.map +1 -1
  34. package/dist/checks/viewport-support.d.ts +4 -1
  35. package/dist/checks/viewport-support.d.ts.map +1 -1
  36. package/dist/checks/viewport-support.js +29 -19
  37. package/dist/checks/viewport-support.js.map +1 -1
  38. package/dist/index.d.ts +5 -4
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +6 -3
  41. package/dist/index.js.map +1 -1
  42. package/dist/lib/file-source.d.ts.map +1 -1
  43. package/dist/lib/file-source.js +9 -1
  44. package/dist/lib/file-source.js.map +1 -1
  45. package/dist/lib/inline-manifest.d.ts +32 -0
  46. package/dist/lib/inline-manifest.d.ts.map +1 -0
  47. package/dist/lib/inline-manifest.js +109 -0
  48. package/dist/lib/inline-manifest.js.map +1 -0
  49. package/dist/live/index.d.ts.map +1 -1
  50. package/dist/live/index.js +5 -1
  51. package/dist/live/index.js.map +1 -1
  52. package/package.json +7 -7
@@ -0,0 +1,444 @@
1
+ const VITE_CONFIG = 'web/vite.config.ts';
2
+ const INDEX_HTML = 'web/index.html';
3
+ const PUBLIC_DIR = 'web/public';
4
+ /**
5
+ * Verifies a game's PWA can actually load from the home screen while
6
+ * offline. Apps that ship a manifest but mis-configure the service
7
+ * worker install fine, then show a blank screen when offline.
8
+ *
9
+ * Three failure modes this catches, all observed in the wild:
10
+ *
11
+ * 1. `maximumFileSizeToCacheInBytes` left at the workbox default (2 MB).
12
+ * Any bundle chunk above 2 MB is silently dropped from the precache.
13
+ * The SW serves index.html from cache, then the JS chunk 404s offline.
14
+ *
15
+ * 2. Google Fonts loaded via render-blocking <link> in index.html with
16
+ * no `runtimeCaching` rule. Browser HTTP cache works most of the
17
+ * time, but standalone-mode launches on iOS bypass it inconsistently
18
+ * — fonts fall back to system, and on cold first offline launch the
19
+ * <link> can stall paint for hundreds of ms.
20
+ *
21
+ * 3. Assets in extensions not covered by `globPatterns`. The default
22
+ * list is js/css/html/png/svg/ico/woff2. Any wasm, json, audio, etc.
23
+ * shipped under web/public/ isn't precached → offline 404.
24
+ *
25
+ * Also catches the inverse: index.html links a manifest but the config
26
+ * has no service worker at all → "installable" PWA that always needs
27
+ * network.
28
+ */
29
+ export async function checkPwaOffline(source) {
30
+ const config = await source.read(VITE_CONFIG);
31
+ const html = await source.read(INDEX_HTML);
32
+ // Strip HTML comments before matching — `<!-- <link rel="manifest"> -->`
33
+ // is not a live install claim, and a commented-out fonts <link> is
34
+ // not loading anything.
35
+ const htmlCode = html === null ? null : stripHtmlComments(html);
36
+ const linksManifest = htmlCode !== null && /<link[^>]+rel\s*=\s*["']manifest["']/i.test(htmlCode);
37
+ const linksGoogleFonts = htmlCode !== null && /fonts\.(googleapis|gstatic)\.com/i.test(htmlCode);
38
+ // Strip comments and string-literal contents before any regex matching
39
+ // against the config text — otherwise `VitePWA(` in a comment or
40
+ // `"workbox: {"` in a string is treated as real code (false positive).
41
+ const configCode = config === null ? null : stripCommentsAndStrings(config);
42
+ const hasVitePwa = configCode !== null && /\bVitePWA\s*\(/.test(configCode);
43
+ // `injectManifest` strategy means the developer writes their own SW
44
+ // file (typically web/src/sw.ts). The `workbox` field doesn't apply
45
+ // — `injectManifest` config does — so the rest of our checks are
46
+ // inapplicable. Trust the dev's manual SW. (Matched against `config`
47
+ // — not `configCode` — because the string-stripping would erase
48
+ // `"injectManifest"` from the latter.)
49
+ const usesInjectManifest = config !== null && /strategies\s*:\s*["']injectManifest["']/.test(config);
50
+ // Hand-rolled SW registration (e.g. an inline <script> calling
51
+ // navigator.serviceWorker.register) is a legitimate alternative to
52
+ // vite-plugin-pwa. If it exists, we trust the dev to manage their own
53
+ // precache and limit ourselves to the install-claim check.
54
+ const hasManualSw = (html !== null && /serviceWorker\.register/.test(html)) ||
55
+ (await sourceHasSwRegistration(source));
56
+ const hasServiceWorker = hasVitePwa || hasManualSw;
57
+ // "Installable" claim with no service worker — the worst failure mode.
58
+ // The PWA installs from the manifest but launches into a network fetch
59
+ // for `/` that 404s offline → blank screen on home screen.
60
+ if (linksManifest && !hasServiceWorker) {
61
+ return {
62
+ name: 'PWA offline correctness',
63
+ status: 'fail',
64
+ detail: 'index.html links a manifest but no service worker is registered → installable PWA that cannot load offline from home screen',
65
+ suggestions: [
66
+ 'Install vite-plugin-pwa and add VitePWA({...}) to vite.config.ts plugins.',
67
+ 'Or register a service worker manually (`navigator.serviceWorker.register("/sw.js")`).',
68
+ 'Or drop the <link rel="manifest"> from index.html if this is not meant to be installable.',
69
+ ],
70
+ };
71
+ }
72
+ // No vite.config.ts at all — can't analyze further. Either not a Vite
73
+ // project, or PWA wiring lives elsewhere; either way, nothing for us
74
+ // to assert about workbox.
75
+ if (config === null) {
76
+ return {
77
+ name: 'PWA offline correctness',
78
+ status: 'pass',
79
+ detail: hasManualSw
80
+ ? 'no vite.config.ts; hand-rolled service worker present'
81
+ : 'no web/vite.config.ts (not a Vite project)',
82
+ };
83
+ }
84
+ if (!hasVitePwa) {
85
+ return {
86
+ name: 'PWA offline correctness',
87
+ status: 'pass',
88
+ detail: hasManualSw
89
+ ? 'hand-rolled service worker; no install claim to verify'
90
+ : 'not a PWA (no VitePWA, no manifest link)',
91
+ };
92
+ }
93
+ // injectManifest: developer hand-writes the SW. Their `workbox` config
94
+ // (if any) is irrelevant; the analyzable surface lives in their SW
95
+ // source which we don't parse.
96
+ if (usesInjectManifest) {
97
+ return {
98
+ name: 'PWA offline correctness',
99
+ status: 'pass',
100
+ detail: 'VitePWA with injectManifest strategy — SW managed in src',
101
+ };
102
+ }
103
+ // Extract the workbox block. Match `workbox: { ... }` allowing nested
104
+ // braces. We pass `configCode` (comments/strings stripped) so the
105
+ // matcher can't false-positive on `"workbox: {"` inside a string, but
106
+ // we slice out of `config` so the returned substring still has its
107
+ // real string contents — otherwise downstream `globPatterns:
108
+ // ["..."]` regex would fail.
109
+ const workbox = extractBalancedBlock(config, configCode, /workbox\s*:\s*\{/);
110
+ if (workbox === null) {
111
+ return {
112
+ name: 'PWA offline correctness',
113
+ status: 'warn',
114
+ detail: 'VitePWA present but no workbox block parsed — defaults may leave assets unprecached',
115
+ suggestions: [
116
+ 'Add a `workbox: { ... }` block with globPatterns, maximumFileSizeToCacheInBytes, and runtimeCaching.',
117
+ ],
118
+ };
119
+ }
120
+ const issues = [];
121
+ const suggestions = [];
122
+ // Issue 1: bundle-size cap. Default is 2 MiB; many real bundles exceed it.
123
+ // Also catch the inverse footgun: a value *lower* than the default
124
+ // (e.g. someone copy-pasted `1024` thinking it was MB), which silently
125
+ // makes precache worse.
126
+ const capValue = parseBundleCap(workbox);
127
+ const DEFAULT_CAP = 2 * 1024 * 1024;
128
+ if (capValue === null) {
129
+ issues.push('no maximumFileSizeToCacheInBytes (defaults to 2 MB — bigger chunks silently skipped from precache)');
130
+ suggestions.push('Set `maximumFileSizeToCacheInBytes: 10 * 1024 * 1024` so the main bundle is precached.');
131
+ }
132
+ else if (capValue < DEFAULT_CAP) {
133
+ issues.push(`maximumFileSizeToCacheInBytes is ${capValue} bytes — smaller than the workbox default (2 MB); any chunk above this is dropped from precache`);
134
+ suggestions.push('Raise to at least `10 * 1024 * 1024` (10 MB) so real bundles fit.');
135
+ }
136
+ // `VitePWA({ disable: true })` literal turns the plugin off in all
137
+ // environments, so the manifest link is broken. Only flag the
138
+ // unconditional literal — `disable: process.env.NODE_ENV !==
139
+ // "production"` is a common, correct dev-only pattern that we can't
140
+ // evaluate statically.
141
+ if (configCode && /\bdisable\s*:\s*true\b/.test(configCode)) {
142
+ issues.push('VitePWA({ disable: true }) literal — service worker will never register');
143
+ suggestions.push('Drop `disable: true`, or gate it behind a non-production check.');
144
+ }
145
+ // Issue 2: Google Fonts with no runtime caching.
146
+ if (linksGoogleFonts) {
147
+ const hasGoogleApisRule = /fonts\\?\.googleapis\\?\.com/.test(workbox);
148
+ const hasGstaticRule = /fonts\\?\.gstatic\\?\.com/.test(workbox);
149
+ // Workbox also lets you target by `request.destination` — a rule
150
+ // like `({request}) => request.destination === "font"` catches
151
+ // every font request including Google Fonts. Accept that as
152
+ // covering both endpoints rather than emitting a false warn.
153
+ const hasDestinationFontRule = /\bdestination\b/.test(workbox) && /["']font["']/.test(workbox);
154
+ const fontsCovered = (hasGoogleApisRule && hasGstaticRule) || hasDestinationFontRule;
155
+ if (!fontsCovered) {
156
+ issues.push('index.html loads Google Fonts but workbox has no runtimeCaching for fonts.googleapis.com / fonts.gstatic.com');
157
+ suggestions.push('Add runtimeCaching CacheFirst rules for /^https:\\/\\/fonts\\.googleapis\\.com/ and /^https:\\/\\/fonts\\.gstatic\\.com/.');
158
+ }
159
+ }
160
+ // Issue 3: assets in public/ in extensions not covered by globPatterns.
161
+ // Workbox supports multiple patterns in the array; we union the
162
+ // extensions across all of them, otherwise a config like
163
+ // `globPatterns: ["**/*.{js,css}", "**/*.wasm"]` would look like it
164
+ // omits wasm.
165
+ const covered = extractCoveredExtensions(workbox);
166
+ if (covered !== null && source.listDir) {
167
+ const uncovered = await findUncoveredAssets(source, PUBLIC_DIR, covered);
168
+ if (uncovered.length > 0) {
169
+ const sample = uncovered.slice(0, 3).join(', ');
170
+ issues.push(`web/public/ has files in extensions not in globPatterns: ${sample}${uncovered.length > 3 ? ` (+${uncovered.length - 3} more)` : ''}`);
171
+ const newExts = [...new Set([...covered, ...uncovered.map(extOf)])].filter(Boolean).join(',');
172
+ suggestions.push(`Extend globPatterns to cover them, e.g. \`**/*.{${newExts}}\`.`);
173
+ }
174
+ }
175
+ if (issues.length === 0) {
176
+ return {
177
+ name: 'PWA offline correctness',
178
+ status: 'pass',
179
+ detail: 'workbox precaches everything, fonts cached, bundle cap raised',
180
+ };
181
+ }
182
+ return {
183
+ name: 'PWA offline correctness',
184
+ status: 'warn',
185
+ detail: issues.join('; '),
186
+ suggestions,
187
+ };
188
+ }
189
+ /**
190
+ * Parse the numeric value assigned to `maximumFileSizeToCacheInBytes`.
191
+ * Handles simple integer literals (`10485760`), underscore separators
192
+ * (`10_485_760`), and `A * B * C` arithmetic chains that workbox docs
193
+ * recommend (`10 * 1024 * 1024`). Returns null if the key isn't present
194
+ * or the value isn't a recognisable arithmetic literal.
195
+ */
196
+ function parseBundleCap(workbox) {
197
+ const m = workbox.match(/maximumFileSizeToCacheInBytes\s*:\s*([^,\n}]+)/);
198
+ if (!m)
199
+ return null;
200
+ const expr = (m[1] ?? '').trim().replace(/_/g, '');
201
+ // Strict: only digits, *, whitespace. Anything else (variable
202
+ // reference, function call) → can't evaluate, treat as unknown.
203
+ if (!/^[\d*\s]+$/.test(expr))
204
+ return null;
205
+ const parts = expr.split('*').map((s) => Number(s.trim()));
206
+ if (parts.some((n) => !Number.isFinite(n) || n < 0))
207
+ return null;
208
+ return parts.reduce((a, b) => a * b, 1);
209
+ }
210
+ /**
211
+ * Replace every `<!-- ... -->` comment body with spaces (preserving
212
+ * positions). Used before HTML regex matches so that commented-out
213
+ * tags don't false-positive — `<!-- <link rel="manifest"> -->` is not
214
+ * a live install claim.
215
+ *
216
+ * HTML comments don't nest in real-world docs; first `-->` ends the
217
+ * comment. Doesn't try to handle CDATA or downlevel-revealed comments.
218
+ */
219
+ function stripHtmlComments(src) {
220
+ const out = src.split('');
221
+ let i = 0;
222
+ while (i < src.length) {
223
+ if (src[i] === '<' &&
224
+ src[i + 1] === '!' &&
225
+ src[i + 2] === '-' &&
226
+ src[i + 3] === '-') {
227
+ const start = i;
228
+ i += 4;
229
+ while (i < src.length &&
230
+ !(src[i] === '-' && src[i + 1] === '-' && src[i + 2] === '>'))
231
+ i++;
232
+ i = Math.min(src.length, i + 3);
233
+ for (let k = start; k < i; k++)
234
+ if (out[k] !== '\n')
235
+ out[k] = ' ';
236
+ continue;
237
+ }
238
+ i++;
239
+ }
240
+ return out.join('');
241
+ }
242
+ /**
243
+ * Returns a "code-only" version of `src` where every comment body and
244
+ * string-literal content is replaced with spaces of equal length. This
245
+ * lets us run cheap regex matches against the source while ignoring
246
+ * text that isn't real code, without disturbing source positions —
247
+ * regex `.index` results are still valid offsets into the original.
248
+ *
249
+ * Handles: line comments (`//`), block comments (`/* *\/`), single,
250
+ * double, and backtick strings (with `\` escapes). Doesn't try to
251
+ * track template-literal `${...}` expressions or recognise regex
252
+ * literals — both edge cases would need a real tokenizer.
253
+ */
254
+ function stripCommentsAndStrings(src) {
255
+ const out = src.split('');
256
+ let i = 0;
257
+ const blank = (from, to) => {
258
+ for (let k = from; k < to; k++)
259
+ if (out[k] !== '\n')
260
+ out[k] = ' ';
261
+ };
262
+ while (i < src.length) {
263
+ const c = src[i];
264
+ if (c === '/' && src[i + 1] === '/') {
265
+ const start = i;
266
+ while (i < src.length && src[i] !== '\n')
267
+ i++;
268
+ blank(start, i);
269
+ continue;
270
+ }
271
+ if (c === '/' && src[i + 1] === '*') {
272
+ const start = i;
273
+ i += 2;
274
+ while (i < src.length && !(src[i] === '*' && src[i + 1] === '/'))
275
+ i++;
276
+ i = Math.min(src.length, i + 2);
277
+ blank(start, i);
278
+ continue;
279
+ }
280
+ if (c === '"' || c === "'" || c === '`') {
281
+ const quote = c;
282
+ const start = i + 1; // keep the opening quote in place
283
+ i++;
284
+ while (i < src.length && src[i] !== quote) {
285
+ if (src[i] === '\\' && i + 1 < src.length)
286
+ i++;
287
+ i++;
288
+ }
289
+ blank(start, i);
290
+ i++; // skip closing quote
291
+ continue;
292
+ }
293
+ i++;
294
+ }
295
+ return out.join('');
296
+ }
297
+ /**
298
+ * Extracts the `{ ... }` body that follows the first match of `opener`,
299
+ * walking the source character-by-character to balance braces.
300
+ *
301
+ * Two source views are required:
302
+ * - `src` — the real source, used for the returned substring.
303
+ * - `code` — the stripped view (comments/strings blanked) with the
304
+ * same character offsets as `src`. Used for matching the opener and
305
+ * counting braces, so that `}` in a string doesn't close the block.
306
+ *
307
+ * Regex alone can't handle this because workbox blocks contain nested
308
+ * objects (`options: { expiration: {...} }`) and regex doesn't balance.
309
+ */
310
+ function extractBalancedBlock(src, code, opener) {
311
+ const m = code.match(opener);
312
+ if (!m || m.index === undefined)
313
+ return null;
314
+ let i = m.index + m[0].length; // start just after the `{`
315
+ let depth = 1;
316
+ const start = i;
317
+ while (i < code.length) {
318
+ const c = code[i];
319
+ if (c === '{')
320
+ depth++;
321
+ else if (c === '}') {
322
+ depth--;
323
+ if (depth === 0)
324
+ return src.slice(start, i);
325
+ }
326
+ i++;
327
+ }
328
+ return null;
329
+ }
330
+ /**
331
+ * Parses every string literal in the workbox block, finds those that
332
+ * look like glob patterns with a brace-expansion (e.g.
333
+ * `**\/*.{js,css,wasm}`), and unions their extensions. Returns null if
334
+ * no `globPatterns:` key is present at all.
335
+ *
336
+ * Bracket-balances the array body on a string-stripped view so that
337
+ * glob bracket expressions like `**\/[abc]/*` don't truncate the array
338
+ * — that `]` lives inside a string literal and isn't the array's close.
339
+ */
340
+ function extractCoveredExtensions(workbox) {
341
+ const workboxCode = stripCommentsAndStrings(workbox);
342
+ const keyMatch = workboxCode.match(/globPatterns\s*:\s*\[/);
343
+ if (!keyMatch || keyMatch.index === undefined)
344
+ return null;
345
+ // Walk the stripped view to find the matching `]` for this `[`.
346
+ let i = keyMatch.index + keyMatch[0].length;
347
+ const start = i;
348
+ let depth = 1;
349
+ while (i < workboxCode.length && depth > 0) {
350
+ const c = workboxCode[i];
351
+ if (c === '[')
352
+ depth++;
353
+ else if (c === ']')
354
+ depth--;
355
+ if (depth === 0)
356
+ break;
357
+ i++;
358
+ }
359
+ if (depth !== 0)
360
+ return null;
361
+ // Pull the real (un-stripped) array body so we still see the
362
+ // quoted patterns.
363
+ const arrayBody = workbox.slice(start, i);
364
+ const covered = new Set();
365
+ for (const m of arrayBody.matchAll(/["']([^"']+)["']/g)) {
366
+ const pattern = m[1] ?? '';
367
+ const brace = pattern.match(/\{([^}]+)\}/);
368
+ if (brace) {
369
+ for (const ext of brace[1].split(',')) {
370
+ covered.add(ext.trim().toLowerCase());
371
+ }
372
+ }
373
+ else {
374
+ // Bare pattern like "**/*.wasm" — extract the extension after the
375
+ // last `.` (or the entire pattern if it's literally `**/*.wasm`).
376
+ const ext = pattern.match(/\.([a-zA-Z0-9]+)$/);
377
+ if (ext)
378
+ covered.add(ext[1].toLowerCase());
379
+ }
380
+ }
381
+ return covered;
382
+ }
383
+ function extOf(filename) {
384
+ const dot = filename.lastIndexOf('.');
385
+ return dot === -1 ? '' : filename.slice(dot + 1).toLowerCase();
386
+ }
387
+ /**
388
+ * Walks web/public/ (one level deep is enough — workbox precache
389
+ * resolves the pattern recursively, but most public assets sit at the
390
+ * top level or one level down), returns extensions not in `covered`.
391
+ * Ignores the manifest icons and favicons we already know are listed.
392
+ */
393
+ async function findUncoveredAssets(source, dir, covered) {
394
+ if (!source.listDir)
395
+ return [];
396
+ const seen = new Set();
397
+ await walkPublic(source, dir, seen, covered, 0);
398
+ return [...seen].sort();
399
+ }
400
+ /**
401
+ * Best-effort scan of web/src/ entry points for a manual
402
+ * `serviceWorker.register` call. Doesn't recurse into the whole src
403
+ * tree — we only care about top-level entry files (main, index,
404
+ * registerSW) where this conventionally lives.
405
+ */
406
+ async function sourceHasSwRegistration(source) {
407
+ const candidates = [
408
+ 'web/src/main.tsx',
409
+ 'web/src/main.ts',
410
+ 'web/src/index.tsx',
411
+ 'web/src/index.ts',
412
+ 'web/src/registerSW.ts',
413
+ 'web/src/registerSW.js',
414
+ ];
415
+ for (const p of candidates) {
416
+ const text = await source.read(p);
417
+ if (text !== null && /serviceWorker\.register/.test(text))
418
+ return true;
419
+ }
420
+ return false;
421
+ }
422
+ async function walkPublic(source, dir, seen, covered, depth) {
423
+ if (depth > 3)
424
+ return;
425
+ if (!source.listDir)
426
+ return;
427
+ const entries = await source.listDir(dir);
428
+ if (entries === null)
429
+ return;
430
+ for (const name of entries) {
431
+ const full = `${dir}/${name}`;
432
+ if (name.includes('.')) {
433
+ const ext = extOf(name);
434
+ if (!ext || covered.has(ext))
435
+ continue;
436
+ seen.add(name);
437
+ }
438
+ else {
439
+ // Probably a subdirectory — recurse. listDir returns null if it's actually a file.
440
+ await walkPublic(source, full, seen, covered, depth + 1);
441
+ }
442
+ }
443
+ }
444
+ //# sourceMappingURL=pwa-offline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pwa-offline.js","sourceRoot":"","sources":["../../src/checks/pwa-offline.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ export async function checkStoreLink(source) {
8
8
  if (!path.startsWith('web/src/'))
9
9
  continue;
10
10
  const content = await source.read(path);
11
- if (content && content.includes(domain)) {
11
+ if (content?.includes(domain)) {
12
12
  return { name: 'Store link', status: 'pass', detail: `${domain} referenced in ${path}` };
13
13
  }
14
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"store-link.js","sourceRoot":"","sources":["../../src/checks/store-link.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAkB;IACrD,MAAM,MAAM,GAAG,sBAAsB,CAAC;IAEtC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,IAAI,EAAE,EAAE,CAAC;QAC3F,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,cAAc,MAAM,oBAAoB;QAChD,WAAW,EAAE;YACX,0BAA0B,MAAM,uCAAuC;YACvE,wFAAwF;SACzF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"store-link.js","sourceRoot":"","sources":["../../src/checks/store-link.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAkB;IACrD,MAAM,MAAM,GAAG,sBAAsB,CAAC;IAEtC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,IAAI,EAAE,EAAE,CAAC;QAC3F,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,cAAc,MAAM,oBAAoB;QAChD,WAAW,EAAE;YACX,0BAA0B,MAAM,uCAAuC;YACvE,wFAAwF;SACzF;KACF,CAAC;AACJ,CAAC"}
@@ -6,7 +6,7 @@ import type { CheckResult } from '../types.js';
6
6
  * 92% of devices · portrait + landscape") and visitors know what to
7
7
  * expect before they tap.
8
8
  *
9
- * Two declarations are required, both in `web/public/manifest.json`:
9
+ * Two declarations are required:
10
10
  *
11
11
  * "orientation": "any" | "portrait" | "landscape" |
12
12
  * "portrait-primary" | "landscape-primary"
@@ -19,6 +19,9 @@ import type { CheckResult } from '../types.js';
19
19
  *
20
20
  * If you genuinely don't care about orientation, set `"any"`. Don't
21
21
  * leave it off — that's the only value that returns a fail.
22
+ *
23
+ * Read from either a static `web/public/manifest.json` or the inline
24
+ * `manifest:{...}` inside VitePWA(...) in `web/vite.config.ts`.
22
25
  */
23
26
  export declare function checkViewportSupport(source: FileSource): Promise<CheckResult>;
24
27
  //# sourceMappingURL=viewport-support.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewport-support.d.ts","sourceRoot":"","sources":["../../src/checks/viewport-support.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAqEnF"}
1
+ {"version":3,"file":"viewport-support.d.ts","sourceRoot":"","sources":["../../src/checks/viewport-support.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CA2DnF"}
@@ -1,11 +1,13 @@
1
- const MANIFEST_PATH = 'web/public/manifest.json';
1
+ import { extractInlineManifest } from '../lib/inline-manifest.js';
2
+ const STATIC_MANIFEST_PATH = 'web/public/manifest.json';
3
+ const VITE_CONFIG_PATH = 'web/vite.config.ts';
2
4
  /**
3
5
  * Apps and games must declare which screens and orientations they
4
6
  * support, so the storefront can render a coverage badge ("works on
5
7
  * 92% of devices · portrait + landscape") and visitors know what to
6
8
  * expect before they tap.
7
9
  *
8
- * Two declarations are required, both in `web/public/manifest.json`:
10
+ * Two declarations are required:
9
11
  *
10
12
  * "orientation": "any" | "portrait" | "landscape" |
11
13
  * "portrait-primary" | "landscape-primary"
@@ -18,29 +20,21 @@ const MANIFEST_PATH = 'web/public/manifest.json';
18
20
  *
19
21
  * If you genuinely don't care about orientation, set `"any"`. Don't
20
22
  * leave it off — that's the only value that returns a fail.
23
+ *
24
+ * Read from either a static `web/public/manifest.json` or the inline
25
+ * `manifest:{...}` inside VitePWA(...) in `web/vite.config.ts`.
21
26
  */
22
27
  export async function checkViewportSupport(source) {
23
- const raw = await source.read(MANIFEST_PATH);
24
- if (raw === null) {
25
- return {
26
- name: 'Viewport support',
27
- status: 'fail',
28
- detail: `${MANIFEST_PATH} not found`,
29
- };
30
- }
31
- let manifest;
32
- try {
33
- manifest = JSON.parse(raw);
34
- }
35
- catch {
28
+ const manifest = await loadManifest(source);
29
+ if (!manifest) {
36
30
  return {
37
31
  name: 'Viewport support',
38
32
  status: 'fail',
39
- detail: `${MANIFEST_PATH} unparseable`,
33
+ detail: `no manifest source found (looked for ${STATIC_MANIFEST_PATH} and a VitePWA(...) block in ${VITE_CONFIG_PATH})`,
40
34
  };
41
35
  }
42
- const orientation = manifest['orientation'];
43
- const minWidth = manifest['min_viewport_width'];
36
+ const orientation = manifest.orientation;
37
+ const minWidth = manifest.min_viewport_width;
44
38
  const issues = [];
45
39
  const warnings = [];
46
40
  if (typeof orientation !== 'string' || !VALID_ORIENTATIONS.has(orientation)) {
@@ -63,7 +57,7 @@ export async function checkViewportSupport(source) {
63
57
  detail: `${issues.length} viewport-declaration issue${issues.length === 1 ? '' : 's'}`,
64
58
  suggestions: [
65
59
  ...issues,
66
- 'Edit web/public/manifest.json: add "orientation": "any" (or portrait/landscape) and "min_viewport_width": 360.',
60
+ 'Add `"orientation": "any"` (or portrait/landscape) and `"min_viewport_width": 360` to the manifest — either in web/public/manifest.json or inside the manifest:{...} of VitePWA() in web/vite.config.ts.',
67
61
  ],
68
62
  };
69
63
  }
@@ -81,6 +75,22 @@ export async function checkViewportSupport(source) {
81
75
  detail: `orientation=${orientation} · min ${minWidth}px`,
82
76
  };
83
77
  }
78
+ async function loadManifest(source) {
79
+ const staticRaw = await source.read(STATIC_MANIFEST_PATH);
80
+ if (staticRaw !== null) {
81
+ try {
82
+ return JSON.parse(staticRaw);
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
88
+ const viteConfig = await source.read(VITE_CONFIG_PATH);
89
+ if (viteConfig !== null && /\bVitePWA\s*\(/.test(viteConfig)) {
90
+ return extractInlineManifest(viteConfig);
91
+ }
92
+ return null;
93
+ }
84
94
  const VALID_ORIENTATIONS = new Set([
85
95
  'any',
86
96
  'portrait',
@@ -1 +1 @@
1
- {"version":3,"file":"viewport-support.js","sourceRoot":"","sources":["../../src/checks/viewport-support.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"viewport-support.js","sourceRoot":"","sources":["../../src/checks/viewport-support.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { checkAudioMuteRespect } from './checks/audio-mute-respect.js';
1
2
  import { checkBrandFonts } from './checks/brand-fonts.js';
2
3
  import { checkBrandTokens } from './checks/brand-tokens.js';
3
4
  import { checkBundleSize } from './checks/bundle-size.js';
@@ -12,18 +13,18 @@ import { checkNoPlaceholders } from './checks/no-placeholders.js';
12
13
  import { checkNoScroll } from './checks/no-scroll.js';
13
14
  import { checkNoTracking } from './checks/no-tracking.js';
14
15
  import { checkPwaMeta } from './checks/pwa-meta.js';
16
+ import { checkPwaOffline } from './checks/pwa-offline.js';
15
17
  import { checkStoreLink } from './checks/store-link.js';
16
18
  import { checkUnsafeVh } from './checks/unsafe-vh.js';
17
19
  import { checkViewportSupport } from './checks/viewport-support.js';
18
20
  import { fsFileSource, mapFileSource } from './lib/file-source.js';
19
21
  import { isGameProject } from './lib/project-type.js';
20
22
  import type { CheckResult } from './types.js';
21
- export type { CheckStatus, CheckResult } from './types.js';
22
23
  export type { FileSource } from './lib/file-source.js';
23
- export { fsFileSource, mapFileSource, isGameProject };
24
- export { checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkHtmlMeta, checkLicenseMit, checkManifest, checkNoBrandOverrides, checkNoEnvProduction, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPwaMeta, checkStoreLink, checkUnsafeVh, checkViewportSupport, };
25
- export { auditLive, checkNoTrackingLive, checkBrandFontsLive, checkManifestLive, checkBundleSizeLive, checkUnsafeVhLive, } from './live/index.js';
26
24
  export type { LiveAuditInput, LiveAuditReport } from './live/index.js';
25
+ export { auditLive, checkBrandFontsLive, checkBundleSizeLive, checkManifestLive, checkNoTrackingLive, checkUnsafeVhLive, } from './live/index.js';
26
+ export type { CheckResult, CheckStatus } from './types.js';
27
+ export { checkAudioMuteRespect, checkBrandFonts, checkBrandTokens, checkBundleSize, checkClaudeMdSlim, checkDarkMode, checkHtmlMeta, checkLicenseMit, checkManifest, checkNoBrandOverrides, checkNoEnvProduction, checkNoPlaceholders, checkNoScroll, checkNoTracking, checkPwaMeta, checkPwaOffline, checkStoreLink, checkUnsafeVh, checkViewportSupport, fsFileSource, isGameProject, mapFileSource, };
27
28
  /**
28
29
  * Runs every compliance check against the source. Two front doors:
29
30
  * - `runChecks(repoDir)` — CLI / CI; reads from disk.
@@ -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,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAmB,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;AACtD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,EACd,aAAa,EACb,oBAAoB,GACrB,CAAC;AAKF,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvE;;;;;;;;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":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,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,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAmB,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIvE,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,aAAa,GACd,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAEvE;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAE3F"}