@qooxdoo/framework 8.0.0-beta.1 → 8.0.0-beta.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.
Files changed (49) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/Manifest.json +1 -1
  3. package/lib/compiler/compile-info.json +55 -55
  4. package/lib/compiler/index.js +18497 -22975
  5. package/lib/resource/qx/tool/compiler/cli/templates/class/default.tmpl.js +6 -7
  6. package/lib/resource/qx/tool/compiler/cli/templates/class/singleton.tmpl.js +5 -6
  7. package/lib/resource/qx/tool/compiler/schema/compile-1-0-0.json +6 -2
  8. package/package.json +8 -10
  9. package/source/class/qx/Class.js +3 -3
  10. package/source/class/qx/core/BaseInit.js +14 -13
  11. package/source/class/qx/core/MObjectId.js +16 -0
  12. package/source/class/qx/core/MProperty.js +147 -175
  13. package/source/class/qx/core/check/DynamicTypeCheck.js +4 -0
  14. package/source/class/qx/core/property/Property.js +20 -19
  15. package/source/class/qx/data/SingleValueBinding.js +5 -7
  16. package/source/class/qx/data/binding/AbstractSegment.js +1 -1
  17. package/source/class/qx/data/binding/ArrayIndexSegment.js +17 -10
  18. package/source/class/qx/data/binding/IInputReceiver.js +1 -1
  19. package/source/class/qx/data/binding/PropNameSegment.js +1 -1
  20. package/source/class/qx/dev/unit/TestCase.js +4 -1
  21. package/source/class/qx/event/handler/Focus.js +2 -1
  22. package/source/class/qx/html/Jsx.js +2 -3
  23. package/source/class/qx/html/Node.js +3 -3
  24. package/source/class/qx/io/jsonrpc/Client.js +1 -1
  25. package/source/class/qx/promise/NativeWrapper.js +1 -1
  26. package/source/class/qx/test/core/Property.js +30 -2
  27. package/source/class/qx/test/data/singlevalue/Simple.js +6 -0
  28. package/source/class/qx/test/locale/Date.js +2 -2
  29. package/source/class/qx/theme/classic/Appearance.js +21 -0
  30. package/source/class/qx/theme/modern/Appearance.js +21 -0
  31. package/source/class/qx/theme/simple/Appearance.js +21 -0
  32. package/source/class/qx/theme/tangible/Appearance.js +2 -0
  33. package/source/class/qx/tool/cli/AbstractCliApp.js +18 -2
  34. package/source/class/qx/tool/compiler/ClassFile.js +0 -4
  35. package/source/class/qx/tool/compiler/MetaDatabase.js +47 -0
  36. package/source/class/qx/tool/compiler/cli/commands/Compile.js +139 -8
  37. package/source/class/qx/tool/compiler/cli/commands/Create.js +1 -1
  38. package/source/class/qx/tool/compiler/cli/commands/Serve.js +1 -1
  39. package/source/class/qx/tool/compiler/cli/commands/Typescript.js +26 -39
  40. package/source/class/qx/tool/compiler/cli/commands/add/Script.js +1 -1
  41. package/source/class/qx/tool/compiler/cli/commands/package/Publish.js +3 -2
  42. package/source/class/qx/tool/compiler/cli/commands/package/Update.js +2 -2
  43. package/source/class/qx/tool/compiler/targets/TypeScriptWriter.js +3 -0
  44. package/source/class/qx/tool/compiler/targets/meta/Browserify.js +142 -80
  45. package/source/class/qx/tool/migration/M8_0_0.js +4 -4
  46. package/source/class/qx/ui/toolbar/ToolBar.js +4 -4
  47. package/source/resource/qx/tool/compiler/cli/templates/class/default.tmpl.js +6 -7
  48. package/source/resource/qx/tool/compiler/cli/templates/class/singleton.tmpl.js +5 -6
  49. package/source/resource/qx/tool/compiler/schema/compile-1-0-0.json +6 -2
