@schukai/monster 3.55.6 → 3.56.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/CHANGELOG.md +14 -0
- package/package.json +2 -2
- package/source/components/datatable/change-button.mjs +265 -0
- package/source/components/datatable/dataset.mjs +76 -5
- package/source/components/datatable/datasource/dom.mjs +1 -1
- package/source/components/datatable/datasource/rest.mjs +401 -345
- package/source/components/datatable/datasource.mjs +8 -0
- package/source/components/datatable/datatable.mjs +600 -600
- package/source/components/datatable/filter/range.mjs +1 -3
- package/source/components/datatable/filter/select.mjs +1 -1
- package/source/components/datatable/filter.mjs +1 -3
- package/source/components/datatable/save-button.mjs +301 -0
- package/source/components/datatable/status.mjs +6 -2
- package/source/components/datatable/style/change-button.pcss +19 -0
- package/source/components/datatable/style/save-button.pcss +44 -0
- package/source/components/datatable/stylesheet/change-button.mjs +27 -0
- package/source/components/datatable/stylesheet/save-button.mjs +27 -0
- package/source/components/datatable/util.mjs +3 -1
- package/source/components/form/button-bar.mjs +3 -3
- package/source/components/form/button.mjs +1 -2
- package/source/components/form/form.mjs +1 -1
- package/source/components/form/message-state-button.mjs +1 -1
- package/source/components/form/select.mjs +1744 -1777
- package/source/components/form/state-button.mjs +1 -1
- package/source/components/form/tabs.mjs +3 -3
- package/source/components/form/tree-select.mjs +6 -2
- package/source/components/host/overlay.mjs +4 -1
- package/source/components/tree-menu/tree-menu.mjs +0 -1
- package/source/data/datasource/server/restapi.mjs +2 -3
- package/source/data/datasource/server.mjs +1 -1
- package/source/data/extend.mjs +55 -55
- package/source/data/pathfinder.mjs +6 -4
- package/source/dom/constants.mjs +9 -0
- package/source/dom/customelement.mjs +25 -7
- package/source/dom/updater.mjs +34 -3
- package/source/i18n/translations.mjs +1 -1
- package/source/monster.mjs +0 -1
- package/source/types/noderecursiveiterator.mjs +2 -3
- package/source/types/version.mjs +1 -1
- package/test/cases/monster.mjs +1 -1
|
@@ -101,7 +101,7 @@ class StateButton extends Button {
|
|
|
101
101
|
*
|
|
102
102
|
* @since 3.18.0 a previously set timeout is cleared
|
|
103
103
|
*
|
|
104
|
-
* @param {
|
|
104
|
+
* @param {string} state
|
|
105
105
|
* @param {number} timeout
|
|
106
106
|
* @return {Monster.Components.Form.StateButton}
|
|
107
107
|
* @throws {TypeError} value is not a string
|
|
@@ -330,7 +330,7 @@ function initPopperSwitch() {
|
|
|
330
330
|
switchButton.setAttribute(ATTRIBUTE_ROLE, "switch");
|
|
331
331
|
switchButton.setAttribute("part", "switch");
|
|
332
332
|
switchButton.classList.add("hidden");
|
|
333
|
-
|
|
333
|
+
const classList = this.getOption("classes.button");
|
|
334
334
|
if (classList) {
|
|
335
335
|
switchButton.classList.add(classList);
|
|
336
336
|
}
|
|
@@ -510,7 +510,7 @@ function initPopper() {
|
|
|
510
510
|
* @private
|
|
511
511
|
* @param {HTMLElement} element
|
|
512
512
|
*/
|
|
513
|
-
function show(element) {
|
|
513
|
+
function show(element) {
|
|
514
514
|
if (!this.shadowRoot) {
|
|
515
515
|
throw new Error("no shadow-root is defined");
|
|
516
516
|
}
|
|
@@ -593,7 +593,7 @@ function show(element) {;
|
|
|
593
593
|
/**
|
|
594
594
|
* @private
|
|
595
595
|
*/
|
|
596
|
-
function initEventHandler() {
|
|
596
|
+
function initEventHandler() {
|
|
597
597
|
|
|
598
598
|
if (!this.shadowRoot) {
|
|
599
599
|
throw new Error("no shadow-root is defined");
|
|
@@ -16,7 +16,11 @@ import {
|
|
|
16
16
|
assembleMethodSymbol,
|
|
17
17
|
registerCustomElement,
|
|
18
18
|
} from "../../dom/customelement.mjs";
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
findTargetElementFromEvent,
|
|
21
|
+
fireCustomEvent,
|
|
22
|
+
fireEvent,
|
|
23
|
+
} from "../../dom/events.mjs";
|
|
20
24
|
import { Formatter } from "../../text/formatter.mjs";
|
|
21
25
|
import { isString } from "../../types/is.mjs";
|
|
22
26
|
import { Node } from "../../types/node.mjs";
|
|
@@ -204,7 +208,7 @@ class TreeSelect extends Select {
|
|
|
204
208
|
fireCustomEvent(this, "monster-options-set", {
|
|
205
209
|
options,
|
|
206
210
|
});
|
|
207
|
-
|
|
211
|
+
|
|
208
212
|
return this;
|
|
209
213
|
}
|
|
210
214
|
|
|
@@ -127,6 +127,7 @@ class Overlay extends CustomElement {
|
|
|
127
127
|
* @property {string} classes.overlay Css class to hide the overlay. This class is removed when the component is ready.
|
|
128
128
|
* @property {Object} features Feature definitions
|
|
129
129
|
* @property {boolean} features.escapeKey If true the overlay can be closed with the escape key
|
|
130
|
+
* @property {boolean} features.openButton If true the overlay can be opened with a button
|
|
130
131
|
*/
|
|
131
132
|
get defaults() {
|
|
132
133
|
return Object.assign({}, super.defaults, {
|
|
@@ -146,6 +147,7 @@ class Overlay extends CustomElement {
|
|
|
146
147
|
},
|
|
147
148
|
features: {
|
|
148
149
|
escapeKey: true,
|
|
150
|
+
openButton: true,
|
|
149
151
|
},
|
|
150
152
|
});
|
|
151
153
|
}
|
|
@@ -326,7 +328,8 @@ function getTemplate() {
|
|
|
326
328
|
data-monster-attributes="part path:host-overlay.name, data-monster-role path:host-container.overlay"></div>
|
|
327
329
|
</template>
|
|
328
330
|
|
|
329
|
-
<div data-monster-role="overlay-open" part="open"
|
|
331
|
+
<div data-monster-role="overlay-open" part="open"
|
|
332
|
+
data-monster-attributes="class path:features.openButton | if:visible:hidden"></div>
|
|
330
333
|
|
|
331
334
|
<div id="overlay" data-monster-role="overlay" part="overlay" data-monster-insert="host-overlay path:overlay"
|
|
332
335
|
data-monster-attributes="class path:classes.overlay">
|
|
@@ -88,7 +88,7 @@ class RestAPI extends Server {
|
|
|
88
88
|
},
|
|
89
89
|
responseCallback: undefined,
|
|
90
90
|
acceptedStatus: [200, 201],
|
|
91
|
-
url:
|
|
91
|
+
url: null,
|
|
92
92
|
mapping: {
|
|
93
93
|
transformer: undefined,
|
|
94
94
|
callbacks: [],
|
|
@@ -107,7 +107,7 @@ class RestAPI extends Server {
|
|
|
107
107
|
},
|
|
108
108
|
responseCallback: undefined,
|
|
109
109
|
acceptedStatus: [200],
|
|
110
|
-
url:
|
|
110
|
+
url: null,
|
|
111
111
|
mapping: {
|
|
112
112
|
transformer: undefined,
|
|
113
113
|
callbacks: [],
|
|
@@ -123,7 +123,6 @@ class RestAPI extends Server {
|
|
|
123
123
|
* @throws {Error} the data cannot be read
|
|
124
124
|
*/
|
|
125
125
|
read() {
|
|
126
|
-
|
|
127
126
|
let init = this.getOption("read.init");
|
|
128
127
|
if (!isObject(init)) init = {};
|
|
129
128
|
if (!init["method"]) init["method"] = "GET";
|
|
@@ -81,7 +81,7 @@ class Server extends Datasource {
|
|
|
81
81
|
*/
|
|
82
82
|
function doTransform(type, obj) {
|
|
83
83
|
const transformation = this.getOption(`${type}.mapping.transformer`);
|
|
84
|
-
if (transformation !== undefined) {
|
|
84
|
+
if (transformation !== undefined && transformation !== null) {
|
|
85
85
|
const pipe = new Pipe(transformation);
|
|
86
86
|
const callbacks = this.getOption(`${type}.mapping.callbacks`);
|
|
87
87
|
|
package/source/data/extend.mjs
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {isArray, isObject} from "../types/is.mjs";
|
|
9
|
-
import {typeOf} from "../types/typeof.mjs";
|
|
8
|
+
import { isArray, isObject } from "../types/is.mjs";
|
|
9
|
+
import { typeOf } from "../types/typeof.mjs";
|
|
10
10
|
|
|
11
|
-
export {extend};
|
|
11
|
+
export { extend };
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Extend copies all enumerable own properties from one or
|
|
@@ -25,65 +25,65 @@ export {extend};
|
|
|
25
25
|
* @param args
|
|
26
26
|
*/
|
|
27
27
|
function extend(...args) {
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
let o;
|
|
29
|
+
let i;
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
if (typeof args !== "object" || args[0] === null) {
|
|
32
|
+
throw new Error(`unsupported argument ${JSON.stringify(args[0])}`);
|
|
33
|
+
}
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
for (i = 0; i < args.length; i++) {
|
|
36
|
+
const a = args[i];
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
if (!(isObject(a) || isArray(a))) {
|
|
39
|
+
throw new Error(`unsupported argument ${JSON.stringify(a)}`);
|
|
40
|
+
}
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
if (o === undefined) {
|
|
43
|
+
o = a;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
for (const k in a) {
|
|
48
|
+
const v = a?.[k];
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
if (v === o?.[k]) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (isArray(o[k])) {
|
|
72
|
-
o[k] = [];
|
|
73
|
-
o[k].push(...v);
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
54
|
+
if ((isObject(v) && typeOf(v) === "object") || isArray(v)) {
|
|
55
|
+
if (o[k] === undefined) {
|
|
56
|
+
if (isArray(v)) {
|
|
57
|
+
o[k] = [];
|
|
58
|
+
} else {
|
|
59
|
+
o[k] = {};
|
|
60
|
+
}
|
|
61
|
+
} else {
|
|
62
|
+
if (typeOf(o[k]) !== typeOf(v)) {
|
|
63
|
+
throw new Error(
|
|
64
|
+
`type mismatch: ${JSON.stringify(o[k])}(${typeOf(
|
|
65
|
+
o[k],
|
|
66
|
+
)}) != ${JSON.stringify(v)}(${typeOf(v)})`,
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
76
70
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
o[k] = v;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
71
|
+
if (isArray(o[k])) {
|
|
72
|
+
o[k] = [];
|
|
73
|
+
o[k].push(...v);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
87
76
|
|
|
88
|
-
|
|
77
|
+
o[k] = extend(o[k], v);
|
|
78
|
+
} else {
|
|
79
|
+
if (isArray(o)) {
|
|
80
|
+
o.push(v);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
o[k] = v;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return o;
|
|
89
89
|
}
|
|
@@ -83,10 +83,12 @@ const WILDCARD = "*";
|
|
|
83
83
|
*/
|
|
84
84
|
class Pathfinder extends Base {
|
|
85
85
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* @
|
|
89
|
-
|
|
86
|
+
* Creates a new instance of the constructor.
|
|
87
|
+
*
|
|
88
|
+
* @param {object} object - The object parameter for the constructor.
|
|
89
|
+
*
|
|
90
|
+
* @throws {Error} Throws an error if the provided object parameter is a simple type.
|
|
91
|
+
*/
|
|
90
92
|
constructor(object) {
|
|
91
93
|
super();
|
|
92
94
|
|
package/source/dom/constants.mjs
CHANGED
|
@@ -19,6 +19,7 @@ export {
|
|
|
19
19
|
ATTRIBUTE_UPDATER_INSERT_REFERENCE,
|
|
20
20
|
ATTRIBUTE_UPDATER_REMOVE,
|
|
21
21
|
ATTRIBUTE_UPDATER_BIND,
|
|
22
|
+
ATTRIBUTE_UPDATER_BIND_TYPE,
|
|
22
23
|
ATTRIBUTE_TEMPLATE_PREFIX,
|
|
23
24
|
ATTRIBUTE_ROLE,
|
|
24
25
|
ATTRIBUTE_DISABLED,
|
|
@@ -199,6 +200,14 @@ const ATTRIBUTE_UPDATER_REMOVE = `${ATTRIBUTE_PREFIX}remove`;
|
|
|
199
200
|
*/
|
|
200
201
|
const ATTRIBUTE_UPDATER_BIND = `${ATTRIBUTE_PREFIX}bind`;
|
|
201
202
|
|
|
203
|
+
/**
|
|
204
|
+
* @memberOf Monster.DOM
|
|
205
|
+
* @type {string}
|
|
206
|
+
* @license AGPLv3
|
|
207
|
+
* @since 1.9.0
|
|
208
|
+
*/
|
|
209
|
+
const ATTRIBUTE_UPDATER_BIND_TYPE = `${ATTRIBUTE_UPDATER_BIND}-type`;
|
|
210
|
+
|
|
202
211
|
/**
|
|
203
212
|
* @memberOf Monster.DOM
|
|
204
213
|
* @type {string}
|
|
@@ -95,6 +95,12 @@ const attributeMutationObserverSymbol = Symbol(
|
|
|
95
95
|
"@schukai/monster/dom/@@mutationObserver",
|
|
96
96
|
);
|
|
97
97
|
|
|
98
|
+
/**
|
|
99
|
+
* @private
|
|
100
|
+
* @type {symbol}
|
|
101
|
+
*/
|
|
102
|
+
const updateCloneDataSymbol = Symbol("@schukai/monster/dom/@@updateCloneData");
|
|
103
|
+
|
|
98
104
|
/**
|
|
99
105
|
* @private
|
|
100
106
|
* @type {symbol}
|
|
@@ -465,7 +471,7 @@ class CustomElement extends HTMLElement {
|
|
|
465
471
|
* @return {*}
|
|
466
472
|
* @since 1.10.0
|
|
467
473
|
*/
|
|
468
|
-
getOption(path, defaultValue=undefined) {
|
|
474
|
+
getOption(path, defaultValue = undefined) {
|
|
469
475
|
let value;
|
|
470
476
|
|
|
471
477
|
try {
|
|
@@ -503,13 +509,10 @@ class CustomElement extends HTMLElement {
|
|
|
503
509
|
if (isString(options)) {
|
|
504
510
|
options = parseOptionsJSON.call(this, options);
|
|
505
511
|
}
|
|
506
|
-
// 2024-01-21: remove this.defaults, otherwise it will overwrite
|
|
512
|
+
// 2024-01-21: remove this.defaults, otherwise it will overwrite
|
|
507
513
|
// the current settings that have already been made.
|
|
508
514
|
// https://gitlab.schukai.com/oss/libraries/javascript/monster/-/issues/136
|
|
509
|
-
extend(
|
|
510
|
-
this[internalSymbol].getSubject()["options"],
|
|
511
|
-
options,
|
|
512
|
-
);
|
|
515
|
+
extend(this[internalSymbol].getSubject()["options"], options);
|
|
513
516
|
|
|
514
517
|
return this;
|
|
515
518
|
}
|
|
@@ -583,11 +586,16 @@ class CustomElement extends HTMLElement {
|
|
|
583
586
|
} catch (e) {
|
|
584
587
|
nodeList = elements;
|
|
585
588
|
}
|
|
589
|
+
|
|
590
|
+
this[updateCloneDataSymbol] = clone(
|
|
591
|
+
this[internalSymbol].getRealSubject()["options"],
|
|
592
|
+
);
|
|
593
|
+
|
|
586
594
|
addObjectWithUpdaterToElement.call(
|
|
587
595
|
this,
|
|
588
596
|
nodeList,
|
|
589
597
|
customElementUpdaterLinkSymbol,
|
|
590
|
-
|
|
598
|
+
this[updateCloneDataSymbol],
|
|
591
599
|
);
|
|
592
600
|
|
|
593
601
|
// Attach a mutation observer to observe changes to the attributes of the element
|
|
@@ -596,6 +604,16 @@ class CustomElement extends HTMLElement {
|
|
|
596
604
|
return this;
|
|
597
605
|
}
|
|
598
606
|
|
|
607
|
+
/**
|
|
608
|
+
* You know what you are doing? This function is only for advanced users.
|
|
609
|
+
* The result is a clone of the internal data.
|
|
610
|
+
*
|
|
611
|
+
* @returns {*}
|
|
612
|
+
*/
|
|
613
|
+
getInternalUpdateCloneData() {
|
|
614
|
+
return clone(this[updateCloneDataSymbol]);
|
|
615
|
+
}
|
|
616
|
+
|
|
599
617
|
/**
|
|
600
618
|
* This method is called every time the element is inserted into the DOM. It checks if the custom element
|
|
601
619
|
* has already been initialized and if not, calls the assembleMethod to initialize it.
|
package/source/dom/updater.mjs
CHANGED
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
ATTRIBUTE_ERRORMESSAGE,
|
|
14
14
|
ATTRIBUTE_UPDATER_ATTRIBUTES,
|
|
15
15
|
ATTRIBUTE_UPDATER_BIND,
|
|
16
|
+
ATTRIBUTE_UPDATER_BIND_TYPE,
|
|
16
17
|
ATTRIBUTE_UPDATER_INSERT,
|
|
17
18
|
ATTRIBUTE_UPDATER_INSERT_REFERENCE,
|
|
18
19
|
ATTRIBUTE_UPDATER_REMOVE,
|
|
@@ -21,7 +22,7 @@ import {
|
|
|
21
22
|
} from "./constants.mjs";
|
|
22
23
|
|
|
23
24
|
import { Base } from "../types/base.mjs";
|
|
24
|
-
import { isArray, isInstance, isIterable } from "../types/is.mjs";
|
|
25
|
+
import { isArray, isString, isInstance, isIterable } from "../types/is.mjs";
|
|
25
26
|
import { Observer } from "../types/observer.mjs";
|
|
26
27
|
import { ProxyObserver } from "../types/proxyobserver.mjs";
|
|
27
28
|
import { validateArray, validateInstance } from "../types/validate.mjs";
|
|
@@ -311,7 +312,7 @@ function retrieveAndSetValue(element) {
|
|
|
311
312
|
throw new Error("the bind argument must start as a value with a path");
|
|
312
313
|
}
|
|
313
314
|
|
|
314
|
-
path = path.substring(5);
|
|
315
|
+
path = path.substring(5); // remove path: from the string
|
|
315
316
|
|
|
316
317
|
let value;
|
|
317
318
|
|
|
@@ -342,7 +343,7 @@ function retrieveAndSetValue(element) {
|
|
|
342
343
|
break;
|
|
343
344
|
}
|
|
344
345
|
|
|
345
|
-
// values from
|
|
346
|
+
// values from custom elements
|
|
346
347
|
} else if (
|
|
347
348
|
(element?.constructor?.prototype &&
|
|
348
349
|
!!Object.getOwnPropertyDescriptor(
|
|
@@ -356,6 +357,36 @@ function retrieveAndSetValue(element) {
|
|
|
356
357
|
throw new Error("unsupported object");
|
|
357
358
|
}
|
|
358
359
|
|
|
360
|
+
if (isString(value)) {
|
|
361
|
+
const type = element.getAttribute(ATTRIBUTE_UPDATER_BIND_TYPE);
|
|
362
|
+
switch (type) {
|
|
363
|
+
case "number":
|
|
364
|
+
case "int":
|
|
365
|
+
case "float":
|
|
366
|
+
case "integer":
|
|
367
|
+
value = Number(value);
|
|
368
|
+
if (isNaN(value)) {
|
|
369
|
+
value = 0;
|
|
370
|
+
}
|
|
371
|
+
break;
|
|
372
|
+
case "boolean":
|
|
373
|
+
case "bool":
|
|
374
|
+
case "checkbox":
|
|
375
|
+
value = value === "true" || value === "1" || value === "on";
|
|
376
|
+
break;
|
|
377
|
+
case "array":
|
|
378
|
+
case "list":
|
|
379
|
+
value = value.split(",");
|
|
380
|
+
break;
|
|
381
|
+
case "object":
|
|
382
|
+
case "json":
|
|
383
|
+
value = JSON.parse(value);
|
|
384
|
+
break;
|
|
385
|
+
default:
|
|
386
|
+
break;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
359
390
|
const copy = clone(this[internalSymbol].subject.getRealSubject());
|
|
360
391
|
const pf = new Pathfinder(copy);
|
|
361
392
|
pf.setVia(path, value);
|
|
@@ -90,7 +90,7 @@ class Translations extends Base {
|
|
|
90
90
|
* The appropriate text for this number is then selected. If no suitable key is found, `defaultText` is taken.
|
|
91
91
|
*
|
|
92
92
|
* @param {string} key
|
|
93
|
-
* @param {integer|
|
|
93
|
+
* @param {integer|string} count
|
|
94
94
|
* @param {string|undefined} defaultText
|
|
95
95
|
* @return {string}
|
|
96
96
|
*/
|
package/source/monster.mjs
CHANGED
|
@@ -44,10 +44,10 @@ class NodeRecursiveIterator extends Base {
|
|
|
44
44
|
// iterator is a NodeList
|
|
45
45
|
if (isInstance(node, NodeList)) {
|
|
46
46
|
const children = node;
|
|
47
|
-
|
|
47
|
+
const n = new Node();
|
|
48
48
|
n.childNodes = children;
|
|
49
49
|
this[isNodeListSymbol] = true;
|
|
50
|
-
this[internalSymbol]
|
|
50
|
+
this[internalSymbol] = n;
|
|
51
51
|
return;
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -80,7 +80,6 @@ class NodeRecursiveIterator extends Base {
|
|
|
80
80
|
yield* new NodeRecursiveIterator(node);
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
-
|
|
84
83
|
};
|
|
85
84
|
|
|
86
85
|
/**
|
package/source/types/version.mjs
CHANGED
package/test/cases/monster.mjs
CHANGED