@qooxdoo/framework 7.0.0-beta.3 → 7.0.0-beta.7

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 (105) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/Manifest.json +1 -1
  3. package/README.md +9 -3
  4. package/lib/compiler/compile-info.json +60 -58
  5. package/lib/compiler/index.js +3242 -1883
  6. package/lib/resource/qx/tool/cli/templates/skeleton/mobile/source/theme/custom/css/custom.css.map +1 -1
  7. package/lib/resource/qx/tool/loadsass.js +6 -4
  8. package/lib/resource/qx/tool/schema/compile-1-0-0.json +6 -11
  9. package/package.json +17 -3
  10. package/source/class/qx/Bootstrap.js +22 -1
  11. package/source/class/qx/bom/Blocker.js +2 -1
  12. package/source/class/qx/core/Environment.js +3 -12
  13. package/source/class/qx/core/MProperty.js +1 -1
  14. package/source/class/qx/dev/unit/Sinon.js +1 -1
  15. package/source/class/qx/io/__init__.js +5 -3
  16. package/source/class/qx/io/exception/Cancel.js +34 -0
  17. package/source/class/qx/io/exception/Exception.js +38 -0
  18. package/source/class/qx/io/exception/Protocol.js +26 -0
  19. package/source/class/qx/io/exception/Transport.js +39 -0
  20. package/source/class/qx/io/exception/__init__.js +4 -0
  21. package/source/class/qx/io/graphql/Client.js +112 -0
  22. package/source/class/qx/io/graphql/__init__.js +9 -0
  23. package/source/class/qx/io/graphql/protocol/Message.js +65 -0
  24. package/source/class/qx/io/graphql/protocol/Request.js +95 -0
  25. package/source/class/qx/io/graphql/protocol/Response.js +61 -0
  26. package/source/class/qx/io/graphql/protocol/__init__.js +6 -0
  27. package/source/class/qx/io/jsonrpc/Client.js +323 -0
  28. package/source/class/qx/io/jsonrpc/__init__.js +15 -0
  29. package/source/class/qx/io/jsonrpc/protocol/Batch.js +97 -0
  30. package/source/class/qx/io/jsonrpc/protocol/Error.js +63 -0
  31. package/source/class/qx/io/jsonrpc/protocol/Message.js +48 -0
  32. package/source/class/qx/io/jsonrpc/protocol/Notification.js +45 -0
  33. package/source/class/qx/io/jsonrpc/protocol/Parser.js +81 -0
  34. package/source/class/qx/io/jsonrpc/protocol/Request.js +93 -0
  35. package/source/class/qx/io/jsonrpc/protocol/Result.js +48 -0
  36. package/source/class/qx/io/jsonrpc/protocol/__init__.js +5 -0
  37. package/source/class/qx/io/request/authentication/Bearer.js +52 -0
  38. package/source/class/qx/io/transport/AbstractClient.js +100 -0
  39. package/source/class/qx/io/transport/AbstractTransport.js +41 -0
  40. package/source/class/qx/io/transport/Fetch.js +95 -0
  41. package/source/class/qx/io/transport/ITransport.js +40 -0
  42. package/source/class/qx/io/transport/PostMessage.js +55 -0
  43. package/source/class/qx/io/transport/Websocket.js +97 -0
  44. package/source/class/qx/io/transport/Xhr.js +139 -0
  45. package/source/class/qx/io/transport/__init__.js +18 -0
  46. package/source/class/qx/test/core/Assert.js +1 -1
  47. package/source/class/qx/test/core/Environment.js +0 -3
  48. package/source/class/qx/test/io/MAssert.js +46 -0
  49. package/source/class/qx/test/io/graphql/Client.js +169 -0
  50. package/source/class/qx/test/io/graphql/ClientFetch.js +34 -0
  51. package/source/class/qx/test/io/graphql/Request.js +42 -0
  52. package/source/class/qx/test/io/jsonrpc/Client.js +267 -0
  53. package/source/class/qx/test/io/jsonrpc/Protocol.js +80 -0
  54. package/source/class/qx/test/io/transport/PostMessage.js +56 -0
  55. package/source/class/qx/test/io/transport/Websocket.js +63 -0
  56. package/source/class/qx/test/ui/embed/Iframe.js +1 -1
  57. package/source/class/qx/test/util/DateFormat.js +45 -6
  58. package/source/class/qx/tool/cli/Cli.js +1 -0
  59. package/source/class/qx/tool/cli/commands/Compile.js +13 -3
  60. package/source/class/qx/tool/cli/commands/Es6ify.js +93 -0
  61. package/source/class/qx/tool/cli/commands/package/Install.js +1 -1
  62. package/source/class/qx/tool/cli/commands/package/Publish.js +14 -0
  63. package/source/class/qx/tool/compiler/ClassFile.js +67 -27
  64. package/source/class/qx/tool/compiler/Es6ify.js +368 -0
  65. package/source/class/qx/tool/compiler/makers/AppMaker.js +2 -1
  66. package/source/class/qx/tool/compiler/targets/Target.js +57 -47
  67. package/source/class/qx/tool/compiler/targets/meta/AbstractJavascriptMeta.js +25 -18
  68. package/source/class/qx/tool/compiler/targets/meta/BootJs.js +16 -16
  69. package/source/class/qx/tool/compiler/targets/meta/PolyfillJs.js +11 -3
  70. package/source/class/qx/tool/compiler/targets/meta/Uglify.js +10 -10
  71. package/source/class/qx/ui/core/Widget.js +70 -0
  72. package/source/class/qx/ui/decoration/MLinearBackgroundGradient.js +2 -1
  73. package/source/class/qx/ui/form/ComboBox.js +8 -3
  74. package/source/class/qx/ui/form/DateField.js +16 -1
  75. package/source/class/qx/ui/form/MenuButton.js +8 -4
  76. package/source/class/qx/ui/form/SelectBox.js +8 -3
  77. package/source/class/qx/ui/menu/AbstractButton.js +12 -8
  78. package/source/class/qx/ui/menu/Menu.js +18 -8
  79. package/source/class/qx/ui/table/pane/Model.js +10 -4
  80. package/source/class/qx/ui/window/Window.js +8 -0
  81. package/source/class/qx/util/format/DateFormat.js +44 -17
  82. package/source/resource/qx/tool/loadsass.js +6 -4
  83. package/source/resource/qx/tool/schema/compile-1-0-0.json +6 -11
  84. package/source/translation/hr.po +297 -0
  85. package/lib/resource/qx/static/blank.gif +0 -0
  86. package/source/class/qx/io/remote/Exchange.js +0 -1063
  87. package/source/class/qx/io/remote/Request.js +0 -1021
  88. package/source/class/qx/io/remote/RequestQueue.js +0 -521
  89. package/source/class/qx/io/remote/Response.js +0 -137
  90. package/source/class/qx/io/remote/Rpc.js +0 -1075
  91. package/source/class/qx/io/remote/RpcError.js +0 -198
  92. package/source/class/qx/io/remote/__init__.js +0 -88
  93. package/source/class/qx/io/remote/transport/Abstract.js +0 -513
  94. package/source/class/qx/io/remote/transport/Iframe.js +0 -652
  95. package/source/class/qx/io/remote/transport/Script.js +0 -475
  96. package/source/class/qx/io/remote/transport/XmlHttp.js +0 -1019
  97. package/source/class/qx/io/remote/transport/__init__.js +0 -3
  98. package/source/class/qx/test/io/remote/AbstractRequest.js +0 -150
  99. package/source/class/qx/test/io/remote/RequestIframe.js +0 -105
  100. package/source/class/qx/test/io/remote/RequestXhr.js +0 -151
  101. package/source/class/qx/test/io/remote/Rpc.js +0 -205
  102. package/source/class/qx/test/io/remote/__init__.js +0 -4
  103. package/source/class/qx/test/io/remote/transport/Iframe.js +0 -67
  104. package/source/class/qx/test/io/remote/transport/XmlHttp.js +0 -133
  105. package/source/class/qx/test/io/remote/transport/__init__.js +0 -4
