@schukai/monster 2.0.16 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/source/constants.mjs +10 -3
  4. package/source/constraints/abstract.mjs +11 -0
  5. package/source/constraints/abstractoperator.mjs +11 -1
  6. package/source/constraints/andoperator.mjs +11 -1
  7. package/source/constraints/invalid.mjs +11 -1
  8. package/source/constraints/isarray.mjs +11 -1
  9. package/source/constraints/isobject.mjs +11 -1
  10. package/source/constraints/oroperator.mjs +11 -1
  11. package/source/constraints/valid.mjs +11 -1
  12. package/source/data/datasource/restapi/writeerror.mjs +10 -1
  13. package/source/data/datasource/restapi.mjs +10 -1
  14. package/source/data/datasource/storage/localstorage.mjs +10 -1
  15. package/source/data/datasource/storage/sessionstorage.mjs +10 -1
  16. package/source/data/datasource/storage.mjs +11 -2
  17. package/source/data/datasource.mjs +12 -2
  18. package/source/dom/constants.mjs +1 -1
  19. package/source/dom/customcontrol.mjs +11 -1
  20. package/source/dom/customelement.mjs +14 -3
  21. package/source/dom/focusmanager.mjs +11 -1
  22. package/source/dom/resource/data.mjs +11 -1
  23. package/source/dom/resource/link/stylesheet.mjs +11 -1
  24. package/source/dom/resource/link.mjs +11 -1
  25. package/source/dom/resource/script.mjs +10 -1
  26. package/source/dom/resource.mjs +8 -0
  27. package/source/dom/template.mjs +11 -1
  28. package/source/dom/theme.mjs +11 -1
  29. package/source/text/formatter.mjs +0 -1
  30. package/source/types/base.mjs +100 -0
  31. package/source/types/dataurl.mjs +11 -1
  32. package/source/types/mediatype.mjs +11 -1
  33. package/source/types/node.mjs +11 -0
  34. package/source/types/nodelist.mjs +11 -1
  35. package/source/types/observer.mjs +11 -1
  36. package/source/types/proxyobserver.mjs +11 -1
  37. package/source/types/queue.mjs +11 -1
  38. package/source/types/stack.mjs +10 -1
  39. package/source/types/version.mjs +14 -2
  40. package/test/cases/constraint/abstractoperator.mjs +38 -0
  41. package/test/cases/dom/customelement.mjs +1 -1
  42. package/test/cases/dom/resource.mjs +48 -0
  43. package/test/cases/monster.mjs +1 -1
  44. package/test/cases/types/base.mjs +42 -0
  45. package/test/web/mocha.js +10976 -20806
  46. package/test/web/test.html +3 -3
  47. package/test/web/tests.js +68 -12
@@ -10,7 +10,7 @@ import {getGlobalFunction, getGlobalObject} from '../types/global.mjs';
10
10
  import {validateInstance, validateString} from "../types/validate.mjs";
11
11
  import {ATTRIBUTE_TEMPLATE_PREFIX} from "./constants.mjs";
12
12
  import {getDocumentTheme} from "./theme.mjs";
13
-
13
+ import {instanceSymbol} from '../constants.mjs';
14
14
  export {Template}
15
15
 
16
16
  /**
@@ -37,6 +37,16 @@ class Template extends Base {
37
37
  this.template = template;
38
38
  }
39
39
 
40
+ /**
41
+ * This method is called by the `instanceof` operator.
42
+ * @returns {symbol}
43
+ * @since 2.1.0
44
+ */
45
+ static get [instanceSymbol]() {
46
+ return Symbol.for("@schukai/monster/dom/resource/template");
47
+ }
48
+
49
+
40
50
  /**
41
51
  *
42
52
  * @returns {HTMLTemplateElement}
@@ -9,7 +9,7 @@ import {Base} from '../types/base.mjs';
9
9
  import {getGlobalObject} from '../types/global.mjs';
10
10
  import {validateString} from "../types/validate.mjs";
11
11
  import {ATTRIBUTE_THEME_NAME, DEFAULT_THEME} from "./constants.mjs";
12
-
12
+ import {instanceSymbol} from '../constants.mjs';
13
13
  export {Theme, getDocumentTheme}
14
14
 
15
15
  /**
@@ -35,6 +35,16 @@ class Theme extends Base {
35
35
  this.name = name;
36
36
  }
37
37
 
38
+ /**
39
+ * This method is called by the `instanceof` operator.
40
+ * @returns {symbol}
41
+ * @since 2.1.0
42
+ */
43
+ static get [instanceSymbol]() {
44
+ return Symbol.for("@schukai/monster/dom/theme");
45
+ }
46
+
47
+
38
48
  /**
39
49
  *
40
50
  * @returns {string}
@@ -12,7 +12,6 @@ import {Pipe} from "../data/pipe.mjs";
12
12
  import {BaseWithOptions} from "../types/basewithoptions.mjs";
13
13
  import {isObject, isString} from "../types/is.mjs";
14
14
  import {validateArray, validateString} from "../types/validate.mjs";
15
- import {getMonsterVersion} from "../types/version.mjs";
16
15
 
17
16
  export {Formatter}
18
17
 
@@ -5,10 +5,29 @@
5
5
  * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
6
  */
