@qooxdoo/framework 7.9.1 → 8.0.0-beta.1

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 (597) hide show
  1. package/CHANGELOG.md +191 -33
  2. package/Manifest.json +3 -3
  3. package/bin/tools/utils.js +50 -13
  4. package/lib/compiler/compile-info.json +295 -225
  5. package/lib/compiler/index.js +56729 -44017
  6. package/lib/resource/qx/tool/{cli → compiler/cli}/templates/loader/loader-node.tmpl.js +1 -0
  7. package/lib/resource/qx/tool/compiler/cli/templates/skeleton/mobile/source/theme/custom/css/custom.css.map +1 -0
  8. package/{source/resource/qx/tool → lib/resource/qx/tool/compiler}/cli/templates/template_vars.js +12 -9
  9. package/{source/resource/qx/tool → lib/resource/qx/tool/compiler}/schema/Manifest-1-0-0.json +2 -2
  10. package/lib/resource/qx/tool/{schema → compiler/schema}/Manifest-2-0-0.json +2 -2
  11. package/lib/resource/qx/tool/{schema → compiler/schema}/compile-1-0-0.json +15 -3
  12. package/{source/resource/qx/tool → lib/resource/qx/tool/compiler}/schema/qooxdoo-1-0-0.json +1 -1
  13. package/lib/resource/qx/tool/website/build/404.html +22 -22
  14. package/lib/resource/qx/tool/website/build/about.html +23 -23
  15. package/lib/resource/qx/tool/website/build/assets/common.js +30 -18
  16. package/lib/resource/qx/tool/website/build/assets/custom.css +290 -0
  17. package/lib/resource/qx/tool/website/build/assets/qxWeb.js +28 -0
  18. package/lib/resource/qx/tool/website/build/diagnostics/dependson.html +30 -30
  19. package/lib/resource/qx/tool/website/build/diagnostics/dependson.js +49 -40
  20. package/lib/resource/qx/tool/website/build/diagnostics/requiredby.html +20 -23
  21. package/lib/resource/qx/tool/website/build/diagnostics/requiredby.js +38 -31
  22. package/lib/resource/qx/tool/website/build/index.html +24 -24
  23. package/lib/resource/qx/tool/website/build/scripts/serve.js +63 -65
  24. package/lib/resource/qx/tool/website/partials/footer.html +8 -13
  25. package/lib/resource/qx/tool/website/partials/head.html +9 -7
  26. package/lib/resource/qx/tool/website/partials/header.html +3 -3
  27. package/lib/resource/qx/tool/website/src/assets/common.js +32 -0
  28. package/lib/resource/qx/tool/website/src/assets/custom.css +290 -0
  29. package/lib/resource/qx/tool/website/src/assets/qxWeb.js +28 -0
  30. package/lib/resource/qx/tool/website/src/diagnostics/dependson.js +49 -40
  31. package/lib/resource/qx/tool/website/src/diagnostics/requiredby.js +38 -31
  32. package/lib/resource/qx/tool/website/src/index.html +2 -2
  33. package/lib/resource/qx/tool/website/src/scripts/serve.js +63 -65
  34. package/package.json +20 -19
  35. package/source/boot/index.html +2 -2
  36. package/source/class/qx/Bootstrap.js +931 -705
  37. package/source/class/qx/Class.js +1476 -1451
  38. package/source/class/qx/Interface.js +40 -107
  39. package/source/class/qx/Mixin.js +58 -116
  40. package/source/class/qx/Promise.js +1 -0
  41. package/source/class/qx/Theme.js +1 -1
  42. package/source/class/qx/application/Routing.js +2 -0
  43. package/source/class/qx/bom/Font.js +3 -0
  44. package/source/class/qx/bom/client/Locale.js +5 -0
  45. package/source/class/qx/bom/request/Jsonp.js +5 -13
  46. package/source/class/qx/bom/request/Script.js +11 -35
  47. package/source/class/qx/bom/request/SimpleXhr.js +13 -41
  48. package/source/class/qx/bom/request/Xhr.js +19 -80
  49. package/source/class/qx/bom/storage/Memory.js +2 -0
  50. package/source/class/qx/bom/storage/UserData.js +2 -0
  51. package/source/class/qx/bom/storage/Web.js +2 -0
  52. package/source/class/qx/bom/webfonts/Validator.js +13 -5
  53. package/source/class/qx/core/Assert.js +14 -0
  54. package/source/class/qx/core/BaseInit.js +19 -20
  55. package/source/class/qx/core/Environment.js +23 -20
  56. package/source/class/qx/core/MEvent.js +1 -1
  57. package/source/class/qx/core/MObjectId.js +8 -6
  58. package/source/class/qx/core/MProperty.js +172 -136
  59. package/source/class/qx/core/Object.js +88 -102
  60. package/source/class/qx/core/check/AbstractCheck.js +111 -0
  61. package/source/class/qx/core/check/Any.js +63 -0
  62. package/source/class/qx/core/check/CheckFactory.js +151 -0
  63. package/source/class/qx/core/check/DynamicTypeCheck.js +90 -0
  64. package/source/class/qx/core/check/ICheck.js +75 -0
  65. package/source/class/qx/core/check/IsOneOfCheck.js +63 -0
  66. package/source/class/qx/core/check/JsDocCheck.js +71 -0
  67. package/source/class/qx/core/check/SimpleCheck.js +42 -0
  68. package/source/class/qx/core/check/standard/ArrayCheck.js +49 -0
  69. package/source/class/qx/core/check/standard/BooleanCheck.js +47 -0
  70. package/source/class/qx/core/check/standard/ClassCheck.js +33 -0
  71. package/source/class/qx/core/check/standard/ColorCheck.js +33 -0
  72. package/source/class/qx/core/check/standard/DateCheck.js +49 -0
  73. package/source/class/qx/core/check/standard/DecoratorCheck.js +33 -0
  74. package/source/class/qx/core/check/standard/DocumentCheck.js +40 -0
  75. package/source/class/qx/core/check/standard/ElementCheck.js +40 -0
  76. package/source/class/qx/core/check/standard/ErrorCheck.js +46 -0
  77. package/source/class/qx/core/check/standard/EventCheck.js +40 -0
  78. package/source/class/qx/core/check/standard/FontCheck.js +33 -0
  79. package/source/class/qx/core/check/standard/FunctionCheck.js +49 -0
  80. package/source/class/qx/core/check/standard/IntegerCheck.js +54 -0
  81. package/source/class/qx/core/check/standard/InterfaceCheck.js +33 -0
  82. package/source/class/qx/core/check/standard/MapCheck.js +33 -0
  83. package/source/class/qx/core/check/standard/MixinCheck.js +33 -0
  84. package/source/class/qx/core/check/standard/NodeCheck.js +40 -0
  85. package/source/class/qx/core/check/standard/NumberCheck.js +48 -0
  86. package/source/class/qx/core/check/standard/ObjectCheck.js +33 -0
  87. package/source/class/qx/core/check/standard/PositiveIntegerCheck.js +45 -0
  88. package/source/class/qx/core/check/standard/PositiveNumberCheck.js +45 -0
  89. package/source/class/qx/core/check/standard/PromiseCheck.js +33 -0
  90. package/source/class/qx/core/check/standard/RegExpCheck.js +46 -0
  91. package/source/class/qx/core/check/standard/StringCheck.js +43 -0
  92. package/source/class/qx/core/check/standard/ThemeCheck.js +33 -0
  93. package/source/class/qx/core/check/standard/WindowCheck.js +40 -0
  94. package/source/class/qx/core/property/ExplicitPropertyStorage.js +87 -0
  95. package/source/class/qx/core/property/GroupProperty.js +262 -0
  96. package/source/class/qx/core/property/IProperty.js +46 -0
  97. package/source/class/qx/core/property/IPropertyStorage.js +83 -0
  98. package/source/class/qx/core/property/ImmutableArrayStorage.js +38 -0
  99. package/source/class/qx/core/property/ImmutableDataArrayStorage.js +38 -0
  100. package/source/class/qx/core/property/ImmutableObjectStorage.js +39 -0
  101. package/source/class/qx/core/property/Property.js +1481 -0
  102. package/source/class/qx/core/property/PropertyStorageFactory.js +22 -0
  103. package/source/class/qx/core/property/SimplePropertyStorage.js +105 -0
  104. package/source/class/qx/data/Array.js +102 -57
  105. package/source/class/qx/data/MBinding.js +4 -29
  106. package/source/class/qx/data/SingleValueBinding.js +596 -1495
  107. package/source/class/qx/data/binding/AbstractSegment.js +197 -0
  108. package/source/class/qx/data/binding/ArrayIndexSegment.js +148 -0
  109. package/source/class/qx/data/binding/IInputReceiver.js +14 -0
  110. package/source/class/qx/data/binding/PropNameSegment.js +150 -0
  111. package/source/class/qx/data/controller/CheckedList.js +1 -1
  112. package/source/class/qx/data/controller/Form.js +78 -8
  113. package/source/class/qx/data/controller/Tree.js +27 -117
  114. package/source/class/qx/data/marshal/Json.js +46 -149
  115. package/source/class/qx/data/store/Json.js +0 -2
  116. package/source/class/qx/dev/Debug.js +1 -1
  117. package/source/class/qx/dev/LeakDetector.js +144 -0
  118. package/source/class/qx/dev/unit/AsyncWrapper.js +1 -0
  119. package/source/class/qx/dev/unit/MMock.js +7 -2
  120. package/source/class/qx/dev/unit/Sinon.js +0 -4
  121. package/source/class/qx/dev/unit/TestClass.js +2 -2
  122. package/source/class/qx/dev/unit/TestFunction.js +1 -0
  123. package/source/class/qx/dev/unit/TestLoaderBasic.js +1 -0
  124. package/source/class/qx/dev/unit/TestRunner.js +106 -0
  125. package/source/class/qx/event/IEventDispatcher.js +8 -4
  126. package/source/class/qx/event/Manager.js +4 -0
  127. package/source/class/qx/event/Messaging.js +2 -0
  128. package/source/class/qx/event/Pool.js +7 -0
  129. package/source/class/qx/event/Registration.js +33 -55
  130. package/source/class/qx/event/Timer.js +2 -0
  131. package/source/class/qx/event/Utils.js +25 -8
  132. package/source/class/qx/event/dispatch/AbstractBubbling.js +98 -194
  133. package/source/class/qx/event/dispatch/Direct.js +18 -13
  134. package/source/class/qx/event/handler/Appear.js +20 -24
  135. package/source/class/qx/event/handler/Application.js +4 -0
  136. package/source/class/qx/event/handler/DragDrop.js +182 -385
  137. package/source/class/qx/event/handler/Element.js +3 -0
  138. package/source/class/qx/event/handler/Focus.js +36 -30
  139. package/source/class/qx/event/handler/Input.js +5 -0
  140. package/source/class/qx/event/handler/Keyboard.js +107 -165
  141. package/source/class/qx/event/handler/Pointer.js +39 -68
  142. package/source/class/qx/event/handler/PointerCore.js +7 -25
  143. package/source/class/qx/event/handler/Window.js +5 -0
  144. package/source/class/qx/event/type/Event.js +12 -0
  145. package/source/class/qx/event/type/KeySequence.js +3 -0
  146. package/source/class/qx/event/type/Native.js +3 -0
  147. package/source/class/qx/html/Element.js +26 -91
  148. package/source/class/qx/io/jsonrpc/Client.js +1 -1
  149. package/source/class/qx/io/jsonrpc/protocol/Error.js +2 -2
  150. package/source/class/qx/io/jsonrpc/protocol/Parser.js +1 -0
  151. package/source/class/qx/io/jsonrpc/protocol/Result.js +2 -2
  152. package/source/class/qx/io/request/Xhr.js +3 -8
  153. package/source/class/qx/lang/normalize/Array.js +23 -1
  154. package/source/class/qx/locale/Date.js +520 -113
  155. package/source/class/qx/locale/LocalizedString.js +3 -0
  156. package/source/class/qx/locale/Manager.js +14 -3
  157. package/source/class/qx/locale/Number.js +60 -7
  158. package/source/class/qx/log/Logger.js +1 -1
  159. package/source/class/qx/module/Animation.js +2 -0
  160. package/source/class/qx/module/Attribute.js +2 -0
  161. package/source/class/qx/module/Css.js +7 -24
  162. package/source/class/qx/module/Event.js +2 -0
  163. package/source/class/qx/module/Manipulating.js +2 -0
  164. package/source/class/qx/module/Traversing.js +2 -0
  165. package/source/class/qx/test/Bootstrap.js +68 -53
  166. package/source/class/qx/test/Class.js +310 -2
  167. package/source/class/qx/test/Mixin.js +192 -42
  168. package/source/class/qx/test/Promise.js +129 -331
  169. package/source/class/qx/test/Theme.js +11 -0
  170. package/source/class/qx/test/bom/Font.js +2 -5
  171. package/source/class/qx/test/bom/Template.js +1 -1
  172. package/source/class/qx/test/compiler/ClassFile.js +14 -0
  173. package/source/class/qx/test/core/Assert.js +12 -0
  174. package/source/class/qx/test/core/Environment.js +17 -3
  175. package/source/class/qx/test/core/InheritanceDummy.js +10 -1
  176. package/source/class/qx/test/core/Object.js +51 -24
  177. package/source/class/qx/test/core/ObjectId.js +10 -1
  178. package/source/class/qx/test/core/Property.js +1338 -121
  179. package/source/class/qx/test/core/PropertyHelper.js +12 -0
  180. package/source/class/qx/test/core/Target.js +1 -0
  181. package/source/class/qx/test/core/Validation.js +2 -0
  182. package/source/class/qx/test/data/DataArray.js +218 -639
  183. package/source/class/qx/test/data/DataArrayWithChangeBubble.js +45 -215
  184. package/source/class/qx/test/data/MultiBinding.js +42 -0
  185. package/source/class/qx/test/data/async/__init__.js +4 -0
  186. package/source/class/qx/test/data/controller/Form.js +523 -14
  187. package/source/class/qx/test/data/controller/List.js +94 -426
  188. package/source/class/qx/test/data/controller/ListReverse.js +5 -20
  189. package/source/class/qx/test/data/controller/ListWithObjects.js +49 -225
  190. package/source/class/qx/test/data/controller/Object.js +54 -222
  191. package/source/class/qx/test/data/controller/Tree.js +195 -934
  192. package/source/class/qx/test/data/marshal/Json.js +74 -312
  193. package/source/class/qx/test/data/singlevalue/Array.js +55 -279
  194. package/source/class/qx/test/data/singlevalue/Async.js +173 -0
  195. package/source/class/qx/test/data/singlevalue/Deep.js +148 -327
  196. package/source/class/qx/test/data/singlevalue/Resolve.js +8 -28
  197. package/source/class/qx/test/data/singlevalue/Simple.js +124 -359
  198. package/source/class/qx/test/data/store/Json.js +86 -254
  199. package/source/class/qx/test/data/store/Jsonp.js +9 -29
  200. package/source/class/qx/test/data/store/Offline.js +2 -8
  201. package/source/class/qx/test/data/store/Rest.js +3 -3
  202. package/source/class/qx/test/dev/unit/Requirements.js +26 -10
  203. package/source/class/qx/test/event/GlobalError.js +2 -2
  204. package/source/class/qx/test/html/Iframe.js +1 -1
  205. package/source/class/qx/test/io/graphql/Client.js +2 -0
  206. package/source/class/qx/test/io/jsonrpc/Protocol.js +4 -2
  207. package/source/class/qx/test/io/request/MRequest.js +2 -8
  208. package/source/class/qx/test/io/request/Xhr.js +27 -117
  209. package/source/class/qx/test/lang/Function.js +6 -25
  210. package/source/class/qx/test/lang/Type.js +31 -13
  211. package/source/class/qx/test/locale/Date.js +173 -2
  212. package/source/class/qx/test/locale/Locale.js +23 -28
  213. package/source/class/qx/test/locale/Number.js +71 -0
  214. package/source/class/qx/test/log/Logger.js +7 -1
  215. package/source/class/qx/test/log/fixture/ClassA.js +2 -5
  216. package/source/class/qx/test/mobile/basic/Atom.js +3 -3
  217. package/source/class/qx/test/mobile/container/Scroll.js +4 -4
  218. package/source/class/qx/test/mobile/form/CheckBox.js +6 -12
  219. package/source/class/qx/test/performance/Property.js +5 -4
  220. package/source/class/qx/test/performance/widget/WidgetWithDecorator.js +2 -0
  221. package/source/class/qx/test/theme/Simple.js +34 -0
  222. package/source/class/qx/test/{MAppearance.js → theme/SimpleAppearance.js} +5 -4
  223. package/source/class/qx/test/{MDecoration.js → theme/SimpleDecoration.js} +6 -4
  224. package/source/class/qx/test/theme/manager/Color.js +23 -15
  225. package/source/class/qx/test/theme/manager/Decoration.js +23 -15
  226. package/source/class/qx/test/theme/manager/Font.js +23 -15
  227. package/source/class/qx/test/theme/manager/Icon.js +23 -15
  228. package/source/class/qx/test/theme/manager/Meta.js +33 -20
  229. package/source/class/qx/test/tool/__init__.js +3 -0
  230. package/source/class/qx/test/tool/cli/AbstractValue.js +274 -0
  231. package/source/class/qx/test/tool/cli/Argument.js +384 -0
  232. package/source/class/qx/test/tool/cli/Command.js +387 -0
  233. package/source/class/qx/test/tool/cli/Flag.js +413 -0
  234. package/source/class/qx/test/tool/cli/__init__.js +3 -0
  235. package/source/class/qx/test/ui/LayoutTestCase.js +1 -14
  236. package/source/class/qx/test/ui/basic/Label.js +106 -0
  237. package/source/class/qx/test/ui/core/Blocker.js +125 -3
  238. package/source/class/qx/test/ui/form/Form.js +106 -0
  239. package/source/class/qx/test/ui/form/FormManager.js +6 -5
  240. package/source/class/qx/test/ui/form/SplitButton.js +1 -1
  241. package/source/class/qx/test/ui/toolbar/OverflowHandling.js +13 -14
  242. package/source/class/qx/test/ui/toolbar/ToolBar.js +16 -16
  243. package/source/class/qx/test/ui/tree/TreeFolder.js +5 -7
  244. package/source/class/qx/test/ui/tree/virtual/AbstractTreeTest.js +2 -0
  245. package/source/class/qx/test/ui/tree/virtual/Tree.js +36 -0
  246. package/source/class/qx/test/util/DateFormat.js +1 -1
  247. package/source/class/qx/test/util/PropertyUtil.js +0 -36
  248. package/source/class/qx/theme/classic/Appearance.js +1 -1
  249. package/source/class/qx/theme/indigo/ColorDark.js +2 -0
  250. package/source/class/qx/theme/manager/Font.js +6 -1
  251. package/source/class/qx/theme/manager/Meta.js +2 -1
  252. package/source/class/qx/theme/simple/Appearance.js +31 -95
  253. package/source/class/qx/theme/simple/Decoration.js +0 -1
  254. package/source/class/qx/theme/tangible/Appearance.js +1 -1
  255. package/source/class/qx/tool/cli/AbstractCliApp.js +72 -0
  256. package/source/class/qx/tool/cli/AbstractValue.js +186 -0
  257. package/source/class/qx/tool/cli/Argument.js +155 -0
  258. package/source/class/qx/tool/cli/Command.js +518 -0
  259. package/source/class/qx/tool/cli/Flag.js +202 -0
  260. package/source/class/qx/tool/cli/Parser.js +39 -0
  261. package/source/class/qx/tool/cli/__init__.js +26 -1
  262. package/source/class/qx/tool/compiler/Analyser.js +41 -13
  263. package/source/class/qx/tool/compiler/ClassFile.js +37 -9
  264. package/source/class/qx/tool/compiler/Console.js +2 -0
  265. package/source/class/qx/tool/compiler/MetaExtraction.js +53 -33
  266. package/source/class/qx/tool/compiler/app/Library.js +1 -1
  267. package/source/class/qx/tool/compiler/app/WebFont.js +2 -0
  268. package/source/class/qx/tool/compiler/cli/Application.js +58 -0
  269. package/source/class/qx/tool/{cli/commands → compiler/cli}/Command.js +99 -45
  270. package/source/class/qx/tool/{cli → compiler/cli}/ConfigDb.js +7 -7
  271. package/source/class/qx/tool/compiler/cli/ConfigLoader.js +272 -0
  272. package/source/class/qx/tool/{cli → compiler/cli}/LibraryApplication.js +3 -3
  273. package/source/class/qx/tool/compiler/cli/RootCommand.js +63 -0
  274. package/source/class/qx/tool/{cli → compiler/cli}/Watch.js +49 -24
  275. package/source/class/qx/tool/compiler/cli/__init__.js +3 -0
  276. package/source/class/qx/tool/{cli → compiler/cli}/api/AbstractApi.js +2 -11
  277. package/source/class/qx/tool/{cli → compiler/cli}/api/CompilerApi.js +11 -10
  278. package/source/class/qx/tool/{cli → compiler/cli}/api/LibraryApi.js +13 -4
  279. package/source/class/qx/tool/{cli → compiler/cli}/api/Test.js +1 -1
  280. package/source/class/qx/tool/compiler/cli/commands/Add.js +49 -0
  281. package/source/class/qx/tool/{cli → compiler/cli}/commands/Clean.js +12 -25
  282. package/source/class/qx/tool/{cli → compiler/cli}/commands/Compile.js +524 -615
  283. package/source/class/qx/tool/{cli → compiler/cli}/commands/Config.js +22 -20
  284. package/source/class/qx/tool/{cli → compiler/cli}/commands/Create.js +77 -54
  285. package/source/class/qx/tool/{cli → compiler/cli}/commands/Deploy.js +45 -60
  286. package/source/class/qx/tool/{cli → compiler/cli}/commands/Es6ify.js +57 -41
  287. package/source/class/qx/tool/{cli → compiler/cli}/commands/ExportGlyphs.js +26 -7
  288. package/source/class/qx/tool/compiler/cli/commands/Lint.js +420 -0
  289. package/source/class/qx/tool/{cli → compiler/cli}/commands/Migrate.js +40 -20
  290. package/source/class/qx/tool/{cli → compiler/cli}/commands/Package.js +20 -32
  291. package/source/class/qx/tool/compiler/cli/commands/Pkg.js +36 -0
  292. package/source/class/qx/tool/compiler/cli/commands/Prettier.js +278 -0
  293. package/source/class/qx/tool/{cli → compiler/cli}/commands/Run.js +43 -39
  294. package/source/class/qx/tool/{cli → compiler/cli}/commands/Serve.js +63 -61
  295. package/source/class/qx/tool/{cli → compiler/cli}/commands/Test.js +49 -52
  296. package/source/class/qx/tool/{cli → compiler/cli}/commands/Typescript.js +51 -30
  297. package/source/class/qx/tool/{cli → compiler/cli}/commands/add/Class.js +54 -31
  298. package/source/class/qx/tool/{cli → compiler/cli}/commands/add/Script.js +56 -32
  299. package/source/class/qx/tool/{cli → compiler/cli}/commands/config/Delete.js +19 -13
  300. package/source/class/qx/tool/{cli → compiler/cli}/commands/config/Get.js +19 -13
  301. package/source/class/qx/tool/{cli → compiler/cli}/commands/config/List.js +20 -20
  302. package/source/class/qx/tool/{cli → compiler/cli}/commands/config/Set.js +28 -20
  303. package/source/class/qx/tool/{cli → compiler/cli}/commands/package/Install.js +140 -75
  304. package/source/class/qx/tool/{cli → compiler/cli}/commands/package/List.js +119 -80
  305. package/source/class/qx/tool/{cli → compiler/cli}/commands/package/Publish.js +194 -178
  306. package/source/class/qx/tool/{cli → compiler/cli}/commands/package/Remove.js +18 -21
  307. package/source/class/qx/tool/{cli → compiler/cli}/commands/package/Update.js +90 -69
  308. package/source/class/qx/tool/{cli → compiler/cli}/commands/package/Upgrade.js +67 -54
  309. package/source/class/qx/tool/compiler/makers/AbstractAppMaker.js +2 -1
  310. package/source/class/qx/tool/compiler/resources/Manager.js +2 -0
  311. package/source/class/qx/tool/compiler/resources/ScssConverter.js +1 -1
  312. package/source/class/qx/tool/compiler/resources/ScssFile.js +1 -1
  313. package/source/class/qx/tool/compiler/targets/Target.js +5 -10
  314. package/source/class/qx/tool/compiler/targets/TypeScriptWriter.js +6 -2
  315. package/source/class/qx/tool/compiler/targets/meta/ApplicationMeta.js +2 -4
  316. package/source/class/qx/tool/compiler/targets/meta/BootJs.js +2 -0
  317. package/source/class/qx/tool/compiler/targets/meta/PackageJavascript.js +2 -0
  318. package/source/class/qx/tool/config/Abstract.js +5 -5
  319. package/source/class/qx/tool/config/Lockfile.js +1 -1
  320. package/source/class/qx/tool/migration/BaseMigration.js +9 -7
  321. package/source/class/qx/tool/migration/M6_0_0.js +3 -3
  322. package/source/class/qx/tool/migration/M8_0_0.js +958 -0
  323. package/source/class/qx/tool/utils/Debounce.js +0 -1
  324. package/source/class/qx/tool/utils/Http.js +109 -21
  325. package/source/class/qx/tool/utils/LogManager.js +7 -0
  326. package/source/class/qx/tool/utils/Promisify.js +12 -1
  327. package/source/class/qx/tool/utils/QooxdooVersions.js +193 -0
  328. package/source/class/qx/tool/utils/Utils.js +8 -5
  329. package/source/class/qx/tool/utils/Website.js +9 -222
  330. package/source/class/qx/tool/utils/Zip.js +47 -0
  331. package/source/class/qx/tool/utils/files/Utils.js +3 -11
  332. package/source/class/qx/tool/utils/json/Tokenizer.js +5 -0
  333. package/source/class/qx/ui/basic/Atom.js +8 -8
  334. package/source/class/qx/ui/core/Blocker.js +17 -4
  335. package/source/class/qx/ui/core/DragDropCursor.js +2 -1
  336. package/source/class/qx/ui/core/EventHandler.js +13 -21
  337. package/source/class/qx/ui/core/LayoutItem.js +8 -31
  338. package/source/class/qx/ui/core/MExecutable.js +21 -43
  339. package/source/class/qx/ui/core/MNativeOverflow.js +4 -2
  340. package/source/class/qx/ui/core/Widget.js +50 -165
  341. package/source/class/qx/ui/core/scroll/IScrollBar.js +9 -3
  342. package/source/class/qx/ui/core/scroll/ScrollBar.js +7 -1
  343. package/source/class/qx/ui/core/scroll/ScrollPane.js +12 -4
  344. package/source/class/qx/ui/embed/Html.js +6 -2
  345. package/source/class/qx/ui/form/AbstractField.js +4 -12
  346. package/source/class/qx/ui/form/Button.js +6 -4
  347. package/source/class/qx/ui/form/CheckedSelectBox.js +8 -8
  348. package/source/class/qx/ui/form/FileSelectorButton.js +1 -1
  349. package/source/class/qx/ui/form/Form.js +3 -0
  350. package/source/class/qx/ui/form/IListItem.js +3 -1
  351. package/source/class/qx/ui/form/IRadioItem.js +3 -1
  352. package/source/class/qx/ui/form/MForm.js +3 -1
  353. package/source/class/qx/ui/form/Slider.js +6 -2
  354. package/source/class/qx/ui/form/SplitButton.js +5 -5
  355. package/source/class/qx/ui/form/TextField.js +1 -2
  356. package/source/class/qx/ui/form/validation/Manager.js +6 -2
  357. package/source/class/qx/ui/menubar/Button.js +1 -1
  358. package/source/class/qx/ui/mobile/basic/Atom.js +5 -5
  359. package/source/class/qx/ui/mobile/dialog/Menu.js +9 -31
  360. package/source/class/qx/ui/mobile/dialog/Popup.js +13 -1
  361. package/source/class/qx/ui/table/pane/FocusIndicator.js +5 -2
  362. package/source/class/qx/ui/table/pane/Scroller.js +11 -28
  363. package/source/class/qx/ui/table/selection/Model.js +1 -0
  364. package/source/class/qx/ui/toolbar/Button.js +1 -1
  365. package/source/class/qx/ui/toolbar/CheckBox.js +1 -1
  366. package/source/class/qx/ui/toolbar/FileSelectorButton.js +1 -2
  367. package/source/class/qx/ui/toolbar/Part.js +2 -2
  368. package/source/class/qx/ui/toolbar/PartContainer.js +2 -2
  369. package/source/class/qx/ui/toolbar/ToolBar.js +24 -49
  370. package/source/class/qx/ui/tree/VirtualTree.js +6 -4
  371. package/source/class/qx/ui/tree/core/AbstractItem.js +10 -17
  372. package/source/class/qx/ui/tree/core/IVirtualTree.js +4 -2
  373. package/source/class/qx/ui/tree/provider/IVirtualTreeProvider.js +20 -10
  374. package/source/class/qx/ui/treevirtual/SimpleTreeDataModel.js +4 -1
  375. package/source/class/qx/ui/virtual/cell/Cell.js +20 -48
  376. package/source/class/qx/ui/virtual/cell/WidgetCell.js +2 -4
  377. package/source/class/qx/ui/virtual/core/Axis.js +4 -0
  378. package/source/class/qx/ui/virtual/core/ILayer.js +14 -10
  379. package/source/class/qx/ui/virtual/core/Scroller.js +4 -4
  380. package/source/class/qx/ui/virtual/layer/WidgetCell.js +4 -0
  381. package/source/class/qx/ui/virtual/selection/Abstract.js +3 -0
  382. package/source/class/qx/ui/virtual/selection/MModel.js +1 -1
  383. package/source/class/qx/ui/window/IDesktop.js +6 -2
  384. package/source/class/qx/ui/window/IWindowManager.js +10 -4
  385. package/source/class/qx/ui/window/MDesktop.js +2 -1
  386. package/source/class/qx/ui/window/Manager.js +1 -1
  387. package/source/class/qx/ui/window/Window.js +6 -4
  388. package/source/class/qx/util/OOUtil.js +8 -9
  389. package/source/class/qx/util/PropertyUtil.js +34 -154
  390. package/source/class/qx/util/ResponseParser.js +2 -0
  391. package/source/class/qx/util/Serializer.js +69 -114
  392. package/source/class/qx/util/format/DateFormat.js +3 -2
  393. package/source/global.d.ts +4 -0
  394. package/source/resource/qx/tool/bin/download-assets +0 -2
  395. package/source/resource/qx/tool/{cli → compiler/cli}/templates/loader/loader-node.tmpl.js +1 -0
  396. package/{lib/resource/qx/tool → source/resource/qx/tool/compiler}/cli/templates/template_vars.js +12 -9
  397. package/{lib/resource/qx/tool → source/resource/qx/tool/compiler}/schema/Manifest-1-0-0.json +2 -2
  398. package/source/resource/qx/tool/{schema → compiler/schema}/Manifest-2-0-0.json +2 -2
  399. package/source/resource/qx/tool/{schema → compiler/schema}/compile-1-0-0.json +15 -3
  400. package/{lib/resource/qx/tool → source/resource/qx/tool/compiler}/schema/qooxdoo-1-0-0.json +1 -1
  401. package/source/resource/qx/tool/website/build/404.html +22 -22
  402. package/source/resource/qx/tool/website/build/about.html +23 -23
  403. package/source/resource/qx/tool/website/build/assets/common.js +30 -18
  404. package/source/resource/qx/tool/website/build/assets/custom.css +290 -0
  405. package/source/resource/qx/tool/website/build/assets/qxWeb.js +28 -0
  406. package/source/resource/qx/tool/website/build/diagnostics/dependson.html +30 -30
  407. package/source/resource/qx/tool/website/build/diagnostics/dependson.js +49 -40
  408. package/source/resource/qx/tool/website/build/diagnostics/requiredby.html +20 -23
  409. package/source/resource/qx/tool/website/build/diagnostics/requiredby.js +38 -31
  410. package/source/resource/qx/tool/website/build/index.html +24 -24
  411. package/source/resource/qx/tool/website/build/scripts/serve.js +63 -65
  412. package/source/resource/qx/tool/website/partials/footer.html +8 -13
  413. package/source/resource/qx/tool/website/partials/head.html +9 -7
  414. package/source/resource/qx/tool/website/partials/header.html +3 -3
  415. package/source/resource/qx/tool/website/src/assets/common.js +32 -0
  416. package/source/resource/qx/tool/website/src/assets/custom.css +290 -0
  417. package/source/resource/qx/tool/website/src/assets/qxWeb.js +28 -0
  418. package/source/resource/qx/tool/website/src/diagnostics/dependson.js +49 -40
  419. package/source/resource/qx/tool/website/src/diagnostics/requiredby.js +38 -31
  420. package/source/resource/qx/tool/website/src/index.html +2 -2
  421. package/source/resource/qx/tool/website/src/scripts/serve.js +63 -65
  422. package/lib/resource/qx/tool/bin/build-devtools +0 -13
  423. package/lib/resource/qx/tool/bin/build-website +0 -15
  424. package/lib/resource/qx/tool/bin/download-assets +0 -23
  425. package/lib/resource/qx/tool/cli/templates/skeleton/mobile/source/theme/custom/css/custom.css.map +0 -1
  426. package/lib/resource/qx/tool/website/build/assets/bootstrap.css +0 -7
  427. package/lib/resource/qx/tool/website/build/assets/bootstrap.min.css +0 -7
  428. package/lib/resource/qx/tool/website/build/assets/bootstrap.min.css.map +0 -1
  429. package/lib/resource/qx/tool/website/build/assets/jquery.js +0 -5453
  430. package/lib/resource/qx/tool/website/build/qooxdoo.css +0 -21
  431. package/lib/resource/qx/tool/website/sass/qooxdoo.css +0 -3
  432. package/lib/resource/qx/tool/website/sass/qooxdoo.css.map +0 -1
  433. package/lib/resource/qx/tool/website/src/assets/bootstrap.css +0 -7
  434. package/lib/resource/qx/tool/website/src/assets/bootstrap.min.css +0 -7
  435. package/lib/resource/qx/tool/website/src/assets/bootstrap.min.css.map +0 -1
  436. package/lib/resource/qx/tool/website/src/assets/jquery.js +0 -5453
  437. package/source/class/qx/core/Property.js +0 -2100
  438. package/source/class/qx/tool/cli/Application.js +0 -47
  439. package/source/class/qx/tool/cli/Cli.js +0 -713
  440. package/source/class/qx/tool/cli/commands/Add.js +0 -46
  441. package/source/class/qx/tool/cli/commands/Lint.js +0 -255
  442. package/source/class/qx/tool/cli/commands/Pkg.js +0 -56
  443. package/source/class/qx/tool/cli/commands/package/Migrate.js +0 -37
  444. package/source/class/qx/tool/compiler/app/Cldr.js +0 -725
  445. package/source/resource/qx/tool/bin/build-devtools +0 -13
  446. package/source/resource/qx/tool/bin/build-website +0 -15
  447. package/source/resource/qx/tool/website/build/assets/bootstrap.css +0 -7
  448. package/source/resource/qx/tool/website/build/assets/bootstrap.min.css +0 -7
  449. package/source/resource/qx/tool/website/build/assets/bootstrap.min.css.map +0 -1
  450. package/source/resource/qx/tool/website/build/assets/jquery.js +0 -5453
  451. package/source/resource/qx/tool/website/build/qooxdoo.css +0 -21
  452. package/source/resource/qx/tool/website/sass/qooxdoo.scss +0 -31
  453. package/source/resource/qx/tool/website/src/assets/bootstrap.css +0 -7
  454. package/source/resource/qx/tool/website/src/assets/bootstrap.min.css +0 -7
  455. package/source/resource/qx/tool/website/src/assets/bootstrap.min.css.map +0 -1
  456. package/source/resource/qx/tool/website/src/assets/jquery.js +0 -5453
  457. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/TypeScriptWriter-base_declaration.d.ts +0 -0
  458. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/class/default.tmpl.js +0 -0
  459. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/class/header.tmpl.js +0 -0
  460. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/class/interface.tmpl.js +0 -0
  461. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/class/mixin.tmpl.js +0 -0
  462. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/class/singleton.tmpl.js +0 -0
  463. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/loader/loader-browser.tmpl.js +0 -0
  464. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/loader/loader-rhino.tmpl.js +0 -0
  465. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/.gitignore.tmpl +0 -0
  466. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/Manifest.tmpl.json +0 -0
  467. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/compile.tmpl.json +0 -0
  468. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/readme.tmpl.md +0 -0
  469. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/boot/index.tmpl.html +0 -0
  470. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/boot/nojs.tmpl.html +0 -0
  471. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/Application.tmpl.js +0 -0
  472. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/__init__.tmpl.js +0 -0
  473. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/test/DemoTest.tmpl.js +0 -0
  474. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Appearance.tmpl.js +0 -0
  475. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Color.tmpl.js +0 -0
  476. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Decoration.tmpl.js +0 -0
  477. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Font.tmpl.js +0 -0
  478. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Theme.tmpl.js +0 -0
  479. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/app.png +0 -0
  480. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/favicon.png +0 -0
  481. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/js_256x256.png +0 -0
  482. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/test.png +0 -0
  483. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/translation/readme.txt +0 -0
  484. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/.gitignore.tmpl +0 -0
  485. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/Manifest.tmpl.json +0 -0
  486. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/compile.tmpl.json +0 -0
  487. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/readme.tmpl.md +0 -0
  488. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/boot/index.tmpl.html +0 -0
  489. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/boot/nojs.tmpl.html +0 -0
  490. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/Application.tmpl.js +0 -0
  491. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/__init__.tmpl.js +0 -0
  492. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/page/Login.tmpl.js +0 -0
  493. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/page/Overview.tmpl.js +0 -0
  494. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/page/__init__.tmpl.js +0 -0
  495. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/app.png +0 -0
  496. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/css/.gitignore.tmpl +0 -0
  497. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/favicon.png +0 -0
  498. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/js_256x256.png +0 -0
  499. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/theme/custom/css/custom.css +0 -0
  500. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/translation/readme.txt +0 -0
  501. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/.gitignore.tmpl +0 -0
  502. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/Manifest.tmpl.json +0 -0
  503. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/compile.tmpl.json +0 -0
  504. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/readme.tmpl.md +0 -0
  505. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/Button.tmpl.js +0 -0
  506. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/__init__.tmpl.js +0 -0
  507. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/demo/Application.tmpl.js +0 -0
  508. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/resource/custom/test.png +0 -0
  509. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/test/DemoTest.tmpl.js +0 -0
  510. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Appearance.tmpl.js +0 -0
  511. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Color.tmpl.js +0 -0
  512. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Decoration.tmpl.js +0 -0
  513. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Font.tmpl.js +0 -0
  514. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Theme.tmpl.js +0 -0
  515. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/resource/custom/test.png +0 -0
  516. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/translation/readme.txt +0 -0
  517. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/.gitignore.tmpl +0 -0
  518. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/Manifest.tmpl.json +0 -0
  519. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/compile.tmpl.json +0 -0
  520. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/readme.tmpl.txt +0 -0
  521. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/class/custom/Application.tmpl.js +0 -0
  522. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/class/custom/__init__.tmpl.js +0 -0
  523. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/class/custom/test/DemoTest.tmpl.js +0 -0
  524. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/resource/custom/.gitignore.tmpl +0 -0
  525. /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/translation/readme.txt +0 -0
  526. /package/lib/resource/qx/tool/{loadsass.js → compiler/loadsass.js} +0 -0
  527. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/TypeScriptWriter-base_declaration.d.ts +0 -0
  528. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/class/default.tmpl.js +0 -0
  529. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/class/header.tmpl.js +0 -0
  530. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/class/interface.tmpl.js +0 -0
  531. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/class/mixin.tmpl.js +0 -0
  532. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/class/singleton.tmpl.js +0 -0
  533. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/loader/loader-browser.tmpl.js +0 -0
  534. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/loader/loader-rhino.tmpl.js +0 -0
  535. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/.gitignore.tmpl +0 -0
  536. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/Manifest.tmpl.json +0 -0
  537. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/compile.tmpl.json +0 -0
  538. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/readme.tmpl.md +0 -0
  539. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/boot/index.tmpl.html +0 -0
  540. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/boot/nojs.tmpl.html +0 -0
  541. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/Application.tmpl.js +0 -0
  542. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/__init__.tmpl.js +0 -0
  543. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/test/DemoTest.tmpl.js +0 -0
  544. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Appearance.tmpl.js +0 -0
  545. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Color.tmpl.js +0 -0
  546. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Decoration.tmpl.js +0 -0
  547. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Font.tmpl.js +0 -0
  548. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Theme.tmpl.js +0 -0
  549. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/app.png +0 -0
  550. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/favicon.png +0 -0
  551. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/js_256x256.png +0 -0
  552. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/test.png +0 -0
  553. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/translation/readme.txt +0 -0
  554. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/.gitignore.tmpl +0 -0
  555. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/Manifest.tmpl.json +0 -0
  556. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/compile.tmpl.json +0 -0
  557. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/readme.tmpl.md +0 -0
  558. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/boot/index.tmpl.html +0 -0
  559. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/boot/nojs.tmpl.html +0 -0
  560. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/Application.tmpl.js +0 -0
  561. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/__init__.tmpl.js +0 -0
  562. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/page/Login.tmpl.js +0 -0
  563. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/page/Overview.tmpl.js +0 -0
  564. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/page/__init__.tmpl.js +0 -0
  565. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/app.png +0 -0
  566. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/css/.gitignore.tmpl +0 -0
  567. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/favicon.png +0 -0
  568. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/js_256x256.png +0 -0
  569. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/theme/custom/scss/_styles.scss +0 -0
  570. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/theme/custom/scss/custom.scss +0 -0
  571. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/translation/readme.txt +0 -0
  572. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/.gitignore.tmpl +0 -0
  573. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/Manifest.tmpl.json +0 -0
  574. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/compile.tmpl.json +0 -0
  575. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/readme.tmpl.md +0 -0
  576. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/Button.tmpl.js +0 -0
  577. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/__init__.tmpl.js +0 -0
  578. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/demo/Application.tmpl.js +0 -0
  579. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/resource/custom/test.png +0 -0
  580. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/test/DemoTest.tmpl.js +0 -0
  581. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Appearance.tmpl.js +0 -0
  582. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Color.tmpl.js +0 -0
  583. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Decoration.tmpl.js +0 -0
  584. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Font.tmpl.js +0 -0
  585. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Theme.tmpl.js +0 -0
  586. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/resource/custom/test.png +0 -0
  587. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/translation/readme.txt +0 -0
  588. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/.gitignore.tmpl +0 -0
  589. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/Manifest.tmpl.json +0 -0
  590. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/compile.tmpl.json +0 -0
  591. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/readme.tmpl.txt +0 -0
  592. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/class/custom/Application.tmpl.js +0 -0
  593. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/class/custom/__init__.tmpl.js +0 -0
  594. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/class/custom/test/DemoTest.tmpl.js +0 -0
  595. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/resource/custom/.gitignore.tmpl +0 -0
  596. /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/translation/readme.txt +0 -0
  597. /package/source/resource/qx/tool/{loadsass.js → compiler/loadsass.js} +0 -0