@@ -3827,6 +3827,76 @@ qx.Class.define("qx.ui.core.Widget",
3827
3827
 
3828
3828
 
3829
3829
 
3830
+ /*
3831
+ ---------------------------------------------------------------------------
3832
+ ARIA attrs support
3833
+ ---------------------------------------------------------------------------
3834
+ */
3835
+
3836
+ /**
3837
+ * Sets the string which labels this widget. This will be read out by screenreaders. Needed if there is no
3838
+ * readable text/label in this widget which would automatically act as aria-label.
3839
+ * @param label {String} Labelling Text
3840
+ */
3841
+ setAriaLabel: function(label) {
3842
+ this.getContentElement().setAttribute("aria-label", label);
3843
+ },
3844
+
3845
+ /**
3846
+ * Marks that this widget gets labelled by another widget. This will be read out by screenreaders as first
3847
+ * information.
3848
+ * Similiar to aria-label, difference being that the labelling widget is an different widget and multiple
3849
+ * widgets can be added.
3850
+ * @param labelWidgets {qx.ui.core.Widget[]} Indefinite Number of labelling Widgets
3851
+ */
3852
+ addAriaLabelledBy: function(...labelWidgets) {
3853
+ this.__addAriaXBy(labelWidgets, "aria-labelledby");
3854
+ },
3855
+
3856
+ /**
3857
+ * Marks that this widget gets described by another widget. This will be read out by screenreaders as last
3858
+ * information. Multiple Widgets possible.
3859
+ * @param describingWidgets {qx.ui.core.Widget[]} Indefinite Number of describing Widgets
3860
+ */
3861
+ addAriaDescribedBy: function(...describingWidgets) {
3862
+ this.__addAriaXBy(describingWidgets, "aria-describedby");
3863
+ },
3864
+
3865
+ /**
3866
+ * Sets either aria-labelledby or aria-describedby
3867
+ * @param widgets {qx.ui.core.Widget[]} Indefinite Number of widgets
3868
+ * @param ariaAttr {String} aria-labelledby | aria-describedby
3869
+ */
3870
+ __addAriaXBy: function(widgets, ariaAttr) {
3871
+ if (!["aria-labelledby", "aria-describedby"].includes(ariaAttr)) {
3872
+ throw new Error("Only aria-labelledby or aria-describedby allowed!");
3873
+ }
3874
+ let idArr = [];
3875
+ for (const widget of widgets) {
3876
+ if (!(widget instanceof qx.ui.core.Widget)) {
3877
+ throw new Error("Given widget " + widget + " is not an instance of qx.ui.core.Widget!");
3878
+ }
3879
+ const contentEl = widget.getContentElement();
3880
+ let widgetId = contentEl.getAttribute("id");
3881
+ if (!widgetId) {
3882
+ widgetId = `label-${widget.toHashCode()}`;
3883
+ contentEl.setAttribute("id", widgetId);
3884
+ }
3885
+ if (!idArr.includes(widgetId)) {
3886
+ idArr.push(widgetId);
3887
+ }
3888
+ }
3889
+ if (idArr.length === 0) {
3890
+ return;
3891
+ }
3892
+ const idStr = idArr.join(" ");
3893
+ const contentEl = this.getContentElement();
3894
+ let res = contentEl.getAttribute(ariaAttr);
3895
+ res = res ? `${res} ${idStr}` : idStr;
3896
+ contentEl.setAttribute(ariaAttr, res);
3897
+ },
3898
+
3899
+
3830
3900
 
3831
3901
  /*
3832
3902
  ---------------------------------------------------------------------------
@@ -240,7 +240,8 @@ qx.Mixin.define("qx.ui.decoration.MLinearBackgroundGradient",
240
240
  *
241
241
  * @return {Boolean} Whether this implementation supports multiple gradients atop each other (true).
242
242
  */
243
- __styleLinearBackgroundGradientWithCanvas: function me(startColor, endColor, unit, orientation, startColorPosition, endColorPosition, styles, backgroundStyle) {
243
+ __styleLinearBackgroundGradientWithCanvas: function(startColor, endColor, unit, orientation, startColorPosition, endColorPosition, styles, backgroundStyle) {
244
+ const me = qx.ui.decoration.MLinearBackgroundGradient.__styleLinearBackgroundGradientWithCanvas;
244
245
  if (!me.__canvas) {
245
246
  me.__canvas = document.createElement("canvas");
246
247
  }
@@ -337,10 +337,15 @@ qx.Class.define("qx.ui.form.ComboBox",
337
337
  }
338
338
 
339
339
  // Set aria-activedescendant
340
- if (current && current[0]) {
341
- this.getChildControl("textfield").getContentElement().setAttribute("aria-activedescendant", current[0].getContentElement().getAttribute("id"));
340
+ const textFieldContentEl = this.getChildControl("textfield").getContentElement();
341
+ if (!textFieldContentEl) {
342
+ return;
343
+ }
344
+ const currentContentEl = current && current[0] ? current[0].getContentElement() : null;
345
+ if (currentContentEl) {
346
+ textFieldContentEl.setAttribute("aria-activedescendant", currentContentEl.getAttribute("id"));
342
347
  } else {
343
- this.getChildControl("textfield").getContentElement().removeAttribute("aria-activedescendant");
348
+ textFieldContentEl.removeAttribute("aria-activedescendant");
344
349
  }
345
350
  },
346
351
 
@@ -602,7 +602,22 @@ qx.Class.define("qx.ui.form.DateField",
602
602
 
603
603
  field.getFocusElement().focus();
604
604
  field.selectAllText();
605
- }
605
+ },
606
+
607
+ // overridden
608
+ setAriaLabel: function(label) {
609
+ this.getChildControl("textfield").setAriaLabel(label);
610
+ },
611
+
612
+ // overridden
613
+ addAriaLabelledBy: function(...labelWidgets) {
614
+ this.getChildControl("textfield").addAriaLabelledBy(...labelWidgets);
615
+ },
616
+
617
+ // overridden
618
+ addAriaDescribedBy: function(...describingWidgets) {
619
+ this.getChildControl("textfield").addAriaDescribedBy(...describingWidgets);
620
+ },
606
621
  },
607
622
 
608
623
 
@@ -115,7 +115,6 @@ qx.Class.define("qx.ui.form.MenuButton",
115
115
  old.resetOpener();
116
116
  }
117
117
 
118
- const contentEl = this.getContentElement();
119
118
  if (value)
120
119
  {
121
120
  value.addListener("changeVisibility", this._onMenuChange, this);
@@ -123,13 +122,18 @@ qx.Class.define("qx.ui.form.MenuButton",
123
122
 
124
123
  value.removeState("submenu");
125
124
  value.removeState("contextmenu");
126
-
127
- // ARIA attrs
125
+ }
126
+
127
+ // ARIA attrs
128
+ const contentEl = this.getContentElement();
129
+ if (!contentEl) {
130
+ return;
131
+ }
132
+ if (value) {
128
133
  contentEl.setAttribute("aria-haspopup", "menu");
129
134
  contentEl.setAttribute("aria-expanded", value.isVisible());
130
135
  contentEl.setAttribute("aria-controls", value.getContentElement().getAttribute("id"));
131
136
  } else {
132
- // ARIA attrs
133
137
  contentEl.removeAttribute("aria-haspopup");
134
138
  contentEl.removeAttribute("aria-expanded");
135
139
  contentEl.removeAttribute("aria-controls");
@@ -430,10 +430,15 @@ qx.Class.define("qx.ui.form.SelectBox",
430
430
  }
431
431
 
432
432
  // Set aria-activedescendant
433
- if (current && current[0]) {
434
- this.getContentElement().setAttribute("aria-activedescendant", current[0].getContentElement().getAttribute("id"));
433
+ const contentEl = this.getContentElement();
434
+ if (!contentEl) {
435
+ return;
436
+ }
437
+ const currentContentEl = current && current[0] ? current[0].getContentElement() : null;
438
+ if (currentContentEl) {
439
+ contentEl.setAttribute("aria-activedescendant", currentContentEl.getAttribute("id"));
435
440
  } else {
436
- this.getContentElement().removeAttribute("aria-activedescendant");
441
+ contentEl.removeAttribute("aria-activedescendant");
437
442
  }
438
443
  },
439
444
 
@@ -340,7 +340,6 @@ qx.Class.define("qx.ui.menu.AbstractButton",
340
340
  old.removeState("submenu");
341
341
  }
342
342
 
343
- const contentEl = this.getContentElement();
344
343
  if (value)
345
344
  {
346
345
  this._showChildControl("arrow");
@@ -348,17 +347,22 @@ qx.Class.define("qx.ui.menu.AbstractButton",
348
347
  value.addListener("changeVisibility", this._onMenuChange, this);
349
348
  value.setOpener(this);
350
349
  value.addState("submenu");
351
-
352
- // ARIA attrs
353
- contentEl.setAttribute("aria-haspopup", "menu");
354
- contentEl.setAttribute("aria-expanded", value.isVisible());
355
- contentEl.setAttribute("aria-controls", value.getContentElement().getAttribute("id"));
356
350
  }
357
351
  else
358
352
  {
359
353
  this._excludeChildControl("arrow");
360
-
361
- // ARIA attrs
354
+ }
355
+
356
+ // ARIA attrs
357
+ const contentEl = this.getContentElement();
358
+ if (!contentEl) {
359
+ return;
360
+ }
361
+ if (value) {
362
+ contentEl.setAttribute("aria-haspopup", "menu");
363
+ contentEl.setAttribute("aria-expanded", value.isVisible());
364
+ contentEl.setAttribute("aria-controls", value.getContentElement().getAttribute("id"));
365
+ } else {
362
366
  contentEl.removeAttribute("aria-haspopup");
363
367
  contentEl.removeAttribute("aria-expanded");
364
368
  contentEl.removeAttribute("aria-controls");
@@ -493,14 +493,19 @@ qx.Class.define("qx.ui.menu.Menu",
493
493
  if (old) {
494
494
  old.removeState("selected");
495
495
  }
496
-
497
- const opener = this.__getRootOpener();
498
- const contentEl = opener ? opener.getContentElement() : this.getContentElement();
499
496
  if (value) {
500
497
  value.addState("selected");
498
+ }
501
499
 
502
- // ARIA attrs
503
- contentEl.setAttribute("aria-activedescendant", value.getContentElement().getAttribute("id"));
500
+ // ARIA attrs
501
+ const opener = this.__getRootOpener();
502
+ const contentEl = opener ? opener.getContentElement() : this.getContentElement();
503
+ if (!contentEl) {
504
+ return;
505
+ }
506
+ const valueContentEl = value ? value.getContentElement() : null;
507
+ if (valueContentEl) {
508
+ contentEl.setAttribute("aria-activedescendant", valueContentEl.getAttribute("id"));
504
509
  } else {
505
510
  contentEl.removeAttribute("aria-activedescendant");
506
511
  }
@@ -523,10 +528,15 @@ qx.Class.define("qx.ui.menu.Menu",
523
528
  _applyOpener : function(value, old)
524
529
  {
525
530
  // ARIA attrs
526
- if (value) {
527
- this.getContentElement().setAttribute("aria-labelledby", value);
531
+ const contentEl = this.getContentElement();
532
+ if (!contentEl) {
533
+ return;
534
+ }
535
+ if (value && value.getContentElement()) {
536
+ contentEl.setAttribute("aria-labelledby", "");
537
+ this.addAriaLabelledBy(value);
528
538
  } else {
529
- this.getContentElement().removeAttribute("aria-labelledby");
539
+ contentEl.removeAttribute("aria-labelledby");
530
540
  }
531
541
  },
532
542
 
@@ -44,6 +44,10 @@ qx.Class.define("qx.ui.table.pane.Model",
44
44
  this.base(arguments);
45
45
 
46
46
  this.setTableColumnModel(tableColumnModel);
47
+
48
+ this.__defferedEventDispatcher = new qx.util.DeferredCall(function() {
49
+ this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED);
50
+ }, this);
47
51
  },
48
52
 
49
53
 
@@ -122,20 +126,21 @@ qx.Class.define("qx.ui.table.pane.Model",
122
126
  {
123
127
  __columnCount : null,
124
128
  __tableColumnModel : null,
129
+ __defferedEventDispatcher : null,
125
130
 
126
131
 
127
132
  // property modifier
128
133
  _applyFirstColumnX : function(value, old)
129
134
  {
130
135
  this.__columnCount = null;
131
- this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED);
136
+ this.__defferedEventDispatcher.schedule();
132
137
  },
133
138
 
134
139
  // property modifier
135
140
  _applyMaxColumnCount : function(value, old)
136
141
  {
137
142
  this.__columnCount = null;
138
- this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED);
143
+ this.__defferedEventDispatcher.schedule();
139
144
  },
140
145
 
141
146
 
@@ -166,7 +171,7 @@ qx.Class.define("qx.ui.table.pane.Model",
166
171
  {
167
172
  this.__columnCount = null;
168
173
 
169
- this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED);
174
+ this.__defferedEventDispatcher.schedule();
170
175
  },
171
176
 
172
177
 
@@ -177,7 +182,7 @@ qx.Class.define("qx.ui.table.pane.Model",
177
182
  */
178
183
  _onHeaderCellRendererChanged : function(evt)
179
184
  {
180
- this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED);
185
+ this.__defferedEventDispatcher.schedule();
181
186
  },
182
187
 
183
188
 
@@ -305,5 +310,6 @@ qx.Class.define("qx.ui.table.pane.Model",
305
310
  this.__tableColumnModel.removeListener("headerCellRendererChanged", this._onHeaderCellRendererChanged, this);
306
311
  }
307
312
  this.__tableColumnModel = null;
313
+ this._disposeObjects("__defferedEventDispatcher");
308
314
  }
309
315
  });
@@ -102,6 +102,11 @@ qx.Class.define("qx.ui.window.Window",
102
102
 
103
103
  // Change the resize frames appearance
104
104
  this._getResizeFrame().setAppearance("window-resize-frame");
105
+
106
+ // ARIA attrs
107
+ this.getContentElement().setAttribute("role", "dialog");
108
+ this.addAriaLabelledBy(this.getChildControl("title"));
109
+ this.addAriaDescribedBy(this.getChildControl("statusbar-text"));
105
110
  },
106
111
 
107
112
 
@@ -961,6 +966,9 @@ qx.Class.define("qx.ui.window.Window",
961
966
  } else {
962
967
  this.addState("modal");
963
968
  }
969
+
970
+ // ARIA attrs
971
+ this.getContentElement().setAttribute("aria-modal", value);
964
972
  },
965
973
 
966
974
 
@@ -64,7 +64,7 @@
64
64
  * single-quoted.
65
65
  *
66
66
  * The same format patterns will be used for both parsing and output formatting.
67
- *
67
+ *
68
68
  * NOTE: Instances of this class must be disposed of after use
69
69
  *
70
70
  */
@@ -181,6 +181,7 @@ qx.Class.define("qx.util.format.DateFormat",
181
181
  isoDate : "yyyy-MM-dd",
182
182
  isoTime : "HH:mm:ss",
183
183
  isoDateTime : "yyyy-MM-dd'T'HH:mm:ss",
184
+ isoDateTimeTz : "yyyy-MM-dd'T'HH:mm:ssZ",
184
185
  isoUtcDateTime : "yyyy-MM-dd'T'HH:mm:ss'Z'"
185
186
  },
186
187
 
@@ -406,14 +407,14 @@ qx.Class.define("qx.util.format.DateFormat",
406
407
  }
407
408
  this.__locale = value === null ? this.__initialLocale : value;
408
409
  },
409
-
410
+
410
411
  /**
411
412
  * Resets the Locale
412
413
  */
413
414
  resetLocale : function() {
414
415
  this.setLocale(null);
415
416
  },
416
-
417
+
417
418
  /**
418
419
  * Returns the locale
419
420
  */
@@ -427,7 +428,7 @@ qx.Class.define("qx.util.format.DateFormat",
427
428
 
428
429
  /**
429
430
  * Returns the original format string
430
- *
431
+ *
431
432
  * @return {String}
432
433
  */
433
434
  getFormatString() {
@@ -761,7 +762,8 @@ qx.Class.define("qx.util.format.DateFormat",
761
762
  weekOfYear : 1,
762
763
  min : 0,
763
764
  sec : 0,
764
- ms : 0
765
+ ms : 0,
766
+ tzOffsetMins: null
765
767
  };
766
768
 
767
769
  var currGroup = 1;
@@ -825,14 +827,21 @@ qx.Class.define("qx.util.format.DateFormat",
825
827
  dateValues.year = dateValues.year * dateValues.era;
826
828
  }
827
829
 
828
- var date = new Date(dateValues.year, dateValues.month, dateValues.day, (dateValues.ispm) ? (dateValues.hour + 12) : dateValues.hour, dateValues.min, dateValues.sec, dateValues.ms);
829
-
830
- if(this.__UTC) {
831
- date = new Date(date.getUTCFullYear(),date.getUTCMonth(),date.getUTCDate(),date.getUTCHours(),date.getUTCMinutes(),date.getUTCSeconds(),date.getUTCMilliseconds());
832
- }
833
-
834
- if (dateValues.month != date.getMonth() || dateValues.year != date.getFullYear()) {
835
- throw new Error("Error parsing date '" + dateStr + "': the value for day or month is too large");
830
+ var date;
831
+ if (this.__UTC || dateValues.tzOffsetMins !== null) {
832
+ var utcMs = Date.UTC(dateValues.year, dateValues.month, dateValues.day, (dateValues.ispm) ? (dateValues.hour + 12) : dateValues.hour, dateValues.min, dateValues.sec, dateValues.ms);
833
+ if (dateValues.tzOffsetMins !== 0) {
834
+ utcMs += (dateValues.tzOffsetMins * 60000);
835
+ }
836
+ date = new Date(utcMs);
837
+ if (this.__UTC && (dateValues.month !== date.getUTCMonth() || dateValues.year !== date.getUTCFullYear())) {
838
+ throw new Error("Error parsing date '" + dateStr + "': the value for day or month is too large");
839
+ }
840
+ } else {
841
+ date = new Date(dateValues.year, dateValues.month, dateValues.day, (dateValues.ispm) ? (dateValues.hour + 12) : dateValues.hour, dateValues.min, dateValues.sec, dateValues.ms);
842
+ if (dateValues.month !== date.getMonth() || dateValues.year !== date.getFullYear()) {
843
+ throw new Error("Error parsing date '" + dateStr + "': the value for day or month is too large");
844
+ }
836
845
  }
837
846
 
838
847
  return date;
@@ -1207,10 +1216,28 @@ qx.Class.define("qx.util.format.DateFormat",
1207
1216
  dateValues.hour = parseInt(value, 10) % 12;
1208
1217
  };
1209
1218
 
1210
- var ignoreManipulator = function(dateValues, value) {
1211
- return;
1219
+ var timezoneManipulator = function(dateValues, value) {
1220
+ var regEx = new RegExp("([+-]?)(\\d\\d)(?::?(\\d\\d))?$");
1221
+ var tzResults = regEx.exec(value);
1222
+ var offsetHours = parseInt(tzResults[2], 10);
1223
+ var offsetMins = parseInt(tzResults[3], 10);
1224
+ // basic check, hours range is -12 to +14 https://en.wikipedia.org/wiki/Category:UTC_offsets
1225
+ if (offsetHours > 14) {
1226
+ throw new Error("Invalid hours in time zone offset.");
1227
+ }
1228
+ if (offsetMins > 59) {
1229
+ throw new Error("Invalid minutes in time zone offset.");
1230
+ }
1231
+ dateValues.tzOffsetMins = (offsetHours * 60) + offsetMins;
1232
+ if (tzResults[1] === "-") {
1233
+ dateValues.tzOffsetMins = -dateValues.tzOffsetMins;
1234
+ }
1212
1235
  };
1213
1236
 
1237
+ // var ignoreManipulator = function(dateValues, value) {
1238
+ // return;
1239
+ // };
1240
+
1214
1241
  var narrowEraNames = ['A', 'B'];
1215
1242
  var narrowEraNameManipulator = function(dateValues, value) {
1216
1243
  dateValues.era = value == 'A' ? 1 : -1;
@@ -1755,14 +1782,14 @@ qx.Class.define("qx.util.format.DateFormat",
1755
1782
  {
1756
1783
  pattern : "Z",
1757
1784
  regex : "([\\+\\-]\\d\\d\\d\\d)",
1758
- manipulator : ignoreManipulator
1785
+ manipulator : timezoneManipulator
1759
1786
  });
1760
1787
 
1761
1788
  rules.push(
1762
1789
  {
1763
1790
  pattern : "z",
1764
1791
  regex : "(GMT[\\+\\-]\\d\\d:\\d\\d)",
1765
- manipulator : ignoreManipulator
1792
+ manipulator : timezoneManipulator
1766
1793
  });
1767
1794
  }
1768
1795
  }
@@ -1,7 +1,8 @@
1
- global.require = require;
2
- global.__filename__ = __filename;
3
- /* global loadSass */
4
- global.loadSass = new Function (
1
+ if ((typeof global !== 'undefined')) {
2
+ global.require = require;
3
+ global.__filename__ = __filename;
4
+ /* global loadSass */
5
+ global.loadSass = new Function (
5
6
  `
6
7
  // trick out sass
7
8
  process.versions.electron = "0.0.0";
@@ -11,3 +12,4 @@ global.loadSass = new Function (
11
12
  delete process.versions.electron;
12
13
  return sass;
13
14
  `);
15
+ }
@@ -168,15 +168,6 @@
168
168
  },
169
169
  "parts": {
170
170
  "$ref": "#/properties/parts"
171
- },
172
- "minify": {
173
- "$ref": "#/properties/targets"
174
- },
175
- "save-source-in-map": {
176
- "$ref": "#/properties/targets"
177
- },
178
- "save-unminified": {
179
- "$ref": "#/properties/targets"
180
171
  }
181
172
  }
182
173
  }
@@ -266,11 +257,15 @@
266
257
  "type": "boolean"
267
258
  },
268
259
  "save-source-in-map": {
269
- "description": "If true, the source file will be saved in the map file if the target supports it. Can be overridden on a per application basis.",
260
+ "description": "If true, the source file will be saved in the map file if the target supports it.",
261
+ "type": "boolean"
262
+ },
263
+ "source-map-relative-paths": {
264
+ "description": "If true, the source map files will be saved with relative paths in the map file if the target supports it.",
270
265
  "type": "boolean"
271
266
  },
272
267
  "save-unminified": {
273
- "description": "If true, the unminified files will be saved if the target supports it. Can be overridden on a per application basis.",
268
+ "description": "If true, the unminified files will be saved if the target supports it.",
274
269
  "type": "boolean"
275
270
  },
276
271
  "inline-external-scripts": {