7
7
 
8
+ import {instanceSymbol} from "../constants.mjs";
9
+
8
10
  export {Base}
9
11
 
12
+
10
13
  /**
11
14
  * This is the base class from which all monster classes are derived.
15
+ *
16
+ * This class has besides a `toString` which returns the json representation of the object
17
+ * also a functionality to check if an object is an instance of a class.
18
+ *
19
+ * Therefor the class has a static method ` [Symbol.hasInstance](that)` which returns true if the object
20
+ * is an instance of the class.
21
+ * F
22
+ * @see [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance](developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance)
23
+ *
24
+ * Derived classes should implement a static getter `instanceSymbol` which returns a unique symbol.
25
+ *
26
+ * ```javascript
27
+ * static get [instanceSymbol]() {
28
+ * return Symbol.for("@schukai/monster/types/base");
29
+ * }
30
+ * ```
12
31
  *
13
32
  * The class was formerly called Object.
14
33
  *
@@ -27,5 +46,86 @@ class Base extends Object {
27
46
  return JSON.stringify(this);
28
47
  };
29
48
 
49
+ /**
50
+ * This method is called by the `instanceof` operator.
51
+ * @returns {symbol}
52
+ * @since 2.1.0
53
+ */
54
+ static get [instanceSymbol]() {
55
+ return Symbol.for("@schukai/monster/types/base");
56
+ }
57
+
58
+ /**
59
+ * This method is called by the `instanceof` operator.
60
+ * @param that
61
+ * @returns {boolean}
62
+ * @since 2.1.0
63
+ */
64
+ static [Symbol.hasInstance](that) {
65
+
66
+ if (that === undefined || that === null || (typeof that !== "object" && typeof that !== "function")) {
67
+ return false;
68
+ }
69
+
70
+ const thatClass = Object.getPrototypeOf(that)
71
+ if (thatClass === undefined || thatClass === null || (typeof thatClass !== "object" && typeof thatClass !== "function")) {
72
+ return false;
73
+ }
74
+
75
+ if (checkInstanceSymbol.apply(this, [thatClass]) === true) {
76
+ return true;
77
+ }
78
+
79
+
80
+ // this call the static method of the super class, if there is one
81
+ return super[Symbol.hasInstance](that);
82
+
83
+ }
84
+
85
+ }
86
+
87
+ /**
88
+ * this function checks if the class has a static getter `instanceSymbol` and if the value of this getter is equal to the
89
+ *
90
+ * @private
91
+ * @param obj
92
+ * @returns {boolean|any|boolean}
93
+ * @since 2.1.0
94
+ */
95
+ function checkInstanceSymbol(obj) {
96
+
97
+ if (this.hasOwnProperty(instanceSymbol) === false) {
98
+ return false;
99
+ }
100
+
101
+ const proto = obj?.constructor;
102
+ if (proto === undefined || proto === null || (typeof proto !== "object" && typeof proto !== "function")) {
103
+ return false;
104
+ }
105
+
106
+ if (proto.hasOwnProperty(instanceSymbol) !== true) {
107
+ return checkInstanceSymbol.apply(this, [obj.__proto__]);
108
+ }
109
+
110
+ const symbol = proto[instanceSymbol];
111
+ if (symbol === undefined) {
112
+
113
+ if (obj.__proto__) {
114
+ return checkInstanceSymbol(obj.__proto__);
115
+ } else {
116
+ return false;
117
+ }
118
+
119
+ }
120
+
121
+ if (symbol === this[instanceSymbol]) {
122
+ return true;
123
+ }
124
+
125
+ return checkInstanceSymbol.apply(this, [obj.__proto__]);
126
+
30
127
 
31
128
  }
