@freeappstore/compliance 0.2.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 (37) hide show
  1. package/dist/checks/no-scroll.d.ts +24 -0
  2. package/dist/checks/no-scroll.d.ts.map +1 -0
  3. package/dist/checks/no-scroll.js +143 -0
  4. package/dist/checks/no-scroll.js.map +1 -0
  5. package/dist/checks/no-scroll.test.d.ts +2 -0
  6. package/dist/checks/no-scroll.test.d.ts.map +1 -0
  7. package/dist/checks/no-scroll.test.js +105 -0
  8. package/dist/checks/no-scroll.test.js.map +1 -0
  9. package/dist/checks/unsafe-vh.d.ts +24 -0
  10. package/dist/checks/unsafe-vh.d.ts.map +1 -0
  11. package/dist/checks/unsafe-vh.js +110 -0
  12. package/dist/checks/unsafe-vh.js.map +1 -0
  13. package/dist/checks/unsafe-vh.test.d.ts +2 -0
  14. package/dist/checks/unsafe-vh.test.d.ts.map +1 -0
  15. package/dist/checks/unsafe-vh.test.js +115 -0
  16. package/dist/checks/unsafe-vh.test.js.map +1 -0
  17. package/dist/checks/viewport-support.d.ts +23 -0
  18. package/dist/checks/viewport-support.d.ts.map +1 -0
  19. package/dist/checks/viewport-support.js +87 -0
  20. package/dist/checks/viewport-support.js.map +1 -0
  21. package/dist/checks/viewport-support.test.d.ts +2 -0
  22. package/dist/checks/viewport-support.test.d.ts.map +1 -0
  23. package/dist/checks/viewport-support.test.js +63 -0
  24. package/dist/checks/viewport-support.test.js.map +1 -0
  25. package/dist/index.d.ts +6 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +11 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/live/index.d.ts +50 -0
  30. package/dist/live/index.d.ts.map +1 -0
  31. package/dist/live/index.js +311 -0
  32. package/dist/live/index.js.map +1 -0
  33. package/dist/live/index.test.d.ts +2 -0
  34. package/dist/live/index.test.d.ts.map +1 -0
  35. package/dist/live/index.test.js +259 -0
  36. package/dist/live/index.test.js.map +1 -0
  37. package/package.json +1 -1
