@shakenbake/core 0.0.1
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/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +82 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/mock-adapter.test.d.ts +2 -0
- package/dist/__tests__/mock-adapter.test.d.ts.map +1 -0
- package/dist/__tests__/mock-adapter.test.js +184 -0
- package/dist/__tests__/mock-adapter.test.js.map +1 -0
- package/dist/__tests__/plugin-registry.test.d.ts +2 -0
- package/dist/__tests__/plugin-registry.test.d.ts.map +1 -0
- package/dist/__tests__/plugin-registry.test.js +209 -0
- package/dist/__tests__/plugin-registry.test.js.map +1 -0
- package/dist/__tests__/redact.test.d.ts +2 -0
- package/dist/__tests__/redact.test.d.ts.map +1 -0
- package/dist/__tests__/redact.test.js +58 -0
- package/dist/__tests__/redact.test.js.map +1 -0
- package/dist/__tests__/report-builder.test.d.ts +2 -0
- package/dist/__tests__/report-builder.test.d.ts.map +1 -0
- package/dist/__tests__/report-builder.test.js +396 -0
- package/dist/__tests__/report-builder.test.js.map +1 -0
- package/dist/errors.d.ts +23 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +49 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/mock-adapter.d.ts +46 -0
- package/dist/mock-adapter.d.ts.map +1 -0
- package/dist/mock-adapter.js +95 -0
- package/dist/mock-adapter.js.map +1 -0
- package/dist/plugin-registry.d.ts +36 -0
- package/dist/plugin-registry.d.ts.map +1 -0
- package/dist/plugin-registry.js +116 -0
- package/dist/plugin-registry.js.map +1 -0
- package/dist/redact.d.ts +13 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +45 -0
- package/dist/redact.js.map +1 -0
- package/dist/report-builder.d.ts +37 -0
- package/dist/report-builder.d.ts.map +1 -0
- package/dist/report-builder.js +147 -0
- package/dist/report-builder.js.map +1 -0
- package/dist/types.d.ts +223 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +27 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const errors_js_1 = require("../errors.js");
|
|
5
|
+
(0, vitest_1.describe)('ShakeNbakeError', () => {
|
|
6
|
+
(0, vitest_1.it)('should create an error with code and message', () => {
|
|
7
|
+
const err = new errors_js_1.ShakeNbakeError('test message', 'AUTH_FAILED');
|
|
8
|
+
(0, vitest_1.expect)(err.message).toBe('test message');
|
|
9
|
+
(0, vitest_1.expect)(err.code).toBe('AUTH_FAILED');
|
|
10
|
+
(0, vitest_1.expect)(err.name).toBe('ShakeNbakeError');
|
|
11
|
+
(0, vitest_1.expect)(err).toBeInstanceOf(Error);
|
|
12
|
+
(0, vitest_1.expect)(err).toBeInstanceOf(errors_js_1.ShakeNbakeError);
|
|
13
|
+
});
|
|
14
|
+
(0, vitest_1.it)('should default retryable to true for NETWORK_ERROR', () => {
|
|
15
|
+
const err = new errors_js_1.ShakeNbakeError('offline', 'NETWORK_ERROR');
|
|
16
|
+
(0, vitest_1.expect)(err.retryable).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.it)('should default retryable to true for RATE_LIMITED', () => {
|
|
19
|
+
const err = new errors_js_1.ShakeNbakeError('rate limit', 'RATE_LIMITED');
|
|
20
|
+
(0, vitest_1.expect)(err.retryable).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
(0, vitest_1.it)('should default retryable to false for AUTH_FAILED', () => {
|
|
23
|
+
const err = new errors_js_1.ShakeNbakeError('auth fail', 'AUTH_FAILED');
|
|
24
|
+
(0, vitest_1.expect)(err.retryable).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.it)('should default retryable to false for UPLOAD_FAILED', () => {
|
|
27
|
+
const err = new errors_js_1.ShakeNbakeError('upload fail', 'UPLOAD_FAILED');
|
|
28
|
+
(0, vitest_1.expect)(err.retryable).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
(0, vitest_1.it)('should default retryable to false for UNKNOWN', () => {
|
|
31
|
+
const err = new errors_js_1.ShakeNbakeError('unknown', 'UNKNOWN');
|
|
32
|
+
(0, vitest_1.expect)(err.retryable).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)('should allow overriding retryable via options', () => {
|
|
35
|
+
const err = new errors_js_1.ShakeNbakeError('overridden', 'AUTH_FAILED', {
|
|
36
|
+
retryable: true,
|
|
37
|
+
});
|
|
38
|
+
(0, vitest_1.expect)(err.retryable).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.it)('should allow overriding retryable to false for retryable codes', () => {
|
|
41
|
+
const err = new errors_js_1.ShakeNbakeError('forced not retryable', 'NETWORK_ERROR', {
|
|
42
|
+
retryable: false,
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.expect)(err.retryable).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.it)('should store the original error', () => {
|
|
47
|
+
const original = new TypeError('inner');
|
|
48
|
+
const err = new errors_js_1.ShakeNbakeError('wrapped', 'UNKNOWN', {
|
|
49
|
+
originalError: original,
|
|
50
|
+
});
|
|
51
|
+
(0, vitest_1.expect)(err.originalError).toBe(original);
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.it)('should have undefined originalError when not provided', () => {
|
|
54
|
+
const err = new errors_js_1.ShakeNbakeError('no original', 'UNKNOWN');
|
|
55
|
+
(0, vitest_1.expect)(err.originalError).toBeUndefined();
|
|
56
|
+
});
|
|
57
|
+
(0, vitest_1.it)('isRetryable static method returns correct values', () => {
|
|
58
|
+
(0, vitest_1.expect)(errors_js_1.ShakeNbakeError.isRetryable('NETWORK_ERROR')).toBe(true);
|
|
59
|
+
(0, vitest_1.expect)(errors_js_1.ShakeNbakeError.isRetryable('RATE_LIMITED')).toBe(true);
|
|
60
|
+
(0, vitest_1.expect)(errors_js_1.ShakeNbakeError.isRetryable('AUTH_FAILED')).toBe(false);
|
|
61
|
+
(0, vitest_1.expect)(errors_js_1.ShakeNbakeError.isRetryable('UPLOAD_FAILED')).toBe(false);
|
|
62
|
+
(0, vitest_1.expect)(errors_js_1.ShakeNbakeError.isRetryable('UNKNOWN')).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
(0, vitest_1.it)('messageForCode returns correct messages', () => {
|
|
65
|
+
const codes = [
|
|
66
|
+
'AUTH_FAILED',
|
|
67
|
+
'RATE_LIMITED',
|
|
68
|
+
'UPLOAD_FAILED',
|
|
69
|
+
'NETWORK_ERROR',
|
|
70
|
+
'UNKNOWN',
|
|
71
|
+
];
|
|
72
|
+
for (const code of codes) {
|
|
73
|
+
(0, vitest_1.expect)(errors_js_1.ShakeNbakeError.messageForCode(code)).toBe(errors_js_1.ERROR_MESSAGES[code]);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
(0, vitest_1.it)('has a proper stack trace', () => {
|
|
77
|
+
const err = new errors_js_1.ShakeNbakeError('stack check', 'UNKNOWN');
|
|
78
|
+
(0, vitest_1.expect)(err.stack).toBeDefined();
|
|
79
|
+
(0, vitest_1.expect)(err.stack).toContain('ShakeNbakeError');
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=errors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-adapter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mock-adapter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const mock_adapter_js_1 = require("../mock-adapter.js");
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Helpers
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
function makeBugReport(overrides = {}) {
|
|
9
|
+
return {
|
|
10
|
+
id: 'test-id-001',
|
|
11
|
+
timestamp: new Date().toISOString(),
|
|
12
|
+
title: 'Button does not respond',
|
|
13
|
+
description: 'Tapping the submit button does nothing.',
|
|
14
|
+
severity: 'high',
|
|
15
|
+
category: 'bug',
|
|
16
|
+
screenshot: {
|
|
17
|
+
annotated: 'data:image/png;base64,AAAA',
|
|
18
|
+
original: 'data:image/png;base64,BBBB',
|
|
19
|
+
dimensions: { width: 375, height: 812 },
|
|
20
|
+
},
|
|
21
|
+
context: {
|
|
22
|
+
platform: { os: 'ios' },
|
|
23
|
+
device: {},
|
|
24
|
+
screen: { width: 375, height: 812 },
|
|
25
|
+
network: {},
|
|
26
|
+
battery: {},
|
|
27
|
+
locale: {},
|
|
28
|
+
app: {},
|
|
29
|
+
accessibility: {},
|
|
30
|
+
performance: {},
|
|
31
|
+
navigation: {},
|
|
32
|
+
console: {},
|
|
33
|
+
},
|
|
34
|
+
...overrides,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Tests
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
(0, vitest_1.describe)('MockAdapter', () => {
|
|
41
|
+
let adapter;
|
|
42
|
+
(0, vitest_1.beforeEach)(() => {
|
|
43
|
+
adapter = new mock_adapter_js_1.MockAdapter();
|
|
44
|
+
vitest_1.vi.restoreAllMocks();
|
|
45
|
+
});
|
|
46
|
+
// ---- Basic identity ----
|
|
47
|
+
(0, vitest_1.it)('has name "mock"', () => {
|
|
48
|
+
(0, vitest_1.expect)(adapter.name).toBe('mock');
|
|
49
|
+
});
|
|
50
|
+
// ---- uploadImage ----
|
|
51
|
+
(0, vitest_1.it)('uploadImage returns a URL containing "mock.shakenbake.dev"', async () => {
|
|
52
|
+
const url = await adapter.uploadImage(Buffer.from('png'), 'shot.png');
|
|
53
|
+
(0, vitest_1.expect)(url).toContain('mock.shakenbake.dev');
|
|
54
|
+
(0, vitest_1.expect)(url).toMatch(/^https:\/\/mock\.shakenbake\.dev\/images\/.+\.png$/);
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.it)('uploadImage handles Buffer input', async () => {
|
|
57
|
+
const buf = Buffer.from('fake-image-data');
|
|
58
|
+
const url = await adapter.uploadImage(buf, 'buffer-test.png');
|
|
59
|
+
(0, vitest_1.expect)(typeof url).toBe('string');
|
|
60
|
+
(0, vitest_1.expect)(url).toContain('mock.shakenbake.dev');
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.it)('uploadImage handles Blob input', async () => {
|
|
63
|
+
const blob = new Blob(['fake-image-data'], { type: 'image/png' });
|
|
64
|
+
const url = await adapter.uploadImage(blob, 'blob-test.png');
|
|
65
|
+
(0, vitest_1.expect)(typeof url).toBe('string');
|
|
66
|
+
(0, vitest_1.expect)(url).toContain('mock.shakenbake.dev');
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.it)('uploadImage logs filename and size to console', async () => {
|
|
69
|
+
const spy = vitest_1.vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
70
|
+
const buf = Buffer.from('12345');
|
|
71
|
+
await adapter.uploadImage(buf, 'my-screenshot.png');
|
|
72
|
+
(0, vitest_1.expect)(spy).toHaveBeenCalledWith(vitest_1.expect.stringContaining('my-screenshot.png'));
|
|
73
|
+
(0, vitest_1.expect)(spy).toHaveBeenCalledWith(vitest_1.expect.stringContaining('5 bytes'));
|
|
74
|
+
});
|
|
75
|
+
// ---- createIssue ----
|
|
76
|
+
(0, vitest_1.it)('createIssue returns a SubmitResult with url, id, and success: true', async () => {
|
|
77
|
+
const report = makeBugReport();
|
|
78
|
+
const result = await adapter.createIssue(report);
|
|
79
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
80
|
+
(0, vitest_1.expect)(typeof result.id).toBe('string');
|
|
81
|
+
(0, vitest_1.expect)(result.id.length).toBeGreaterThan(0);
|
|
82
|
+
(0, vitest_1.expect)(result.url).toContain('mock.shakenbake.dev/issues/');
|
|
83
|
+
(0, vitest_1.expect)(result.url).toContain(result.id);
|
|
84
|
+
});
|
|
85
|
+
(0, vitest_1.it)('createIssue stores the report in submittedReports', async () => {
|
|
86
|
+
const report = makeBugReport();
|
|
87
|
+
await adapter.createIssue(report);
|
|
88
|
+
const stored = adapter.getSubmittedReports();
|
|
89
|
+
(0, vitest_1.expect)(stored).toHaveLength(1);
|
|
90
|
+
(0, vitest_1.expect)(stored[0]).toEqual(report);
|
|
91
|
+
});
|
|
92
|
+
(0, vitest_1.it)('createIssue logs report title and metadata to console', async () => {
|
|
93
|
+
const spy = vitest_1.vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
94
|
+
const report = makeBugReport({ title: 'My Cool Bug' });
|
|
95
|
+
await adapter.createIssue(report);
|
|
96
|
+
(0, vitest_1.expect)(spy).toHaveBeenCalledWith(vitest_1.expect.stringContaining('My Cool Bug'));
|
|
97
|
+
});
|
|
98
|
+
// ---- getSubmittedReports / clearReports ----
|
|
99
|
+
(0, vitest_1.it)('getSubmittedReports returns a copy (not the internal array)', async () => {
|
|
100
|
+
const report = makeBugReport();
|
|
101
|
+
await adapter.createIssue(report);
|
|
102
|
+
const first = adapter.getSubmittedReports();
|
|
103
|
+
const second = adapter.getSubmittedReports();
|
|
104
|
+
// Different array references
|
|
105
|
+
(0, vitest_1.expect)(first).not.toBe(second);
|
|
106
|
+
// Same contents
|
|
107
|
+
(0, vitest_1.expect)(first).toEqual(second);
|
|
108
|
+
});
|
|
109
|
+
(0, vitest_1.it)('clearReports empties the submitted reports list', async () => {
|
|
110
|
+
await adapter.createIssue(makeBugReport());
|
|
111
|
+
(0, vitest_1.expect)(adapter.getSubmittedReports()).toHaveLength(1);
|
|
112
|
+
adapter.clearReports();
|
|
113
|
+
(0, vitest_1.expect)(adapter.getSubmittedReports()).toHaveLength(0);
|
|
114
|
+
});
|
|
115
|
+
(0, vitest_1.it)('multiple reports accumulate correctly', async () => {
|
|
116
|
+
const r1 = makeBugReport({ id: 'r1', title: 'First' });
|
|
117
|
+
const r2 = makeBugReport({ id: 'r2', title: 'Second' });
|
|
118
|
+
const r3 = makeBugReport({ id: 'r3', title: 'Third' });
|
|
119
|
+
await adapter.createIssue(r1);
|
|
120
|
+
await adapter.createIssue(r2);
|
|
121
|
+
await adapter.createIssue(r3);
|
|
122
|
+
const stored = adapter.getSubmittedReports();
|
|
123
|
+
(0, vitest_1.expect)(stored).toHaveLength(3);
|
|
124
|
+
(0, vitest_1.expect)(stored[0].title).toBe('First');
|
|
125
|
+
(0, vitest_1.expect)(stored[1].title).toBe('Second');
|
|
126
|
+
(0, vitest_1.expect)(stored[2].title).toBe('Third');
|
|
127
|
+
});
|
|
128
|
+
// ---- testConnection ----
|
|
129
|
+
(0, vitest_1.it)('testConnection returns true', async () => {
|
|
130
|
+
const connected = await adapter.testConnection();
|
|
131
|
+
(0, vitest_1.expect)(connected).toBe(true);
|
|
132
|
+
});
|
|
133
|
+
// ---- delay option ----
|
|
134
|
+
(0, vitest_1.it)('delay option adds latency to uploadImage', async () => {
|
|
135
|
+
const delayedAdapter = new mock_adapter_js_1.MockAdapter({ delay: 100 });
|
|
136
|
+
const start = Date.now();
|
|
137
|
+
await delayedAdapter.uploadImage(Buffer.from('x'), 'test.png');
|
|
138
|
+
const elapsed = Date.now() - start;
|
|
139
|
+
// Should take at least ~80ms (allowing a small margin for timer precision)
|
|
140
|
+
(0, vitest_1.expect)(elapsed).toBeGreaterThanOrEqual(80);
|
|
141
|
+
});
|
|
142
|
+
(0, vitest_1.it)('delay option adds latency to createIssue', async () => {
|
|
143
|
+
const delayedAdapter = new mock_adapter_js_1.MockAdapter({ delay: 100 });
|
|
144
|
+
const start = Date.now();
|
|
145
|
+
await delayedAdapter.createIssue(makeBugReport());
|
|
146
|
+
const elapsed = Date.now() - start;
|
|
147
|
+
(0, vitest_1.expect)(elapsed).toBeGreaterThanOrEqual(80);
|
|
148
|
+
});
|
|
149
|
+
(0, vitest_1.it)('delay option adds latency to testConnection', async () => {
|
|
150
|
+
const delayedAdapter = new mock_adapter_js_1.MockAdapter({ delay: 100 });
|
|
151
|
+
const start = Date.now();
|
|
152
|
+
await delayedAdapter.testConnection();
|
|
153
|
+
const elapsed = Date.now() - start;
|
|
154
|
+
(0, vitest_1.expect)(elapsed).toBeGreaterThanOrEqual(80);
|
|
155
|
+
});
|
|
156
|
+
(0, vitest_1.it)('zero delay does not add latency', async () => {
|
|
157
|
+
const zeroAdapter = new mock_adapter_js_1.MockAdapter({ delay: 0 });
|
|
158
|
+
const start = Date.now();
|
|
159
|
+
await zeroAdapter.uploadImage(Buffer.from('x'), 'test.png');
|
|
160
|
+
const elapsed = Date.now() - start;
|
|
161
|
+
// Should be virtually instant (well under 50ms)
|
|
162
|
+
(0, vitest_1.expect)(elapsed).toBeLessThan(50);
|
|
163
|
+
});
|
|
164
|
+
// ---- default config ----
|
|
165
|
+
(0, vitest_1.it)('works with no config argument', async () => {
|
|
166
|
+
const defaultAdapter = new mock_adapter_js_1.MockAdapter();
|
|
167
|
+
const url = await defaultAdapter.uploadImage(Buffer.from('x'), 'a.png');
|
|
168
|
+
(0, vitest_1.expect)(url).toContain('mock.shakenbake.dev');
|
|
169
|
+
const result = await defaultAdapter.createIssue(makeBugReport());
|
|
170
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
171
|
+
const ok = await defaultAdapter.testConnection();
|
|
172
|
+
(0, vitest_1.expect)(ok).toBe(true);
|
|
173
|
+
});
|
|
174
|
+
// ---- implements DestinationAdapter ----
|
|
175
|
+
(0, vitest_1.it)('satisfies the DestinationAdapter interface', () => {
|
|
176
|
+
// TypeScript will catch interface violations at compile-time, but we
|
|
177
|
+
// also verify at runtime that the required methods exist.
|
|
178
|
+
(0, vitest_1.expect)(typeof adapter.name).toBe('string');
|
|
179
|
+
(0, vitest_1.expect)(typeof adapter.uploadImage).toBe('function');
|
|
180
|
+
(0, vitest_1.expect)(typeof adapter.createIssue).toBe('function');
|
|
181
|
+
(0, vitest_1.expect)(typeof adapter.testConnection).toBe('function');
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
//# sourceMappingURL=mock-adapter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-adapter.test.js","sourceRoot":"","sources":["../../src/__tests__/mock-adapter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-registry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/plugin-registry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const plugin_registry_js_1 = require("../plugin-registry.js");
|
|
5
|
+
function makeTrigger(name) {
|
|
6
|
+
return {
|
|
7
|
+
name,
|
|
8
|
+
platform: 'universal',
|
|
9
|
+
activate: vitest_1.vi.fn(),
|
|
10
|
+
deactivate: vitest_1.vi.fn(),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function makeCapture(name, result) {
|
|
14
|
+
return {
|
|
15
|
+
name,
|
|
16
|
+
platform: 'web',
|
|
17
|
+
capture: vitest_1.vi.fn().mockResolvedValue(result ?? {
|
|
18
|
+
imageData: 'base64data',
|
|
19
|
+
dimensions: { width: 800, height: 600 },
|
|
20
|
+
mimeType: 'image/png',
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function makeCollector(name, partial) {
|
|
25
|
+
return {
|
|
26
|
+
name,
|
|
27
|
+
platform: 'universal',
|
|
28
|
+
collect: vitest_1.vi.fn().mockResolvedValue(partial),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function makeFailingCollector(name) {
|
|
32
|
+
return {
|
|
33
|
+
name,
|
|
34
|
+
platform: 'universal',
|
|
35
|
+
collect: vitest_1.vi.fn().mockRejectedValue(new Error('collector failed')),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
(0, vitest_1.describe)('PluginRegistry', () => {
|
|
39
|
+
// ---- Triggers ----
|
|
40
|
+
(0, vitest_1.describe)('triggers', () => {
|
|
41
|
+
(0, vitest_1.it)('registers and retrieves triggers', () => {
|
|
42
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
43
|
+
const trigger = makeTrigger('shake');
|
|
44
|
+
registry.registerTrigger(trigger);
|
|
45
|
+
(0, vitest_1.expect)(registry.getTriggers()).toHaveLength(1);
|
|
46
|
+
(0, vitest_1.expect)(registry.getTriggers()[0]?.name).toBe('shake');
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)('unregisters a trigger by name', () => {
|
|
49
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
50
|
+
registry.registerTrigger(makeTrigger('shake'));
|
|
51
|
+
registry.registerTrigger(makeTrigger('keyboard'));
|
|
52
|
+
registry.unregisterTrigger('shake');
|
|
53
|
+
(0, vitest_1.expect)(registry.getTriggers()).toHaveLength(1);
|
|
54
|
+
(0, vitest_1.expect)(registry.getTriggers()[0]?.name).toBe('keyboard');
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.it)('activates and deactivates all triggers', () => {
|
|
57
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
58
|
+
const t1 = makeTrigger('shake');
|
|
59
|
+
const t2 = makeTrigger('keyboard');
|
|
60
|
+
registry.registerTrigger(t1);
|
|
61
|
+
registry.registerTrigger(t2);
|
|
62
|
+
const onTrigger = vitest_1.vi.fn();
|
|
63
|
+
registry.activateTriggers(onTrigger);
|
|
64
|
+
(0, vitest_1.expect)(t1.activate).toHaveBeenCalledWith(onTrigger);
|
|
65
|
+
(0, vitest_1.expect)(t2.activate).toHaveBeenCalledWith(onTrigger);
|
|
66
|
+
registry.deactivateTriggers();
|
|
67
|
+
(0, vitest_1.expect)(t1.deactivate).toHaveBeenCalled();
|
|
68
|
+
(0, vitest_1.expect)(t2.deactivate).toHaveBeenCalled();
|
|
69
|
+
});
|
|
70
|
+
(0, vitest_1.it)('returns empty array when no triggers registered', () => {
|
|
71
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
72
|
+
(0, vitest_1.expect)(registry.getTriggers()).toEqual([]);
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.it)('overwrites trigger with the same name', () => {
|
|
75
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
76
|
+
const t1 = makeTrigger('shake');
|
|
77
|
+
const t2 = makeTrigger('shake');
|
|
78
|
+
registry.registerTrigger(t1);
|
|
79
|
+
registry.registerTrigger(t2);
|
|
80
|
+
(0, vitest_1.expect)(registry.getTriggers()).toHaveLength(1);
|
|
81
|
+
// The second registration should replace the first
|
|
82
|
+
(0, vitest_1.expect)(registry.getTriggers()[0]).toBe(t2);
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('unregistering a non-existent trigger is a no-op', () => {
|
|
85
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
86
|
+
registry.registerTrigger(makeTrigger('shake'));
|
|
87
|
+
registry.unregisterTrigger('nonexistent');
|
|
88
|
+
(0, vitest_1.expect)(registry.getTriggers()).toHaveLength(1);
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.it)('activateTriggers is a no-op on empty registry', () => {
|
|
91
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
92
|
+
// Should not throw
|
|
93
|
+
registry.activateTriggers(vitest_1.vi.fn());
|
|
94
|
+
});
|
|
95
|
+
(0, vitest_1.it)('deactivateTriggers is a no-op on empty registry', () => {
|
|
96
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
97
|
+
// Should not throw
|
|
98
|
+
registry.deactivateTriggers();
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
// ---- Capture ----
|
|
102
|
+
(0, vitest_1.describe)('capture', () => {
|
|
103
|
+
(0, vitest_1.it)('returns undefined when no capture plugin is registered', () => {
|
|
104
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
105
|
+
(0, vitest_1.expect)(registry.getCapture()).toBeUndefined();
|
|
106
|
+
});
|
|
107
|
+
(0, vitest_1.it)('returns the first registered capture plugin', () => {
|
|
108
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
109
|
+
registry.registerCapture(makeCapture('html2canvas'));
|
|
110
|
+
registry.registerCapture(makeCapture('view-shot'));
|
|
111
|
+
(0, vitest_1.expect)(registry.getCapture()?.name).toBe('html2canvas');
|
|
112
|
+
});
|
|
113
|
+
(0, vitest_1.it)('unregisters a capture plugin by name', () => {
|
|
114
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
115
|
+
registry.registerCapture(makeCapture('html2canvas'));
|
|
116
|
+
registry.unregisterCapture('html2canvas');
|
|
117
|
+
(0, vitest_1.expect)(registry.getCapture()).toBeUndefined();
|
|
118
|
+
});
|
|
119
|
+
(0, vitest_1.it)('overwrites capture plugin with the same name', () => {
|
|
120
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
121
|
+
const c1 = makeCapture('html2canvas');
|
|
122
|
+
const c2 = makeCapture('html2canvas');
|
|
123
|
+
registry.registerCapture(c1);
|
|
124
|
+
registry.registerCapture(c2);
|
|
125
|
+
// Map overwrites, so only one entry
|
|
126
|
+
(0, vitest_1.expect)(registry.getCapture()).toBe(c2);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
// ---- Collectors ----
|
|
130
|
+
(0, vitest_1.describe)('collectors', () => {
|
|
131
|
+
(0, vitest_1.it)('registers and retrieves collectors', () => {
|
|
132
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
133
|
+
const collector = makeCollector('device', {
|
|
134
|
+
device: { manufacturer: 'Apple' },
|
|
135
|
+
});
|
|
136
|
+
registry.registerCollector(collector);
|
|
137
|
+
(0, vitest_1.expect)(registry.getCollectors()).toHaveLength(1);
|
|
138
|
+
});
|
|
139
|
+
(0, vitest_1.it)('unregisters a collector by name', () => {
|
|
140
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
141
|
+
registry.registerCollector(makeCollector('device', { device: {} }));
|
|
142
|
+
registry.unregisterCollector('device');
|
|
143
|
+
(0, vitest_1.expect)(registry.getCollectors()).toHaveLength(0);
|
|
144
|
+
});
|
|
145
|
+
(0, vitest_1.it)('merges context from multiple collectors', async () => {
|
|
146
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
147
|
+
registry.registerCollector(makeCollector('platform', {
|
|
148
|
+
platform: { os: 'ios', osVersion: '17.0' },
|
|
149
|
+
}));
|
|
150
|
+
registry.registerCollector(makeCollector('network', {
|
|
151
|
+
network: { isConnected: true, type: 'wifi' },
|
|
152
|
+
}));
|
|
153
|
+
const ctx = await registry.collectContext();
|
|
154
|
+
(0, vitest_1.expect)(ctx.platform?.os).toBe('ios');
|
|
155
|
+
(0, vitest_1.expect)(ctx.platform?.osVersion).toBe('17.0');
|
|
156
|
+
(0, vitest_1.expect)(ctx.network?.isConnected).toBe(true);
|
|
157
|
+
(0, vitest_1.expect)(ctx.network?.type).toBe('wifi');
|
|
158
|
+
});
|
|
159
|
+
(0, vitest_1.it)('returns empty object when no collectors are registered', async () => {
|
|
160
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
161
|
+
const ctx = await registry.collectContext();
|
|
162
|
+
(0, vitest_1.expect)(ctx).toEqual({});
|
|
163
|
+
});
|
|
164
|
+
(0, vitest_1.it)('overwrites collector with the same name', () => {
|
|
165
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
166
|
+
const c1 = makeCollector('device', { device: { manufacturer: 'Apple' } });
|
|
167
|
+
const c2 = makeCollector('device', { device: { manufacturer: 'Samsung' } });
|
|
168
|
+
registry.registerCollector(c1);
|
|
169
|
+
registry.registerCollector(c2);
|
|
170
|
+
(0, vitest_1.expect)(registry.getCollectors()).toHaveLength(1);
|
|
171
|
+
(0, vitest_1.expect)(registry.getCollectors()[0]).toBe(c2);
|
|
172
|
+
});
|
|
173
|
+
(0, vitest_1.it)('handles a failing collector gracefully without breaking others', async () => {
|
|
174
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
175
|
+
registry.registerCollector(makeCollector('platform', {
|
|
176
|
+
platform: { os: 'ios' },
|
|
177
|
+
}));
|
|
178
|
+
registry.registerCollector(makeFailingCollector('broken'));
|
|
179
|
+
registry.registerCollector(makeCollector('network', {
|
|
180
|
+
network: { isConnected: true },
|
|
181
|
+
}));
|
|
182
|
+
const ctx = await registry.collectContext();
|
|
183
|
+
// The failing collector should be skipped
|
|
184
|
+
(0, vitest_1.expect)(ctx.platform?.os).toBe('ios');
|
|
185
|
+
(0, vitest_1.expect)(ctx.network?.isConnected).toBe(true);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
// ---- Clear ----
|
|
189
|
+
(0, vitest_1.describe)('clear()', () => {
|
|
190
|
+
(0, vitest_1.it)('removes all triggers, capture plugins, and collectors', () => {
|
|
191
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
192
|
+
registry.registerTrigger(makeTrigger('shake'));
|
|
193
|
+
registry.registerTrigger(makeTrigger('keyboard'));
|
|
194
|
+
registry.registerCapture(makeCapture('html2canvas'));
|
|
195
|
+
registry.registerCollector(makeCollector('device', { device: {} }));
|
|
196
|
+
registry.clear();
|
|
197
|
+
(0, vitest_1.expect)(registry.getTriggers()).toHaveLength(0);
|
|
198
|
+
(0, vitest_1.expect)(registry.getCapture()).toBeUndefined();
|
|
199
|
+
(0, vitest_1.expect)(registry.getCollectors()).toHaveLength(0);
|
|
200
|
+
});
|
|
201
|
+
(0, vitest_1.it)('is safe to call clear() on an empty registry', () => {
|
|
202
|
+
const registry = new plugin_registry_js_1.PluginRegistry();
|
|
203
|
+
// Should not throw
|
|
204
|
+
registry.clear();
|
|
205
|
+
(0, vitest_1.expect)(registry.getTriggers()).toHaveLength(0);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
//# sourceMappingURL=plugin-registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-registry.test.js","sourceRoot":"","sources":["../../src/__tests__/plugin-registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/redact.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const redact_js_1 = require("../redact.js");
|
|
5
|
+
function makeContext() {
|
|
6
|
+
return {
|
|
7
|
+
platform: { os: 'web', userAgent: 'Mozilla/5.0', browser: 'Chrome 120' },
|
|
8
|
+
app: { url: 'https://example.com/secret?token=abc', pathname: '/secret', title: 'My App' },
|
|
9
|
+
network: { online: true, effectiveType: '4g' },
|
|
10
|
+
console: {
|
|
11
|
+
recentLogs: [{ level: 'info', message: 'hello', timestamp: '2026-01-01T00:00:00Z' }],
|
|
12
|
+
recentErrors: [],
|
|
13
|
+
},
|
|
14
|
+
screen: { width: 1920, height: 1080 },
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
(0, vitest_1.describe)('redactContext', () => {
|
|
18
|
+
(0, vitest_1.it)('returns context unchanged when no fields specified', () => {
|
|
19
|
+
const ctx = makeContext();
|
|
20
|
+
const result = (0, redact_js_1.redactContext)(ctx, []);
|
|
21
|
+
(0, vitest_1.expect)(result).toEqual(ctx);
|
|
22
|
+
});
|
|
23
|
+
(0, vitest_1.it)('removes a top-level section', () => {
|
|
24
|
+
const result = (0, redact_js_1.redactContext)(makeContext(), ['console']);
|
|
25
|
+
(0, vitest_1.expect)(result.console).toBeUndefined();
|
|
26
|
+
(0, vitest_1.expect)(result.platform?.os).toBe('web');
|
|
27
|
+
});
|
|
28
|
+
(0, vitest_1.it)('removes a nested field', () => {
|
|
29
|
+
const result = (0, redact_js_1.redactContext)(makeContext(), ['app.url']);
|
|
30
|
+
(0, vitest_1.expect)(result.app?.url).toBeUndefined();
|
|
31
|
+
(0, vitest_1.expect)(result.app?.pathname).toBe('/secret');
|
|
32
|
+
(0, vitest_1.expect)(result.app?.title).toBe('My App');
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)('handles wildcard to clear all fields in a section', () => {
|
|
35
|
+
const result = (0, redact_js_1.redactContext)(makeContext(), ['network.*']);
|
|
36
|
+
(0, vitest_1.expect)(result.network).toEqual({});
|
|
37
|
+
});
|
|
38
|
+
(0, vitest_1.it)('handles multiple redaction patterns', () => {
|
|
39
|
+
const result = (0, redact_js_1.redactContext)(makeContext(), ['app.url', 'console', 'platform.userAgent']);
|
|
40
|
+
(0, vitest_1.expect)(result.app?.url).toBeUndefined();
|
|
41
|
+
(0, vitest_1.expect)(result.console).toBeUndefined();
|
|
42
|
+
(0, vitest_1.expect)(result.platform?.userAgent).toBeUndefined();
|
|
43
|
+
(0, vitest_1.expect)(result.platform?.os).toBe('web');
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.it)('does not mutate the original context', () => {
|
|
46
|
+
const ctx = makeContext();
|
|
47
|
+
(0, redact_js_1.redactContext)(ctx, ['app.url', 'console']);
|
|
48
|
+
(0, vitest_1.expect)(ctx.app?.url).toBe('https://example.com/secret?token=abc');
|
|
49
|
+
(0, vitest_1.expect)(ctx.console).toBeDefined();
|
|
50
|
+
});
|
|
51
|
+
(0, vitest_1.it)('ignores non-existent fields gracefully', () => {
|
|
52
|
+
const ctx = makeContext();
|
|
53
|
+
const result = (0, redact_js_1.redactContext)(ctx, ['nonexistent', 'app.nonexistent']);
|
|
54
|
+
(0, vitest_1.expect)(result.platform?.os).toBe('web');
|
|
55
|
+
(0, vitest_1.expect)(result.app?.url).toBe('https://example.com/secret?token=abc');
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=redact.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.test.js","sourceRoot":"","sources":["../../src/__tests__/redact.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-builder.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/report-builder.test.ts"],"names":[],"mappings":""}
|