129
+
130
+
131
+
@@ -9,7 +9,7 @@ import {Base} from "./base.mjs";
9
9
  import {isString} from "./is.mjs";
10
10
  import {MediaType, parseMediaType} from "./mediatype.mjs";
11
11
  import {validateBoolean, validateInstance, validateString} from "./validate.mjs";
12
-
12
+ import {instanceSymbol} from '../constants.mjs';
13
13
  export {DataUrl, parseDataURL}
14
14
 
15
15
  /**
@@ -52,6 +52,16 @@ class DataUrl extends Base {
52
52
 
53
53
  }
54
54
 
55
+ /**
56
+ * This method is called by the `instanceof` operator.
57
+ * @returns {symbol}
58
+ * @since 2.1.0
59
+ */
60
+ static get [instanceSymbol]() {
61
+ return Symbol.for("@schukai/monster/types/data-url");
62
+ }
63
+
64
+
55
65
  get content() {
56
66
  return this[internal].base64 ? atob(this[internal].content) : this[internal].content;
57
67
  }
@@ -8,7 +8,7 @@
8
8
  import {Base} from "./base.mjs";
9
9
  import {isString} from "./is.mjs";
10
10
  import {validateArray, validateString} from "./validate.mjs";
11
-
11
+ import {instanceSymbol} from '../constants.mjs';
12
12
  export {MediaType, parseMediaType}
13
13
 
14
14
  /**
@@ -57,6 +57,16 @@ class MediaType extends Base {
57
57
 
58
58
  }
59
59
 
60
+ /**
61
+ * This method is called by the `instanceof` operator.
62
+ * @returns {symbol}
63
+ * @since 2.1.0
64
+ */
65
+ static get [instanceSymbol]() {
66
+ return Symbol.for("@schukai/monster/types/media-type");
67
+ }
68
+
69
+
60
70
  /**
61
71
  * @return {String}
62
72
  */
@@ -9,6 +9,7 @@ import {Base} from './base.mjs';
9
9
  import {isPrimitive} from "./is.mjs";
10
10
  import {NodeList} from './nodelist.mjs';
11
11
  import {validateInstance} from './validate.mjs';
12
+ import {instanceSymbol} from '../constants.mjs';
12
13
 
13
14
  export {Node}
14
15
 
@@ -52,6 +53,16 @@ class Node extends Base {
52
53
 
53
54
  }
54
55
 
56
+ /**
57
+ * This method is called by the `instanceof` operator.
58
+ * @returns {symbol}
59
+ * @since 2.1.0
60
+ */
61
+ static get [instanceSymbol]() {
62
+ return Symbol.for("@schukai/monster/types/node");
63
+ }
64
+
65
+
55
66
  /**
56
67
  * @property {*}
57
68
  */
@@ -8,7 +8,7 @@
8
8
  import {isArray, isInstance} from "./is.mjs";
9
9
  import {Node} from "./node.mjs";
10
10
  import {validateInstance} from "./validate.mjs";
11
-
11
+ import {instanceSymbol} from '../constants.mjs';
12
12
  export {NodeList}
13
13
 
