happy-dom 9.1.10 → 9.2.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.
Potentially problematic release.
This version of happy-dom might be problematic. Click here for more details.
- package/lib/nodes/element/Dataset.d.ts +34 -0
- package/lib/nodes/element/Dataset.d.ts.map +1 -0
- package/lib/nodes/element/Dataset.js +97 -0
- package/lib/nodes/element/Dataset.js.map +1 -0
- package/lib/nodes/html-element/HTMLElement.d.ts.map +1 -1
- package/lib/nodes/html-element/HTMLElement.js +2 -63
- package/lib/nodes/html-element/HTMLElement.js.map +1 -1
- package/lib/nodes/svg-element/SVGElement.d.ts +1 -0
- package/lib/nodes/svg-element/SVGElement.d.ts.map +1 -1
- package/lib/nodes/svg-element/SVGElement.js +3 -7
- package/lib/nodes/svg-element/SVGElement.js.map +1 -1
- package/package.json +1 -1
- package/src/nodes/element/Dataset.ts +105 -0
- package/src/nodes/html-element/HTMLElement.ts +3 -68
- package/src/nodes/svg-element/SVGElement.ts +3 -7
- package/lib/nodes/html-element/DatasetUtility.d.ts +0 -20
- package/lib/nodes/html-element/DatasetUtility.d.ts.map +0 -1
- package/lib/nodes/html-element/DatasetUtility.js +0 -33
- package/lib/nodes/html-element/DatasetUtility.js.map +0 -1
- package/src/nodes/html-element/DatasetUtility.ts +0 -30
@@ -0,0 +1,34 @@
|
|
1
|
+
import Element from '../element/Element';
|
2
|
+
/**
|
3
|
+
* Storage type for a dataset proxy.
|
4
|
+
*/
|
5
|
+
declare type DatasetRecord = Record<string, string>;
|
6
|
+
/**
|
7
|
+
* Dataset helper proxy.
|
8
|
+
*
|
9
|
+
* Reference:
|
10
|
+
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset
|
11
|
+
*/
|
12
|
+
export default class Dataset {
|
13
|
+
readonly proxy: DatasetRecord;
|
14
|
+
/**
|
15
|
+
* @param element The parent element.
|
16
|
+
*/
|
17
|
+
constructor(element: Element);
|
18
|
+
/**
|
19
|
+
* Transforms a kebab cased string to camel case.
|
20
|
+
*
|
21
|
+
* @param text Text string.
|
22
|
+
* @returns Camel cased string.
|
23
|
+
*/
|
24
|
+
static kebabToCamelCase(text: string): string;
|
25
|
+
/**
|
26
|
+
* Transforms a camel cased string to kebab case.
|
27
|
+
*
|
28
|
+
* @param text Text string.
|
29
|
+
* @returns Kebab cased string.
|
30
|
+
*/
|
31
|
+
static camelCaseToKebab(text: string): string;
|
32
|
+
}
|
33
|
+
export {};
|
34
|
+
//# sourceMappingURL=Dataset.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Dataset.d.ts","sourceRoot":"","sources":["../../../src/nodes/element/Dataset.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,oBAAoB,CAAC;AAEzC;;GAEG;AACH,aAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAC3B,SAAgB,KAAK,EAAE,aAAa,CAAC;IAErC;;OAEG;gBACS,OAAO,EAAE,OAAO;IA4D5B;;;;;OAKG;WACW,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQpD;;;;;OAKG;WACW,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAKpD"}
|
@@ -0,0 +1,97 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
/**
|
4
|
+
* Dataset helper proxy.
|
5
|
+
*
|
6
|
+
* Reference:
|
7
|
+
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset
|
8
|
+
*/
|
9
|
+
class Dataset {
|
10
|
+
/**
|
11
|
+
* @param element The parent element.
|
12
|
+
*/
|
13
|
+
constructor(element) {
|
14
|
+
// Build the initial dataset record from all data attributes.
|
15
|
+
const dataset = {};
|
16
|
+
const attributes = element._attributes;
|
17
|
+
for (const name of Object.keys(attributes)) {
|
18
|
+
if (name.startsWith('data-')) {
|
19
|
+
const key = Dataset.kebabToCamelCase(name.replace('data-', ''));
|
20
|
+
dataset[key] = attributes[name].value;
|
21
|
+
}
|
22
|
+
}
|
23
|
+
// Documentation for Proxy:
|
24
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
|
25
|
+
this.proxy = new Proxy(dataset, {
|
26
|
+
get(dataset, key) {
|
27
|
+
const name = 'data-' + Dataset.camelCaseToKebab(key);
|
28
|
+
if (name in attributes) {
|
29
|
+
return (dataset[key] = attributes[name].value);
|
30
|
+
}
|
31
|
+
delete dataset[key];
|
32
|
+
return undefined;
|
33
|
+
},
|
34
|
+
set(dataset, key, value) {
|
35
|
+
element.setAttribute('data-' + Dataset.camelCaseToKebab(key), value);
|
36
|
+
dataset[key] = value;
|
37
|
+
return true;
|
38
|
+
},
|
39
|
+
deleteProperty(dataset, key) {
|
40
|
+
const name = 'data-' + Dataset.camelCaseToKebab(key);
|
41
|
+
const result1 = delete attributes[name];
|
42
|
+
const result2 = delete dataset[key];
|
43
|
+
return result1 && result2;
|
44
|
+
},
|
45
|
+
ownKeys(dataset) {
|
46
|
+
// According to Mozilla we have to update the dataset object (target) to contain the same keys as what we return:
|
47
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/ownKeys
|
48
|
+
// "The result List must contain the keys of all non-configurable own properties of the target object."
|
49
|
+
const keys = [];
|
50
|
+
const deleteKeys = [];
|
51
|
+
for (const name of Object.keys(attributes)) {
|
52
|
+
if (name.startsWith('data-')) {
|
53
|
+
const key = Dataset.kebabToCamelCase(name.replace('data-', ''));
|
54
|
+
keys.push(key);
|
55
|
+
dataset[key] = attributes[name].value;
|
56
|
+
if (!dataset[key]) {
|
57
|
+
deleteKeys.push(key);
|
58
|
+
}
|
59
|
+
}
|
60
|
+
}
|
61
|
+
for (const key of deleteKeys) {
|
62
|
+
delete dataset[key];
|
63
|
+
}
|
64
|
+
return keys;
|
65
|
+
},
|
66
|
+
has(_dataset, key) {
|
67
|
+
return !!attributes['data-' + Dataset.camelCaseToKebab(key)];
|
68
|
+
}
|
69
|
+
});
|
70
|
+
}
|
71
|
+
/**
|
72
|
+
* Transforms a kebab cased string to camel case.
|
73
|
+
*
|
74
|
+
* @param text Text string.
|
75
|
+
* @returns Camel cased string.
|
76
|
+
*/
|
77
|
+
static kebabToCamelCase(text) {
|
78
|
+
const parts = text.split('-');
|
79
|
+
for (let i = 0, max = parts.length; i < max; i++) {
|
80
|
+
parts[i] = i > 0 ? parts[i].charAt(0).toUpperCase() + parts[i].slice(1) : parts[i];
|
81
|
+
}
|
82
|
+
return parts.join('');
|
83
|
+
}
|
84
|
+
/**
|
85
|
+
* Transforms a camel cased string to kebab case.
|
86
|
+
*
|
87
|
+
* @param text Text string.
|
88
|
+
* @returns Kebab cased string.
|
89
|
+
*/
|
90
|
+
static camelCaseToKebab(text) {
|
91
|
+
return text
|
92
|
+
.toString()
|
93
|
+
.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());
|
94
|
+
}
|
95
|
+
}
|
96
|
+
exports.default = Dataset;
|
97
|
+
//# sourceMappingURL=Dataset.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Dataset.js","sourceRoot":"","sources":["../../../src/nodes/element/Dataset.ts"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"HTMLElement.d.ts","sourceRoot":"","sources":["../../../src/nodes/html-element/HTMLElement.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,mBAAmB,MAAM,2CAA2C,CAAC;AAC5E,OAAO,KAAK,MAAM,eAAe,CAAC;AAMlC,OAAO,KAAK,MAAM,mBAAmB,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAQ,YAAW,YAAY;IACvE,SAAgB,SAAS,MAAM;IAC/B,SAAgB,cAAc,MAAM;IACpC,SAAgB,eAAe,aAAa;IAC5C,SAAgB,iBAAiB,SAAS;IAC1C,SAAgB,YAAY,KAAK;IACjC,SAAgB,WAAW,KAAK;IAChC,SAAgB,UAAU,KAAK;IAC/B,SAAgB,SAAS,KAAK;IAC9B,SAAgB,YAAY,KAAK;IACjC,SAAgB,WAAW,KAAK;IAEhC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,QAAQ,
|
1
|
+
{"version":3,"file":"HTMLElement.d.ts","sourceRoot":"","sources":["../../../src/nodes/html-element/HTMLElement.ts"],"names":[],"mappings":"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"}
|
@@ -7,7 +7,7 @@ const Element_1 = __importDefault(require("../element/Element"));
|
|
7
7
|
const CSSStyleDeclaration_1 = __importDefault(require("../../css/declaration/CSSStyleDeclaration"));
|
8
8
|
const FocusEvent_1 = __importDefault(require("../../event/events/FocusEvent"));
|
9
9
|
const PointerEvent_1 = __importDefault(require("../../event/events/PointerEvent"));
|
10
|
-
const
|
10
|
+
const Dataset_1 = __importDefault(require("../element/Dataset"));
|
11
11
|
const NodeTypeEnum_1 = __importDefault(require("../node/NodeTypeEnum"));
|
12
12
|
const DOMException_1 = __importDefault(require("../../exception/DOMException"));
|
13
13
|
/**
|
@@ -196,68 +196,7 @@ class HTMLElement extends Element_1.default {
|
|
196
196
|
* @returns Data set.
|
197
197
|
*/
|
198
198
|
get dataset() {
|
199
|
-
|
200
|
-
return this._dataset;
|
201
|
-
}
|
202
|
-
const dataset = {};
|
203
|
-
const attributes = this._attributes;
|
204
|
-
for (const name of Object.keys(attributes)) {
|
205
|
-
if (name.startsWith('data-')) {
|
206
|
-
const key = DatasetUtility_1.default.kebabToCamelCase(name.replace('data-', ''));
|
207
|
-
dataset[key] = attributes[name].value;
|
208
|
-
}
|
209
|
-
}
|
210
|
-
// Documentation for Proxy:
|
211
|
-
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
|
212
|
-
this._dataset = new Proxy(dataset, {
|
213
|
-
get: (dataset, key) => {
|
214
|
-
const name = 'data-' + DatasetUtility_1.default.camelCaseToKebab(key);
|
215
|
-
if (this._attributes[name]) {
|
216
|
-
dataset[key] = this._attributes[name].value;
|
217
|
-
return this._attributes[name].value;
|
218
|
-
}
|
219
|
-
if (dataset[key] !== undefined) {
|
220
|
-
delete dataset[key];
|
221
|
-
}
|
222
|
-
return undefined;
|
223
|
-
},
|
224
|
-
set: (dataset, key, value) => {
|
225
|
-
this.setAttribute('data-' + DatasetUtility_1.default.camelCaseToKebab(key), value);
|
226
|
-
dataset[key] = value;
|
227
|
-
return true;
|
228
|
-
},
|
229
|
-
deleteProperty: (dataset, key) => {
|
230
|
-
const name = 'data-' + DatasetUtility_1.default.camelCaseToKebab(key);
|
231
|
-
const result1 = delete attributes[name];
|
232
|
-
const result2 = delete dataset[key];
|
233
|
-
return result1 && result2;
|
234
|
-
},
|
235
|
-
ownKeys: (dataset) => {
|
236
|
-
// According to Mozilla we have to update the dataset object (target) to contain the same keys as what we return:
|
237
|
-
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/ownKeys
|
238
|
-
// "The result List must contain the keys of all non-configurable own properties of the target object."
|
239
|
-
const keys = [];
|
240
|
-
const deleteKeys = [];
|
241
|
-
for (const name of Object.keys(attributes)) {
|
242
|
-
if (name.startsWith('data-')) {
|
243
|
-
const key = DatasetUtility_1.default.kebabToCamelCase(name.replace('data-', ''));
|
244
|
-
keys.push(key);
|
245
|
-
dataset[key] = attributes[name].value;
|
246
|
-
if (!dataset[key]) {
|
247
|
-
deleteKeys.push(key);
|
248
|
-
}
|
249
|
-
}
|
250
|
-
}
|
251
|
-
for (const key of deleteKeys) {
|
252
|
-
delete dataset[key];
|
253
|
-
}
|
254
|
-
return keys;
|
255
|
-
},
|
256
|
-
has: (_dataset, key) => {
|
257
|
-
return !!attributes['data-' + DatasetUtility_1.default.camelCaseToKebab(key)];
|
258
|
-
}
|
259
|
-
});
|
260
|
-
return this._dataset;
|
199
|
+
return (this._dataset ?? (this._dataset = new Dataset_1.default(this))).proxy;
|
261
200
|
}
|
262
201
|
/**
|
263
202
|
* Returns direction.
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"HTMLElement.js","sourceRoot":"","sources":["../../../src/nodes/html-element/HTMLElement.ts"],"names":[],"mappings":";;;;;AAAA,iEAAyC;AAEzC,oGAA4E;AAE5E,+EAAuD;AACvD,mFAA2D;AAC3D,
|
1
|
+
{"version":3,"file":"HTMLElement.js","sourceRoot":"","sources":["../../../src/nodes/html-element/HTMLElement.ts"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SVGElement.d.ts","sourceRoot":"","sources":["../../../src/nodes/svg-element/SVGElement.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,2CAA2C,CAAC;AAC5E,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,MAAM,eAAe,CAAC;AAClC,OAAO,KAAK,MAAM,mBAAmB,CAAC;
|
1
|
+
{"version":3,"file":"SVGElement.d.ts","sourceRoot":"","sources":["../../../src/nodes/svg-element/SVGElement.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,2CAA2C,CAAC;AAC5E,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,MAAM,eAAe,CAAC;AAClC,OAAO,KAAK,MAAM,mBAAmB,CAAC;AAGtC;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAQ,YAAW,WAAW;IAE9D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAQ;IAC9C,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAQ;IAC9C,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAQ;IAC7C,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAQ;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAQ;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAQ;IAEtD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,QAAQ,CAAiB;IAEjC;;;;OAIG;IACH,IAAW,eAAe,IAAI,WAAW,CAExC;IAED;;;;OAIG;IACH,IAAW,eAAe,IAAI,cAAc,CAU3C;IAED;;;;OAIG;IACH,IAAW,OAAO,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAE9C;IAED;;;;OAIG;IACH,IAAW,KAAK,IAAI,mBAAmB,CAKtC;IAED;;OAEG;IACI,gBAAgB,CAAC,SAAS,EAAE,KAAK,GAAG,KAAK;IAUhD;;OAEG;IACI,mBAAmB,CAAC,SAAS,EAAE,KAAK,GAAG,KAAK;CASnD"}
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const CSSStyleDeclaration_1 = __importDefault(require("../../css/declaration/CSSStyleDeclaration"));
|
7
7
|
const Element_1 = __importDefault(require("../element/Element"));
|
8
|
+
const Dataset_1 = __importDefault(require("../element/Dataset"));
|
8
9
|
/**
|
9
10
|
* SVG Element.
|
10
11
|
*
|
@@ -22,6 +23,7 @@ class SVGElement extends Element_1.default {
|
|
22
23
|
this.onscroll = null;
|
23
24
|
this.onunload = null;
|
24
25
|
this._style = null;
|
26
|
+
this._dataset = null;
|
25
27
|
}
|
26
28
|
/**
|
27
29
|
* Returns viewport.
|
@@ -52,13 +54,7 @@ class SVGElement extends Element_1.default {
|
|
52
54
|
* @returns Data set.
|
53
55
|
*/
|
54
56
|
get dataset() {
|
55
|
-
|
56
|
-
for (const name of Object.keys(this._attributes)) {
|
57
|
-
if (name.startsWith('data-')) {
|
58
|
-
dataset[name.replace('data-', '')] = this._attributes[name].value;
|
59
|
-
}
|
60
|
-
}
|
61
|
-
return dataset;
|
57
|
+
return (this._dataset ?? (this._dataset = new Dataset_1.default(this))).proxy;
|
62
58
|
}
|
63
59
|
/**
|
64
60
|
* Returns style.
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SVGElement.js","sourceRoot":"","sources":["../../../src/nodes/svg-element/SVGElement.ts"],"names":[],"mappings":";;;;;AAAA,oGAA4E;AAC5E,iEAAyC;
|
1
|
+
{"version":3,"file":"SVGElement.js","sourceRoot":"","sources":["../../../src/nodes/svg-element/SVGElement.ts"],"names":[],"mappings":";;;;;AAAA,oGAA4E;AAC5E,iEAAyC;AAKzC,iEAAyC;AAEzC;;;;;GAKG;AACH,MAAqB,UAAW,SAAQ,iBAAO;IAA/C;;QACC,SAAS;QACF,YAAO,GAAkC,IAAI,CAAC;QAC9C,YAAO,GAAkC,IAAI,CAAC;QAC9C,WAAM,GAAkC,IAAI,CAAC;QAC7C,aAAQ,GAAkC,IAAI,CAAC;QAC/C,aAAQ,GAAkC,IAAI,CAAC;QAC/C,aAAQ,GAAkC,IAAI,CAAC;QAE9C,WAAM,GAAwB,IAAI,CAAC;QACnC,aAAQ,GAAY,IAAI,CAAC;IA0ElC,CAAC;IAxEA;;;;OAIG;IACH,IAAW,eAAe;QACzB,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,IAAW,eAAe;QACzB,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC7B,OAAO,MAAM,EAAE;YACd,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,EAAE;gBAChC,OAAuB,MAAM,CAAC;aAC9B;YAED,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;SAC3B;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,IAAW,OAAO;QACjB,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAb,IAAI,CAAC,QAAQ,GAAK,IAAI,iBAAO,CAAC,IAAI,CAAC,EAAC,CAAC,KAAK,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,IAAW,KAAK;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACjB,IAAI,CAAC,MAAM,GAAG,IAAI,6BAAmB,CAAC,IAAI,CAAC,CAAC;SAC5C;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,SAAgB;QACvC,MAAM,iBAAiB,GAAG,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAE5D,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC;SACtC;QAED,OAAO,iBAAiB,CAAC;IAC1B,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,SAAgB;QAC1C,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAErC,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;SACzB;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;CACD;AApFD,6BAoFC"}
|
package/package.json
CHANGED
@@ -0,0 +1,105 @@
|
|
1
|
+
import Element from '../element/Element';
|
2
|
+
|
3
|
+
/**
|
4
|
+
* Storage type for a dataset proxy.
|
5
|
+
*/
|
6
|
+
type DatasetRecord = Record<string, string>;
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Dataset helper proxy.
|
10
|
+
*
|
11
|
+
* Reference:
|
12
|
+
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset
|
13
|
+
*/
|
14
|
+
export default class Dataset {
|
15
|
+
public readonly proxy: DatasetRecord;
|
16
|
+
|
17
|
+
/**
|
18
|
+
* @param element The parent element.
|
19
|
+
*/
|
20
|
+
constructor(element: Element) {
|
21
|
+
// Build the initial dataset record from all data attributes.
|
22
|
+
const dataset: DatasetRecord = {};
|
23
|
+
const attributes = element._attributes;
|
24
|
+
for (const name of Object.keys(attributes)) {
|
25
|
+
if (name.startsWith('data-')) {
|
26
|
+
const key = Dataset.kebabToCamelCase(name.replace('data-', ''));
|
27
|
+
dataset[key] = attributes[name].value;
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
// Documentation for Proxy:
|
32
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
|
33
|
+
this.proxy = new Proxy(dataset, {
|
34
|
+
get(dataset: DatasetRecord, key: string): string {
|
35
|
+
const name = 'data-' + Dataset.camelCaseToKebab(key);
|
36
|
+
if (name in attributes) {
|
37
|
+
return (dataset[key] = attributes[name].value);
|
38
|
+
}
|
39
|
+
delete dataset[key];
|
40
|
+
return undefined;
|
41
|
+
},
|
42
|
+
set(dataset: DatasetRecord, key: string, value: string): boolean {
|
43
|
+
element.setAttribute('data-' + Dataset.camelCaseToKebab(key), value);
|
44
|
+
dataset[key] = value;
|
45
|
+
return true;
|
46
|
+
},
|
47
|
+
deleteProperty(dataset: DatasetRecord, key: string): boolean {
|
48
|
+
const name = 'data-' + Dataset.camelCaseToKebab(key);
|
49
|
+
const result1 = delete attributes[name];
|
50
|
+
const result2 = delete dataset[key];
|
51
|
+
return result1 && result2;
|
52
|
+
},
|
53
|
+
ownKeys(dataset: DatasetRecord): string[] {
|
54
|
+
// According to Mozilla we have to update the dataset object (target) to contain the same keys as what we return:
|
55
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/ownKeys
|
56
|
+
// "The result List must contain the keys of all non-configurable own properties of the target object."
|
57
|
+
const keys = [];
|
58
|
+
const deleteKeys = [];
|
59
|
+
for (const name of Object.keys(attributes)) {
|
60
|
+
if (name.startsWith('data-')) {
|
61
|
+
const key = Dataset.kebabToCamelCase(name.replace('data-', ''));
|
62
|
+
keys.push(key);
|
63
|
+
dataset[key] = attributes[name].value;
|
64
|
+
if (!dataset[key]) {
|
65
|
+
deleteKeys.push(key);
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
for (const key of deleteKeys) {
|
70
|
+
delete dataset[key];
|
71
|
+
}
|
72
|
+
return keys;
|
73
|
+
},
|
74
|
+
has(_dataset: DatasetRecord, key: string): boolean {
|
75
|
+
return !!attributes['data-' + Dataset.camelCaseToKebab(key)];
|
76
|
+
}
|
77
|
+
});
|
78
|
+
}
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Transforms a kebab cased string to camel case.
|
82
|
+
*
|
83
|
+
* @param text Text string.
|
84
|
+
* @returns Camel cased string.
|
85
|
+
*/
|
86
|
+
public static kebabToCamelCase(text: string): string {
|
87
|
+
const parts = text.split('-');
|
88
|
+
for (let i = 0, max = parts.length; i < max; i++) {
|
89
|
+
parts[i] = i > 0 ? parts[i].charAt(0).toUpperCase() + parts[i].slice(1) : parts[i];
|
90
|
+
}
|
91
|
+
return parts.join('');
|
92
|
+
}
|
93
|
+
|
94
|
+
/**
|
95
|
+
* Transforms a camel cased string to kebab case.
|
96
|
+
*
|
97
|
+
* @param text Text string.
|
98
|
+
* @returns Kebab cased string.
|
99
|
+
*/
|
100
|
+
public static camelCaseToKebab(text: string): string {
|
101
|
+
return text
|
102
|
+
.toString()
|
103
|
+
.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());
|
104
|
+
}
|
105
|
+
}
|
@@ -4,7 +4,7 @@ import CSSStyleDeclaration from '../../css/declaration/CSSStyleDeclaration';
|
|
4
4
|
import IAttr from '../attr/IAttr';
|
5
5
|
import FocusEvent from '../../event/events/FocusEvent';
|
6
6
|
import PointerEvent from '../../event/events/PointerEvent';
|
7
|
-
import
|
7
|
+
import Dataset from '../element/Dataset';
|
8
8
|
import NodeTypeEnum from '../node/NodeTypeEnum';
|
9
9
|
import DOMException from '../../exception/DOMException';
|
10
10
|
import Event from '../../event/Event';
|
@@ -28,7 +28,7 @@ export default class HTMLElement extends Element implements IHTMLElement {
|
|
28
28
|
public readonly clientWidth = 0;
|
29
29
|
|
30
30
|
private _style: CSSStyleDeclaration = null;
|
31
|
-
private _dataset:
|
31
|
+
private _dataset: Dataset = null;
|
32
32
|
|
33
33
|
// Events
|
34
34
|
public oncopy: (event: Event) => void | null = null;
|
@@ -216,72 +216,7 @@ export default class HTMLElement extends Element implements IHTMLElement {
|
|
216
216
|
* @returns Data set.
|
217
217
|
*/
|
218
218
|
public get dataset(): { [key: string]: string } {
|
219
|
-
|
220
|
-
return this._dataset;
|
221
|
-
}
|
222
|
-
|
223
|
-
const dataset: { [key: string]: string } = {};
|
224
|
-
const attributes = this._attributes;
|
225
|
-
|
226
|
-
for (const name of Object.keys(attributes)) {
|
227
|
-
if (name.startsWith('data-')) {
|
228
|
-
const key = DatasetUtility.kebabToCamelCase(name.replace('data-', ''));
|
229
|
-
dataset[key] = attributes[name].value;
|
230
|
-
}
|
231
|
-
}
|
232
|
-
|
233
|
-
// Documentation for Proxy:
|
234
|
-
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
|
235
|
-
this._dataset = new Proxy(dataset, {
|
236
|
-
get: (dataset: { [key: string]: string }, key: string): string => {
|
237
|
-
const name = 'data-' + DatasetUtility.camelCaseToKebab(key);
|
238
|
-
if (this._attributes[name]) {
|
239
|
-
dataset[key] = this._attributes[name].value;
|
240
|
-
return this._attributes[name].value;
|
241
|
-
}
|
242
|
-
if (dataset[key] !== undefined) {
|
243
|
-
delete dataset[key];
|
244
|
-
}
|
245
|
-
return undefined;
|
246
|
-
},
|
247
|
-
set: (dataset: { [key: string]: string }, key: string, value: string): boolean => {
|
248
|
-
this.setAttribute('data-' + DatasetUtility.camelCaseToKebab(key), value);
|
249
|
-
dataset[key] = value;
|
250
|
-
return true;
|
251
|
-
},
|
252
|
-
deleteProperty: (dataset: { [key: string]: string }, key: string) => {
|
253
|
-
const name = 'data-' + DatasetUtility.camelCaseToKebab(key);
|
254
|
-
const result1 = delete attributes[name];
|
255
|
-
const result2 = delete dataset[key];
|
256
|
-
return result1 && result2;
|
257
|
-
},
|
258
|
-
ownKeys: (dataset: { [key: string]: string }) => {
|
259
|
-
// According to Mozilla we have to update the dataset object (target) to contain the same keys as what we return:
|
260
|
-
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/ownKeys
|
261
|
-
// "The result List must contain the keys of all non-configurable own properties of the target object."
|
262
|
-
const keys = [];
|
263
|
-
const deleteKeys = [];
|
264
|
-
for (const name of Object.keys(attributes)) {
|
265
|
-
if (name.startsWith('data-')) {
|
266
|
-
const key = DatasetUtility.kebabToCamelCase(name.replace('data-', ''));
|
267
|
-
keys.push(key);
|
268
|
-
dataset[key] = attributes[name].value;
|
269
|
-
if (!dataset[key]) {
|
270
|
-
deleteKeys.push(key);
|
271
|
-
}
|
272
|
-
}
|
273
|
-
}
|
274
|
-
for (const key of deleteKeys) {
|
275
|
-
delete dataset[key];
|
276
|
-
}
|
277
|
-
return keys;
|
278
|
-
},
|
279
|
-
has: (_dataset: { [key: string]: string }, key: string) => {
|
280
|
-
return !!attributes['data-' + DatasetUtility.camelCaseToKebab(key)];
|
281
|
-
}
|
282
|
-
});
|
283
|
-
|
284
|
-
return this._dataset;
|
219
|
+
return (this._dataset ??= new Dataset(this)).proxy;
|
285
220
|
}
|
286
221
|
|
287
222
|
/**
|
@@ -4,6 +4,7 @@ import ISVGElement from './ISVGElement';
|
|
4
4
|
import ISVGSVGElement from './ISVGSVGElement';
|
5
5
|
import IAttr from '../attr/IAttr';
|
6
6
|
import Event from '../../event/Event';
|
7
|
+
import Dataset from '../element/Dataset';
|
7
8
|
|
8
9
|
/**
|
9
10
|
* SVG Element.
|
@@ -21,6 +22,7 @@ export default class SVGElement extends Element implements ISVGElement {
|
|
21
22
|
public onunload: (event: Event) => void | null = null;
|
22
23
|
|
23
24
|
private _style: CSSStyleDeclaration = null;
|
25
|
+
private _dataset: Dataset = null;
|
24
26
|
|
25
27
|
/**
|
26
28
|
* Returns viewport.
|
@@ -54,13 +56,7 @@ export default class SVGElement extends Element implements ISVGElement {
|
|
54
56
|
* @returns Data set.
|
55
57
|
*/
|
56
58
|
public get dataset(): { [key: string]: string } {
|
57
|
-
|
58
|
-
for (const name of Object.keys(this._attributes)) {
|
59
|
-
if (name.startsWith('data-')) {
|
60
|
-
dataset[name.replace('data-', '')] = this._attributes[name].value;
|
61
|
-
}
|
62
|
-
}
|
63
|
-
return dataset;
|
59
|
+
return (this._dataset ??= new Dataset(this)).proxy;
|
64
60
|
}
|
65
61
|
|
66
62
|
/**
|
@@ -1,20 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Dataset utility.
|
3
|
-
*/
|
4
|
-
export default class DatasetUtility {
|
5
|
-
/**
|
6
|
-
* Transforms a kebab cased string to camel case.
|
7
|
-
*
|
8
|
-
* @param text Text string.
|
9
|
-
* @returns Camel cased string.
|
10
|
-
*/
|
11
|
-
static kebabToCamelCase(text: string): string;
|
12
|
-
/**
|
13
|
-
* Transforms a camel cased string to kebab case.
|
14
|
-
*
|
15
|
-
* @param text Text string.
|
16
|
-
* @returns Kebab cased string.
|
17
|
-
*/
|
18
|
-
static camelCaseToKebab(text: string): string;
|
19
|
-
}
|
20
|
-
//# sourceMappingURL=DatasetUtility.d.ts.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"DatasetUtility.d.ts","sourceRoot":"","sources":["../../../src/nodes/html-element/DatasetUtility.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IAClC;;;;;OAKG;WACW,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQpD;;;;;OAKG;WACW,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAKpD"}
|
@@ -1,33 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
/**
|
4
|
-
* Dataset utility.
|
5
|
-
*/
|
6
|
-
class DatasetUtility {
|
7
|
-
/**
|
8
|
-
* Transforms a kebab cased string to camel case.
|
9
|
-
*
|
10
|
-
* @param text Text string.
|
11
|
-
* @returns Camel cased string.
|
12
|
-
*/
|
13
|
-
static kebabToCamelCase(text) {
|
14
|
-
const parts = text.split('-');
|
15
|
-
for (let i = 0, max = parts.length; i < max; i++) {
|
16
|
-
parts[i] = i > 0 ? parts[i].charAt(0).toUpperCase() + parts[i].slice(1) : parts[i];
|
17
|
-
}
|
18
|
-
return parts.join('');
|
19
|
-
}
|
20
|
-
/**
|
21
|
-
* Transforms a camel cased string to kebab case.
|
22
|
-
*
|
23
|
-
* @param text Text string.
|
24
|
-
* @returns Kebab cased string.
|
25
|
-
*/
|
26
|
-
static camelCaseToKebab(text) {
|
27
|
-
return text
|
28
|
-
.toString()
|
29
|
-
.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());
|
30
|
-
}
|
31
|
-
}
|
32
|
-
exports.default = DatasetUtility;
|
33
|
-
//# sourceMappingURL=DatasetUtility.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"DatasetUtility.js","sourceRoot":"","sources":["../../../src/nodes/html-element/DatasetUtility.ts"],"names":[],"mappings":";;AAAA;;GAEG;AACH,MAAqB,cAAc;IAClC;;;;;OAKG;IACI,MAAM,CAAC,gBAAgB,CAAC,IAAY;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YACjD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACnF;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,gBAAgB,CAAC,IAAY;QAC1C,OAAO,IAAI;aACT,QAAQ,EAAE;aACV,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACrF,CAAC;CACD;AA1BD,iCA0BC"}
|
@@ -1,30 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Dataset utility.
|
3
|
-
*/
|
4
|
-
export default class DatasetUtility {
|
5
|
-
/**
|
6
|
-
* Transforms a kebab cased string to camel case.
|
7
|
-
*
|
8
|
-
* @param text Text string.
|
9
|
-
* @returns Camel cased string.
|
10
|
-
*/
|
11
|
-
public static kebabToCamelCase(text: string): string {
|
12
|
-
const parts = text.split('-');
|
13
|
-
for (let i = 0, max = parts.length; i < max; i++) {
|
14
|
-
parts[i] = i > 0 ? parts[i].charAt(0).toUpperCase() + parts[i].slice(1) : parts[i];
|
15
|
-
}
|
16
|
-
return parts.join('');
|
17
|
-
}
|
18
|
-
|
19
|
-
/**
|
20
|
-
* Transforms a camel cased string to kebab case.
|
21
|
-
*
|
22
|
-
* @param text Text string.
|
23
|
-
* @returns Kebab cased string.
|
24
|
-
*/
|
25
|
-
public static camelCaseToKebab(text: string): string {
|
26
|
-
return text
|
27
|
-
.toString()
|
28
|
-
.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());
|
29
|
-
}
|
30
|
-
}
|