@@ -12,9 +12,8 @@ qx.Class.define("${classname}",
12
12
  /**
13
13
  * Constructor
14
14
  */
15
- construct : function() {
16
- // If you want to call the parent constructor, use
17
- // this.base(arguments);
15
+ construct() {
16
+ super();
18
17
  },
19
18
 
20
19
  /**
@@ -62,7 +61,7 @@ qx.Class.define("${classname}",
62
61
  * @param {number} bar The bar parameter
63
62
  * @return The result of the method.
64
63
  */
65
- myMethod : function(foo, bar) {
64
+ myMethod(foo, bar) {
66
65
  //
67
66
  },
68
67
 
@@ -72,7 +71,7 @@ qx.Class.define("${classname}",
72
71
  * @param {string} value new value
73
72
  * @param {string} old the old value
74
73
  */
75
- _applyFoo : function(value, old) {
74
+ _applyFoo(value, old) {
76
75
  //
77
76
  }
78
77
 
@@ -81,7 +80,7 @@ qx.Class.define("${classname}",
81
80
  /**
82
81
  * Use for disposing objects created by class instances
83
82
  */
84
- destruct : function() {
83
+ destruct() {
85
84
  //
86
- }
85
+ }
87
86
  });
@@ -14,9 +14,8 @@ qx.Class.define("${classname}",
14
14
  /**
15
15
  * Create a the singleton
16
16
  */
17
- construct : function() {
18
- // If you want to call the parent constructor, use
19
- // this.base(arguments);
17
+ construct() {
18
+ super();
20
19
  },
21
20
 
22
21
  /**
@@ -55,15 +54,15 @@ qx.Class.define("${classname}",
55
54
  * @param {Number} bar The bar parameter
56
55
  * @return {void} The result of the method.
57
56
  */
58
- myMethod : function(foo, bar)
57
+ myMethod(foo, bar)
59
58
  {
60
59
  //
61
60
  },
62
61
 
63
62
  /** Applies the foo property */
64
- _applyFoo : function(value, old)
63
+ _applyFoo(value, old)
65
64
  {
66
65
  //
67
- }
66
+ }
68
67
  }
69
68
  });
@@ -320,7 +320,7 @@
320
320
  },
321
321
  "browserifyOptions": {
322
322
  "type": "object",
323
- "description": "Options given to browserify. For details see here: <https://github.com/browserify/browserify#usage>. They can be overridden per target."
323
+ "description": "Options passed to esbuild when bundling CommonJS modules. See https://esbuild.github.io/api/ for available options. They can be overridden per target. Browserify-specific options (noParse, ignoreMissing, insertGlobals, detectGlobals, builtins) are not supported and will be ignored with a warning."
324
324
  },
325
325
  "parts": {
326
326
  "$ref": "#/properties/parts"
@@ -465,9 +465,13 @@
465
465
  "browserify": {
466
466
  "type": "object",
467
467
  "properties": {
468
+ "polyfillNode": {
469
+ "type": "boolean",
470
+ "description": "Whether to include the esbuild-plugin-polyfill-node plugin, which provides browser shims for Node.js built-ins (process, buffer, etc.). Defaults to true. Set to false if your packages do not use Node.js built-ins and you want a smaller bundle."
471
+ },
468
472
  "options": {
469
473
  "type": "object",
470
- "description": "Options given to browserify. For details see here: <https://github.com/browserify/browserify#usage>. They can be overridden per target."
474
+ "description": "Options passed to esbuild when bundling CommonJS modules. See https://esbuild.github.io/api/ for available options. They can be overridden per target. Browserify-specific options (noParse, ignoreMissing, insertGlobals, detectGlobals, builtins) are not supported and will be ignored with a warning."
471
475
  }
472
476
  }
473
477
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qooxdoo/framework",
3
- "version": "8.0.0-beta.1",
3
+ "version": "8.0.0-beta.2",
4
4
  "description": "The JS Framework for Coders",
5
5
  "author": "The qooxdoo project",
6
6
  "keywords": [
@@ -78,9 +78,7 @@
78
78
  "ajv": "^8.12.0",
79
79
  "app-module-path": "^2.2.0",
80
80
  "async": "^2.6.3",
81
- "babelify": "^10.0.0",
82
81
  "better-ajv-errors": "^1.2.0",
83
- "browserify": "^17.0.1",
84
82
  "chokidar": "^3.5.3",
85
83
  "cli-progress": "^3.12.0",
86
84
  "columnify": "^1.6.0",
@@ -88,32 +86,32 @@
88
86
  "core-js-bundle": "^3.33.1",
89
87
  "dot": "^1.1.3",
90
88
  "es6-promise-pool": "^2.5.0",
89
+ "esbuild": "^0.27.3",
90
+ "esbuild-plugin-polyfill-node": "^0.3.0",
91
91
  "eslint": "^9.15.0",
92
92
  "eslint-formatter-codeframe": "^7.32.1",
93
93
  "eslint-plugin-jsdoc": "^50.5.0",
94
94
  "express": "^5.1.0",
95
95
  "fontkit": "^2.0.2",
96
96
  "get-value": "^3.0.1",
97
- "glob": "^11.0.3",
97
+ "glob": "^13.0.6",
98
98
  "image-size": "^0.8.3",
99
- "inquirer": "^7.3.3",
99
+ "inquirer": "^13.2.5",
100
100
  "jsdoctypeparser": "^9.0.0",
101
101
  "json-stable-stringify": "^1.0.2",
102
102
  "jstransformer-dot": "^0.1.2",
103
103
  "metalsmith": "^2.6.1",
104
- "node-fetch": "^3.3.2",
105
104
  "object-hash": "^2.1.1",
106
105
  "prettier": "^2.5.1",
107
106
  "ps-tree": "^1.2.0",
108
107
  "regenerator-runtime": "^0.14.1",
109
- "replace-in-file": "^8.3.0",
110
- "rimraf": "^6.0.1",
108
+ "replace-in-file": "^8.4.0",
109
+ "rimraf": "^6.1.3",
111
110
  "sass": "1.69.4",
112
111
  "semver": "^7.5.4",
113
112
  "set-value": "^4.1.0",
114
113
  "showdown": "^1.9.1",
115
114
  "source-map-js": "^1.0.2",
116
- "tap-colorize": "^1.2.0",
117
115
  "terser": "^5.22.0",
118
116
  "tmp": "^0.2.5",
119
117
  "unset-value": "^1.0.0",
@@ -123,9 +121,9 @@
123
121
  "yauzl-promise": "^4.0.0"
124
122
  },
125
123
  "devDependencies": {
124
+ "baseline-browser-mapping": "^2.10.0",
126
125
  "dirsum": "^0.1.1",
127
126
  "source-map-support": "^0.5.21",
128
- "tape": "^5.9.0",
129
127
  "tree-kill": "^1.2.2"
130
128
  },
131
129
  "engine": "node >= 20",
@@ -679,14 +679,14 @@ qx.Bootstrap.define("qx.Class", {
679
679
  continue;
680
680
  }
681
681
  let def = property.getDefinition();
682
- let excluded = property.getClass().classname && excludeAutoApply.find(match => property.getClass().classname.match(match));
682
+ let modernFeatures = def && (def.autoApply || def.initFunction);
683
+ let excluded = property.getClass().classname ? excludeAutoApply.find(match => property.getClass().classname.match(match)) : !modernFeatures;
683
684
  if (
684
685
  !property.isPseudoProperty() &&
685
686
  def.autoApply !== false &&
686
- property.getClass().classname &&
687
687
  property.hasInitValue() &&
688
688
  !property.getPropertyState(this).initMethodCalled &&
689
- ((initDuringConstruct === true && !excluded) || def.autoApply || def.initFunction)
689
+ ((initDuringConstruct === true && !excluded) || modernFeatures)
690
690
  ) {
691
691
  property.init(this);
692
692
  }
@@ -71,25 +71,26 @@ qx.Class.define("qx.core.BaseInit", {
71
71
  var clazz = qx.Class.getByName(app);
72
72
 
73
73
  if (clazz) {
74
- (async () => {
75
- this.__application = new clazz();
76
- var start = new Date();
77
- await this.__application.main();
74
+ this.__application = new clazz();
75
+ let mainResult = this.__application.main();
76
+
77
+ const cb = () => {
78
78
  if (qx.core.Environment.get("qx.debug.startupTimings")) {
79
- qx.log.Logger.debug(
80
- this,
81
- "Main runtime: " + (new Date() - start) + "ms"
82
- );
79
+ qx.log.Logger.debug(this, "Main runtime: " + (new Date() - start) + "ms");
83
80
  }
84
81
  var start = new Date();
85
82
  this.__application.finalize();
86
83
  if (qx.core.Environment.get("qx.debug.startupTimings")) {
87
- qx.log.Logger.debug(
88
- this,
89
- "Finalize runtime: " + (new Date() - start) + "ms"
90
- );
84
+ qx.log.Logger.debug(this, "Finalize runtime: " + (new Date() - start) + "ms");
91
85
  }
92
- })();
86
+ };
87
+
88
+ //We cannot use await here because this code may be called in engines which don't support async, such as Rhino
89
+ if (qx.lang.Type.isPromise(mainResult)) {
90
+ mainResult.then(cb);
91
+ } else {
92
+ cb(mainResult);
93
+ }
93
94
  qx.event.handler.Application.onAppInstanceInitialized();
94
95
  } else {
95
96
  qx.log.Logger.warn("Missing application class: " + app);
@@ -399,6 +399,22 @@ qx.Mixin.define("qx.core.MObjectId", {
399
399
  */
400
400
  getOwnedQxObjects() {
401
401
  return this.__ownedQxObjects ? Object.values(this.__ownedQxObjects) : [];
402
+ },
403
+
404
+ /**
405
+ * @param {string}
406
+ * @returns {boolean} Whether this object has an owned object with the given ID that has been created
407
+ */
408
+ hasOwnedQxObject(id) {
409
+ return !!(this.__ownedQxObjects && this.__ownedQxObjects[id]);
410
+ },
411
+
412
+ /**
413
+ *
414
+ * @returns {Object} An object mapping IDs to owned objects. Do not modify this object directly.
415
+ */
416
+ getAllQxObjectsById() {
417
+ return this.__ownedQxObjects ?? {};
402
418
  }
403
419
  }
404
420
  });
@@ -20,193 +20,165 @@
20
20
  * This mixin offers the basic property features which include generic
21
21
  * setter, getter and resetter.
22
22
  */
23
- qx.Mixin.define(
24
- "qx.core.MProperty",
25
- {
26
- members:
27
- {
28
- /**
29
- * Sets either multiple properties at once by using a property
30
- * list or sets one property and its value by the first and
31
- * second argument. As a fallback, if no generated property
32
- * setter could be found, a handwritten setter will be searched
33
- * and invoked if available.
34
- *
35
- * @param data {Object | String}
36
- * a map of property values. The key is the name of the property.
37
- *
38
- * @param value {var?}
39
- * the value, only used when <code>data</code> is a string.
40
- *
41
- * @return {Object}
42
- * Returns this instance if <code>data</code> is a map or a
43
- * non-generated setter is called; otherwise returns
44
- * <code>value</code>.
45
- *
46
- * @throws {Error} if a property defined does not exist
47
- */
48
- set(data, value)
49
- {
50
- // If there's just a single property name and value, convert
51
- // it to a map as if there were multiple property names and
52
- // values.
53
- if (qx.Bootstrap.isString(data))
54
- {
55
- data =
56
- {
57
- [data] : value
58
- };
59
- }
60
-
61
- // Set each property specified in the map
62
- for (let prop in data)
63
- {
64
- // If the property exists as a member variable, set it directly
65
- if (prop in this)
66
- {
67
- if (data[prop] !== undefined)
68
- {
69
- this[`$$variant_${prop}`] = "set";
70
- this[prop] = data[prop];
71
- }
72
- continue;
73
- }
74
-
75
- // Otherwise, see if there's a hand-written setter method
76
- if (this["set" + qx.Bootstrap.firstUp(prop)] != undefined)
77
- {
78
- this["set" + qx.Bootstrap.firstUp(prop)](data[prop]);
79
- continue;
80
- }
23
+ qx.Mixin.define("qx.core.MProperty", {
24
+ members: {
25
+ /**
26
+ * Sets either multiple properties at once by using a property
27
+ * list or sets one property and its value by the first and
28
+ * second argument. As a fallback, if no generated property
29
+ * setter could be found, a handwritten setter will be searched
30
+ * and invoked if available.
31
+ *
32
+ * @param data {Object | String}
33
+ * a map of property values. The key is the name of the property.
34
+ *
35
+ * @param value {var?}
36
+ * the value, only used when <code>data</code> is a string.
37
+ *
38
+ * @return {Object}
39
+ * Returns this instance if <code>data</code> is a map or a
40
+ * non-generated setter is called; otherwise returns
41
+ * <code>value</code>.
42
+ *
43
+ * @throws {Error} if a property defined does not exist
44
+ */
45
+ set(data, value) {
46
+ // If there's just a single property name and value, convert
47
+ // it to a map as if there were multiple property names and
48
+ // values.
49
+ if (qx.Bootstrap.isString(data)) {
50
+ data = {
51
+ [data]: value
52
+ };
53
+ }
81
54
 
82
- // Neither was true
83
- throw new Error("No such property: " + data);
55
+ // Set each property specified in the map
56
+ for (let prop in data) {
57
+ // Otherwise, see if there's a hand-written setter method
58
+ if (this["set" + qx.Bootstrap.firstUp(prop)] != undefined) {
59
+ this["set" + qx.Bootstrap.firstUp(prop)](data[prop]);
60
+ continue;
84
61
  }
62
+ // Neither was true
63
+ throw new Error("No such property: " + prop + " in " + this.classname + " (" + this + ")");
64
+ }
85
65
 
86
- // Allow for the case where no properties were given
87
- return this;
88
- },
89
-
90
-
91
- /**
92
- * Sets a property or multiple properties asynchronously.
93
- * First tries calling `setPropetyNameAsync` if it exists,
94
- * otherwise falls back to `setPropertyName`.
95
- *
96
- * @overload
97
- * @param {string} data Name of property to set
98
- * @param {*} value Value to set it to
99
- *
100
- * @overload
101
- * @param {Object<string, *>} data Map of properties to set
102
- *
103
- * @returns {qx.core.Object | Promise<*>} This instance if a map was provided,
104
- * or, if a single property is set,
105
- * a promise which resolves when the setting has completed
106
- * to the set value of the property.
107
- */
108
- async setAsync(data, value) {
109
- const setValueImpl = async (propName, value) => {
110
- let upname = qx.Bootstrap.firstUp(propName);
111
- let setterName = "set" + upname + "Async";
66
+ // Allow for the case where no properties were given
67
+ return this;
68
+ },
69
+
70
+ /**
71
+ * Sets a property or multiple properties asynchronously.
72
+ * First tries calling `setPropetyNameAsync` if it exists,
73
+ * otherwise falls back to `setPropertyName`.
74
+ *
75
+ * @overload
76
+ * @param {string} data Name of property to set
77
+ * @param {*} value Value to set it to
78
+ *
79
+ * @overload
80
+ * @param {Object<string, *>} data Map of properties to set
81
+ *
82
+ * @returns {qx.core.Object | Promise<*>} This instance if a map was provided,
83
+ * or, if a single property is set,
84
+ * a promise which resolves when the setting has completed
85
+ * to the set value of the property.
86
+ */
87
+ async setAsync(data, value) {
88
+ const setValueImpl = async (propName, value) => {
89
+ let upname = qx.Bootstrap.firstUp(propName);
90
+ let setterName = "set" + upname + "Async";
91
+
92
+ if (!this[setterName]) {
93
+ setterName = "set" + upname;
94
+ }
112
95
 
96
+ if (qx.core.Environment.get("qx.debug")) {
113
97
  if (!this[setterName]) {
114
- setterName = "set" + upname;
115
- }
116
-
117
- if (qx.core.Environment.get("qx.debug")) {
118
- if (!this[setterName]) {
119
- throw new Error(
120
- `No such property: ${propName} in ${this.classname} (${this})`
121
- );
122
- }
98
+ throw new Error(`No such property: ${propName} in ${this.classname} (${this})`);
123
99
  }
124
-
125
- return await this[setterName](value);
126
- };
127
-
128
- if (qx.Bootstrap.isString(data)) {
129
- return await setValueImpl(data, value);
130
100
  }
131
101
 
132
- for (let propName in data) {
133
- await setValueImpl(propName, data[propName]);
134
- }
135
- return this;
136
- },
137
-
138
- /**
139
- * Returns the value of the given property. If no generated getter could
140
- * be found, a fallback tries to access a handwritten getter.
141
- *
142
- * @param prop {String}
143
- * Name of the property.
144
- *
145
- * @return {var}
146
- * The value of the value
147
- *
148
- * @param safe {Boolean?false}
149
- *
150
- * @throws {Error}
151
- * if a property defined does not exist
152
- */
153
- get(prop, safe)
154
- {
155
- if (safe) {
156
- let property = qx.Class.getByProperty(this.constructor, prop);
157
- if (property) {
158
- return property.getSafe(this);
159
- }
160
- }
102
+ return await this[setterName](value);
103
+ };
161
104
 
162
- // Otherwise, see if there's a hand-written getter method
163
- if (this["get" + qx.Bootstrap.firstUp(prop)] != undefined)
164
- {
165
- return this["get" + qx.Bootstrap.firstUp(prop)]();
166
- }
105
+ if (qx.Bootstrap.isString(data)) {
106
+ return await setValueImpl(data, value);
107
+ }
167
108
 
168
- // If the property exists as a member variable, get it directly
169
- if (prop in this)
170
- {
171
- return this[prop];
109
+ for (let propName in data) {
110
+ await setValueImpl(propName, data[propName]);
111
+ }
112
+ return this;
113
+ },
114
+
115
+ /**
116
+ * Returns the value of the given property. If no generated getter could
117
+ * be found, a fallback tries to access a handwritten getter.
118
+ *
119
+ * @param prop {String}
120
+ * Name of the property.
121
+ *
122
+ * @return {var}
123
+ * The value of the value
124
+ *
125
+ * @param safe {Boolean?false}
126
+ *
127
+ * @throws {Error}
128
+ * if a property defined does not exist
129
+ */
130
+ get(prop, safe) {
131
+ if (safe) {
132
+ let property = qx.Class.getByProperty(this.constructor, prop);
133
+ if (property) {
134
+ return property.getSafe(this);
172
135
  }
136
+ }
173
137
 
174
- throw new Error("No such property: " + prop);
175
- },
176
-
177
- /**
178
- *
179
- * Returns the value of the given property.
180
- * If the property is not initialized, it will return undefined.
181
- *
182
- * @param prop {String}
183
- * Name of the property.
184
- *
185
- * @returns {*}
186
- */
187
- getSafe(prop) {
188
- return this.get(prop, true);
189
- },
190
-
191
- /**
192
- * Resets the value of the given property. If no generated resetter
193
- * could be found, a handwritten resetter will be invoked, if available.
194
- *
195
- * @param prop {String}
196
- * Name of the property.
197
- *
198
- * @throws {Error}
199
- * if a property defined does not exist
200
- */
201
- reset(prop)
202
- {
203
- // Reset the property
204
- if (this["reset" + qx.Bootstrap.firstUp(prop)] != undefined)
205
- {
206
- return this["reset" + qx.Bootstrap.firstUp(prop)]();
207
- }
138
+ // Otherwise, see if there's a hand-written getter method
139
+ if (this["get" + qx.Bootstrap.firstUp(prop)] != undefined) {
140
+ return this["get" + qx.Bootstrap.firstUp(prop)]();
141
+ }
208
142
 
209
- throw new Error("No such property: " + prop);
143
+ // If the property exists as a member variable, get it directly
144
+ if (prop in this) {
145
+ return this[prop];
210
146
  }
147
+
148
+ throw new Error("No such property: " + prop);
149
+ },
150
+
151
+ /**
152
+ *
153
+ * Returns the value of the given property.
154
+ * If the property is not initialized, it will return undefined.
155
+ *
156
+ * @param prop {String}
157
+ * Name of the property.
158
+ *
159
+ * @returns {*}
160
+ */
161
+ getSafe(prop) {
162
+ return this.get(prop, true);
163
+ },
164
+
165
+ /**
166
+ * Resets the value of the given property. If no generated resetter
167
+ * could be found, a handwritten resetter will be invoked, if available.
168
+ *
169
+ * @param prop {String}
170
+ * Name of the property.
171
+ *
172
+ * @throws {Error}
173
+ * if a property defined does not exist
174
+ */
175
+ reset(prop) {
176
+ // Reset the property
177
+ if (this["reset" + qx.Bootstrap.firstUp(prop)] != undefined) {
178
+ return this["reset" + qx.Bootstrap.firstUp(prop)]();
179
+ }
180
+
181
+ throw new Error("No such property: " + prop);
211
182
  }
212
- });
183
+ }
184
+ });
@@ -61,6 +61,10 @@ qx.Bootstrap.define("qx.core.check.DynamicTypeCheck", {
61
61
  }
62
62
  tmp = tmp.superclass;
63
63
  }
64
+ } else if (typeof window[this.__typename] === "function") {
65
+ //handle cases where the check is a globally-defined class
66
+ let clazz = window[this.__typename];
67
+ return value instanceof clazz;
64
68
  }
65
69
 
66
70
  return false;