14
14
  /**
@@ -44,6 +44,16 @@ class NodeList extends Set {
44
44
  }
45
45
  }
46
46
 
47
+ /**
48
+ * This method is called by the `instanceof` operator.
49
+ * @returns {symbol}
50
+ * @since 2.1.0
51
+ */
52
+ static get [instanceSymbol]() {
53
+ return Symbol.for("@schukai/monster/types/node-list");
54
+ }
55
+
56
+
47
57
  /**
48
58
  *
49
59
  * @param {Node} node
@@ -9,7 +9,7 @@ import {Base} from './base.mjs';
9
9
  import {isObject} from './is.mjs';
10
10
  import {TokenList} from './tokenlist.mjs';
11
11
  import {UniqueQueue} from './uniquequeue.mjs';
12
-
12
+ import {instanceSymbol} from '../constants.mjs';
13
13
  export {Observer}
14
14
 
15
15
  /**
@@ -64,6 +64,16 @@ class Observer extends Base {
64
64
  this.queue = new UniqueQueue();
65
65
  }
66
66
 
67
+ /**
68
+ * This method is called by the `instanceof` operator.
69
+ * @returns {symbol}
70
+ * @since 2.1.0
71
+ */
72
+ static get [instanceSymbol]() {
73
+ return Symbol.for("@schukai/monster/types/observer");
74
+ }
75
+
76
+
67
77
  /**
68
78
  *
69
79
  * @param {string} tag
@@ -11,7 +11,7 @@ import {Observer} from "./observer.mjs";
11
11
  import {ObserverList} from "./observerlist.mjs";
12
12
  import {validateObject} from "./validate.mjs";
13
13
  import {extend} from "../data/extend.mjs";
14
-
14
+ import {instanceSymbol} from '../constants.mjs';
15
15
  export {ProxyObserver}
16
16
 
17
17
  /**
@@ -50,6 +50,16 @@ export {ProxyObserver}
50
50
  this.observers = new ObserverList;
51
51
  }
52
52
 
53
+ /**
54
+ * This method is called by the `instanceof` operator.
55
+ * @returns {symbol}
56
+ * @since 2.1.0
57
+ */
58
+ static get [instanceSymbol]() {
59
+ return Symbol.for("@schukai/monster/types/proxy-observer");
60
+ }
61
+
62
+
53
63
  /**
54
64
  * get the real object
55
65
  *
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import {Base} from './base.mjs';
9
-
9
+ import {instanceSymbol} from '../constants.mjs';
10
10
  export {Queue}
11
11
 
12
12
  /**
@@ -29,6 +29,16 @@ class Queue extends Base {
29
29
  this.data = [];
30
30
  }
31
31
 
32
+ /**
33
+ * This method is called by the `instanceof` operator.
34
+ * @returns {symbol}
35
+ * @since 2.1.0
36
+ */
37
+ static get [instanceSymbol]() {
38
+ return Symbol.for("@schukai/monster/types/queue");
39
+ }
40
+
41
+
32
42
 
33
43
  /**
34
44
  * @return {boolean}
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import {Base} from './base.mjs';
9
-
9
+ import {instanceSymbol} from '../constants.mjs';
10
10
  export {Stack}
11
11
 
12
12
  /**
@@ -27,6 +27,15 @@ class Stack extends Base {
27
27
  this.data = [];
28
28
  }
29
29
 
30
+ /**
31
+ * This method is called by the `instanceof` operator.
32
+ * @returns {symbol}
33
+ * @since 2.1.0
34
+ */
35
+ static get [instanceSymbol]() {
36
+ return Symbol.for("@schukai/monster/types/stack");
37
+ }
38
+
30
39
 
31
40
  /**
32
41
  * @return {boolean}
@@ -6,9 +6,11 @@
6
6
  */
7
7
 
8
8
  import {Base} from './base.mjs';
9
+ import {instanceSymbol} from '../constants.mjs';
9
10
 
10
11
  export {Version, getMonsterVersion}
11
12
 
13
+
12
14
  /**
13
15
  * The version object contains a semantic version number
14
16
  *
@@ -72,6 +74,16 @@ class Version extends Base {
72
74
 
73
75
  }
74
76
 
77
+ /**
78
+ * This method is called by the `instanceof` operator.
79
+ * @returns {symbol}
80
+ * @since 2.1.0
81
+ */
82
+ static get [instanceSymbol]() {
83
+ return Symbol.for("@schukai/monster/types/version");
84
+ }
85
+
86
+
75
87
  /**
76
88
  *
77
89
  * @returns {string}
@@ -135,9 +147,9 @@ function getMonsterVersion() {
135
147
  if (monsterVersion instanceof Version) {
136
148
  return monsterVersion;
137
149
  }
138
-
150
+
139
151
  /** don't touch, replaced by make with package.json version */
140
- monsterVersion = new Version('2.0.16')
152
+ monsterVersion = new Version('2.1.1')
141
153
 
142
154
  return monsterVersion;
143
155
 
