@shgysk8zer0/polyfills 0.0.2
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/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +2 -0
- package/abort.js +194 -0
- package/all.js +30 -0
- package/animation.js +33 -0
- package/aom.js +43 -0
- package/appBadge.js +27 -0
- package/array.js +258 -0
- package/assets/CookieStore.js +230 -0
- package/assets/Lock.js +31 -0
- package/assets/LockManager.js +278 -0
- package/assets/Sanitizer.js +59 -0
- package/assets/SanitizerConfig.js +348 -0
- package/assets/SanitizerConfigBase.js +18 -0
- package/assets/SanitizerConfigEdge.js +335 -0
- package/assets/SanitizerConfigW3C.js +766 -0
- package/assets/Scheduler.js +124 -0
- package/assets/TextDecoder.js +83 -0
- package/assets/TextEncoder.js +41 -0
- package/assets/TrustedTypes.js +595 -0
- package/assets/attributes.js +15 -0
- package/assets/csp.js +29 -0
- package/assets/error.js +8 -0
- package/assets/sanitizerUtils.js +270 -0
- package/assets/trust.js +190 -0
- package/assets/utility.js +101 -0
- package/cookieStore.js +2 -0
- package/crypto.js +8 -0
- package/dialog.js +63 -0
- package/element.js +171 -0
- package/elementInternals.js +616 -0
- package/errors.js +21 -0
- package/function.js +31 -0
- package/globalThis.js +36 -0
- package/iterator.js +197 -0
- package/legacy/array.js +15 -0
- package/legacy/element.js +140 -0
- package/legacy/map.js +168 -0
- package/legacy/object.js +42 -0
- package/legacy.js +9 -0
- package/locks.js +33 -0
- package/map.js +32 -0
- package/match-media.js +58 -0
- package/math.js +69 -0
- package/navigator.js +55 -0
- package/number.js +14 -0
- package/package.json +52 -0
- package/performance.js +36 -0
- package/promise.js +70 -0
- package/sanitizer.js +3 -0
- package/scheduler.js +5 -0
- package/secure-context.js +31 -0
- package/set.js +73 -0
- package/share.js +17 -0
- package/symbols.js +9 -0
- package/textEncoder.js +16 -0
- package/trustedTypes.js +3 -0
- package/weakMap.js +28 -0
- package/window.js +85 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright 2023 Chris Zuber <admin@kernvalley.us>
|
|
3
|
+
*/
|
|
4
|
+
export const PRIORITIES = {
|
|
5
|
+
blocking: 'user-blocking',
|
|
6
|
+
visible: 'user-visible',
|
|
7
|
+
background: 'background',
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
async function delayCallback(cb, { delay = 0, signal } = {}) {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
if (signal instanceof AbortSignal && signal.aborted) {
|
|
13
|
+
reject(signal.reason);
|
|
14
|
+
} else {
|
|
15
|
+
const controller = new AbortController();
|
|
16
|
+
const handle = setTimeout(() => {
|
|
17
|
+
resolve(cb());
|
|
18
|
+
controller.abort();
|
|
19
|
+
}, delay);
|
|
20
|
+
|
|
21
|
+
if (signal instanceof AbortSignal) {
|
|
22
|
+
signal.addEventListener('abort', ({ target }) => {
|
|
23
|
+
reject(target.reason);
|
|
24
|
+
clearTimeout(handle);
|
|
25
|
+
}, { once: true, signal: controller.signal });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class Scheduler {
|
|
32
|
+
async postTask(callback, {
|
|
33
|
+
priority = PRIORITIES.visible,
|
|
34
|
+
delay,
|
|
35
|
+
signal,
|
|
36
|
+
} = {}) {
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
if (signal instanceof AbortSignal && signal.aborted) {
|
|
39
|
+
reject(signal.reason);
|
|
40
|
+
} else {
|
|
41
|
+
switch(priority) {
|
|
42
|
+
case PRIORITIES.blocking:
|
|
43
|
+
if (typeof delay === 'number' && ! Number.isNaN(delay) && delay > 0) {
|
|
44
|
+
delayCallback(callback, { delay, signal })
|
|
45
|
+
.then(resolve, reject);
|
|
46
|
+
} else {
|
|
47
|
+
resolve((async () => await callback())());
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
break;
|
|
51
|
+
|
|
52
|
+
case PRIORITIES.visible:
|
|
53
|
+
if (typeof delay === 'number' && ! Number.isNaN(delay) && delay > 0) {
|
|
54
|
+
delayCallback(() => requestAnimationFrame(async () => {
|
|
55
|
+
try {
|
|
56
|
+
const result = await callback();
|
|
57
|
+
resolve(result);
|
|
58
|
+
} catch(err) {
|
|
59
|
+
reject(err);
|
|
60
|
+
}
|
|
61
|
+
}), { delay, signal }).catch(reject);
|
|
62
|
+
} else {
|
|
63
|
+
const controller = new AbortController();
|
|
64
|
+
const handle = requestAnimationFrame(async () => {
|
|
65
|
+
try {
|
|
66
|
+
const result = await callback();
|
|
67
|
+
resolve(result);
|
|
68
|
+
} catch(err) {
|
|
69
|
+
reject(err);
|
|
70
|
+
} finally {
|
|
71
|
+
controller.abort();
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
if (signal instanceof AbortSignal) {
|
|
76
|
+
signal.addEventListener('abort', ({ target }) => {
|
|
77
|
+
cancelAnimationFrame(handle);
|
|
78
|
+
reject(target.reason);
|
|
79
|
+
}, { once: true, signal: controller.signal });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
break;
|
|
84
|
+
|
|
85
|
+
case PRIORITIES.background:
|
|
86
|
+
if (typeof delay === 'number' && ! Number.isNaN(delay) && delay > 0) {
|
|
87
|
+
delayCallback(() => requestIdleCallback(async () => {
|
|
88
|
+
try {
|
|
89
|
+
const result = await callback();
|
|
90
|
+
resolve(result);
|
|
91
|
+
} catch(err) {
|
|
92
|
+
reject(err);
|
|
93
|
+
}
|
|
94
|
+
}), { delay, signal }).catch(reject);
|
|
95
|
+
} else {
|
|
96
|
+
const controller = new AbortController();
|
|
97
|
+
const handle = requestIdleCallback(async () => {
|
|
98
|
+
try {
|
|
99
|
+
const result = await callback();
|
|
100
|
+
resolve(result);
|
|
101
|
+
} catch(err) {
|
|
102
|
+
reject(err);
|
|
103
|
+
} finally {
|
|
104
|
+
controller.abort();
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
if (signal instanceof AbortSignal) {
|
|
109
|
+
signal.addEventListener('abort', ({ target }) => {
|
|
110
|
+
cancelIdleCallback(handle);
|
|
111
|
+
reject(target.reason);
|
|
112
|
+
}, { once: true, signal: controller.signal });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
break;
|
|
117
|
+
|
|
118
|
+
default:
|
|
119
|
+
throw new TypeError(`Scheduler.postTask: '${priority}' (value of 'priority' member of SchedulerPostTaskOptions) is not a valid value for enumeration TaskPriority.`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright 2023 Chris Zuber <admin@kernvalley.us>
|
|
3
|
+
*/
|
|
4
|
+
import { between } from './utility.js';
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* Array of supported encodings
|
|
8
|
+
* @Todo: At least add utf-16
|
|
9
|
+
* @type {Array}
|
|
10
|
+
*/
|
|
11
|
+
const supportedEncodings = ['utf-8', 'utf8'];
|
|
12
|
+
|
|
13
|
+
export const BOM = new Uint8Array([0xEF, 0xBB, 0xBF]);
|
|
14
|
+
|
|
15
|
+
export class TextDecoder {
|
|
16
|
+
constructor(encoding = 'utf-8', { fatal = false, ignoreBOM = false } = {}) {
|
|
17
|
+
if (typeof encoding !== 'string') {
|
|
18
|
+
encoding = encoding.toString().toLowerCase();
|
|
19
|
+
} else {
|
|
20
|
+
encoding = encoding.toLowerCase();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (! supportedEncodings.includes(encoding)) {
|
|
24
|
+
throw new RangeError(`TextDecoder constructor: The given encoding '${encoding}' is not supported.`);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
Object.defineProperties(this, {
|
|
28
|
+
encoding: {
|
|
29
|
+
configurable: false,
|
|
30
|
+
enumerable: true,
|
|
31
|
+
writable: false,
|
|
32
|
+
value: encoding,
|
|
33
|
+
},
|
|
34
|
+
fatal: {
|
|
35
|
+
configurable: false,
|
|
36
|
+
enumerable: true,
|
|
37
|
+
writable: false,
|
|
38
|
+
value: fatal,
|
|
39
|
+
},
|
|
40
|
+
ignoreBOM: {
|
|
41
|
+
configurable: false,
|
|
42
|
+
enumerable: true,
|
|
43
|
+
writable: false,
|
|
44
|
+
value: ignoreBOM,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
decode(data) {
|
|
50
|
+
switch(this.encoding) {
|
|
51
|
+
case 'utf-8':
|
|
52
|
+
case 'utf8': {
|
|
53
|
+
let prev = NaN;
|
|
54
|
+
/**
|
|
55
|
+
* For (0,127) we just take the charCode
|
|
56
|
+
* For charCode 128+this will be in the form [n=194+, m=(128-191)]
|
|
57
|
+
* where n increments after m reaches 191, increments, and rolls back to 128
|
|
58
|
+
*/
|
|
59
|
+
return data.reduce((str, i, n) => {
|
|
60
|
+
if (Number.isNaN(prev) && i < 128) {
|
|
61
|
+
return str + String.fromCharCode(i);
|
|
62
|
+
} else if (Number.isNaN(prev) && i > 193) {
|
|
63
|
+
prev = i;
|
|
64
|
+
return str;
|
|
65
|
+
} else if (prev > 193 && between(128, i, 194)) {
|
|
66
|
+
const offset = (prev - 194) * 64;
|
|
67
|
+
prev = NaN;
|
|
68
|
+
return str + String.fromCharCode(offset + i);
|
|
69
|
+
} else if (this.fatal) {
|
|
70
|
+
throw new RangeError(`Unhandled character at postion ${n}`);
|
|
71
|
+
} else {
|
|
72
|
+
prev = NaN;
|
|
73
|
+
return str;
|
|
74
|
+
}
|
|
75
|
+
}, '');
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
default:
|
|
80
|
+
throw new TypeError(`Unsupported encoding '${this.encoding}'`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright 2023 Chris Zuber <admin@kernvalley.us>
|
|
3
|
+
*/
|
|
4
|
+
export class TextEncoder {
|
|
5
|
+
get encoding() {
|
|
6
|
+
return 'utf-8';
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
encode(str) {
|
|
10
|
+
// Identical to char up to 127, then [194, (n)] for n=(128-191),
|
|
11
|
+
// then [194, (128-191)] for n=(192-255)
|
|
12
|
+
// and it looks like this holds in intervals of 64
|
|
13
|
+
return new Uint8Array(str.split('').flatMap(char => {
|
|
14
|
+
const code = char.charCodeAt(0);
|
|
15
|
+
|
|
16
|
+
if (code < 128) {
|
|
17
|
+
return [code];
|
|
18
|
+
} else {
|
|
19
|
+
const pt = 194 + Math.floor((code - 128) / 64);
|
|
20
|
+
return [pt, (code % 64) + 128];
|
|
21
|
+
}
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
encodeInto(str, ui8arr) {
|
|
26
|
+
if (! (ui8arr instanceof Uint8Array)) {
|
|
27
|
+
throw new TypeError('TextEncoder.encodeInto: Argument 2 does not implement interface Uint8Array.');
|
|
28
|
+
} else {
|
|
29
|
+
const encoded = this.encode(str);
|
|
30
|
+
const len = Math.min(ui8arr.length, encoded.length);
|
|
31
|
+
|
|
32
|
+
if (encoded.length > ui8arr.length) {
|
|
33
|
+
ui8arr.set(encoded.slice(0, len));
|
|
34
|
+
} else {
|
|
35
|
+
ui8arr.set(encoded);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return { read: len, written: len };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|