@@ -0,0 +1,259 @@
1
+ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
2
+ import { checkNoTrackingLive, checkBrandFontsLive, checkManifestLive, checkBundleSizeLive, checkUnsafeVhLive, auditLive, } from './index.js';
3
+ describe('checkNoTrackingLive', () => {
4
+ it('passes when HTML is clean of tracker patterns', () => {
5
+ const r = checkNoTrackingLive('<html><body>hello</body></html>');
6
+ expect(r.status).toBe('pass');
7
+ expect(r.detail).toMatch(/no known trackers/);
8
+ });
9
+ it('flags Google Analytics', () => {
10
+ const r = checkNoTrackingLive('<script src="https://google-analytics.com/ga.js"></script>');
11
+ expect(r.status).toBe('fail');
12
+ expect(r.suggestions?.[0]).toMatch(/Tracking was injected/);
13
+ });
14
+ it('flags Plausible, Mixpanel, Hotjar variants', () => {
15
+ expect(checkNoTrackingLive('<script src="https://plausible.io/script.js">').status).toBe('fail');
16
+ expect(checkNoTrackingLive('<div>amplitude tracker</div>').status).toBe('fail');
17
+ expect(checkNoTrackingLive('<script>gtag("event")</script>').status).toBe('fail');
18
+ expect(checkNoTrackingLive('<script src="https://www.googletagmanager.com/gtm.js">').status).toBe('fail');
19
+ expect(checkNoTrackingLive('<script src="//cdn.mixpanel.com/x">').status).toBe('fail');
20
+ expect(checkNoTrackingLive('<script src="https://static.hotjar.com/c/hotjar.js">').status).toBe('fail');
21
+ expect(checkNoTrackingLive('<script src="https://posthog.com/array.js">').status).toBe('fail');
22
+ });
23
+ });
24
+ describe('checkBrandFontsLive', () => {
25
+ it('passes when both Manrope and Fraunces are referenced', () => {
26
+ const r = checkBrandFontsLive('<link href="https://fonts.googleapis.com/css2?family=Manrope&family=Fraunces" rel="stylesheet">');
27
+ expect(r.status).toBe('pass');
28
+ });
29
+ it('matches case-insensitively', () => {
30
+ const r = checkBrandFontsLive('<style>font-family: manrope, fraunces</style>');
31
+ expect(r.status).toBe('pass');
32
+ });
33
+ it('fails when one or both fonts are missing', () => {
34
+ const r1 = checkBrandFontsLive('<link href="...?family=Manrope">');
35
+ expect(r1.status).toBe('fail');
36
+ expect(r1.detail).toMatch(/Fraunces/);
37
+ const r2 = checkBrandFontsLive('<head></head>');
38
+ expect(r2.status).toBe('fail');
39
+ expect(r2.detail).toMatch(/Manrope.*Fraunces/);
40
+ });
41
+ });
42
+ describe('checkManifestLive', () => {
43
+ beforeEach(() => {
44
+ vi.stubGlobal('fetch', vi.fn());
45
+ });
46
+ afterEach(() => {
47
+ vi.unstubAllGlobals();
48
+ });
49
+ it('fails when no <link rel="manifest"> in HTML', async () => {
50
+ const r = await checkManifestLive('<html><head></head></html>', 'https://x.example');
51
+ expect(r.status).toBe('fail');
52
+ expect(r.detail).toMatch(/no <link rel="manifest"/);
53
+ });
54
+ it('fails when manifest fetch returns non-2xx', async () => {
55
+ fetch.mockResolvedValue(new Response('', { status: 404 }));
56
+ const html = '<link rel="manifest" href="/manifest.json">';
57
+ const r = await checkManifestLive(html, 'https://x.example');
58
+ expect(r.status).toBe('fail');
59
+ expect(r.detail).toMatch(/404/);
60
+ });
61
+ it('fails when manifest is missing required fields', async () => {
62
+ fetch.mockResolvedValue(new Response(JSON.stringify({ name: 'X' }), {
63
+ status: 200,
64
+ headers: { 'Content-Type': 'application/json' },
65
+ }));
66
+ const html = '<link rel="manifest" href="/manifest.json">';
67
+ const r = await checkManifestLive(html, 'https://x.example');
68
+ expect(r.status).toBe('fail');
69
+ expect(r.detail).toMatch(/display.*start_url|start_url.*display/);
70
+ });
71
+ it('passes when manifest has all required fields', async () => {
72
+ fetch.mockResolvedValue(new Response(JSON.stringify({ name: 'X', display: 'standalone', start_url: '/' }), {
73
+ status: 200,
74
+ }));
75
+ const html = '<link rel="manifest" href="/manifest.json">';
76
+ const r = await checkManifestLive(html, 'https://x.example');
77
+ expect(r.status).toBe('pass');
78
+ });
79
+ it('resolves manifest URL relative to liveUrl', async () => {
80
+ const mockFetch = vi.fn().mockResolvedValue(new Response(JSON.stringify({ name: 'X', display: 'standalone', start_url: '/' }), {
81
+ status: 200,
82
+ }));
83
+ vi.stubGlobal('fetch', mockFetch);
84
+ const html = '<link rel="manifest" href="manifest.json">';
85
+ await checkManifestLive(html, 'https://app.example/');
86
+ // First arg is the URL — should resolve to absolute.
87
+ expect(mockFetch).toHaveBeenCalledWith('https://app.example/manifest.json', expect.any(Object));
88
+ });
89
+ });
90
+ describe('checkBundleSizeLive', () => {
91
+ beforeEach(() => {
92
+ vi.stubGlobal('fetch', vi.fn());
93
+ });
94
+ afterEach(() => {
95
+ vi.unstubAllGlobals();
96
+ });
97
+ it('returns warn when no /assets/*.js found (non-Vite layout)', async () => {
98
+ const r = await checkBundleSizeLive('<html><body></body></html>', 'https://x.example');
99
+ expect(r.status).toBe('warn');
100
+ expect(r.detail).toMatch(/non-Vite/);
101
+ });
102
+ it('passes when bundle is comfortably under 300 KB gzipped', async () => {
103
+ // 200KB raw → ~57KB approx gzipped — well under.
104
+ const small = new ArrayBuffer(200_000);
105
+ fetch.mockResolvedValue(new Response(small, { status: 200 }));
106
+ const html = '<script src="/assets/index-abc.js"></script>';
107
+ const r = await checkBundleSizeLive(html, 'https://x.example');
108
+ expect(r.status).toBe('pass');
109
+ expect(r.detail).toMatch(/KB gzipped/);
110
+ });
111
+ it('fails when bundle approximation exceeds 300 KB gzipped', async () => {
112
+ // 1.5MB raw → ~430KB approx gzipped — over limit.
113
+ const large = new ArrayBuffer(1_500_000);
114
+ fetch.mockResolvedValue(new Response(large, { status: 200 }));
115
+ const html = '<script src="/assets/index-big.js"></script>';
116
+ const r = await checkBundleSizeLive(html, 'https://x.example');
117
+ expect(r.status).toBe('fail');
118
+ expect(r.detail).toMatch(/over 300 KB/);
119
+ });
120
+ });
121
+ describe('auditLive (integration)', () => {
122
+ beforeEach(() => {
123
+ vi.stubGlobal('fetch', vi.fn());
124
+ });
125
+ afterEach(() => {
126
+ vi.unstubAllGlobals();
127
+ });
128
+ it('returns reachable=false + a single fail check when fetch errors', async () => {
129
+ fetch.mockRejectedValue(new Error('ECONNREFUSED'));
130
+ const r = await auditLive({ appId: 'tip', liveUrl: 'https://tip.example' });
131
+ expect(r.reachable).toBe(false);
132
+ expect(r.results).toHaveLength(1);
133
+ expect(r.results[0].status).toBe('fail');
134
+ expect(r.results[0].name).toBe('Reachable');
135
+ });
136
+ it('returns reachable=false + fail when origin returns 5xx', async () => {
137
+ fetch.mockResolvedValue(new Response('boom', { status: 503 }));
138
+ const r = await auditLive({ appId: 'tip', liveUrl: 'https://tip.example' });
139
+ expect(r.reachable).toBe(false);
140
+ expect(r.results[0].detail).toMatch(/HTTP 503/);
141
+ });
142
+ it('runs all 5 checks when origin is reachable', async () => {
143
+ const html = `
144
+ <html><head>
145
+ <link href="https://fonts.googleapis.com/css2?family=Manrope&family=Fraunces" rel="stylesheet">
146
+ <link rel="stylesheet" href="/assets/index-abc.css">
147
+ <link rel="manifest" href="/manifest.json">
148
+ </head><body>
149
+ <script src="/assets/index-abc.js"></script>
150
+ </body></html>
151
+ `;
152
+ let callCount = 0;
153
+ fetch.mockImplementation(async (url) => {
154
+ callCount++;
155
+ if (callCount === 1)
156
+ return new Response(html, { status: 200 });
157
+ if (url.endsWith('/manifest.json')) {
158
+ return new Response(JSON.stringify({ name: 'tip', display: 'standalone', start_url: '/' }), { status: 200 });
159
+ }
160
+ if (url.endsWith('.css')) {
161
+ return new Response('body { height: 100svh; }', { status: 200 });
162
+ }
163
+ // bundle: small size → pass
164
+ return new Response(new ArrayBuffer(150_000), { status: 200 });
165
+ });
166
+ const r = await auditLive({ appId: 'tip', liveUrl: 'https://tip.example' });
167
+ expect(r.reachable).toBe(true);
168
+ // 6 results: Reachable + tracking + fonts + manifest + bundle + vh.
169
+ // Reachable is recorded on success too so stale fail rows from
170
+ // earlier runs get overwritten on the next clean pass.
171
+ expect(r.results).toHaveLength(6);
172
+ const reachable = r.results.find((c) => c.name === 'Reachable');
173
+ expect(reachable?.status).toBe('pass');
174
+ const otherStatuses = r.results.filter((c) => c.name !== 'Reachable').map((c) => c.status);
175
+ expect(otherStatuses).toEqual(['pass', 'pass', 'pass', 'pass', 'pass']);
176
+ });
177
+ it('downgrades subrequest-cap errors from fail → warn (not the app\'s fault)', async () => {
178
+ fetch.mockRejectedValue(new Error('Too many subrequests by single Worker invocation.'));
179
+ const r = await auditLive({ appId: 'tip', liveUrl: 'https://tip.example' });
180
+ expect(r.reachable).toBe(false);
181
+ expect(r.results).toHaveLength(1);
182
+ expect(r.results[0].name).toBe('Reachable');
183
+ expect(r.results[0].status).toBe('warn');
184
+ expect(r.results[0].detail).toMatch(/subrequest cap/);
185
+ });
186
+ it('stamps checkedAt and preserves appId', async () => {
187
+ fetch.mockRejectedValue(new Error('x'));
188
+ const before = Date.now();
189
+ const r = await auditLive({ appId: 'my-app', liveUrl: 'https://my.example' });
190
+ const after = Date.now();
191
+ expect(r.appId).toBe('my-app');
192
+ expect(r.liveUrl).toBe('https://my.example');
193
+ expect(r.checkedAt).toBeGreaterThanOrEqual(before);
194
+ expect(r.checkedAt).toBeLessThanOrEqual(after);
195
+ });
196
+ });
197
+ describe('checkUnsafeVhLive', () => {
198
+ beforeEach(() => {
199
+ vi.stubGlobal('fetch', vi.fn());
200
+ });
201
+ afterEach(() => {
202
+ vi.unstubAllGlobals();
203
+ });
204
+ it('warns when no <link rel="stylesheet"> exists in HTML', async () => {
205
+ const r = await checkUnsafeVhLive('<html><body></body></html>', 'https://x.example');
206
+ expect(r.status).toBe('warn');
207
+ expect(r.detail).toMatch(/no.*stylesheet/);
208
+ });
209
+ it('finds the stylesheet href regardless of attribute order (rel before href)', async () => {
210
+ fetch.mockResolvedValue(new Response('body { height: 100svh; }', { status: 200 }));
211
+ const html = '<link rel="stylesheet" href="/assets/index.css">';
212
+ const r = await checkUnsafeVhLive(html, 'https://x.example');
213
+ expect(r.status).toBe('pass');
214
+ });
215
+ it('finds the stylesheet href regardless of attribute order (href before rel)', async () => {
216
+ fetch.mockResolvedValue(new Response('body { height: 100svh; }', { status: 200 }));
217
+ const html = '<link href="/assets/index.css" rel="stylesheet">';
218
+ const r = await checkUnsafeVhLive(html, 'https://x.example');
219
+ expect(r.status).toBe('pass');
220
+ });
221
+ it('warns when CSS contains 100vh', async () => {
222
+ fetch.mockResolvedValue(new Response('.full { height: 100vh; padding: 100vh; }', { status: 200 }));
223
+ const html = '<link rel="stylesheet" href="/assets/index.css">';
224
+ const r = await checkUnsafeVhLive(html, 'https://x.example');
225
+ expect(r.status).toBe('warn');
226
+ expect(r.detail).toMatch(/2 occurrence\(s\) of 100vh/);
227
+ expect(r.suggestions?.join('\n')).toMatch(/100svh.*100dvh/);
228
+ });
229
+ it('passes when CSS uses 100svh / 100dvh exclusively', async () => {
230
+ fetch.mockResolvedValue(new Response('a{height:100svh}b{height:100dvh}', { status: 200 }));
231
+ const html = '<link rel="stylesheet" href="/assets/index.css">';
232
+ const r = await checkUnsafeVhLive(html, 'https://x.example');
233
+ expect(r.status).toBe('pass');
234
+ });
235
+ it('does not match identifier-like substrings (word boundary on the unit)', async () => {
236
+ // `--my100vhvar` and `var100vh1` aren't actual unit usage; the
237
+ // word-boundary anchors on the regex literal must keep us from
238
+ // flagging them.
239
+ fetch.mockResolvedValue(new Response('.x { --my100vhvar: 0; } .y { content: "var100vh1"; }', { status: 200 }));
240
+ const html = '<link rel="stylesheet" href="/assets/index.css">';
241
+ const r = await checkUnsafeVhLive(html, 'https://x.example');
242
+ expect(r.status).toBe('pass');
243
+ });
244
+ it('warns (not fail) on subrequest cap errors so audit-Worker noise does not flip badges', async () => {
245
+ fetch.mockRejectedValue(new Error('Too many subrequests by single Worker invocation'));
246
+ const html = '<link rel="stylesheet" href="/assets/index.css">';
247
+ const r = await checkUnsafeVhLive(html, 'https://x.example');
248
+ expect(r.status).toBe('warn');
249
+ expect(r.detail).toMatch(/subrequest cap/);
250
+ });
251
+ it('warns on non-200 CSS fetch response', async () => {
252
+ fetch.mockResolvedValue(new Response('', { status: 404 }));
253
+ const html = '<link rel="stylesheet" href="/assets/index.css">';
254
+ const r = await checkUnsafeVhLive(html, 'https://x.example');
255
+ expect(r.status).toBe('warn');
256
+ expect(r.detail).toMatch(/HTTP 404/);
257
+ });
258
+ });
259
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/live/index.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@freeappstore/compliance",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Compliance checks for apps published on freeappstore.online — used by the CLI for local feedback and by CI for gating.",
5
5
  "license": "MIT",
6
6
  "type": "module",