@@ -0,0 +1,38 @@
1
+ import {Base} from "../../../../application/source/types/base.mjs";
2
+ import {AbstractOperator} from "../../../../application/source/constraints/abstractoperator.mjs";
3
+ import {expect} from "chai"
4
+
5
+ class AbstractConstraintMock extends Base {
6
+
7
+ constructor() {
8
+ super();
9
+ }
10
+
11
+ isValid(value) {
12
+ return Promise.reject(value);
13
+ }
14
+ }
15
+
16
+
17
+ describe('AbstractOperator', function () {
18
+ it('should throw an error when the constraint is not call with parameter', function (done) {
19
+ try {
20
+ new AbstractOperator()
21
+ } catch (e) {
22
+ done();
23
+ }
24
+ });
25
+
26
+ it('should throw not an error when the constraint is not call with parameter', function (done) {
27
+
28
+ try {
29
+ const c = new AbstractOperator(new AbstractConstraintMock(), new AbstractConstraintMock())
30
+ } catch (e) {
31
+ done();
32
+ }
33
+
34
+
35
+
36
+ });
37
+ });
38
+
@@ -133,7 +133,7 @@ describe('DOM', function () {
133
133
  try {
134
134
  expect(document.getElementsByTagName('monster-testclass2').length).is.equal(1);
135
135
  expect(document.getElementsByTagName('monster-testclass2').item(0).shadowRoot.innerHTML).is.equal('<h1></h1><article><p>test</p><div id="container"></div></article>');
136
- expect(document.getElementById('test1')).contain.html('<monster-testclass2 data-monster-objectlink="Symbol(monsterUpdater)"></monster-testclass2>');
136
+ expect(document.getElementById('test1')).contain.html('<monster-testclass2 data-monster-objectlink="Symbol(@schukai/monster/dom/@@object-updater-link)"></monster-testclass2>');
137
137
  return done();
138
138
  } catch (e) {
139
139
  done(e);
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+
4
+ import {initJSDOM} from "../../util/jsdom.mjs";
5
+ import {expect} from "chai"
6
+ let Resource,DerivedResource;
7
+
8
+
9
+
10
+ describe('Resource', function() {
11
+
12
+ before(function (done) {
13
+ initJSDOM().then(() => {
14
+
15
+ import("../../../../application/source/dom/resource.mjs").then((m) => {
16
+ Resource = m['Resource'];
17
+
18
+
19
+ DerivedResource = class extends Resource {
20
+ constructor() {
21
+ super({
22
+ "data-url": "http://example.com",
23
+ });
24
+ }
25
+
26
+ static getURLAttribute() {
27
+ return 'data-url';
28
+ }
29
+ }
30
+
31
+ done()
32
+ });
33
+
34
+ });
35
+
36
+
37
+ })
38
+
39
+ describe('DerivedResource', function () {
40
+
41
+ it('should instanceof Resource', function () {
42
+ expect(new DerivedResource()).to.be.an.instanceof(Resource);
43
+ });
44
+
45
+ });
46
+
47
+
48
+ });
@@ -7,7 +7,7 @@ describe('Monster', function () {
7
7
  let monsterVersion
8
8
 
9
9
  /** don´t touch, replaced by make with package.json version */
10
- monsterVersion = new Version('2.0.16')
10
+ monsterVersion = new Version('2.1.1')
11
11
 
12
12
  let m = getMonsterVersion();
13
13
 
@@ -2,8 +2,29 @@
2
2
 
3
3
  import {expect} from "chai"
4
4
  import {Base} from "../../../../application/source/types/base.mjs";
5
+ import {instanceSymbol} from "../../../../application/source/constants.mjs";
5
6
 
6
7
 
8
+
9
+ class BaseDifferentRealm extends Object {
10
+
11
+
12
+ static get [instanceSymbol]() {
13
+ return Symbol.for("@schukai/monster/types/base");
14
+ }
15
+
16
+
17
+ }
18
+
19
+ class Subclass extends BaseDifferentRealm {
20
+ constructor() {
21
+ super();
22
+ }
23
+ static get [instanceSymbol]() {
24
+ return Symbol.for("@schukai/monster/types/subclass");
25
+ }
26
+ }
27
+
7
28
  describe('Base', function () {
8
29
 
9
30
  describe('new Base', function () {
@@ -17,5 +38,26 @@ describe('Base', function () {
17
38
  });
18
39
 
19
40
  })
41
+
42
+ describe('instancof', function () {
43
+
44
+ it('is instance of Base', function () {
45
+ expect(new Base).to.be.instanceOf(Base);
46
+ });
47
+
48
+ it('subclass instanceof', function () {
49
+
50
+ if (new Subclass instanceof Base) {
51
+ expect(true).to.be.true;
52
+ } else {
53
+ expect(false).to.be.true;
54
+ }
55
+
56
+
57
+
58
+ });
59
+
60
+
61
+ })
20
62
 
21
63
  })