@@ -0,0 +1,958 @@
1
+ /* ************************************************************************
2
+
3
+ qooxdoo - the new era of web development
4
+
5
+ http://qooxdoo.org
6
+
7
+ Copyright:
8
+ 2025 Henner Kollmann
9
+
10
+ License:
11
+ MIT: https://opensource.org/licenses/MIT
12
+ See the LICENSE file in the project's top-level directory for details.
13
+
14
+ Authors:
15
+ * Henner Kollmann (Henner.Kollmann@gmx.de, @hkollmann)
16
+
17
+ ************************************************************************ */
18
+
19
+ const process = require("process");
20
+ const path = require("upath");
21
+ const semver = require("semver");
22
+ const fs = qx.tool.utils.Promisify.fs;
23
+ const babylon = require("@babel/parser");
24
+ const traverse = require("@babel/traverse").default;
25
+
26
+ /**
27
+ * Migration class for updating from v7 to v8
28
+ */
29
+ qx.Class.define("qx.tool.migration.M8_0_0", {
30
+ extend: qx.tool.migration.BaseMigration,
31
+ members: {
32
+ /**
33
+ * Update Manifest.json files
34
+ */
35
+ async migrateManifest() {
36
+ let dryRun = this.getRunner().getDryRun();
37
+ let verbose = this.getRunner().getVerbose();
38
+
39
+ // Update all Manifests
40
+ for (const manifestModel of await qx.tool.config.Utils.getManifestModels()) {
41
+ await manifestModel
42
+ .set({
43
+ warnOnly: true
44
+ })
45
+ .load();
46
+
47
+ // Update schema to v8 schema (when available)
48
+ // await this.updateSchemaUnlessDryRun(
49
+ // manifestModel,
50
+ // "https://qooxdoo.org/schema/Manifest-3-0-0.json"
51
+ // );
52
+
53
+ // Update qooxdoo version dependency
54
+ await this.updateQxDependencyUnlessDryRun(manifestModel);
55
+
56
+ // Save Manifest file
57
+ if (!dryRun) {
58
+ manifestModel.setValidate(false);
59
+ await manifestModel.save();
60
+ }
61
+ }
62
+ },
63
+
64
+ /**
65
+ * Migrate code that sets table model data during editing
66
+ * This is now an error in v8, so we need to warn users
67
+ */
68
+ async migrateTableModelUsage() {
69
+ // This is informational only - always announce this breaking change
70
+ this.announce(
71
+ "*** IMPORTANT: qx.ui.table.Table Breaking Change ***\n" +
72
+ "Setting model data while the table is editing will now raise an error.\n" +
73
+ "Please review your code to ensure that table edits are completed or\n" +
74
+ "cancelled before refreshing table model data.\n" +
75
+ "See: https://github.com/qooxdoo/qooxdoo/blob/master/CHANGELOG.md#breaking-changes"
76
+ );
77
+ this.markAsPending(
78
+ "Manual review required for table model data updates"
79
+ );
80
+ },
81
+
82
+ /**
83
+ * Check for usage of deprecated APIs from v6 and v7
84
+ * that might be removed in v8
85
+ */
86
+ async migrateDeprecatedAPIs() {
87
+ // Inform about deprecated APIs
88
+ this.announce(
89
+ "*** INFO: Deprecated APIs ***\n" +
90
+ "The following APIs are deprecated and may be removed in future versions:\n" +
91
+ "- qx.lang.normalize.Date (deprecated since v7.0) - Use native Date methods\n" +
92
+ "- qx.lang.String.startsWith/endsWith (deprecated since v6.0) - Use native String methods\n\n" +
93
+ "Please review your code for usage of these deprecated APIs."
94
+ );
95
+ },
96
+
97
+ /**
98
+ * Check for property setters called before super() or this.base() in constructors
99
+ * This is now an error in v8, as property values will be reset when parent constructor executes
100
+ */
101
+ async migrateConstructorPropertySetters() {
102
+ const sourceDir = path.join(process.cwd(), "source");
103
+ if (!(await fs.existsAsync(sourceDir))) {
104
+ // No source directory, just give general warning
105
+ this.announce(
106
+ "*** IMPORTANT: Constructor Initialization Order ***\n" +
107
+ "Classes extending qx.core.Object MUST call super() or this.base(arguments)\n" +
108
+ "in their constructor BEFORE calling any property setters.\n\n" +
109
+ "Property values set before the parent constructor will be reset!\n\n" +
110
+ "Example - BROKEN (v7 style):\n" +
111
+ " construct(width, height) {\n" +
112
+ " this.setWidth(width); // Will be lost!\n" +
113
+ " this.setHeight(height);\n" +
114
+ " this.base(arguments);\n" +
115
+ " }\n\n" +
116
+ "Example - CORRECT (v8):\n" +
117
+ " construct(width, height) {\n" +
118
+ " this.base(arguments); // Call parent first\n" +
119
+ " this.setWidth(width); // Now set properties\n" +
120
+ " this.setHeight(height);\n" +
121
+ " }"
122
+ );
123
+ this.markAsPending("Review constructor initialization order");
124
+ return;
125
+ }
126
+
127
+ // Use unified scan (reuse if already done by other migration methods)
128
+ if (!this.__scanResults) {
129
+ await this.__scanSourceFilesForIssues(sourceDir);
130
+ }
131
+
132
+ const issues = this.__scanResults.constructorSetterIssues;
133
+
134
+ // Report findings
135
+ if (issues.length > 0) {
136
+ let message = "*** IMPORTANT: Constructor Property Setter Order ***\n" +
137
+ "Property setters (this.setXxx()) must be called AFTER super() or this.base().\n" +
138
+ "The following issues were found:\n\n";
139
+
140
+ for (const issue of issues) {
141
+ message += ` ${issue.file}`;
142
+ if (issue.className) {
143
+ message += ` (${issue.className})`;
144
+ }
145
+ message += ":\n";
146
+
147
+ for (const violation of issue.issues) {
148
+ message += ` Line ${violation.line}: ${violation.setter} called before super()\n`;
149
+ }
150
+ }
151
+
152
+ message += "\nMove all super() or this.base(arguments) calls to the beginning of your\n" +
153
+ "constructors, before any property setters.\n\n" +
154
+ "In v8, property values set before the parent constructor will be reset when\n" +
155
+ "the parent constructor executes, causing unexpected behavior.";
156
+
157
+ this.announce(message);
158
+ this.markAsPending(`Fix ${issues.length} constructor(s) with setter ordering issues`);
159
+ } else {
160
+ this.announce(
161
+ "*** INFO: Constructor Initialization Order Check ***\n" +
162
+ "No constructor property setter ordering issues detected in your codebase.\n\n" +
163
+ "Note: Classes extending qx.core.Object must call super() or this.base()\n" +
164
+ "before calling any property setters in their constructor."
165
+ );
166
+ }
167
+ },
168
+
169
+
170
+ /**
171
+ * Migrate compile.js from yargs to CLI classes
172
+ * This is a major breaking change in v8
173
+ */
174
+ async migrateCompileJs() {
175
+ const compileJsPath = path.join(process.cwd(), "compile.js");
176
+ if (!(await fs.existsAsync(compileJsPath))) {
177
+ return;
178
+ }
179
+
180
+ const content = await fs.readFileAsync(compileJsPath, "utf8");
181
+
182
+ // Check if using old yargs API
183
+ if (content.includes("getYargsCommand") || content.includes("yargs")) {
184
+ this.announce(
185
+ "*** IMPORTANT: CLI System Breaking Change ***\n" +
186
+ "The CLI system has been migrated from yargs to custom CLI classes.\n" +
187
+ "If your compile.js extends commands, you need to update the syntax.\n\n" +
188
+ "Old syntax:\n" +
189
+ " let yargs = qx.tool.cli.commands.Test.getYargsCommand;\n" +
190
+ " qx.tool.cli.commands.Test.getYargsCommand = () => { ... };\n\n" +
191
+ "New syntax:\n" +
192
+ " let originalCreateCliCommand = qx.tool.compiler.cli.commands.Test.createCliCommand;\n" +
193
+ " qx.tool.compiler.cli.commands.Test.createCliCommand = async function(clazz) {\n" +
194
+ " let cmd = await originalCreateCliCommand.call(this, clazz);\n" +
195
+ " cmd.addFlag(new qx.tool.cli.Flag(...));\n" +
196
+ " };\n\n" +
197
+ "See CHANGELOG.md for detailed migration guide."
198
+ );
199
+ this.markAsPending("Manual migration of compile.js yargs API required");
200
+ }
201
+
202
+ // Automatically update old class names to new ones
203
+ // Order matters! Most specific patterns first to avoid partial replacements
204
+ const replacements = [
205
+ {
206
+ files: compileJsPath,
207
+ from: /qx\.tool\.cli\.commands\.Package/g,
208
+ to: "qx.tool.compiler.cli.commands.Package"
209
+ },
210
+ {
211
+ files: compileJsPath,
212
+ from: /qx\.tool\.cli\.ConfigDb/g,
213
+ to: "qx.tool.compiler.cli.ConfigDb"
214
+ },
215
+ {
216
+ files: compileJsPath,
217
+ from: /qx\.tool\.cli\.commands\./g,
218
+ to: "qx.tool.compiler.cli.commands."
219
+ },
220
+ {
221
+ files: compileJsPath,
222
+ from: /qx\.tool\.cli\.api\./g,
223
+ to: "qx.tool.compiler.cli.api."
224
+ }
225
+ ];
226
+
227
+ // Check if any replacements are needed
228
+ let needsReplacement = false;
229
+ for (const replacement of replacements) {
230
+ if (content.match(replacement.from)) {
231
+ needsReplacement = true;
232
+ break;
233
+ }
234
+ }
235
+
236
+ if (needsReplacement) {
237
+ await this.replaceInFilesUnlessDryRun(replacements);
238
+ }
239
+ },
240
+
241
+ /**
242
+ * Check for instance.name usage (no longer available in v8)
243
+ * Should be replaced with instance.classname
244
+ */
245
+ async migrateInstanceName() {
246
+ const sourceDir = path.join(process.cwd(), "source");
247
+ if (!(await fs.existsAsync(sourceDir))) {
248
+ this.announce(
249
+ "*** IMPORTANT: instance.name No Longer Available ***\n" +
250
+ "The predefined instance.name variable is no longer available.\n" +
251
+ "Please replace all uses of instance.name with instance.classname."
252
+ );
253
+ return;
254
+ }
255
+
256
+ // Use unified scan (already done by migratePropertyMemberConflicts)
257
+ // Results are cached in this.__scanResults
258
+ if (!this.__scanResults) {
259
+ await this.__scanSourceFilesForIssues(sourceDir);
260
+ }
261
+
262
+ const usages = this.__scanResults.nameFieldUsages;
263
+
264
+ // Report findings
265
+ if (usages.length > 0) {
266
+ let message = "*** IMPORTANT: Instance .name Field Usage Detected ***\n" +
267
+ "The automatic .name field on object instances is no longer available in v8.\n" +
268
+ "The following usages were found:\n\n";
269
+
270
+ for (const usage of usages) {
271
+ message += ` ${usage.file}:\n`;
272
+ for (const location of usage.locations) {
273
+ message += ` Line ${location.line}: ${location.context}\n`;
274
+ }
275
+ }
276
+
277
+ message += "\nPlease replace .name with .classname on all Qooxdoo object instances.\n" +
278
+ "Examples:\n" +
279
+ " - this.name → this.classname\n" +
280
+ " - widget.name → widget.classname\n" +
281
+ " - obj.name → obj.classname\n\n" +
282
+ "This change was necessary because with native properties in v8,\n" +
283
+ "the .name field conflicts with property definitions named 'name'.\n\n" +
284
+ "Note: Property getters like this.getName() are still valid.";
285
+
286
+ this.announce(message);
287
+ this.markAsPending(`Replace ${usages.length} .name field usage(s) with .classname`);
288
+ } else {
289
+ this.announce(
290
+ "*** INFO: Instance .name Field Check ***\n" +
291
+ "No uses of the .name field on instances detected in your codebase.\n\n" +
292
+ "Note: The automatic .name field is no longer available in v8.\n" +
293
+ "Use .classname instead to get the class name of an instance."
294
+ );
295
+ }
296
+ },
297
+
298
+ /**
299
+ * Check for property and member namespace conflicts
300
+ * Properties and members now share the same namespace
301
+ */
302
+ async migratePropertyMemberConflicts() {
303
+ const sourceDir = path.join(process.cwd(), "source");
304
+ if (!(await fs.existsAsync(sourceDir))) {
305
+ this.announce(
306
+ "*** INFO: Property/Member Namespace Change ***\n" +
307
+ "In v8, properties and members now share the same namespace.\n" +
308
+ "Refining a property in a subclass now adds it to the\n" +
309
+ "subclass prototype instead of modifying it in place."
310
+ );
311
+ return;
312
+ }
313
+
314
+ // Scan source files once for all issues
315
+ await this.__scanSourceFilesForIssues(sourceDir);
316
+
317
+ const conflicts = this.__scanResults.propertyMemberConflicts;
318
+
319
+ // Report findings
320
+ if (conflicts.length > 0) {
321
+ let message = "*** IMPORTANT: Property/Member Conflicts Detected ***\n" +
322
+ "In v8, properties and members share the same namespace.\n" +
323
+ "The following conflicts were found:\n\n";
324
+
325
+ for (const conflict of conflicts) {
326
+ message += ` ${conflict.file}`;
327
+ if (conflict.className) {
328
+ message += ` (${conflict.className})`;
329
+ }
330
+ message += ":\n";
331
+
332
+ if (conflict.propMemberConflicts.length > 0) {
333
+ message += ` Properties conflicting with members: ${conflict.propMemberConflicts.join(", ")}\n`;
334
+ }
335
+
336
+ if (conflict.propStaticConflicts.length > 0) {
337
+ message += ` Properties conflicting with statics: ${conflict.propStaticConflicts.join(", ")}\n`;
338
+ }
339
+ }
340
+
341
+ message += "\nYou must rename either the property or the member/static to resolve conflicts.\n" +
342
+ "Typical solution: Rename the member method (e.g., 'name' → 'getName' or '_name')";
343
+
344
+ this.announce(message);
345
+ this.markAsPending(`Fix ${conflicts.length} property/member conflict(s)`);
346
+ } else {
347
+ this.announce(
348
+ "*** INFO: Property/Member Namespace Check ***\n" +
349
+ "No property/member conflicts detected in your codebase.\n\n" +
350
+ "Note: In v8, properties and members now share the same namespace.\n" +
351
+ "Refining a property in a subclass now adds it to the subclass\n" +
352
+ "prototype instead of modifying it in place."
353
+ );
354
+ }
355
+ },
356
+
357
+ /**
358
+ * Warn about Node.js version requirement for ESLint 9
359
+ */
360
+ async migrateNodeVersion() {
361
+ this.announce(
362
+ "*** IMPORTANT: Node.js Version Requirement ***\n" +
363
+ "qooxdoo v8 requires Node.js >= 20.0.0 for the compiler.\n" +
364
+ "This is due to the migration from ESLint 8 to ESLint 9.\n\n" +
365
+ "ESLint configuration in compile.json is automatically converted\n" +
366
+ "from the old format to the new Flat Config format.\n\n" +
367
+ "Plugin names must now be complete:\n" +
368
+ " Old: '@qooxdoo/qx'\n" +
369
+ " New: '@qooxdoo/eslint-plugin-qx' or full import"
370
+ );
371
+ this.markAsPending("Verify Node.js version >= 20.0.0");
372
+ },
373
+
374
+ /**
375
+ * Warn about qx.locale changes (CLDR → Intl API)
376
+ */
377
+ async migrateLocaleAPI() {
378
+ this.announce(
379
+ "*** INFO: qx.locale Implementation Change ***\n" +
380
+ "qx.locale classes now use the native Internationalization API\n" +
381
+ "instead of the Common Locale Data Repository (CLDR) package.\n" +
382
+ "This significantly reduces package size but may cause minor\n" +
383
+ "differences in formatting for some locales.\n\n" +
384
+ "Please test your locale-specific functionality if you use it."
385
+ );
386
+ },
387
+
388
+ /**
389
+ * Warn about Form.add() name parameter lowercase requirement
390
+ * and try to find problematic patterns in user code
391
+ */
392
+ async migrateFormAddNames() {
393
+ const sourceDir = path.join(process.cwd(), "source");
394
+ if (!(await fs.existsAsync(sourceDir))) {
395
+ // No source directory, just give general warning
396
+ this.announce(
397
+ "*** IMPORTANT: qx.ui.form.Form.add() Name Parameter ***\n" +
398
+ "In v8, the name parameter of qx.ui.form.Form.add() MUST\n" +
399
+ "start with a lowercase letter to avoid property binding errors.\n\n" +
400
+ "Example:\n" +
401
+ " // Wrong:\n" +
402
+ " form.add(widget, 'Label', null, 'MyField');\n\n" +
403
+ " // Correct:\n" +
404
+ " form.add(widget, 'Label', null, 'myField');"
405
+ );
406
+ this.markAsPending("Review form.add() name parameters");
407
+ return;
408
+ }
409
+
410
+ // Scan for form.add() calls
411
+ let foundIssues = [];
412
+
413
+ // Recursively find all .js files
414
+ const findJsFiles = async dir => {
415
+ let jsFiles = [];
416
+ try {
417
+ const entries = await fs.readdirAsync(dir);
418
+ for (const entry of entries) {
419
+ const fullPath = path.join(dir, entry);
420
+ const stat = await fs.statAsync(fullPath);
421
+ if (stat.isDirectory()) {
422
+ jsFiles = jsFiles.concat(await findJsFiles(fullPath));
423
+ } else if (entry.endsWith('.js')) {
424
+ jsFiles.push(fullPath);
425
+ }
426
+ }
427
+ } catch (e) {
428
+ // Ignore errors reading directories
429
+ }
430
+ return jsFiles;
431
+ };
432
+
433
+ const jsFiles = await findJsFiles(sourceDir);
434
+
435
+ // Pattern to match: .add(..., "NameStartingWithUppercase")
436
+ // This will catch obvious cases like form.add(widget, "Label", null, "MyField")
437
+ const uppercaseNamePattern = /\.add\s*\([^)]*['"]([A-Z][a-zA-Z0-9_]*)['"]\s*\)/g;
438
+
439
+ for (const file of jsFiles) {
440
+ try {
441
+ const content = await fs.readFileAsync(file, 'utf8');
442
+
443
+ // Check if file contains form.add() calls
444
+ if (content.includes('.add(')) {
445
+ // Look for uppercase name parameters
446
+ const matches = [...content.matchAll(uppercaseNamePattern)];
447
+
448
+ if (matches.length > 0) {
449
+ const relativePath = path.relative(process.cwd(), file);
450
+ const names = matches.map(m => m[1]).filter((v, i, a) => a.indexOf(v) === i);
451
+ foundIssues.push({
452
+ file: relativePath,
453
+ names: names
454
+ });
455
+ }
456
+ }
457
+ } catch (e) {
458
+ // Ignore errors reading individual files
459
+ }
460
+ }
461
+
462
+ // Report findings
463
+ if (foundIssues.length > 0) {
464
+ let message = "*** IMPORTANT: Found Potential form.add() Issues ***\n" +
465
+ "The following files contain .add() calls with uppercase names.\n" +
466
+ "In v8, form.add() name parameters MUST start with lowercase!\n\n";
467
+
468
+ for (const issue of foundIssues) {
469
+ message += ` ${issue.file}:\n`;
470
+ for (const name of issue.names) {
471
+ message += ` - "${name}" should be "${name.charAt(0).toLowerCase() + name.slice(1)}"\n`;
472
+ }
473
+ }
474
+
475
+ message += "\nExample fix:\n" +
476
+ " // Wrong:\n" +
477
+ " form.add(widget, 'Label', null, 'MyField');\n\n" +
478
+ " // Correct:\n" +
479
+ " form.add(widget, 'Label', null, 'myField');";
480
+
481
+ this.announce(message);
482
+ this.markAsPending("Fix uppercase form.add() name parameters");
483
+ } else {
484
+ // No issues found, but still warn as we might have missed some
485
+ this.announce(
486
+ "*** INFO: qx.ui.form.Form.add() Name Parameter ***\n" +
487
+ "No obvious issues found, but please note:\n" +
488
+ "In v8, the name parameter of form.add() MUST start with\n" +
489
+ "a lowercase letter to avoid property binding errors."
490
+ );
491
+ }
492
+ },
493
+
494
+ /**
495
+ * Upgrade packages to v8 compatible versions
496
+ */
497
+ async migratePackages() {
498
+ // Check if contrib.json exists and has libraries before attempting upgrade
499
+ const contribPath = "contrib.json";
500
+ if (await fs.existsAsync(contribPath)) {
501
+ try {
502
+ const contribData = JSON.parse(await fs.readFileAsync(contribPath, "utf8"));
503
+ if (contribData.libraries && contribData.libraries.length > 0) {
504
+ await this.upgradePackagesUnlessDryRun();
505
+ }
506
+ } catch (e) {
507
+ // contrib.json doesn't exist or is invalid, skip package upgrade
508
+ }
509
+ }
510
+ },
511
+
512
+
513
+ /**
514
+ * Unified method to scan source files for multiple issues in one pass
515
+ * This scans each file only once and performs all AST-based checks
516
+ * @param {String} sourceDir - Source directory to scan
517
+ * @return {Promise<void>} - Results are stored in this.__scanResults
518
+ */
519
+ async __scanSourceFilesForIssues(sourceDir) {
520
+ // Initialize results structure
521
+ this.__scanResults = {
522
+ propertyMemberConflicts: [],
523
+ nameFieldUsages: [],
524
+ constructorSetterIssues: []
525
+ };
526
+
527
+ const jsFiles = await this.__findJsFiles(sourceDir);
528
+
529
+ for (const file of jsFiles) {
530
+ try {
531
+ const content = await fs.readFileAsync(file, 'utf8');
532
+
533
+ // Quick pre-filter: skip files that don't need analysis
534
+ const needsQxDefineCheck = content.match(/qx\.(Class|Mixin)\.define/);
535
+ const needsNameCheck = content.includes('.name');
536
+ const needsConstructorCheck = content.includes('construct');
537
+
538
+ if (!needsQxDefineCheck && !needsNameCheck) {
539
+ continue;
540
+ }
541
+
542
+ // Parse with Babel (only once per file!)
543
+ const ast = babylon.parse(content, {
544
+ sourceType: "module",
545
+ errorRecovery: true
546
+ });
547
+
548
+ const relativePath = path.relative(process.cwd(), file);
549
+
550
+ // Check 1: Property/Member conflicts (if file has qx definitions)
551
+ if (needsQxDefineCheck) {
552
+ const definitions = this.__findQxDefinitions(ast);
553
+
554
+ for (const def of definitions) {
555
+ const propertyNames = this.__extractPropertyNames(def.configObj);
556
+ const memberNames = this.__extractMemberNames(def.configObj);
557
+ const staticNames = this.__extractStaticNames(def.configObj);
558
+
559
+ const propMemberConflicts = this.__findIntersection(propertyNames, memberNames);
560
+ const propStaticConflicts = this.__findIntersection(propertyNames, staticNames);
561
+
562
+ if (propMemberConflicts.length > 0 || propStaticConflicts.length > 0) {
563
+ this.__scanResults.propertyMemberConflicts.push({
564
+ file: relativePath,
565
+ className: def.className,
566
+ propMemberConflicts,
567
+ propStaticConflicts
568
+ });
569
+ }
570
+ }
571
+ }
572
+
573
+ // Check 2: .name field usage (if file has .name access)
574
+ if (needsNameCheck) {
575
+ const locations = this.__findInstanceNameUsages(ast);
576
+
577
+ if (locations.length > 0) {
578
+ this.__scanResults.nameFieldUsages.push({
579
+ file: relativePath,
580
+ locations
581
+ });
582
+ }
583
+ }
584
+
585
+ // Check 3: Constructor setter issues (if file has qx definitions and constructors)
586
+ if (needsQxDefineCheck && needsConstructorCheck) {
587
+ const definitions = this.__findQxDefinitions(ast);
588
+
589
+ for (const def of definitions) {
590
+ const issues = this.__findSettersBeforeSuper(def.configObj, def.className);
591
+
592
+ if (issues.length > 0) {
593
+ this.__scanResults.constructorSetterIssues.push({
594
+ file: relativePath,
595
+ className: def.className,
596
+ issues
597
+ });
598
+ }
599
+ }
600
+ }
601
+ } catch (e) {
602
+ // Log parse errors but continue with other files
603
+ if (this.getRunner().getVerbose()) {
604
+ qx.tool.compiler.Console.warn(
605
+ `Could not parse ${path.relative(process.cwd(), file)}: ${e.message}`
606
+ );
607
+ }
608
+ }
609
+ }
610
+ },
611
+
612
+ /**
613
+ * Helper method to recursively find all .js files in a directory
614
+ * @param {String} dir - Directory to search
615
+ * @return {Promise<String[]>} - Array of file paths
616
+ */
617
+ async __findJsFiles(dir) {
618
+ let jsFiles = [];
619
+ try {
620
+ const entries = await fs.readdirAsync(dir);
621
+ for (const entry of entries) {
622
+ const fullPath = path.join(dir, entry);
623
+ const stat = await fs.statAsync(fullPath);
624
+ if (stat.isDirectory()) {
625
+ jsFiles = jsFiles.concat(await this.__findJsFiles(fullPath));
626
+ } else if (entry.endsWith('.js')) {
627
+ jsFiles.push(fullPath);
628
+ }
629
+ }
630
+ } catch (e) {
631
+ // Ignore errors reading directories
632
+ }
633
+ return jsFiles;
634
+ },
635
+
636
+ /**
637
+ * Helper method to find intersection of two arrays
638
+ * @param {Array} arr1 - First array
639
+ * @param {Array} arr2 - Second array
640
+ * @return {Array} - Array of common elements
641
+ */
642
+ __findIntersection(arr1, arr2) {
643
+ return arr1.filter(name => arr2.includes(name));
644
+ },
645
+
646
+ /**
647
+ * Helper method to get the name from an object key (Identifier or StringLiteral)
648
+ * @param {Object} key - AST node representing object key
649
+ * @return {String} - Key name
650
+ */
651
+ __getKeyName(key) {
652
+ return key.name || key.value;
653
+ },
654
+
655
+ /**
656
+ * Helper method to collapse MemberExpression into a string
657
+ * (Adapted from ClassFile.js)
658
+ * @param {Object} node - AST MemberExpression node
659
+ * @return {String} - Collapsed string like "qx.Class.define"
660
+ */
661
+ __collapseMemberExpression(node) {
662
+ if (!node) {
663
+ return null;
664
+ }
665
+ if (node.type === "Identifier") {
666
+ return node.name;
667
+ }
668
+ if (node.type !== "MemberExpression") {
669
+ return null;
670
+ }
671
+ const object = this.__collapseMemberExpression(node.object);
672
+ const property = node.property.name || node.property.value;
673
+ if (object && property) {
674
+ return object + "." + property;
675
+ }
676
+ return null;
677
+ },
678
+
679
+ /**
680
+ * Helper method to find qx.Class.define and qx.Mixin.define calls in AST
681
+ * @param {Object} ast - Babel AST
682
+ * @return {Array} - Array of definition objects {type, className, configObj}
683
+ */
684
+ __findQxDefinitions(ast) {
685
+ const definitions = [];
686
+ const self = this;
687
+
688
+ traverse(ast, {
689
+ CallExpression(path) {
690
+ const node = path.node;
691
+ const callee = self.__collapseMemberExpression(node.callee);
692
+
693
+ if (callee === "qx.Class.define" || callee === "qx.Mixin.define") {
694
+ // Extract class name from first argument
695
+ let className = null;
696
+ if (node.arguments[0] && (node.arguments[0].type === "StringLiteral" || node.arguments[0].type === "Literal")) {
697
+ className = node.arguments[0].value;
698
+ }
699
+
700
+ // Extract config object from second argument
701
+ const configObj = node.arguments[1];
702
+ if (configObj && configObj.type === "ObjectExpression") {
703
+ definitions.push({
704
+ type: callee === "qx.Class.define" ? "class" : "mixin",
705
+ className,
706
+ configObj
707
+ });
708
+ }
709
+ }
710
+ }
711
+ });
712
+
713
+ return definitions;
714
+ },
715
+
716
+ /**
717
+ * Helper method to extract property names from a class definition config object
718
+ * @param {Object} configObj - AST ObjectExpression node for class config
719
+ * @return {Array} - Array of property names
720
+ */
721
+ __extractPropertyNames(configObj) {
722
+ const names = [];
723
+ if (!configObj || configObj.type !== "ObjectExpression") {
724
+ return names;
725
+ }
726
+
727
+ const propertiesNode = configObj.properties.find(
728
+ prop => this.__getKeyName(prop.key) === "properties"
729
+ );
730
+
731
+ if (propertiesNode && propertiesNode.value && propertiesNode.value.type === "ObjectExpression") {
732
+ propertiesNode.value.properties.forEach(prop => {
733
+ const keyName = this.__getKeyName(prop.key);
734
+ if (keyName) {
735
+ names.push(keyName);
736
+ }
737
+ });
738
+ }
739
+
740
+ return names;
741
+ },
742
+
743
+ /**
744
+ * Helper method to extract member names from a class definition config object
745
+ * @param {Object} configObj - AST ObjectExpression node for class config
746
+ * @return {Array} - Array of member names
747
+ */
748
+ __extractMemberNames(configObj) {
749
+ const names = [];
750
+ if (!configObj || configObj.type !== "ObjectExpression") {
751
+ return names;
752
+ }
753
+
754
+ const membersNode = configObj.properties.find(
755
+ prop => this.__getKeyName(prop.key) === "members"
756
+ );
757
+
758
+ if (membersNode && membersNode.value && membersNode.value.type === "ObjectExpression") {
759
+ membersNode.value.properties.forEach(prop => {
760
+ // Handle both ObjectMethod and ObjectProperty
761
+ if (prop.type === "ObjectMethod" || prop.type === "ObjectProperty") {
762
+ const keyName = this.__getKeyName(prop.key);
763
+ if (keyName) {
764
+ names.push(keyName);
765
+ }
766
+ }
767
+ });
768
+ }
769
+
770
+ return names;
771
+ },
772
+
773
+ /**
774
+ * Helper method to extract static names from a class definition config object
775
+ * @param {Object} configObj - AST ObjectExpression node for class config
776
+ * @return {Array} - Array of static names
777
+ */
778
+ __extractStaticNames(configObj) {
779
+ const names = [];
780
+ if (!configObj || configObj.type !== "ObjectExpression") {
781
+ return names;
782
+ }
783
+
784
+ const staticsNode = configObj.properties.find(
785
+ prop => this.__getKeyName(prop.key) === "statics"
786
+ );
787
+
788
+ if (staticsNode && staticsNode.value && staticsNode.value.type === "ObjectExpression") {
789
+ staticsNode.value.properties.forEach(prop => {
790
+ // Handle both ObjectMethod and ObjectProperty
791
+ if (prop.type === "ObjectMethod" || prop.type === "ObjectProperty") {
792
+ const keyName = this.__getKeyName(prop.key);
793
+ if (keyName) {
794
+ names.push(keyName);
795
+ }
796
+ }
797
+ });
798
+ }
799
+
800
+ return names;
801
+ },
802
+
803
+ /**
804
+ * Helper method to find .name usages on object instances in AST
805
+ * This detects the old pattern where instances had a .name field
806
+ * @param {Object} ast - Babel AST
807
+ * @return {Array} - Array of usage locations {line, context}
808
+ */
809
+ __findInstanceNameUsages(ast) {
810
+ const usages = [];
811
+ const self = this;
812
+
813
+ traverse(ast, {
814
+ MemberExpression(path) {
815
+ const node = path.node;
816
+
817
+ // Check if it's accessing .name property (not computed like obj["name"])
818
+ if (node.property &&
819
+ !node.computed &&
820
+ (node.property.name === "name" || node.property.value === "name")) {
821
+
822
+ // Get the object being accessed
823
+ const objectName = node.object.name || self.__collapseMemberExpression(node.object);
824
+
825
+ // Skip common false positives
826
+ if (self.__isLikelyQooxdooInstanceNameUsage(path, objectName)) {
827
+ usages.push({
828
+ line: node.loc ? node.loc.start.line : "unknown",
829
+ context: objectName ? `${objectName}.name` : ".name"
830
+ });
831
+ }
832
+ }
833
+ }
834
+ });
835
+
836
+ return usages;
837
+ },
838
+
839
+ /**
840
+ * Helper to determine if a .name access is likely the old instance.name pattern
841
+ * @param {Object} path - AST path
842
+ * @param {String} objectName - Name of the object being accessed
843
+ * @return {Boolean} - True if this looks like qooxdoo instance.name usage
844
+ */
845
+ __isLikelyQooxdooInstanceNameUsage(path, objectName) {
846
+ const node = path.node;
847
+
848
+ // Common patterns that suggest this is the old instance.name field:
849
+
850
+ // 1. this.name (very common in qooxdoo classes)
851
+ if (objectName === "this") {
852
+ // But exclude if it's actually a property getter call (this.getName())
853
+ const parent = path.parent;
854
+ if (parent && parent.type === "CallExpression") {
855
+ return false; // It's this.name() which is a method call
856
+ }
857
+ return true;
858
+ }
859
+
860
+ // 2. Common variable names for instances: instance, obj, object, item, element
861
+ const instanceVarNames = ["instance", "obj", "object", "item", "element", "widget", "control"];
862
+ if (instanceVarNames.includes(objectName)) {
863
+ return true;
864
+ }
865
+
866
+ // 3. Skip known JavaScript built-in objects that have .name
867
+ const builtInObjects = ["window", "document", "console", "Function", "Error",
868
+ "constructor", "arguments", "event"];
869
+ if (builtInObjects.includes(objectName)) {
870
+ return false;
871
+ }
872
+
873
+ // 4. If it's within a qx.Class.define or qx.Mixin.define, it's more likely
874
+ // to be qooxdoo code (this is a heuristic)
875
+ // For now, we'll return false for unknown patterns to avoid too many false positives
876
+
877
+ return false;
878
+ },
879
+
880
+ /**
881
+ * Helper to find property setters called before super() in constructors
882
+ * @param {Object} configObj - AST ObjectExpression node for class config
883
+ * @param {String} className - Name of the class being analyzed
884
+ * @return {Array} - Array of {setter, line} objects for violations
885
+ */
886
+ __findSettersBeforeSuper(configObj, className) {
887
+ const violations = [];
888
+
889
+ if (!configObj || configObj.type !== "ObjectExpression") {
890
+ return violations;
891
+ }
892
+
893
+ // Find the construct method (it's a direct property of the config object, not in members)
894
+ const constructMethod = configObj.properties.find(
895
+ prop => (prop.type === "ObjectMethod" || prop.type === "ObjectProperty") &&
896
+ this.__getKeyName(prop.key) === "construct"
897
+ );
898
+
899
+ if (!constructMethod) {
900
+ return violations;
901
+ }
902
+
903
+ // Get the constructor body
904
+ let body;
905
+ if (constructMethod.type === "ObjectMethod") {
906
+ body = constructMethod.body;
907
+ } else if (constructMethod.type === "ObjectProperty" &&
908
+ constructMethod.value &&
909
+ constructMethod.value.type === "FunctionExpression") {
910
+ body = constructMethod.value.body;
911
+ }
912
+
913
+ if (!body || body.type !== "BlockStatement") {
914
+ return violations;
915
+ }
916
+
917
+ // Iterate through statements in order
918
+ let superFound = false;
919
+ const statements = body.body;
920
+
921
+ for (const stmt of statements) {
922
+ // Only process ExpressionStatements containing calls
923
+ if (stmt.type !== "ExpressionStatement") {
924
+ continue;
925
+ }
926
+
927
+ const expr = stmt.expression;
928
+ if (expr.type !== "CallExpression") {
929
+ continue;
930
+ }
931
+
932
+ const callee = expr.callee;
933
+
934
+ // Check for super() or this.base(arguments)
935
+ if (callee.type === "Super") {
936
+ superFound = true;
937
+ } else if (callee.type === "MemberExpression" &&
938
+ callee.object &&
939
+ callee.object.type === "ThisExpression") {
940
+ const methodName = callee.property.name || callee.property.value;
941
+
942
+ if (methodName === "base") {
943
+ // this.base(arguments) found
944
+ superFound = true;
945
+ } else if (!superFound && methodName && methodName.startsWith("set")) {
946
+ // Property setter called before super/base
947
+ violations.push({
948
+ setter: `this.${methodName}()`,
949
+ line: stmt.loc ? stmt.loc.start.line : "unknown"
950
+ });
951
+ }
952
+ }
953
+ }
954
+
955
+ return violations;
956
+ }
957
+ }
958
+ });