html2canvas-pro 1.6.6 → 2.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/README.md +1 -0
- package/demo/image-smoothing-demo.html +256 -0
- package/demo/refactoring-test.html +602 -0
- package/dist/html2canvas-pro.esm.js +2846 -1238
- package/dist/html2canvas-pro.esm.js.map +1 -1
- package/dist/html2canvas-pro.js +2849 -1237
- package/dist/html2canvas-pro.js.map +1 -1
- package/dist/html2canvas-pro.min.js +5 -4
- package/dist/lib/__tests__/index.js +8 -2
- package/dist/lib/__tests__/index.js.map +1 -1
- package/dist/lib/config.js +72 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/core/__tests__/cache-storage.js +6 -3
- package/dist/lib/core/__tests__/cache-storage.js.map +1 -1
- package/dist/lib/core/__tests__/cache-storage.test.js +158 -0
- package/dist/lib/core/__tests__/cache-storage.test.js.map +1 -0
- package/dist/lib/core/__tests__/validator.js +296 -0
- package/dist/lib/core/__tests__/validator.js.map +1 -0
- package/dist/lib/core/cache-storage.js +130 -11
- package/dist/lib/core/cache-storage.js.map +1 -1
- package/dist/lib/core/context.js +5 -2
- package/dist/lib/core/context.js.map +1 -1
- package/dist/lib/core/debugger.js +3 -0
- package/dist/lib/core/debugger.js.map +1 -1
- package/dist/lib/core/origin-checker.js +54 -0
- package/dist/lib/core/origin-checker.js.map +1 -0
- package/dist/lib/core/performance-monitor.js +208 -0
- package/dist/lib/core/performance-monitor.js.map +1 -0
- package/dist/lib/core/validator.js +501 -0
- package/dist/lib/core/validator.js.map +1 -0
- package/dist/lib/css/index.js +2 -0
- package/dist/lib/css/index.js.map +1 -1
- package/dist/lib/css/property-descriptors/__tests__/background-tests.js +7 -1
- package/dist/lib/css/property-descriptors/__tests__/background-tests.js.map +1 -1
- package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js +142 -0
- package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js.map +1 -0
- package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js +167 -0
- package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js.map +1 -0
- package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js +61 -0
- package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js.map +1 -0
- package/dist/lib/css/property-descriptors/image-rendering.js +34 -0
- package/dist/lib/css/property-descriptors/image-rendering.js.map +1 -0
- package/dist/lib/css/types/__tests__/image-tests.js +7 -1
- package/dist/lib/css/types/__tests__/image-tests.js.map +1 -1
- package/dist/lib/css/types/color-math.js +26 -0
- package/dist/lib/css/types/color-math.js.map +1 -0
- package/dist/lib/css/types/color-spaces/srgb.js +6 -6
- package/dist/lib/css/types/color-spaces/srgb.js.map +1 -1
- package/dist/lib/css/types/color-utilities.js +13 -22
- package/dist/lib/css/types/color-utilities.js.map +1 -1
- package/dist/lib/dom/__tests__/dom-normalizer.test.js +113 -0
- package/dist/lib/dom/__tests__/dom-normalizer.test.js.map +1 -0
- package/dist/lib/dom/__tests__/element-container.test.js +109 -0
- package/dist/lib/dom/__tests__/element-container.test.js.map +1 -0
- package/dist/lib/dom/document-cloner.js +152 -11
- package/dist/lib/dom/document-cloner.js.map +1 -1
- package/dist/lib/dom/dom-normalizer.js +80 -0
- package/dist/lib/dom/dom-normalizer.js.map +1 -0
- package/dist/lib/dom/element-container.js +32 -15
- package/dist/lib/dom/element-container.js.map +1 -1
- package/dist/lib/dom/node-parser.js +16 -20
- package/dist/lib/dom/node-parser.js.map +1 -1
- package/dist/lib/dom/node-type-guards.js +44 -0
- package/dist/lib/dom/node-type-guards.js.map +1 -0
- package/dist/lib/dom/replaced-elements/iframe-element-container.js +5 -4
- package/dist/lib/dom/replaced-elements/iframe-element-container.js.map +1 -1
- package/dist/lib/index.js +148 -41
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/render/canvas/__tests__/background-renderer.test.js +65 -0
- package/dist/lib/render/canvas/__tests__/background-renderer.test.js.map +1 -0
- package/dist/lib/render/canvas/__tests__/border-renderer.test.js +23 -0
- package/dist/lib/render/canvas/__tests__/border-renderer.test.js.map +1 -0
- package/dist/lib/render/canvas/__tests__/effects-renderer.test.js +30 -0
- package/dist/lib/render/canvas/__tests__/effects-renderer.test.js.map +1 -0
- package/dist/lib/render/canvas/__tests__/text-renderer.test.js +63 -0
- package/dist/lib/render/canvas/__tests__/text-renderer.test.js.map +1 -0
- package/dist/lib/render/canvas/background-renderer.js +222 -0
- package/dist/lib/render/canvas/background-renderer.js.map +1 -0
- package/dist/lib/render/canvas/border-renderer.js +185 -0
- package/dist/lib/render/canvas/border-renderer.js.map +1 -0
- package/dist/lib/render/canvas/canvas-renderer.js +61 -689
- package/dist/lib/render/canvas/canvas-renderer.js.map +1 -1
- package/dist/lib/render/canvas/effects-renderer.js +89 -0
- package/dist/lib/render/canvas/effects-renderer.js.map +1 -0
- package/dist/lib/render/canvas/text-renderer.js +508 -0
- package/dist/lib/render/canvas/text-renderer.js.map +1 -0
- package/dist/lib/render/renderer-interface.js +3 -0
- package/dist/lib/render/renderer-interface.js.map +1 -0
- package/dist/types/config.d.ts +54 -0
- package/dist/types/core/__tests__/cache-storage.test.d.ts +1 -0
- package/dist/types/core/__tests__/validator.d.ts +1 -0
- package/dist/types/core/cache-storage.d.ts +42 -1
- package/dist/types/core/context.d.ts +5 -1
- package/dist/types/core/origin-checker.d.ts +33 -0
- package/dist/types/core/performance-monitor.d.ts +131 -0
- package/dist/types/core/validator.d.ts +132 -0
- package/dist/types/css/index.d.ts +2 -0
- package/dist/types/css/property-descriptors/__tests__/image-rendering-integration.test.d.ts +1 -0
- package/dist/types/css/property-descriptors/__tests__/image-rendering-performance.test.d.ts +1 -0
- package/dist/types/css/property-descriptors/__tests__/image-rendering.test.d.ts +1 -0
- package/dist/types/css/property-descriptors/image-rendering.d.ts +8 -0
- package/dist/types/css/types/color-math.d.ts +12 -0
- package/dist/types/css/types/color-utilities.d.ts +2 -3
- package/dist/types/dom/__tests__/dom-normalizer.test.d.ts +1 -0
- package/dist/types/dom/__tests__/element-container.test.d.ts +1 -0
- package/dist/types/dom/document-cloner.d.ts +46 -0
- package/dist/types/dom/dom-normalizer.d.ts +43 -0
- package/dist/types/dom/element-container.d.ts +20 -1
- package/dist/types/dom/node-parser.d.ts +2 -7
- package/dist/types/dom/node-type-guards.d.ts +33 -0
- package/dist/types/dom/replaced-elements/iframe-element-container.d.ts +4 -1
- package/dist/types/index.d.ts +48 -3
- package/dist/types/render/canvas/__tests__/background-renderer.test.d.ts +1 -0
- package/dist/types/render/canvas/__tests__/border-renderer.test.d.ts +1 -0
- package/dist/types/render/canvas/__tests__/effects-renderer.test.d.ts +1 -0
- package/dist/types/render/canvas/__tests__/text-renderer.test.d.ts +1 -0
- package/dist/types/render/canvas/background-renderer.d.ts +87 -0
- package/dist/types/render/canvas/border-renderer.d.ts +67 -0
- package/dist/types/render/canvas/canvas-renderer.d.ts +19 -23
- package/dist/types/render/canvas/effects-renderer.d.ts +64 -0
- package/dist/types/render/canvas/text-renderer.d.ts +57 -0
- package/dist/types/render/renderer-interface.d.ts +26 -0
- package/package.json +2 -1
|
@@ -15,7 +15,7 @@ jest.mock('../dom/node-parser', () => {
|
|
|
15
15
|
isBodyElement: () => false,
|
|
16
16
|
isHTMLElement: () => false,
|
|
17
17
|
parseTree: jest.fn().mockImplementation(() => {
|
|
18
|
-
return { styles: {} };
|
|
18
|
+
return { styles: {}, restoreTree: jest.fn() };
|
|
19
19
|
})
|
|
20
20
|
};
|
|
21
21
|
});
|
|
@@ -25,8 +25,14 @@ describe('html2canvas', () => {
|
|
|
25
25
|
const element = {
|
|
26
26
|
ownerDocument: {
|
|
27
27
|
defaultView: {
|
|
28
|
+
document: {
|
|
29
|
+
createElement: () => ({ href: '' })
|
|
30
|
+
},
|
|
31
|
+
location: { href: 'http://localhost/' },
|
|
28
32
|
pageXOffset: 12,
|
|
29
|
-
pageYOffset: 34
|
|
33
|
+
pageYOffset: 34,
|
|
34
|
+
innerWidth: 800,
|
|
35
|
+
innerHeight: 600
|
|
30
36
|
}
|
|
31
37
|
}
|
|
32
38
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/__tests__/index.ts"],"names":[],"mappings":";;;;;AAAA,qDAAmC;AAEnC,sEAAkE;AAClE,4DAAwD;AACxD,8CAA4C;AAE5C,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC5B,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAClC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AACpC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACjC,OAAO;QACH,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK;QAC1B,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK;QAC1B,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE;YACzC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/__tests__/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Html2CanvasConfig = void 0;
|
|
4
|
+
exports.setDefaultConfig = setDefaultConfig;
|
|
5
|
+
exports.getDefaultConfig = getDefaultConfig;
|
|
6
|
+
/**
|
|
7
|
+
* Html2Canvas Configuration
|
|
8
|
+
*
|
|
9
|
+
* Manages configuration state for html2canvas rendering.
|
|
10
|
+
* Eliminates the need for global static variables.
|
|
11
|
+
*/
|
|
12
|
+
class Html2CanvasConfig {
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
// Try to get window from options first, then fall back to global window
|
|
15
|
+
this.window = options.window || (typeof window !== 'undefined' ? window : null);
|
|
16
|
+
if (!this.window) {
|
|
17
|
+
throw new Error('Window object is required but not available');
|
|
18
|
+
}
|
|
19
|
+
this.cspNonce = options.cspNonce;
|
|
20
|
+
this.cache = options.cache;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create configuration from an element
|
|
24
|
+
* Extracts window from element's owner document
|
|
25
|
+
*/
|
|
26
|
+
static fromElement(element, options = {}) {
|
|
27
|
+
const ownerDocument = element.ownerDocument;
|
|
28
|
+
if (!ownerDocument) {
|
|
29
|
+
throw new Error('Element is not attached to a document');
|
|
30
|
+
}
|
|
31
|
+
const defaultView = ownerDocument.defaultView;
|
|
32
|
+
if (!defaultView) {
|
|
33
|
+
throw new Error('Document is not attached to a window');
|
|
34
|
+
}
|
|
35
|
+
return new Html2CanvasConfig({
|
|
36
|
+
window: defaultView,
|
|
37
|
+
...options
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Clone configuration with override options
|
|
42
|
+
*/
|
|
43
|
+
clone(options = {}) {
|
|
44
|
+
return new Html2CanvasConfig({
|
|
45
|
+
window: options.window || this.window,
|
|
46
|
+
cspNonce: options.cspNonce ?? this.cspNonce,
|
|
47
|
+
cache: options.cache ?? this.cache
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.Html2CanvasConfig = Html2CanvasConfig;
|
|
52
|
+
/**
|
|
53
|
+
* Default global configuration (for backward compatibility)
|
|
54
|
+
* @deprecated Use Html2CanvasConfig instances instead
|
|
55
|
+
*/
|
|
56
|
+
let _defaultConfig = null;
|
|
57
|
+
/**
|
|
58
|
+
* Set default configuration
|
|
59
|
+
* @deprecated Pass configuration directly to html2canvas instead
|
|
60
|
+
*/
|
|
61
|
+
function setDefaultConfig(config) {
|
|
62
|
+
console.warn('[html2canvas-pro] setDefaultConfig is deprecated. Pass configuration to html2canvas directly.');
|
|
63
|
+
_defaultConfig = config;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get default configuration
|
|
67
|
+
* @deprecated Pass configuration directly to html2canvas instead
|
|
68
|
+
*/
|
|
69
|
+
function getDefaultConfig() {
|
|
70
|
+
return _defaultConfig;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":";;;AA+FA,4CAGC;AAMD,4CAEC;AA/ED;;;;;GAKG;AACH,MAAa,iBAAiB;IAK1B,YAAY,UAAyB,EAAE;QACnC,wEAAwE;QACxE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,IAAY,CAAC,CAAC;QAEzF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,OAAoB,EAAE,UAAkC,EAAE;QACzE,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAE5C,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;QAE9C,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,IAAI,iBAAiB,CAAC;YACzB,MAAM,EAAE,WAAW;YACnB,GAAG,OAAO;SACb,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAkC,EAAE;QACtC,OAAO,IAAI,iBAAiB,CAAC;YACzB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;YACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;YAC3C,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;SACrC,CAAC,CAAC;IACP,CAAC;CACJ;AAlDD,8CAkDC;AAED;;;GAGG;AACH,IAAI,cAAc,GAA6B,IAAI,CAAC;AAEpD;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,MAAyB;IACtD,OAAO,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAC;IAC9G,cAAc,GAAG,MAAM,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB;IAC5B,OAAO,cAAc,CAAC;AAC1B,CAAC"}
|
|
@@ -5,9 +5,10 @@ const features_1 = require("../features");
|
|
|
5
5
|
const cache_storage_1 = require("../cache-storage");
|
|
6
6
|
const context_1 = require("../context");
|
|
7
7
|
const bounds_1 = require("../../css/layout/bounds");
|
|
8
|
+
const config_1 = require("../../config");
|
|
8
9
|
const proxy = 'http://example.com/proxy';
|
|
9
10
|
const createMockContext = (origin, opts = {}) => {
|
|
10
|
-
const
|
|
11
|
+
const mockWindow = {
|
|
11
12
|
location: {
|
|
12
13
|
href: origin
|
|
13
14
|
},
|
|
@@ -34,7 +35,9 @@ const createMockContext = (origin, opts = {}) => {
|
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
37
|
};
|
|
37
|
-
|
|
38
|
+
// For backward compatibility, also initialize static CacheStorage
|
|
39
|
+
cache_storage_1.CacheStorage.setContext(mockWindow);
|
|
40
|
+
const config = new config_1.Html2CanvasConfig({ window: mockWindow });
|
|
38
41
|
return new context_1.Context({
|
|
39
42
|
logging: false,
|
|
40
43
|
imageTimeout: 0,
|
|
@@ -42,7 +45,7 @@ const createMockContext = (origin, opts = {}) => {
|
|
|
42
45
|
allowTaint: false,
|
|
43
46
|
proxy,
|
|
44
47
|
...opts
|
|
45
|
-
}, new bounds_1.Bounds(0, 0, 0, 0));
|
|
48
|
+
}, new bounds_1.Bounds(0, 0, 0, 0), config);
|
|
46
49
|
};
|
|
47
50
|
const images = [];
|
|
48
51
|
const xhr = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-storage.js","sourceRoot":"","sources":["../../../../src/core/__tests__/cache-storage.ts"],"names":[],"mappings":";;AAAA,mCAA+C;AAC/C,0CAAuC;AACvC,oDAAgD;AAChD,wCAAqC;AACrC,oDAAiD;AAEjD,MAAM,KAAK,GAAG,0BAA0B,CAAC;AAEzC,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;IACpD,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-storage.js","sourceRoot":"","sources":["../../../../src/core/__tests__/cache-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const assert_1 = require("assert");
|
|
4
|
+
const cache_storage_1 = require("../cache-storage");
|
|
5
|
+
const context_1 = require("../context");
|
|
6
|
+
const bounds_1 = require("../../css/layout/bounds");
|
|
7
|
+
const config_1 = require("../../config");
|
|
8
|
+
describe('Cache LRU', () => {
|
|
9
|
+
let context;
|
|
10
|
+
let cache;
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
const mockWindow = {
|
|
13
|
+
document: {
|
|
14
|
+
createElement: (_name) => {
|
|
15
|
+
let _href = '';
|
|
16
|
+
return {
|
|
17
|
+
set href(value) {
|
|
18
|
+
_href = value;
|
|
19
|
+
},
|
|
20
|
+
get href() {
|
|
21
|
+
return _href;
|
|
22
|
+
},
|
|
23
|
+
get protocol() {
|
|
24
|
+
return 'http:';
|
|
25
|
+
},
|
|
26
|
+
get hostname() {
|
|
27
|
+
return 'localhost';
|
|
28
|
+
},
|
|
29
|
+
get port() {
|
|
30
|
+
return '';
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
location: { href: 'http://localhost/' }
|
|
36
|
+
};
|
|
37
|
+
const config = new config_1.Html2CanvasConfig({ window: mockWindow });
|
|
38
|
+
context = new context_1.Context({
|
|
39
|
+
logging: false,
|
|
40
|
+
imageTimeout: 15000,
|
|
41
|
+
useCORS: false,
|
|
42
|
+
allowTaint: false
|
|
43
|
+
}, new bounds_1.Bounds(0, 0, 800, 600), config);
|
|
44
|
+
const options = {
|
|
45
|
+
imageTimeout: 15000,
|
|
46
|
+
useCORS: false,
|
|
47
|
+
allowTaint: false,
|
|
48
|
+
maxCacheSize: 3 // Small size for testing
|
|
49
|
+
};
|
|
50
|
+
cache = new cache_storage_1.Cache(context, options);
|
|
51
|
+
});
|
|
52
|
+
it('should enforce maximum cache size', () => {
|
|
53
|
+
(0, assert_1.strictEqual)(cache.getMaxSize(), 3);
|
|
54
|
+
(0, assert_1.strictEqual)(cache.size(), 0);
|
|
55
|
+
});
|
|
56
|
+
it('should add images to cache', () => {
|
|
57
|
+
const blob1 = 'blob:http://localhost/image1';
|
|
58
|
+
const blob2 = 'blob:http://localhost/image2';
|
|
59
|
+
cache.addImage(blob1);
|
|
60
|
+
(0, assert_1.strictEqual)(cache.size(), 1);
|
|
61
|
+
cache.addImage(blob2);
|
|
62
|
+
(0, assert_1.strictEqual)(cache.size(), 2);
|
|
63
|
+
});
|
|
64
|
+
it('should not exceed max cache size', () => {
|
|
65
|
+
const blobs = [
|
|
66
|
+
'blob:http://localhost/image1',
|
|
67
|
+
'blob:http://localhost/image2',
|
|
68
|
+
'blob:http://localhost/image3',
|
|
69
|
+
'blob:http://localhost/image4' // This should trigger eviction
|
|
70
|
+
];
|
|
71
|
+
blobs.forEach((blob) => cache.addImage(blob));
|
|
72
|
+
// Should not exceed max size (3)
|
|
73
|
+
(0, assert_1.strictEqual)(cache.size(), 3);
|
|
74
|
+
});
|
|
75
|
+
it('should evict least recently used entry when full', async () => {
|
|
76
|
+
const blob1 = 'blob:http://localhost/image1';
|
|
77
|
+
const blob2 = 'blob:http://localhost/image2';
|
|
78
|
+
const blob3 = 'blob:http://localhost/image3';
|
|
79
|
+
const blob4 = 'blob:http://localhost/image4';
|
|
80
|
+
// Add 3 images (fill cache)
|
|
81
|
+
cache.addImage(blob1);
|
|
82
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
83
|
+
cache.addImage(blob2);
|
|
84
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
85
|
+
cache.addImage(blob3);
|
|
86
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
87
|
+
(0, assert_1.strictEqual)(cache.size(), 3);
|
|
88
|
+
// Access blob2 and blob3 (update their access time)
|
|
89
|
+
cache.match(blob2);
|
|
90
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
91
|
+
cache.match(blob3);
|
|
92
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
93
|
+
// Add blob4 - should evict blob1 (oldest, never accessed)
|
|
94
|
+
cache.addImage(blob4);
|
|
95
|
+
(0, assert_1.strictEqual)(cache.size(), 3);
|
|
96
|
+
// blob1 should be evicted
|
|
97
|
+
(0, assert_1.strictEqual)(cache.match(blob1), undefined);
|
|
98
|
+
// blob2, blob3, blob4 should exist
|
|
99
|
+
(0, assert_1.ok)(cache.match(blob2) !== undefined);
|
|
100
|
+
(0, assert_1.ok)(cache.match(blob3) !== undefined);
|
|
101
|
+
(0, assert_1.ok)(cache.match(blob4) !== undefined);
|
|
102
|
+
});
|
|
103
|
+
it('should update access time on repeated access', async () => {
|
|
104
|
+
const blob1 = 'blob:http://localhost/image1';
|
|
105
|
+
const blob2 = 'blob:http://localhost/image2';
|
|
106
|
+
const blob3 = 'blob:http://localhost/image3';
|
|
107
|
+
cache.addImage(blob1);
|
|
108
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
109
|
+
cache.addImage(blob2);
|
|
110
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
111
|
+
cache.addImage(blob3);
|
|
112
|
+
(0, assert_1.strictEqual)(cache.size(), 3);
|
|
113
|
+
// Access blob1 multiple times (update access time)
|
|
114
|
+
cache.match(blob1);
|
|
115
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
116
|
+
cache.addImage(blob1); // Should update access time
|
|
117
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
118
|
+
// Add 4th image - should evict blob2 (oldest unaccessed)
|
|
119
|
+
const blob4 = 'blob:http://localhost/image4';
|
|
120
|
+
cache.addImage(blob4);
|
|
121
|
+
(0, assert_1.strictEqual)(cache.size(), 3);
|
|
122
|
+
(0, assert_1.strictEqual)(cache.match(blob2), undefined); // Evicted
|
|
123
|
+
(0, assert_1.ok)(cache.match(blob1) !== undefined); // Still exists
|
|
124
|
+
});
|
|
125
|
+
it('should clear all cache entries', () => {
|
|
126
|
+
cache.addImage('blob:http://localhost/image1');
|
|
127
|
+
cache.addImage('blob:http://localhost/image2');
|
|
128
|
+
(0, assert_1.strictEqual)(cache.size(), 2);
|
|
129
|
+
cache.clear();
|
|
130
|
+
(0, assert_1.strictEqual)(cache.size(), 0);
|
|
131
|
+
});
|
|
132
|
+
it('should throw error for invalid max size', () => {
|
|
133
|
+
const options = {
|
|
134
|
+
imageTimeout: 15000,
|
|
135
|
+
useCORS: false,
|
|
136
|
+
allowTaint: false,
|
|
137
|
+
maxCacheSize: 0 // Invalid
|
|
138
|
+
};
|
|
139
|
+
try {
|
|
140
|
+
new cache_storage_1.Cache(context, options);
|
|
141
|
+
(0, assert_1.ok)(false, 'Should have thrown error');
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
(0, assert_1.ok)(error.message.includes('at least 1'));
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
it('should use default max size if not specified', () => {
|
|
148
|
+
const options = {
|
|
149
|
+
imageTimeout: 15000,
|
|
150
|
+
useCORS: false,
|
|
151
|
+
allowTaint: false
|
|
152
|
+
// maxCacheSize not specified
|
|
153
|
+
};
|
|
154
|
+
const cacheWithDefault = new cache_storage_1.Cache(context, options);
|
|
155
|
+
(0, assert_1.strictEqual)(cacheWithDefault.getMaxSize(), 100); // Default
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=cache-storage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-storage.test.js","sourceRoot":"","sources":["../../../../src/core/__tests__/cache-storage.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const assert_1 = require("assert");
|
|
4
|
+
const validator_1 = require("../validator");
|
|
5
|
+
describe('Validator', () => {
|
|
6
|
+
describe('URL validation', () => {
|
|
7
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
8
|
+
it('should accept valid HTTP URLs', () => {
|
|
9
|
+
const result = validator.validateUrl('http://example.com/test.jpg', 'image');
|
|
10
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
11
|
+
});
|
|
12
|
+
it('should accept valid HTTPS URLs', () => {
|
|
13
|
+
const result = validator.validateUrl('https://example.com/test.jpg', 'image');
|
|
14
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
15
|
+
});
|
|
16
|
+
it('should accept data URLs by default', () => {
|
|
17
|
+
const result = validator.validateUrl('data:image/png;base64,iVBORw0KGgo=', 'image');
|
|
18
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
19
|
+
});
|
|
20
|
+
it('should accept blob URLs', () => {
|
|
21
|
+
const result = validator.validateUrl('blob:http://example.com/uuid', 'image');
|
|
22
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
23
|
+
});
|
|
24
|
+
it('should reject invalid protocols', () => {
|
|
25
|
+
const result = validator.validateUrl('ftp://example.com/test.jpg', 'image');
|
|
26
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
27
|
+
(0, assert_1.strictEqual)(result.error?.includes('Protocol'), true);
|
|
28
|
+
});
|
|
29
|
+
it('should reject file:// URLs', () => {
|
|
30
|
+
const result = validator.validateUrl('file:///etc/passwd', 'image');
|
|
31
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
32
|
+
});
|
|
33
|
+
it('should reject javascript: URLs', () => {
|
|
34
|
+
const result = validator.validateUrl('javascript:alert(1)', 'general');
|
|
35
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
36
|
+
});
|
|
37
|
+
it('should reject empty URLs', () => {
|
|
38
|
+
const result = validator.validateUrl('', 'image');
|
|
39
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
40
|
+
});
|
|
41
|
+
it('should reject non-string URLs', () => {
|
|
42
|
+
const result = validator.validateUrl(null, 'image');
|
|
43
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
44
|
+
});
|
|
45
|
+
it('should reject malformed URLs', () => {
|
|
46
|
+
const result = validator.validateUrl('not a url', 'image');
|
|
47
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
48
|
+
(0, assert_1.strictEqual)(result.error?.includes('Invalid URL'), true);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('Proxy URL validation (SSRF prevention)', () => {
|
|
52
|
+
it('should reject localhost for proxy URLs', () => {
|
|
53
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
54
|
+
const result = validator.validateUrl('http://localhost:8080/proxy', 'proxy');
|
|
55
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
56
|
+
(0, assert_1.strictEqual)(result.error?.includes('Localhost'), true);
|
|
57
|
+
});
|
|
58
|
+
it('should reject 127.0.0.1 for proxy URLs', () => {
|
|
59
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
60
|
+
const result = validator.validateUrl('http://127.0.0.1/proxy', 'proxy');
|
|
61
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
62
|
+
});
|
|
63
|
+
it('should reject ::1 for proxy URLs', () => {
|
|
64
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
65
|
+
const result = validator.validateUrl('http://[::1]/proxy', 'proxy');
|
|
66
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
67
|
+
});
|
|
68
|
+
it('should reject private IP ranges (10.x.x.x)', () => {
|
|
69
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
70
|
+
const result = validator.validateUrl('http://10.0.0.1/proxy', 'proxy');
|
|
71
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
72
|
+
(0, assert_1.strictEqual)(result.error?.includes('Private IP'), true);
|
|
73
|
+
});
|
|
74
|
+
it('should reject private IP ranges (172.16-31.x.x)', () => {
|
|
75
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
76
|
+
const results = [
|
|
77
|
+
validator.validateUrl('http://172.16.0.1/proxy', 'proxy'),
|
|
78
|
+
validator.validateUrl('http://172.20.0.1/proxy', 'proxy'),
|
|
79
|
+
validator.validateUrl('http://172.31.255.254/proxy', 'proxy')
|
|
80
|
+
];
|
|
81
|
+
results.forEach((result) => (0, assert_1.strictEqual)(result.valid, false));
|
|
82
|
+
});
|
|
83
|
+
it('should reject private IP ranges (192.168.x.x)', () => {
|
|
84
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
85
|
+
const result = validator.validateUrl('http://192.168.1.1/proxy', 'proxy');
|
|
86
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
87
|
+
});
|
|
88
|
+
it('should reject link-local addresses', () => {
|
|
89
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
90
|
+
const result = validator.validateUrl('http://169.254.1.1/proxy', 'proxy');
|
|
91
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
92
|
+
});
|
|
93
|
+
it('should accept public IPs for proxy URLs', () => {
|
|
94
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
95
|
+
const result = validator.validateUrl('https://8.8.8.8/proxy', 'proxy');
|
|
96
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
97
|
+
});
|
|
98
|
+
it('should enforce proxy domain whitelist', () => {
|
|
99
|
+
const validator = (0, validator_1.createStrictValidator)(['example.com', 'trusted.org']);
|
|
100
|
+
const allowed = validator.validateUrl('https://example.com/proxy', 'proxy');
|
|
101
|
+
(0, assert_1.strictEqual)(allowed.valid, true);
|
|
102
|
+
const notAllowed = validator.validateUrl('https://evil.com/proxy', 'proxy');
|
|
103
|
+
(0, assert_1.strictEqual)(notAllowed.valid, false);
|
|
104
|
+
(0, assert_1.strictEqual)(notAllowed.error?.includes('not in the allowed list'), true);
|
|
105
|
+
});
|
|
106
|
+
it('should allow subdomains of whitelisted domains', () => {
|
|
107
|
+
const validator = (0, validator_1.createStrictValidator)(['example.com']);
|
|
108
|
+
const result = validator.validateUrl('https://api.example.com/proxy', 'proxy');
|
|
109
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
describe('CSP nonce validation', () => {
|
|
113
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
114
|
+
it('should accept valid nonce', () => {
|
|
115
|
+
const result = validator.validateCspNonce('ABC123def456GHI789jkl');
|
|
116
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
117
|
+
});
|
|
118
|
+
it('should reject empty nonce', () => {
|
|
119
|
+
const result = validator.validateCspNonce('');
|
|
120
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
121
|
+
});
|
|
122
|
+
it('should reject non-string nonce', () => {
|
|
123
|
+
const result = validator.validateCspNonce(123);
|
|
124
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
125
|
+
});
|
|
126
|
+
it('should reject too short nonce', () => {
|
|
127
|
+
const result = validator.validateCspNonce('short');
|
|
128
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
129
|
+
(0, assert_1.strictEqual)(result.error?.includes('too short'), true);
|
|
130
|
+
});
|
|
131
|
+
it('should reject nonce with invalid characters', () => {
|
|
132
|
+
const result = validator.validateCspNonce('ABC<script>alert(1)</script>');
|
|
133
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
134
|
+
(0, assert_1.strictEqual)(result.error?.includes('invalid characters'), true);
|
|
135
|
+
});
|
|
136
|
+
it('should accept base64-like nonces', () => {
|
|
137
|
+
const result = validator.validateCspNonce('AbCdEfGhIjKlMnOpQrStUvWxYz0123456789+/=');
|
|
138
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe('Image timeout validation', () => {
|
|
142
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
143
|
+
it('should accept valid timeout', () => {
|
|
144
|
+
const result = validator.validateImageTimeout(15000);
|
|
145
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
146
|
+
});
|
|
147
|
+
it('should reject negative timeout', () => {
|
|
148
|
+
const result = validator.validateImageTimeout(-1000);
|
|
149
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
150
|
+
});
|
|
151
|
+
it('should reject non-number timeout', () => {
|
|
152
|
+
const result = validator.validateImageTimeout('15000');
|
|
153
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
154
|
+
});
|
|
155
|
+
it('should reject NaN timeout', () => {
|
|
156
|
+
const result = validator.validateImageTimeout(NaN);
|
|
157
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
158
|
+
});
|
|
159
|
+
it('should enforce maximum timeout', () => {
|
|
160
|
+
const strictValidator = (0, validator_1.createStrictValidator)([]);
|
|
161
|
+
const result = strictValidator.validateImageTimeout(120000); // 2 minutes
|
|
162
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
163
|
+
(0, assert_1.strictEqual)(result.error?.includes('exceeds maximum'), true);
|
|
164
|
+
});
|
|
165
|
+
it('should accept timeout within limit', () => {
|
|
166
|
+
const strictValidator = (0, validator_1.createStrictValidator)([]);
|
|
167
|
+
const result = strictValidator.validateImageTimeout(30000); // 30 seconds
|
|
168
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
describe('Dimensions validation', () => {
|
|
172
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
173
|
+
it('should accept valid dimensions', () => {
|
|
174
|
+
const result = validator.validateDimensions(800, 600);
|
|
175
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
176
|
+
});
|
|
177
|
+
it('should reject zero dimensions', () => {
|
|
178
|
+
const result = validator.validateDimensions(0, 600);
|
|
179
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
180
|
+
});
|
|
181
|
+
it('should reject negative dimensions', () => {
|
|
182
|
+
const result = validator.validateDimensions(800, -100);
|
|
183
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
184
|
+
});
|
|
185
|
+
it('should reject NaN dimensions', () => {
|
|
186
|
+
const result = validator.validateDimensions(NaN, 600);
|
|
187
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
188
|
+
});
|
|
189
|
+
it('should reject non-number dimensions', () => {
|
|
190
|
+
const result = validator.validateDimensions('800', 600);
|
|
191
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
192
|
+
});
|
|
193
|
+
it('should reject dimensions exceeding maximum', () => {
|
|
194
|
+
const result = validator.validateDimensions(40000, 600);
|
|
195
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
196
|
+
(0, assert_1.strictEqual)(result.error?.includes('exceed maximum'), true);
|
|
197
|
+
});
|
|
198
|
+
it('should accept dimensions at the limit', () => {
|
|
199
|
+
const result = validator.validateDimensions(32767, 32767);
|
|
200
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
describe('Scale validation', () => {
|
|
204
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
205
|
+
it('should accept valid scale', () => {
|
|
206
|
+
const result = validator.validateScale(2);
|
|
207
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
208
|
+
});
|
|
209
|
+
it('should accept fractional scale', () => {
|
|
210
|
+
const result = validator.validateScale(0.5);
|
|
211
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
212
|
+
});
|
|
213
|
+
it('should reject zero scale', () => {
|
|
214
|
+
const result = validator.validateScale(0);
|
|
215
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
216
|
+
});
|
|
217
|
+
it('should reject negative scale', () => {
|
|
218
|
+
const result = validator.validateScale(-2);
|
|
219
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
220
|
+
});
|
|
221
|
+
it('should reject too large scale', () => {
|
|
222
|
+
const result = validator.validateScale(20);
|
|
223
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
224
|
+
(0, assert_1.strictEqual)(result.error?.includes('too large'), true);
|
|
225
|
+
});
|
|
226
|
+
it('should reject NaN scale', () => {
|
|
227
|
+
const result = validator.validateScale(NaN);
|
|
228
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
describe('Element validation', () => {
|
|
232
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
233
|
+
it('should reject null element', () => {
|
|
234
|
+
const result = validator.validateElement(null);
|
|
235
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
236
|
+
});
|
|
237
|
+
it('should reject undefined element', () => {
|
|
238
|
+
const result = validator.validateElement(undefined);
|
|
239
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
240
|
+
});
|
|
241
|
+
it('should reject non-object element', () => {
|
|
242
|
+
const result = validator.validateElement('not an element');
|
|
243
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
244
|
+
});
|
|
245
|
+
// Note: Full HTMLElement testing requires DOM environment (jsdom/browser)
|
|
246
|
+
});
|
|
247
|
+
describe('Options validation', () => {
|
|
248
|
+
const validator = (0, validator_1.createDefaultValidator)();
|
|
249
|
+
it('should accept valid options', () => {
|
|
250
|
+
const options = {
|
|
251
|
+
scale: 2,
|
|
252
|
+
width: 800,
|
|
253
|
+
height: 600,
|
|
254
|
+
imageTimeout: 15000
|
|
255
|
+
};
|
|
256
|
+
const result = validator.validateOptions(options);
|
|
257
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
258
|
+
});
|
|
259
|
+
it('should collect multiple errors', () => {
|
|
260
|
+
const options = {
|
|
261
|
+
scale: -1,
|
|
262
|
+
width: -800,
|
|
263
|
+
imageTimeout: -5000
|
|
264
|
+
};
|
|
265
|
+
const result = validator.validateOptions(options);
|
|
266
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
267
|
+
// Should contain multiple error messages
|
|
268
|
+
(0, assert_1.strictEqual)(result.error?.includes('Scale'), true);
|
|
269
|
+
(0, assert_1.strictEqual)(result.error?.includes('Dimensions'), true);
|
|
270
|
+
(0, assert_1.strictEqual)(result.error?.includes('timeout'), true);
|
|
271
|
+
});
|
|
272
|
+
it('should allow missing optional fields', () => {
|
|
273
|
+
const options = {};
|
|
274
|
+
const result = validator.validateOptions(options);
|
|
275
|
+
(0, assert_1.strictEqual)(result.valid, true);
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
describe('Strict validator', () => {
|
|
279
|
+
const strictValidator = (0, validator_1.createStrictValidator)(['trusted.com']);
|
|
280
|
+
it('should reject data URLs in strict mode', () => {
|
|
281
|
+
// Note: This would need implementation in createStrictValidator
|
|
282
|
+
// Currently it doesn't disable data URLs
|
|
283
|
+
});
|
|
284
|
+
it('should enforce shorter timeout in strict mode', () => {
|
|
285
|
+
const result = strictValidator.validateImageTimeout(120000);
|
|
286
|
+
(0, assert_1.strictEqual)(result.valid, false);
|
|
287
|
+
});
|
|
288
|
+
it('should enforce proxy whitelist in strict mode', () => {
|
|
289
|
+
const allowed = strictValidator.validateUrl('https://trusted.com/proxy', 'proxy');
|
|
290
|
+
(0, assert_1.strictEqual)(allowed.valid, true);
|
|
291
|
+
const denied = strictValidator.validateUrl('https://untrusted.com/proxy', 'proxy');
|
|
292
|
+
(0, assert_1.strictEqual)(denied.valid, false);
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
//# sourceMappingURL=validator.js.map
|