@xivdyetools/test-utils 1.0.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.
- package/LICENSE +37 -0
- package/README.md +144 -0
- package/dist/assertions/index.d.ts +7 -0
- package/dist/assertions/index.d.ts.map +1 -0
- package/dist/assertions/index.js +7 -0
- package/dist/assertions/index.js.map +1 -0
- package/dist/assertions/response.d.ts +84 -0
- package/dist/assertions/response.d.ts.map +1 -0
- package/dist/assertions/response.js +125 -0
- package/dist/assertions/response.js.map +1 -0
- package/dist/auth/context.d.ts +55 -0
- package/dist/auth/context.d.ts.map +1 -0
- package/dist/auth/context.js +95 -0
- package/dist/auth/context.js.map +1 -0
- package/dist/auth/headers.d.ts +64 -0
- package/dist/auth/headers.d.ts.map +1 -0
- package/dist/auth/headers.js +101 -0
- package/dist/auth/headers.js.map +1 -0
- package/dist/auth/index.d.ts +10 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +10 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/jwt.d.ts +76 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +77 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/signature.d.ts +64 -0
- package/dist/auth/signature.d.ts.map +1 -0
- package/dist/auth/signature.js +75 -0
- package/dist/auth/signature.js.map +1 -0
- package/dist/cloudflare/analytics.d.ts +55 -0
- package/dist/cloudflare/analytics.d.ts.map +1 -0
- package/dist/cloudflare/analytics.js +44 -0
- package/dist/cloudflare/analytics.js.map +1 -0
- package/dist/cloudflare/d1.d.ts +101 -0
- package/dist/cloudflare/d1.d.ts.map +1 -0
- package/dist/cloudflare/d1.js +148 -0
- package/dist/cloudflare/d1.js.map +1 -0
- package/dist/cloudflare/fetcher.d.ts +72 -0
- package/dist/cloudflare/fetcher.d.ts.map +1 -0
- package/dist/cloudflare/fetcher.js +136 -0
- package/dist/cloudflare/fetcher.js.map +1 -0
- package/dist/cloudflare/index.d.ts +12 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +12 -0
- package/dist/cloudflare/index.js.map +1 -0
- package/dist/cloudflare/kv.d.ts +85 -0
- package/dist/cloudflare/kv.d.ts.map +1 -0
- package/dist/cloudflare/kv.js +138 -0
- package/dist/cloudflare/kv.js.map +1 -0
- package/dist/cloudflare/r2.d.ts +88 -0
- package/dist/cloudflare/r2.d.ts.map +1 -0
- package/dist/cloudflare/r2.js +127 -0
- package/dist/cloudflare/r2.js.map +1 -0
- package/dist/constants/index.d.ts +8 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +8 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/pkce.d.ts +89 -0
- package/dist/constants/pkce.d.ts.map +1 -0
- package/dist/constants/pkce.js +107 -0
- package/dist/constants/pkce.js.map +1 -0
- package/dist/constants/secrets.d.ts +72 -0
- package/dist/constants/secrets.d.ts.map +1 -0
- package/dist/constants/secrets.js +73 -0
- package/dist/constants/secrets.js.map +1 -0
- package/dist/dom/canvas.d.ts +108 -0
- package/dist/dom/canvas.d.ts.map +1 -0
- package/dist/dom/canvas.js +125 -0
- package/dist/dom/canvas.js.map +1 -0
- package/dist/dom/fetch.d.ts +69 -0
- package/dist/dom/fetch.d.ts.map +1 -0
- package/dist/dom/fetch.js +107 -0
- package/dist/dom/fetch.js.map +1 -0
- package/dist/dom/index.d.ts +12 -0
- package/dist/dom/index.d.ts.map +1 -0
- package/dist/dom/index.js +12 -0
- package/dist/dom/index.js.map +1 -0
- package/dist/dom/localStorage.d.ts +80 -0
- package/dist/dom/localStorage.d.ts.map +1 -0
- package/dist/dom/localStorage.js +124 -0
- package/dist/dom/localStorage.js.map +1 -0
- package/dist/dom/matchMedia.d.ts +51 -0
- package/dist/dom/matchMedia.d.ts.map +1 -0
- package/dist/dom/matchMedia.js +120 -0
- package/dist/dom/matchMedia.js.map +1 -0
- package/dist/dom/resizeObserver.d.ts +68 -0
- package/dist/dom/resizeObserver.d.ts.map +1 -0
- package/dist/dom/resizeObserver.js +99 -0
- package/dist/dom/resizeObserver.js.map +1 -0
- package/dist/factories/category.d.ts +74 -0
- package/dist/factories/category.d.ts.map +1 -0
- package/dist/factories/category.js +99 -0
- package/dist/factories/category.js.map +1 -0
- package/dist/factories/dye.d.ts +76 -0
- package/dist/factories/dye.d.ts.map +1 -0
- package/dist/factories/dye.js +211 -0
- package/dist/factories/dye.js.map +1 -0
- package/dist/factories/index.d.ts +13 -0
- package/dist/factories/index.d.ts.map +1 -0
- package/dist/factories/index.js +14 -0
- package/dist/factories/index.js.map +1 -0
- package/dist/factories/preset.d.ts +105 -0
- package/dist/factories/preset.d.ts.map +1 -0
- package/dist/factories/preset.js +170 -0
- package/dist/factories/preset.js.map +1 -0
- package/dist/factories/user.d.ts +74 -0
- package/dist/factories/user.d.ts.map +1 -0
- package/dist/factories/user.js +115 -0
- package/dist/factories/user.js.map +1 -0
- package/dist/factories/vote.d.ts +55 -0
- package/dist/factories/vote.d.ts.map +1 -0
- package/dist/factories/vote.js +68 -0
- package/dist/factories/vote.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/counters.d.ts +35 -0
- package/dist/utils/counters.d.ts.map +1 -0
- package/dist/utils/counters.js +53 -0
- package/dist/utils/counters.js.map +1 -0
- package/dist/utils/crypto.d.ts +42 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +72 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canvas mock utilities for testing
|
|
3
|
+
*
|
|
4
|
+
* Provides mock implementations of Canvas 2D context
|
|
5
|
+
* for testing chart and graphics code.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Setup canvas mocks before tests
|
|
10
|
+
* setupCanvasMocks();
|
|
11
|
+
*
|
|
12
|
+
* // Now canvas operations won't throw
|
|
13
|
+
* const canvas = document.createElement('canvas');
|
|
14
|
+
* const ctx = canvas.getContext('2d');
|
|
15
|
+
* ctx.fillRect(0, 0, 100, 100); // Works in jsdom
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Mock Canvas 2D rendering context
|
|
20
|
+
*/
|
|
21
|
+
export interface MockCanvasContext {
|
|
22
|
+
fillRect: () => void;
|
|
23
|
+
clearRect: () => void;
|
|
24
|
+
strokeRect: () => void;
|
|
25
|
+
fillText: () => void;
|
|
26
|
+
strokeText: () => void;
|
|
27
|
+
measureText: (text: string) => {
|
|
28
|
+
width: number;
|
|
29
|
+
};
|
|
30
|
+
beginPath: () => void;
|
|
31
|
+
closePath: () => void;
|
|
32
|
+
moveTo: () => void;
|
|
33
|
+
lineTo: () => void;
|
|
34
|
+
arc: () => void;
|
|
35
|
+
arcTo: () => void;
|
|
36
|
+
bezierCurveTo: () => void;
|
|
37
|
+
quadraticCurveTo: () => void;
|
|
38
|
+
rect: () => void;
|
|
39
|
+
fill: () => void;
|
|
40
|
+
stroke: () => void;
|
|
41
|
+
clip: () => void;
|
|
42
|
+
save: () => void;
|
|
43
|
+
restore: () => void;
|
|
44
|
+
scale: () => void;
|
|
45
|
+
rotate: () => void;
|
|
46
|
+
translate: () => void;
|
|
47
|
+
transform: () => void;
|
|
48
|
+
setTransform: () => void;
|
|
49
|
+
resetTransform: () => void;
|
|
50
|
+
drawImage: () => void;
|
|
51
|
+
createImageData: () => {
|
|
52
|
+
data: Uint8ClampedArray;
|
|
53
|
+
width: number;
|
|
54
|
+
height: number;
|
|
55
|
+
};
|
|
56
|
+
getImageData: () => {
|
|
57
|
+
data: Uint8ClampedArray;
|
|
58
|
+
width: number;
|
|
59
|
+
height: number;
|
|
60
|
+
};
|
|
61
|
+
putImageData: () => void;
|
|
62
|
+
createLinearGradient: () => {
|
|
63
|
+
addColorStop: () => void;
|
|
64
|
+
};
|
|
65
|
+
createRadialGradient: () => {
|
|
66
|
+
addColorStop: () => void;
|
|
67
|
+
};
|
|
68
|
+
createPattern: () => null;
|
|
69
|
+
isPointInPath: () => boolean;
|
|
70
|
+
isPointInStroke: () => boolean;
|
|
71
|
+
getLineDash: () => number[];
|
|
72
|
+
setLineDash: () => void;
|
|
73
|
+
canvas: {
|
|
74
|
+
width: number;
|
|
75
|
+
height: number;
|
|
76
|
+
};
|
|
77
|
+
fillStyle: string;
|
|
78
|
+
strokeStyle: string;
|
|
79
|
+
lineWidth: number;
|
|
80
|
+
lineCap: string;
|
|
81
|
+
lineJoin: string;
|
|
82
|
+
miterLimit: number;
|
|
83
|
+
lineDashOffset: number;
|
|
84
|
+
font: string;
|
|
85
|
+
textAlign: string;
|
|
86
|
+
textBaseline: string;
|
|
87
|
+
globalAlpha: number;
|
|
88
|
+
globalCompositeOperation: string;
|
|
89
|
+
shadowBlur: number;
|
|
90
|
+
shadowColor: string;
|
|
91
|
+
shadowOffsetX: number;
|
|
92
|
+
shadowOffsetY: number;
|
|
93
|
+
imageSmoothingEnabled: boolean;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Creates a mock Canvas 2D context
|
|
97
|
+
*
|
|
98
|
+
* @returns A mock context object
|
|
99
|
+
*/
|
|
100
|
+
export declare function createMockCanvasContext(): MockCanvasContext;
|
|
101
|
+
/**
|
|
102
|
+
* Sets up canvas mocks on HTMLCanvasElement prototype
|
|
103
|
+
*
|
|
104
|
+
* Call this in your test setup (beforeAll/beforeEach) to enable
|
|
105
|
+
* canvas operations in jsdom environment.
|
|
106
|
+
*/
|
|
107
|
+
export declare function setupCanvasMocks(): void;
|
|
108
|
+
//# sourceMappingURL=canvas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../src/dom/canvas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canvas mock utilities for testing
|
|
3
|
+
*
|
|
4
|
+
* Provides mock implementations of Canvas 2D context
|
|
5
|
+
* for testing chart and graphics code.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Setup canvas mocks before tests
|
|
10
|
+
* setupCanvasMocks();
|
|
11
|
+
*
|
|
12
|
+
* // Now canvas operations won't throw
|
|
13
|
+
* const canvas = document.createElement('canvas');
|
|
14
|
+
* const ctx = canvas.getContext('2d');
|
|
15
|
+
* ctx.fillRect(0, 0, 100, 100); // Works in jsdom
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Creates a mock Canvas 2D context
|
|
20
|
+
*
|
|
21
|
+
* @returns A mock context object
|
|
22
|
+
*/
|
|
23
|
+
export function createMockCanvasContext() {
|
|
24
|
+
return {
|
|
25
|
+
fillRect: () => { },
|
|
26
|
+
clearRect: () => { },
|
|
27
|
+
strokeRect: () => { },
|
|
28
|
+
fillText: () => { },
|
|
29
|
+
strokeText: () => { },
|
|
30
|
+
measureText: (text) => ({ width: text.length * 8 }),
|
|
31
|
+
beginPath: () => { },
|
|
32
|
+
closePath: () => { },
|
|
33
|
+
moveTo: () => { },
|
|
34
|
+
lineTo: () => { },
|
|
35
|
+
arc: () => { },
|
|
36
|
+
arcTo: () => { },
|
|
37
|
+
bezierCurveTo: () => { },
|
|
38
|
+
quadraticCurveTo: () => { },
|
|
39
|
+
rect: () => { },
|
|
40
|
+
fill: () => { },
|
|
41
|
+
stroke: () => { },
|
|
42
|
+
clip: () => { },
|
|
43
|
+
save: () => { },
|
|
44
|
+
restore: () => { },
|
|
45
|
+
scale: () => { },
|
|
46
|
+
rotate: () => { },
|
|
47
|
+
translate: () => { },
|
|
48
|
+
transform: () => { },
|
|
49
|
+
setTransform: () => { },
|
|
50
|
+
resetTransform: () => { },
|
|
51
|
+
drawImage: () => { },
|
|
52
|
+
createImageData: () => ({
|
|
53
|
+
data: new Uint8ClampedArray(400),
|
|
54
|
+
width: 10,
|
|
55
|
+
height: 10,
|
|
56
|
+
}),
|
|
57
|
+
getImageData: () => ({
|
|
58
|
+
data: new Uint8ClampedArray(400),
|
|
59
|
+
width: 10,
|
|
60
|
+
height: 10,
|
|
61
|
+
}),
|
|
62
|
+
putImageData: () => { },
|
|
63
|
+
createLinearGradient: () => ({ addColorStop: () => { } }),
|
|
64
|
+
createRadialGradient: () => ({ addColorStop: () => { } }),
|
|
65
|
+
createPattern: () => null,
|
|
66
|
+
isPointInPath: () => false,
|
|
67
|
+
isPointInStroke: () => false,
|
|
68
|
+
getLineDash: () => [],
|
|
69
|
+
setLineDash: () => { },
|
|
70
|
+
// Default property values
|
|
71
|
+
canvas: { width: 300, height: 150 },
|
|
72
|
+
fillStyle: '#000000',
|
|
73
|
+
strokeStyle: '#000000',
|
|
74
|
+
lineWidth: 1,
|
|
75
|
+
lineCap: 'butt',
|
|
76
|
+
lineJoin: 'miter',
|
|
77
|
+
miterLimit: 10,
|
|
78
|
+
lineDashOffset: 0,
|
|
79
|
+
font: '10px sans-serif',
|
|
80
|
+
textAlign: 'start',
|
|
81
|
+
textBaseline: 'alphabetic',
|
|
82
|
+
globalAlpha: 1,
|
|
83
|
+
globalCompositeOperation: 'source-over',
|
|
84
|
+
shadowBlur: 0,
|
|
85
|
+
shadowColor: 'rgba(0, 0, 0, 0)',
|
|
86
|
+
shadowOffsetX: 0,
|
|
87
|
+
shadowOffsetY: 0,
|
|
88
|
+
imageSmoothingEnabled: true,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Sets up canvas mocks on HTMLCanvasElement prototype
|
|
93
|
+
*
|
|
94
|
+
* Call this in your test setup (beforeAll/beforeEach) to enable
|
|
95
|
+
* canvas operations in jsdom environment.
|
|
96
|
+
*/
|
|
97
|
+
export function setupCanvasMocks() {
|
|
98
|
+
// Check if we're in a browser-like environment
|
|
99
|
+
if (typeof HTMLCanvasElement === 'undefined') {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const mockContext = createMockCanvasContext();
|
|
103
|
+
// Mock getContext - cast to any to satisfy TypeScript's strict overload signatures
|
|
104
|
+
// This is intentional for testing purposes where we don't need the full context API
|
|
105
|
+
HTMLCanvasElement.prototype.getContext = function (contextId
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
107
|
+
) {
|
|
108
|
+
if (contextId === '2d') {
|
|
109
|
+
return {
|
|
110
|
+
...mockContext,
|
|
111
|
+
canvas: { width: this.width || 300, height: this.height || 150 },
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
};
|
|
116
|
+
// Mock toDataURL
|
|
117
|
+
HTMLCanvasElement.prototype.toDataURL = function () {
|
|
118
|
+
return 'data:image/png;base64,mock';
|
|
119
|
+
};
|
|
120
|
+
// Mock toBlob
|
|
121
|
+
HTMLCanvasElement.prototype.toBlob = function (callback) {
|
|
122
|
+
callback(new Blob(['mock'], { type: 'image/png' }));
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=canvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../src/dom/canvas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch mock utilities for testing
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for mocking the global fetch function.
|
|
5
|
+
* For more complex scenarios, consider using MSW (Mock Service Worker).
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Simple mock
|
|
10
|
+
* const mockFetch = setupFetchMock({ data: 'test' });
|
|
11
|
+
*
|
|
12
|
+
* // Make request
|
|
13
|
+
* const response = await fetch('/api/test');
|
|
14
|
+
* const data = await response.json();
|
|
15
|
+
*
|
|
16
|
+
* // Assert
|
|
17
|
+
* expect(data).toEqual({ data: 'test' });
|
|
18
|
+
* expect(mockFetch.calls).toHaveLength(1);
|
|
19
|
+
*
|
|
20
|
+
* // Reset
|
|
21
|
+
* mockFetch.restore();
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
type MockResponseInit = {
|
|
25
|
+
status?: number;
|
|
26
|
+
statusText?: string;
|
|
27
|
+
headers?: Record<string, string>;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Mock fetch tracking interface
|
|
31
|
+
*/
|
|
32
|
+
export interface MockFetchTracker {
|
|
33
|
+
/** All recorded fetch calls */
|
|
34
|
+
calls: Array<{
|
|
35
|
+
url: string;
|
|
36
|
+
init?: RequestInit;
|
|
37
|
+
}>;
|
|
38
|
+
/** Restore original fetch */
|
|
39
|
+
restore: () => void;
|
|
40
|
+
/** Clear recorded calls */
|
|
41
|
+
clear: () => void;
|
|
42
|
+
/** Update mock response */
|
|
43
|
+
setResponse: (body: unknown, init?: MockResponseInit) => void;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Sets up a simple fetch mock that returns a fixed response
|
|
47
|
+
*
|
|
48
|
+
* @param responseBody - The response body (will be JSON stringified)
|
|
49
|
+
* @param responseInit - Optional response configuration
|
|
50
|
+
* @returns A tracker object with calls array and restore function
|
|
51
|
+
*/
|
|
52
|
+
export declare function setupFetchMock(responseBody: unknown, responseInit?: MockResponseInit): MockFetchTracker;
|
|
53
|
+
/**
|
|
54
|
+
* Sets up a fetch mock with custom handler
|
|
55
|
+
*
|
|
56
|
+
* @param handler - Function to handle fetch requests
|
|
57
|
+
* @returns A tracker object with calls array and restore function
|
|
58
|
+
*/
|
|
59
|
+
export declare function setupFetchMockHandler(handler: (url: string, init?: RequestInit) => Promise<Response> | Response): MockFetchTracker;
|
|
60
|
+
/**
|
|
61
|
+
* Creates a mock Response object
|
|
62
|
+
*
|
|
63
|
+
* @param body - Response body
|
|
64
|
+
* @param init - Response init options
|
|
65
|
+
* @returns A Response object
|
|
66
|
+
*/
|
|
67
|
+
export declare function createMockResponse(body: unknown, init?: MockResponseInit): Response;
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/dom/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,KAAK,gBAAgB,GAAG;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;IAElD,6BAA6B;IAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB,2BAA2B;IAC3B,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC/D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,OAAO,EACrB,YAAY,GAAE,gBAAqB,GAClC,gBAAgB,CAkClB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,GACzE,gBAAgB,CAsBlB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,IAAI,GAAE,gBAAqB,GAC1B,QAAQ,CASV"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch mock utilities for testing
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for mocking the global fetch function.
|
|
5
|
+
* For more complex scenarios, consider using MSW (Mock Service Worker).
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Simple mock
|
|
10
|
+
* const mockFetch = setupFetchMock({ data: 'test' });
|
|
11
|
+
*
|
|
12
|
+
* // Make request
|
|
13
|
+
* const response = await fetch('/api/test');
|
|
14
|
+
* const data = await response.json();
|
|
15
|
+
*
|
|
16
|
+
* // Assert
|
|
17
|
+
* expect(data).toEqual({ data: 'test' });
|
|
18
|
+
* expect(mockFetch.calls).toHaveLength(1);
|
|
19
|
+
*
|
|
20
|
+
* // Reset
|
|
21
|
+
* mockFetch.restore();
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Sets up a simple fetch mock that returns a fixed response
|
|
26
|
+
*
|
|
27
|
+
* @param responseBody - The response body (will be JSON stringified)
|
|
28
|
+
* @param responseInit - Optional response configuration
|
|
29
|
+
* @returns A tracker object with calls array and restore function
|
|
30
|
+
*/
|
|
31
|
+
export function setupFetchMock(responseBody, responseInit = {}) {
|
|
32
|
+
const calls = [];
|
|
33
|
+
const originalFetch = globalThis.fetch;
|
|
34
|
+
let currentBody = responseBody;
|
|
35
|
+
let currentInit = responseInit;
|
|
36
|
+
globalThis.fetch = async (input, init) => {
|
|
37
|
+
const url = input instanceof Request ? input.url : input.toString();
|
|
38
|
+
calls.push({ url, init });
|
|
39
|
+
return new Response(JSON.stringify(currentBody), {
|
|
40
|
+
status: currentInit.status ?? 200,
|
|
41
|
+
statusText: currentInit.statusText ?? 'OK',
|
|
42
|
+
headers: {
|
|
43
|
+
'Content-Type': 'application/json',
|
|
44
|
+
...currentInit.headers,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
calls,
|
|
50
|
+
restore: () => {
|
|
51
|
+
globalThis.fetch = originalFetch;
|
|
52
|
+
},
|
|
53
|
+
clear: () => {
|
|
54
|
+
calls.length = 0;
|
|
55
|
+
},
|
|
56
|
+
setResponse: (body, init) => {
|
|
57
|
+
currentBody = body;
|
|
58
|
+
if (init)
|
|
59
|
+
currentInit = init;
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Sets up a fetch mock with custom handler
|
|
65
|
+
*
|
|
66
|
+
* @param handler - Function to handle fetch requests
|
|
67
|
+
* @returns A tracker object with calls array and restore function
|
|
68
|
+
*/
|
|
69
|
+
export function setupFetchMockHandler(handler) {
|
|
70
|
+
const calls = [];
|
|
71
|
+
const originalFetch = globalThis.fetch;
|
|
72
|
+
globalThis.fetch = async (input, init) => {
|
|
73
|
+
const url = input instanceof Request ? input.url : input.toString();
|
|
74
|
+
calls.push({ url, init });
|
|
75
|
+
return handler(url, init);
|
|
76
|
+
};
|
|
77
|
+
return {
|
|
78
|
+
calls,
|
|
79
|
+
restore: () => {
|
|
80
|
+
globalThis.fetch = originalFetch;
|
|
81
|
+
},
|
|
82
|
+
clear: () => {
|
|
83
|
+
calls.length = 0;
|
|
84
|
+
},
|
|
85
|
+
setResponse: () => {
|
|
86
|
+
// No-op for handler-based mock
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Creates a mock Response object
|
|
92
|
+
*
|
|
93
|
+
* @param body - Response body
|
|
94
|
+
* @param init - Response init options
|
|
95
|
+
* @returns A Response object
|
|
96
|
+
*/
|
|
97
|
+
export function createMockResponse(body, init = {}) {
|
|
98
|
+
return new Response(JSON.stringify(body), {
|
|
99
|
+
status: init.status ?? 200,
|
|
100
|
+
statusText: init.statusText ?? 'OK',
|
|
101
|
+
headers: {
|
|
102
|
+
'Content-Type': 'application/json',
|
|
103
|
+
...init.headers,
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/dom/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAyBH;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,YAAqB,EACrB,eAAiC,EAAE;IAEnC,MAAM,KAAK,GAA+C,EAAE,CAAC;IAC7D,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IAEvC,IAAI,WAAW,GAAG,YAAY,CAAC;IAC/B,IAAI,WAAW,GAAG,YAAY,CAAC;IAE/B,UAAU,CAAC,KAAK,GAAG,KAAK,EAAE,KAAwB,EAAE,IAAkB,EAAqB,EAAE;QAC3F,MAAM,GAAG,GAAG,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1B,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE;YAC/C,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,GAAG;YACjC,UAAU,EAAE,WAAW,CAAC,UAAU,IAAI,IAAI;YAC1C,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,WAAW,CAAC,OAAO;aACvB;SACF,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACL,KAAK;QACL,OAAO,EAAE,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACnC,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,WAAW,EAAE,CAAC,IAAa,EAAE,IAAuB,EAAE,EAAE;YACtD,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,IAAI;gBAAE,WAAW,GAAG,IAAI,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAA0E;IAE1E,MAAM,KAAK,GAA+C,EAAE,CAAC;IAC7D,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IAEvC,UAAU,CAAC,KAAK,GAAG,KAAK,EAAE,KAAwB,EAAE,IAAkB,EAAqB,EAAE;QAC3F,MAAM,GAAG,GAAG,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1B,OAAO,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO;QACL,KAAK;QACL,OAAO,EAAE,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACnC,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,WAAW,EAAE,GAAG,EAAE;YAChB,+BAA+B;QACjC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAa,EACb,OAAyB,EAAE;IAE3B,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,GAAG;QAC1B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;QACnC,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,IAAI,CAAC,OAAO;SAChB;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM/Browser utilities for testing
|
|
3
|
+
*
|
|
4
|
+
* Provides mocks for browser APIs commonly used in testing:
|
|
5
|
+
* localStorage, canvas, ResizeObserver, fetch, etc.
|
|
6
|
+
*/
|
|
7
|
+
export * from './localStorage.js';
|
|
8
|
+
export * from './canvas.js';
|
|
9
|
+
export * from './resizeObserver.js';
|
|
10
|
+
export * from './fetch.js';
|
|
11
|
+
export * from './matchMedia.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dom/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM/Browser utilities for testing
|
|
3
|
+
*
|
|
4
|
+
* Provides mocks for browser APIs commonly used in testing:
|
|
5
|
+
* localStorage, canvas, ResizeObserver, fetch, etc.
|
|
6
|
+
*/
|
|
7
|
+
export * from './localStorage.js';
|
|
8
|
+
export * from './canvas.js';
|
|
9
|
+
export * from './resizeObserver.js';
|
|
10
|
+
export * from './fetch.js';
|
|
11
|
+
export * from './matchMedia.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dom/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock localStorage for testing
|
|
3
|
+
*
|
|
4
|
+
* Provides a Map-backed implementation of the Storage interface
|
|
5
|
+
* for testing localStorage-dependent code.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const storage = new MockLocalStorage();
|
|
10
|
+
*
|
|
11
|
+
* // Use as global localStorage
|
|
12
|
+
* Object.defineProperty(globalThis, 'localStorage', { value: storage });
|
|
13
|
+
*
|
|
14
|
+
* // Or use directly
|
|
15
|
+
* storage.setItem('key', 'value');
|
|
16
|
+
* expect(storage.getItem('key')).toBe('value');
|
|
17
|
+
*
|
|
18
|
+
* // Check internal storage
|
|
19
|
+
* expect(storage._store.get('key')).toBe('value');
|
|
20
|
+
*
|
|
21
|
+
* // Reset between tests
|
|
22
|
+
* storage.clear();
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Mock implementation of the Storage interface
|
|
27
|
+
*/
|
|
28
|
+
export declare class MockLocalStorage implements Storage {
|
|
29
|
+
/** Internal storage map */
|
|
30
|
+
readonly _store: Map<string, string>;
|
|
31
|
+
get length(): number;
|
|
32
|
+
key(index: number): string | null;
|
|
33
|
+
getItem(key: string): string | null;
|
|
34
|
+
setItem(key: string, value: string): void;
|
|
35
|
+
removeItem(key: string): void;
|
|
36
|
+
clear(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Get all keys in storage
|
|
39
|
+
*/
|
|
40
|
+
keys(): string[];
|
|
41
|
+
/**
|
|
42
|
+
* Get all entries as an object
|
|
43
|
+
*/
|
|
44
|
+
toObject(): Record<string, string>;
|
|
45
|
+
/**
|
|
46
|
+
* Populate storage from an object
|
|
47
|
+
*/
|
|
48
|
+
fromObject(obj: Record<string, string>): void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Creates a mock localStorage instance
|
|
52
|
+
*
|
|
53
|
+
* @returns A new MockLocalStorage instance
|
|
54
|
+
*/
|
|
55
|
+
export declare function createMockLocalStorage(): MockLocalStorage;
|
|
56
|
+
/**
|
|
57
|
+
* Sets up mock localStorage on globalThis
|
|
58
|
+
*
|
|
59
|
+
* @returns The mock localStorage instance (for assertions)
|
|
60
|
+
*/
|
|
61
|
+
export declare function setupLocalStorageMock(): MockLocalStorage;
|
|
62
|
+
/**
|
|
63
|
+
* Mock implementation of sessionStorage
|
|
64
|
+
* (Same interface as localStorage)
|
|
65
|
+
*/
|
|
66
|
+
export declare class MockSessionStorage extends MockLocalStorage {
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Creates a mock sessionStorage instance
|
|
70
|
+
*
|
|
71
|
+
* @returns A new MockSessionStorage instance
|
|
72
|
+
*/
|
|
73
|
+
export declare function createMockSessionStorage(): MockSessionStorage;
|
|
74
|
+
/**
|
|
75
|
+
* Sets up mock sessionStorage on globalThis
|
|
76
|
+
*
|
|
77
|
+
* @returns The mock sessionStorage instance
|
|
78
|
+
*/
|
|
79
|
+
export declare function setupSessionStorageMock(): MockSessionStorage;
|
|
80
|
+
//# sourceMappingURL=localStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localStorage.d.ts","sourceRoot":"","sources":["../../src/dom/localStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;GAEG;AACH,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,2BAA2B;IAC3B,QAAQ,CAAC,MAAM,sBAA6B;IAE5C,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKjC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAInC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIlC;;OAEG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;CAM9C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,gBAAgB,CAQxD;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,gBAAgB;CAAG;AAE3D;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,kBAAkB,CAQ5D"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock localStorage for testing
|
|
3
|
+
*
|
|
4
|
+
* Provides a Map-backed implementation of the Storage interface
|
|
5
|
+
* for testing localStorage-dependent code.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const storage = new MockLocalStorage();
|
|
10
|
+
*
|
|
11
|
+
* // Use as global localStorage
|
|
12
|
+
* Object.defineProperty(globalThis, 'localStorage', { value: storage });
|
|
13
|
+
*
|
|
14
|
+
* // Or use directly
|
|
15
|
+
* storage.setItem('key', 'value');
|
|
16
|
+
* expect(storage.getItem('key')).toBe('value');
|
|
17
|
+
*
|
|
18
|
+
* // Check internal storage
|
|
19
|
+
* expect(storage._store.get('key')).toBe('value');
|
|
20
|
+
*
|
|
21
|
+
* // Reset between tests
|
|
22
|
+
* storage.clear();
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Mock implementation of the Storage interface
|
|
27
|
+
*/
|
|
28
|
+
export class MockLocalStorage {
|
|
29
|
+
constructor() {
|
|
30
|
+
/** Internal storage map */
|
|
31
|
+
this._store = new Map();
|
|
32
|
+
}
|
|
33
|
+
get length() {
|
|
34
|
+
return this._store.size;
|
|
35
|
+
}
|
|
36
|
+
key(index) {
|
|
37
|
+
const keys = Array.from(this._store.keys());
|
|
38
|
+
return keys[index] ?? null;
|
|
39
|
+
}
|
|
40
|
+
getItem(key) {
|
|
41
|
+
return this._store.get(key) ?? null;
|
|
42
|
+
}
|
|
43
|
+
setItem(key, value) {
|
|
44
|
+
this._store.set(key, value);
|
|
45
|
+
}
|
|
46
|
+
removeItem(key) {
|
|
47
|
+
this._store.delete(key);
|
|
48
|
+
}
|
|
49
|
+
clear() {
|
|
50
|
+
this._store.clear();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get all keys in storage
|
|
54
|
+
*/
|
|
55
|
+
keys() {
|
|
56
|
+
return Array.from(this._store.keys());
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get all entries as an object
|
|
60
|
+
*/
|
|
61
|
+
toObject() {
|
|
62
|
+
return Object.fromEntries(this._store);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Populate storage from an object
|
|
66
|
+
*/
|
|
67
|
+
fromObject(obj) {
|
|
68
|
+
this._store.clear();
|
|
69
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
70
|
+
this._store.set(key, value);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates a mock localStorage instance
|
|
76
|
+
*
|
|
77
|
+
* @returns A new MockLocalStorage instance
|
|
78
|
+
*/
|
|
79
|
+
export function createMockLocalStorage() {
|
|
80
|
+
return new MockLocalStorage();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Sets up mock localStorage on globalThis
|
|
84
|
+
*
|
|
85
|
+
* @returns The mock localStorage instance (for assertions)
|
|
86
|
+
*/
|
|
87
|
+
export function setupLocalStorageMock() {
|
|
88
|
+
const storage = new MockLocalStorage();
|
|
89
|
+
Object.defineProperty(globalThis, 'localStorage', {
|
|
90
|
+
value: storage,
|
|
91
|
+
writable: true,
|
|
92
|
+
configurable: true,
|
|
93
|
+
});
|
|
94
|
+
return storage;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Mock implementation of sessionStorage
|
|
98
|
+
* (Same interface as localStorage)
|
|
99
|
+
*/
|
|
100
|
+
export class MockSessionStorage extends MockLocalStorage {
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Creates a mock sessionStorage instance
|
|
104
|
+
*
|
|
105
|
+
* @returns A new MockSessionStorage instance
|
|
106
|
+
*/
|
|
107
|
+
export function createMockSessionStorage() {
|
|
108
|
+
return new MockSessionStorage();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Sets up mock sessionStorage on globalThis
|
|
112
|
+
*
|
|
113
|
+
* @returns The mock sessionStorage instance
|
|
114
|
+
*/
|
|
115
|
+
export function setupSessionStorageMock() {
|
|
116
|
+
const storage = new MockSessionStorage();
|
|
117
|
+
Object.defineProperty(globalThis, 'sessionStorage', {
|
|
118
|
+
value: storage,
|
|
119
|
+
writable: true,
|
|
120
|
+
configurable: true,
|
|
121
|
+
});
|
|
122
|
+
return storage;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=localStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localStorage.js","sourceRoot":"","sources":["../../src/dom/localStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAA7B;QACE,2BAA2B;QAClB,WAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAkD9C,CAAC;IAhDC,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,KAAa;QACf,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,KAAa;QAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,GAA2B;QACpC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,gBAAgB,EAAE,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACvC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE;QAChD,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,gBAAgB;CAAG;AAE3D;;;;GAIG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,kBAAkB,EAAE,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACzC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,gBAAgB,EAAE;QAClD,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
|