@schukai/monster 3.48.0 → 3.50.0

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schukai/monster",
3
- "version": "3.48.0",
3
+ "version": "3.50.0",
4
4
  "description": "Monster is a simple library for creating fast, robust and lightweight websites.",
5
5
  "keywords": [
6
6
  "framework",
@@ -27,7 +27,7 @@ class DataFetchError extends Error {
27
27
  constructor(message, response) {
28
28
  super(message);
29
29
  this[internalSymbol] = {
30
- response: response
30
+ response: response,
31
31
  };
32
32
  }
33
33
 
@@ -46,5 +46,4 @@ class DataFetchError extends Error {
46
46
  getResponse() {
47
47
  return this[internalSymbol]["response"];
48
48
  }
49
-
50
49
  }
@@ -5,13 +5,13 @@
5
5
  * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
6
  */
7
7
 
8
- import {internalSymbol, instanceSymbol} from "../../../constants.mjs";
9
- import {isObject, isFunction} from "../../../types/is.mjs";
10
- import {Server} from "../server.mjs";
11
- import {WriteError} from "./restapi/writeerror.mjs";
12
- import {DataFetchError} from "./restapi/data-fetch-error.mjs";
8
+ import { internalSymbol, instanceSymbol } from "../../../constants.mjs";
9
+ import { isObject, isFunction } from "../../../types/is.mjs";
10
+ import { Server } from "../server.mjs";
11
+ import { WriteError } from "./restapi/writeerror.mjs";
12
+ import { DataFetchError } from "./restapi/data-fetch-error.mjs";
13
13
 
14
- export {RestAPI};
14
+ export { RestAPI };
15
15
 
16
16
  /**
17
17
  * @type {symbol}
@@ -189,7 +189,10 @@ function fetchData(init, key, callback) {
189
189
  const acceptedStatus = self.getOption(`${key}.acceptedStatus`, [200]);
190
190
 
191
191
  if (acceptedStatus.indexOf(resp.status) === -1) {
192
- throw new DataFetchError(`the response does not contain a accepted status (actual: ${resp.status}).`, response);
192
+ throw new DataFetchError(
193
+ `the response does not contain a accepted status (actual: ${resp.status}).`,
194
+ response,
195
+ );
193
196
  }
194
197
 
195
198
  return resp.text();
@@ -673,6 +673,24 @@ function transform(value) {
673
673
  throw new Error(`unsupported locale or missing format (${e.message})`);
674
674
  }
675
675
 
676
+ case "datetimeformat":
677
+ date = new Date(value);
678
+ if (isNaN(date.getTime())) {
679
+ throw new Error("invalid date");
680
+ }
681
+
682
+ const options = {
683
+ dateStyle: args.shift() || "medium",
684
+ timeStyle: args.shift() || "medium",
685
+ };
686
+
687
+ try {
688
+ locale = getLocaleOfDocument();
689
+ return new Intl.DateTimeFormat(locale, options).format(date);
690
+ } catch (e) {
691
+ throw new Error(`unsupported locale or missing format (${e.message})`);
692
+ }
693
+
676
694
  case "datetime":
677
695
  date = new Date(value);
678
696
  if (isNaN(date.getTime())) {
@@ -61,7 +61,7 @@ export {
61
61
  customElementUpdaterLinkSymbol,
62
62
  initControlCallbackName,
63
63
  ATTRIBUTE_SCRIPT_HOST,
64
- ATTRIBUTE_OPTION_CALLBACK
64
+ ATTRIBUTE_INIT_CALLBACK,
65
65
  };
66
66
 
67
67
  /**
@@ -117,7 +117,7 @@ const ATTRIBUTE_OPTIONS_SELECTOR = `${ATTRIBUTE_PREFIX}options-selector`;
117
117
  * @since 3.48.0
118
118
  * @type {string}
119
119
  */
120
- const ATTRIBUTE_OPTION_CALLBACK = `${ATTRIBUTE_PREFIX}option-callback`;
120
+ const ATTRIBUTE_INIT_CALLBACK = `${ATTRIBUTE_PREFIX}init-callback`;
121
121
 
122
122
  /**
123
123
  * This is the name of the callback to pass the callback to a control
@@ -5,12 +5,13 @@
5
5
  * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
6
  */
7
7
 
8
- import {extend} from "../data/extend.mjs";
9
- import {ATTRIBUTE_VALUE} from "./constants.mjs";
10
- import {CustomElement, attributeObserverSymbol} from "./customelement.mjs";
11
- import {instanceSymbol} from "../constants.mjs";
8
+ import { extend } from "../data/extend.mjs";
9
+ import { addAttributeToken } from "./attributes.mjs";
10
+ import { ATTRIBUTE_ERRORMESSAGE } from "./constants.mjs";
11
+ import { CustomElement, attributeObserverSymbol } from "./customelement.mjs";
12
+ import { instanceSymbol } from "../constants.mjs";
12
13
 
13
- export {CustomControl};
14
+ export { CustomControl };
14
15
 
15
16
  /**
16
17
  * @private
@@ -19,54 +20,61 @@ export {CustomControl};
19
20
  const attachedInternalSymbol = Symbol("attachedInternal");
20
21
 
21
22
  /**
22
- * To define a new HTML control we need the power of CustomElement
23
+ * This is a base class for creating custom controls using the power of CustomElement.
23
24
  *
24
- * IMPORTANT: after defining a `CustomElement`, the `registerCustomElement` method must be called
25
- * with the new class name. only then will the tag defined via the `getTag` method be made known to the DOM.
25
+ * After defining a `CustomElement`, the `registerCustomElement` method must be called with the new class name. Only then
26
+ * will the tag defined via the `getTag` method be made known to the DOM.
26
27
  *
27
28
  * <img src="./images/customcontrol-class.png">
28
29
  *
29
- * This control uses `attachInternals()` to integrate the control into a form.
30
- * If the target environment does not support this method, the [polyfill](https://www.npmjs.com/package/element-internals-polyfill ) can be used.
30
+ * This control uses `attachInternals()` to integrate the control into a form. If the target environment does not support
31
+ * this method, the [polyfill](https://www.npmjs.com/package/element-internals-polyfill) can be used.
31
32
  *
32
- * You can create the object via the function `document.createElement()`.
33
+ * You can create the object using the function `document.createElement()`.
33
34
  *
34
- * @startuml customcontrol-class.png
35
- * skinparam monochrome true
36
- * skinparam shadowing false
37
- * HTMLElement <|-- CustomElement
38
- * CustomElement <|-- CustomControl
39
- * @enduml
35
+ * This control uses `attachInternals()` to integrate the control into a form. If the target environment does not support
36
+ * this method, the Polyfill for attachInternals() can be used: {@link https://www.npmjs.com/package/element-internals-polyfill|element-internals-polyfill}.
40
37
  *
41
- * @summary A base class for customcontrols based on CustomElement
42
- * @see {@link https://www.npmjs.com/package/element-internals-polyfill}
43
- * @see {@link https://github.com/WICG/webcomponents}
44
- * @see {@link https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements}
45
- * @see {@link https://html.spec.whatwg.org/dev/custom-elements.html#custom-element-reactions}
38
+ * Learn more about WICG Web Components: {@link https://github.com/WICG/webcomponents|WICG Web Components}.
39
+ *
40
+ * Read the HTML specification for Custom Elements: {@link https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements|Custom Elements}.
41
+ *
42
+ * Read the HTML specification for Custom Element Reactions: {@link https://html.spec.whatwg.org/dev/custom-elements.html#custom-element-reactions|Custom Element Reactions}.
43
+ *
44
+ * @summary A base class for custom controls based on CustomElement.
45
+ * @copyright schukai GmbH
46
46
  * @license AGPLv3
47
47
  * @since 1.14.0
48
- * @copyright schukai GmbH
49
48
  * @memberOf Monster.DOM
49
+ * @extends Monster.DOM.CustomElement
50
50
  */
51
51
  class CustomControl extends CustomElement {
52
52
  /**
53
- * IMPORTANT: CustomControls instances are not created via the constructor, but either via a tag in the HTML or via <code>document.createElement()</code>.
53
+ * The constructor method of CustomControl, which is called when creating a new instance.
54
+ * It checks whether the element supports `attachInternals()` and initializes an internal form-associated element
55
+ * if supported. Additionally, it initializes a MutationObserver to watch for attribute changes.
54
56
  *
57
+ * See the links below for more information:
58
+ * {@link https://html.spec.whatwg.org/multipage/custom-elements.html#dom-customelementregistry-define|CustomElementRegistry.define()}
59
+ * {@link https://html.spec.whatwg.org/multipage/custom-elements.html#dom-customelementregistry-get|CustomElementRegistry.get()}
60
+ * and {@link https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals|ElementInternals}
61
+ *
62
+ * @inheritdoc
55
63
  * @throws {Error} the ElementInternals is not supported and a polyfill is necessary
56
- * @summary create new Instance
64
+ * @since 1.7.0
57
65
  */
58
66
  constructor() {
59
67
  super();
60
68
 
69
+ // check if element supports `attachInternals()`
61
70
  if (typeof this["attachInternals"] === "function") {
62
- /**
63
- * currently only supported by chrome
64
- * @property {Object}
65
- * @private
66
- */
67
71
  this[attachedInternalSymbol] = this.attachInternals();
72
+ } else {
73
+ // `attachInternals()` is not supported, so a polyfill is necessary
74
+ throw Error("the ElementInternals is not supported and a polyfill is necessary");
68
75
  }
69
76
 
77
+ // initialize a MutationObserver to watch for attribute changes
70
78
  initObserver.call(this);
71
79
  }
72
80
 
@@ -90,40 +98,27 @@ class CustomControl extends CustomElement {
90
98
  }
91
99
 
92
100
  /**
93
- * Adding a static formAssociated property, with a true value, makes an autonomous custom element a form-associated custom element.
101
+ * Adding a static `formAssociated` property, with a true value, makes an autonomous custom element a form-associated custom element.
94
102
  *
95
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/attachInternals}
96
- * @see {@link https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements-face-example}
103
+ * @see [attachInternals()]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/attachInternals}
104
+ * @see [Custom Elements Face Example]{@link https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements-face-example}
97
105
  * @since 1.14.0
98
106
  * @return {boolean}
99
107
  */
100
- static formAssociated = true
108
+ static formAssociated = true;
101
109
 
102
110
  /**
103
- * Derived classes can override and extend this method as follows.
104
- *
105
- * ```
106
- * get defaults() {
107
- * return extends{}, super.defaults, {
108
- * myValue:true
109
- * });
110
- * }
111
- * ```
112
- *
113
- * @see {@link https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements-face-example}
114
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/attachInternals}
115
- * @return {object}
111
+ * @inheritdoc
116
112
  * @since 1.14.0
117
- */
113
+ **/
118
114
  get defaults() {
119
- return extend({
120
- }, super.defaults);
115
+ return extend({}, super.defaults);
121
116
  }
122
117
 
123
118
  /**
124
119
  * Must be overridden by a derived class and return the value of the control.
125
120
  *
126
- * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals)
121
+ * This is a method of [internal API](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals), which is a part of the web standard for custom elements.
127
122
  *
128
123
  * @since 1.14.0
129
124
  * @throws {Error} the value getter must be overwritten by the derived class
@@ -133,11 +128,11 @@ class CustomControl extends CustomElement {
133
128
  }
134
129
 
135
130
  /**
136
- * Must be overridden by a derived class and return the value of the control.
131
+ * Must be overridden by a derived class and set the value of the control.
137
132
  *
138
- * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals)
133
+ * This is a method of [internal API](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals), which is a part of the web standard for custom elements.
139
134
  *
140
- * @param {*} value
135
+ * @param {*} value The value to set.
141
136
  * @since 1.14.0
142
137
  * @throws {Error} the value setter must be overwritten by the derived class
143
138
  */
@@ -180,8 +175,8 @@ class CustomControl extends CustomElement {
180
175
  *
181
176
  * @return {ValidityState}
182
177
  * @throws {Error} the ElementInternals is not supported and a polyfill is necessary
183
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/ValidityState}
184
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/validity}
178
+ * @see [ValidityState]{@link https://developer.mozilla.org/en-US/docs/Web/API/ValidityState}
179
+ * @see [validity]{@link https://developer.mozilla.org/en-US/docs/Web/API/validity}
185
180
  */
186
181
  get validity() {
187
182
  return getInternal.call(this)?.validity;
@@ -214,7 +209,7 @@ class CustomControl extends CustomElement {
214
209
  /**
215
210
  * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals)
216
211
  *
217
- * @return {CustomStateSet}
212
+ * @return {boolean}
218
213
  * @since 1.14.0
219
214
  * @see https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals/states
220
215
  * @throws {Error} the ElementInternals is not supported and a polyfill is necessary
@@ -301,12 +296,15 @@ class CustomControl extends CustomElement {
301
296
  }
302
297
 
303
298
  /**
304
- * @param {string} form
299
+ * Sets the `form` attribute of the custom control to the `id` of the passed form element.
300
+ * If no form element is passed, removes the `form` attribute.
301
+ *
302
+ * @param {HTMLFormElement} form - The form element to associate with the control
305
303
  */
306
304
  formAssociatedCallback(form) {
307
305
  if (form) {
308
- if(form.id) {
309
- this.setAttribute("form", form.id);
306
+ if (form.id) {
307
+ this.setAttribute("form", form.id);
310
308
  }
311
309
  } else {
312
310
  this.removeAttribute("form");
@@ -314,7 +312,9 @@ class CustomControl extends CustomElement {
314
312
  }
315
313
 
316
314
  /**
317
- * @param {string} disabled
315
+ * Sets or removes the `disabled` attribute of the custom control based on the passed value.
316
+ *
317
+ * @param {boolean} disabled - Whether or not the control should be disabled
318
318
  */
319
319
  formDisabledCallback(disabled) {
320
320
  if (disabled) {
@@ -328,17 +328,14 @@ class CustomControl extends CustomElement {
328
328
  * @param {string} state
329
329
  * @param {string} mode
330
330
  */
331
- formStateRestoreCallback(state, mode) {
332
-
333
- }
331
+ formStateRestoreCallback(state, mode) {}
334
332
 
335
333
  /**
336
334
  *
337
335
  */
338
336
  formResetCallback() {
339
- this.value = "";
337
+ this.value = "";
340
338
  }
341
-
342
339
  }
343
340
 
344
341
  /**