@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.
- package/CHANGELOG.md +191 -33
- package/Manifest.json +3 -3
- package/bin/tools/utils.js +50 -13
- package/lib/compiler/compile-info.json +295 -225
- package/lib/compiler/index.js +56729 -44017
- package/lib/resource/qx/tool/{cli → compiler/cli}/templates/loader/loader-node.tmpl.js +1 -0
- package/lib/resource/qx/tool/compiler/cli/templates/skeleton/mobile/source/theme/custom/css/custom.css.map +1 -0
- package/{source/resource/qx/tool → lib/resource/qx/tool/compiler}/cli/templates/template_vars.js +12 -9
- package/{source/resource/qx/tool → lib/resource/qx/tool/compiler}/schema/Manifest-1-0-0.json +2 -2
- package/lib/resource/qx/tool/{schema → compiler/schema}/Manifest-2-0-0.json +2 -2
- package/lib/resource/qx/tool/{schema → compiler/schema}/compile-1-0-0.json +15 -3
- package/{source/resource/qx/tool → lib/resource/qx/tool/compiler}/schema/qooxdoo-1-0-0.json +1 -1
- package/lib/resource/qx/tool/website/build/404.html +22 -22
- package/lib/resource/qx/tool/website/build/about.html +23 -23
- package/lib/resource/qx/tool/website/build/assets/common.js +30 -18
- package/lib/resource/qx/tool/website/build/assets/custom.css +290 -0
- package/lib/resource/qx/tool/website/build/assets/qxWeb.js +28 -0
- package/lib/resource/qx/tool/website/build/diagnostics/dependson.html +30 -30
- package/lib/resource/qx/tool/website/build/diagnostics/dependson.js +49 -40
- package/lib/resource/qx/tool/website/build/diagnostics/requiredby.html +20 -23
- package/lib/resource/qx/tool/website/build/diagnostics/requiredby.js +38 -31
- package/lib/resource/qx/tool/website/build/index.html +24 -24
- package/lib/resource/qx/tool/website/build/scripts/serve.js +63 -65
- package/lib/resource/qx/tool/website/partials/footer.html +8 -13
- package/lib/resource/qx/tool/website/partials/head.html +9 -7
- package/lib/resource/qx/tool/website/partials/header.html +3 -3
- package/lib/resource/qx/tool/website/src/assets/common.js +32 -0
- package/lib/resource/qx/tool/website/src/assets/custom.css +290 -0
- package/lib/resource/qx/tool/website/src/assets/qxWeb.js +28 -0
- package/lib/resource/qx/tool/website/src/diagnostics/dependson.js +49 -40
- package/lib/resource/qx/tool/website/src/diagnostics/requiredby.js +38 -31
- package/lib/resource/qx/tool/website/src/index.html +2 -2
- package/lib/resource/qx/tool/website/src/scripts/serve.js +63 -65
- package/package.json +20 -19
- package/source/boot/index.html +2 -2
- package/source/class/qx/Bootstrap.js +931 -705
- package/source/class/qx/Class.js +1476 -1451
- package/source/class/qx/Interface.js +40 -107
- package/source/class/qx/Mixin.js +58 -116
- package/source/class/qx/Promise.js +1 -0
- package/source/class/qx/Theme.js +1 -1
- package/source/class/qx/application/Routing.js +2 -0
- package/source/class/qx/bom/Font.js +3 -0
- package/source/class/qx/bom/client/Locale.js +5 -0
- package/source/class/qx/bom/request/Jsonp.js +5 -13
- package/source/class/qx/bom/request/Script.js +11 -35
- package/source/class/qx/bom/request/SimpleXhr.js +13 -41
- package/source/class/qx/bom/request/Xhr.js +19 -80
- package/source/class/qx/bom/storage/Memory.js +2 -0
- package/source/class/qx/bom/storage/UserData.js +2 -0
- package/source/class/qx/bom/storage/Web.js +2 -0
- package/source/class/qx/bom/webfonts/Validator.js +13 -5
- package/source/class/qx/core/Assert.js +14 -0
- package/source/class/qx/core/BaseInit.js +19 -20
- package/source/class/qx/core/Environment.js +23 -20
- package/source/class/qx/core/MEvent.js +1 -1
- package/source/class/qx/core/MObjectId.js +8 -6
- package/source/class/qx/core/MProperty.js +172 -136
- package/source/class/qx/core/Object.js +88 -102
- package/source/class/qx/core/check/AbstractCheck.js +111 -0
- package/source/class/qx/core/check/Any.js +63 -0
- package/source/class/qx/core/check/CheckFactory.js +151 -0
- package/source/class/qx/core/check/DynamicTypeCheck.js +90 -0
- package/source/class/qx/core/check/ICheck.js +75 -0
- package/source/class/qx/core/check/IsOneOfCheck.js +63 -0
- package/source/class/qx/core/check/JsDocCheck.js +71 -0
- package/source/class/qx/core/check/SimpleCheck.js +42 -0
- package/source/class/qx/core/check/standard/ArrayCheck.js +49 -0
- package/source/class/qx/core/check/standard/BooleanCheck.js +47 -0
- package/source/class/qx/core/check/standard/ClassCheck.js +33 -0
- package/source/class/qx/core/check/standard/ColorCheck.js +33 -0
- package/source/class/qx/core/check/standard/DateCheck.js +49 -0
- package/source/class/qx/core/check/standard/DecoratorCheck.js +33 -0
- package/source/class/qx/core/check/standard/DocumentCheck.js +40 -0
- package/source/class/qx/core/check/standard/ElementCheck.js +40 -0
- package/source/class/qx/core/check/standard/ErrorCheck.js +46 -0
- package/source/class/qx/core/check/standard/EventCheck.js +40 -0
- package/source/class/qx/core/check/standard/FontCheck.js +33 -0
- package/source/class/qx/core/check/standard/FunctionCheck.js +49 -0
- package/source/class/qx/core/check/standard/IntegerCheck.js +54 -0
- package/source/class/qx/core/check/standard/InterfaceCheck.js +33 -0
- package/source/class/qx/core/check/standard/MapCheck.js +33 -0
- package/source/class/qx/core/check/standard/MixinCheck.js +33 -0
- package/source/class/qx/core/check/standard/NodeCheck.js +40 -0
- package/source/class/qx/core/check/standard/NumberCheck.js +48 -0
- package/source/class/qx/core/check/standard/ObjectCheck.js +33 -0
- package/source/class/qx/core/check/standard/PositiveIntegerCheck.js +45 -0
- package/source/class/qx/core/check/standard/PositiveNumberCheck.js +45 -0
- package/source/class/qx/core/check/standard/PromiseCheck.js +33 -0
- package/source/class/qx/core/check/standard/RegExpCheck.js +46 -0
- package/source/class/qx/core/check/standard/StringCheck.js +43 -0
- package/source/class/qx/core/check/standard/ThemeCheck.js +33 -0
- package/source/class/qx/core/check/standard/WindowCheck.js +40 -0
- package/source/class/qx/core/property/ExplicitPropertyStorage.js +87 -0
- package/source/class/qx/core/property/GroupProperty.js +262 -0
- package/source/class/qx/core/property/IProperty.js +46 -0
- package/source/class/qx/core/property/IPropertyStorage.js +83 -0
- package/source/class/qx/core/property/ImmutableArrayStorage.js +38 -0
- package/source/class/qx/core/property/ImmutableDataArrayStorage.js +38 -0
- package/source/class/qx/core/property/ImmutableObjectStorage.js +39 -0
- package/source/class/qx/core/property/Property.js +1481 -0
- package/source/class/qx/core/property/PropertyStorageFactory.js +22 -0
- package/source/class/qx/core/property/SimplePropertyStorage.js +105 -0
- package/source/class/qx/data/Array.js +102 -57
- package/source/class/qx/data/MBinding.js +4 -29
- package/source/class/qx/data/SingleValueBinding.js +596 -1495
- package/source/class/qx/data/binding/AbstractSegment.js +197 -0
- package/source/class/qx/data/binding/ArrayIndexSegment.js +148 -0
- package/source/class/qx/data/binding/IInputReceiver.js +14 -0
- package/source/class/qx/data/binding/PropNameSegment.js +150 -0
- package/source/class/qx/data/controller/CheckedList.js +1 -1
- package/source/class/qx/data/controller/Form.js +78 -8
- package/source/class/qx/data/controller/Tree.js +27 -117
- package/source/class/qx/data/marshal/Json.js +46 -149
- package/source/class/qx/data/store/Json.js +0 -2
- package/source/class/qx/dev/Debug.js +1 -1
- package/source/class/qx/dev/LeakDetector.js +144 -0
- package/source/class/qx/dev/unit/AsyncWrapper.js +1 -0
- package/source/class/qx/dev/unit/MMock.js +7 -2
- package/source/class/qx/dev/unit/Sinon.js +0 -4
- package/source/class/qx/dev/unit/TestClass.js +2 -2
- package/source/class/qx/dev/unit/TestFunction.js +1 -0
- package/source/class/qx/dev/unit/TestLoaderBasic.js +1 -0
- package/source/class/qx/dev/unit/TestRunner.js +106 -0
- package/source/class/qx/event/IEventDispatcher.js +8 -4
- package/source/class/qx/event/Manager.js +4 -0
- package/source/class/qx/event/Messaging.js +2 -0
- package/source/class/qx/event/Pool.js +7 -0
- package/source/class/qx/event/Registration.js +33 -55
- package/source/class/qx/event/Timer.js +2 -0
- package/source/class/qx/event/Utils.js +25 -8
- package/source/class/qx/event/dispatch/AbstractBubbling.js +98 -194
- package/source/class/qx/event/dispatch/Direct.js +18 -13
- package/source/class/qx/event/handler/Appear.js +20 -24
- package/source/class/qx/event/handler/Application.js +4 -0
- package/source/class/qx/event/handler/DragDrop.js +182 -385
- package/source/class/qx/event/handler/Element.js +3 -0
- package/source/class/qx/event/handler/Focus.js +36 -30
- package/source/class/qx/event/handler/Input.js +5 -0
- package/source/class/qx/event/handler/Keyboard.js +107 -165
- package/source/class/qx/event/handler/Pointer.js +39 -68
- package/source/class/qx/event/handler/PointerCore.js +7 -25
- package/source/class/qx/event/handler/Window.js +5 -0
- package/source/class/qx/event/type/Event.js +12 -0
- package/source/class/qx/event/type/KeySequence.js +3 -0
- package/source/class/qx/event/type/Native.js +3 -0
- package/source/class/qx/html/Element.js +26 -91
- package/source/class/qx/io/jsonrpc/Client.js +1 -1
- package/source/class/qx/io/jsonrpc/protocol/Error.js +2 -2
- package/source/class/qx/io/jsonrpc/protocol/Parser.js +1 -0
- package/source/class/qx/io/jsonrpc/protocol/Result.js +2 -2
- package/source/class/qx/io/request/Xhr.js +3 -8
- package/source/class/qx/lang/normalize/Array.js +23 -1
- package/source/class/qx/locale/Date.js +520 -113
- package/source/class/qx/locale/LocalizedString.js +3 -0
- package/source/class/qx/locale/Manager.js +14 -3
- package/source/class/qx/locale/Number.js +60 -7
- package/source/class/qx/log/Logger.js +1 -1
- package/source/class/qx/module/Animation.js +2 -0
- package/source/class/qx/module/Attribute.js +2 -0
- package/source/class/qx/module/Css.js +7 -24
- package/source/class/qx/module/Event.js +2 -0
- package/source/class/qx/module/Manipulating.js +2 -0
- package/source/class/qx/module/Traversing.js +2 -0
- package/source/class/qx/test/Bootstrap.js +68 -53
- package/source/class/qx/test/Class.js +310 -2
- package/source/class/qx/test/Mixin.js +192 -42
- package/source/class/qx/test/Promise.js +129 -331
- package/source/class/qx/test/Theme.js +11 -0
- package/source/class/qx/test/bom/Font.js +2 -5
- package/source/class/qx/test/bom/Template.js +1 -1
- package/source/class/qx/test/compiler/ClassFile.js +14 -0
- package/source/class/qx/test/core/Assert.js +12 -0
- package/source/class/qx/test/core/Environment.js +17 -3
- package/source/class/qx/test/core/InheritanceDummy.js +10 -1
- package/source/class/qx/test/core/Object.js +51 -24
- package/source/class/qx/test/core/ObjectId.js +10 -1
- package/source/class/qx/test/core/Property.js +1338 -121
- package/source/class/qx/test/core/PropertyHelper.js +12 -0
- package/source/class/qx/test/core/Target.js +1 -0
- package/source/class/qx/test/core/Validation.js +2 -0
- package/source/class/qx/test/data/DataArray.js +218 -639
- package/source/class/qx/test/data/DataArrayWithChangeBubble.js +45 -215
- package/source/class/qx/test/data/MultiBinding.js +42 -0
- package/source/class/qx/test/data/async/__init__.js +4 -0
- package/source/class/qx/test/data/controller/Form.js +523 -14
- package/source/class/qx/test/data/controller/List.js +94 -426
- package/source/class/qx/test/data/controller/ListReverse.js +5 -20
- package/source/class/qx/test/data/controller/ListWithObjects.js +49 -225
- package/source/class/qx/test/data/controller/Object.js +54 -222
- package/source/class/qx/test/data/controller/Tree.js +195 -934
- package/source/class/qx/test/data/marshal/Json.js +74 -312
- package/source/class/qx/test/data/singlevalue/Array.js +55 -279
- package/source/class/qx/test/data/singlevalue/Async.js +173 -0
- package/source/class/qx/test/data/singlevalue/Deep.js +148 -327
- package/source/class/qx/test/data/singlevalue/Resolve.js +8 -28
- package/source/class/qx/test/data/singlevalue/Simple.js +124 -359
- package/source/class/qx/test/data/store/Json.js +86 -254
- package/source/class/qx/test/data/store/Jsonp.js +9 -29
- package/source/class/qx/test/data/store/Offline.js +2 -8
- package/source/class/qx/test/data/store/Rest.js +3 -3
- package/source/class/qx/test/dev/unit/Requirements.js +26 -10
- package/source/class/qx/test/event/GlobalError.js +2 -2
- package/source/class/qx/test/html/Iframe.js +1 -1
- package/source/class/qx/test/io/graphql/Client.js +2 -0
- package/source/class/qx/test/io/jsonrpc/Protocol.js +4 -2
- package/source/class/qx/test/io/request/MRequest.js +2 -8
- package/source/class/qx/test/io/request/Xhr.js +27 -117
- package/source/class/qx/test/lang/Function.js +6 -25
- package/source/class/qx/test/lang/Type.js +31 -13
- package/source/class/qx/test/locale/Date.js +173 -2
- package/source/class/qx/test/locale/Locale.js +23 -28
- package/source/class/qx/test/locale/Number.js +71 -0
- package/source/class/qx/test/log/Logger.js +7 -1
- package/source/class/qx/test/log/fixture/ClassA.js +2 -5
- package/source/class/qx/test/mobile/basic/Atom.js +3 -3
- package/source/class/qx/test/mobile/container/Scroll.js +4 -4
- package/source/class/qx/test/mobile/form/CheckBox.js +6 -12
- package/source/class/qx/test/performance/Property.js +5 -4
- package/source/class/qx/test/performance/widget/WidgetWithDecorator.js +2 -0
- package/source/class/qx/test/theme/Simple.js +34 -0
- package/source/class/qx/test/{MAppearance.js → theme/SimpleAppearance.js} +5 -4
- package/source/class/qx/test/{MDecoration.js → theme/SimpleDecoration.js} +6 -4
- package/source/class/qx/test/theme/manager/Color.js +23 -15
- package/source/class/qx/test/theme/manager/Decoration.js +23 -15
- package/source/class/qx/test/theme/manager/Font.js +23 -15
- package/source/class/qx/test/theme/manager/Icon.js +23 -15
- package/source/class/qx/test/theme/manager/Meta.js +33 -20
- package/source/class/qx/test/tool/__init__.js +3 -0
- package/source/class/qx/test/tool/cli/AbstractValue.js +274 -0
- package/source/class/qx/test/tool/cli/Argument.js +384 -0
- package/source/class/qx/test/tool/cli/Command.js +387 -0
- package/source/class/qx/test/tool/cli/Flag.js +413 -0
- package/source/class/qx/test/tool/cli/__init__.js +3 -0
- package/source/class/qx/test/ui/LayoutTestCase.js +1 -14
- package/source/class/qx/test/ui/basic/Label.js +106 -0
- package/source/class/qx/test/ui/core/Blocker.js +125 -3
- package/source/class/qx/test/ui/form/Form.js +106 -0
- package/source/class/qx/test/ui/form/FormManager.js +6 -5
- package/source/class/qx/test/ui/form/SplitButton.js +1 -1
- package/source/class/qx/test/ui/toolbar/OverflowHandling.js +13 -14
- package/source/class/qx/test/ui/toolbar/ToolBar.js +16 -16
- package/source/class/qx/test/ui/tree/TreeFolder.js +5 -7
- package/source/class/qx/test/ui/tree/virtual/AbstractTreeTest.js +2 -0
- package/source/class/qx/test/ui/tree/virtual/Tree.js +36 -0
- package/source/class/qx/test/util/DateFormat.js +1 -1
- package/source/class/qx/test/util/PropertyUtil.js +0 -36
- package/source/class/qx/theme/classic/Appearance.js +1 -1
- package/source/class/qx/theme/indigo/ColorDark.js +2 -0
- package/source/class/qx/theme/manager/Font.js +6 -1
- package/source/class/qx/theme/manager/Meta.js +2 -1
- package/source/class/qx/theme/simple/Appearance.js +31 -95
- package/source/class/qx/theme/simple/Decoration.js +0 -1
- package/source/class/qx/theme/tangible/Appearance.js +1 -1
- package/source/class/qx/tool/cli/AbstractCliApp.js +72 -0
- package/source/class/qx/tool/cli/AbstractValue.js +186 -0
- package/source/class/qx/tool/cli/Argument.js +155 -0
- package/source/class/qx/tool/cli/Command.js +518 -0
- package/source/class/qx/tool/cli/Flag.js +202 -0
- package/source/class/qx/tool/cli/Parser.js +39 -0
- package/source/class/qx/tool/cli/__init__.js +26 -1
- package/source/class/qx/tool/compiler/Analyser.js +41 -13
- package/source/class/qx/tool/compiler/ClassFile.js +37 -9
- package/source/class/qx/tool/compiler/Console.js +2 -0
- package/source/class/qx/tool/compiler/MetaExtraction.js +53 -33
- package/source/class/qx/tool/compiler/app/Library.js +1 -1
- package/source/class/qx/tool/compiler/app/WebFont.js +2 -0
- package/source/class/qx/tool/compiler/cli/Application.js +58 -0
- package/source/class/qx/tool/{cli/commands → compiler/cli}/Command.js +99 -45
- package/source/class/qx/tool/{cli → compiler/cli}/ConfigDb.js +7 -7
- package/source/class/qx/tool/compiler/cli/ConfigLoader.js +272 -0
- package/source/class/qx/tool/{cli → compiler/cli}/LibraryApplication.js +3 -3
- package/source/class/qx/tool/compiler/cli/RootCommand.js +63 -0
- package/source/class/qx/tool/{cli → compiler/cli}/Watch.js +49 -24
- package/source/class/qx/tool/compiler/cli/__init__.js +3 -0
- package/source/class/qx/tool/{cli → compiler/cli}/api/AbstractApi.js +2 -11
- package/source/class/qx/tool/{cli → compiler/cli}/api/CompilerApi.js +11 -10
- package/source/class/qx/tool/{cli → compiler/cli}/api/LibraryApi.js +13 -4
- package/source/class/qx/tool/{cli → compiler/cli}/api/Test.js +1 -1
- package/source/class/qx/tool/compiler/cli/commands/Add.js +49 -0
- package/source/class/qx/tool/{cli → compiler/cli}/commands/Clean.js +12 -25
- package/source/class/qx/tool/{cli → compiler/cli}/commands/Compile.js +524 -615
- package/source/class/qx/tool/{cli → compiler/cli}/commands/Config.js +22 -20
- package/source/class/qx/tool/{cli → compiler/cli}/commands/Create.js +77 -54
- package/source/class/qx/tool/{cli → compiler/cli}/commands/Deploy.js +45 -60
- package/source/class/qx/tool/{cli → compiler/cli}/commands/Es6ify.js +57 -41
- package/source/class/qx/tool/{cli → compiler/cli}/commands/ExportGlyphs.js +26 -7
- package/source/class/qx/tool/compiler/cli/commands/Lint.js +420 -0
- package/source/class/qx/tool/{cli → compiler/cli}/commands/Migrate.js +40 -20
- package/source/class/qx/tool/{cli → compiler/cli}/commands/Package.js +20 -32
- package/source/class/qx/tool/compiler/cli/commands/Pkg.js +36 -0
- package/source/class/qx/tool/compiler/cli/commands/Prettier.js +278 -0
- package/source/class/qx/tool/{cli → compiler/cli}/commands/Run.js +43 -39
- package/source/class/qx/tool/{cli → compiler/cli}/commands/Serve.js +63 -61
- package/source/class/qx/tool/{cli → compiler/cli}/commands/Test.js +49 -52
- package/source/class/qx/tool/{cli → compiler/cli}/commands/Typescript.js +51 -30
- package/source/class/qx/tool/{cli → compiler/cli}/commands/add/Class.js +54 -31
- package/source/class/qx/tool/{cli → compiler/cli}/commands/add/Script.js +56 -32
- package/source/class/qx/tool/{cli → compiler/cli}/commands/config/Delete.js +19 -13
- package/source/class/qx/tool/{cli → compiler/cli}/commands/config/Get.js +19 -13
- package/source/class/qx/tool/{cli → compiler/cli}/commands/config/List.js +20 -20
- package/source/class/qx/tool/{cli → compiler/cli}/commands/config/Set.js +28 -20
- package/source/class/qx/tool/{cli → compiler/cli}/commands/package/Install.js +140 -75
- package/source/class/qx/tool/{cli → compiler/cli}/commands/package/List.js +119 -80
- package/source/class/qx/tool/{cli → compiler/cli}/commands/package/Publish.js +194 -178
- package/source/class/qx/tool/{cli → compiler/cli}/commands/package/Remove.js +18 -21
- package/source/class/qx/tool/{cli → compiler/cli}/commands/package/Update.js +90 -69
- package/source/class/qx/tool/{cli → compiler/cli}/commands/package/Upgrade.js +67 -54
- package/source/class/qx/tool/compiler/makers/AbstractAppMaker.js +2 -1
- package/source/class/qx/tool/compiler/resources/Manager.js +2 -0
- package/source/class/qx/tool/compiler/resources/ScssConverter.js +1 -1
- package/source/class/qx/tool/compiler/resources/ScssFile.js +1 -1
- package/source/class/qx/tool/compiler/targets/Target.js +5 -10
- package/source/class/qx/tool/compiler/targets/TypeScriptWriter.js +6 -2
- package/source/class/qx/tool/compiler/targets/meta/ApplicationMeta.js +2 -4
- package/source/class/qx/tool/compiler/targets/meta/BootJs.js +2 -0
- package/source/class/qx/tool/compiler/targets/meta/PackageJavascript.js +2 -0
- package/source/class/qx/tool/config/Abstract.js +5 -5
- package/source/class/qx/tool/config/Lockfile.js +1 -1
- package/source/class/qx/tool/migration/BaseMigration.js +9 -7
- package/source/class/qx/tool/migration/M6_0_0.js +3 -3
- package/source/class/qx/tool/migration/M8_0_0.js +958 -0
- package/source/class/qx/tool/utils/Debounce.js +0 -1
- package/source/class/qx/tool/utils/Http.js +109 -21
- package/source/class/qx/tool/utils/LogManager.js +7 -0
- package/source/class/qx/tool/utils/Promisify.js +12 -1
- package/source/class/qx/tool/utils/QooxdooVersions.js +193 -0
- package/source/class/qx/tool/utils/Utils.js +8 -5
- package/source/class/qx/tool/utils/Website.js +9 -222
- package/source/class/qx/tool/utils/Zip.js +47 -0
- package/source/class/qx/tool/utils/files/Utils.js +3 -11
- package/source/class/qx/tool/utils/json/Tokenizer.js +5 -0
- package/source/class/qx/ui/basic/Atom.js +8 -8
- package/source/class/qx/ui/core/Blocker.js +17 -4
- package/source/class/qx/ui/core/DragDropCursor.js +2 -1
- package/source/class/qx/ui/core/EventHandler.js +13 -21
- package/source/class/qx/ui/core/LayoutItem.js +8 -31
- package/source/class/qx/ui/core/MExecutable.js +21 -43
- package/source/class/qx/ui/core/MNativeOverflow.js +4 -2
- package/source/class/qx/ui/core/Widget.js +50 -165
- package/source/class/qx/ui/core/scroll/IScrollBar.js +9 -3
- package/source/class/qx/ui/core/scroll/ScrollBar.js +7 -1
- package/source/class/qx/ui/core/scroll/ScrollPane.js +12 -4
- package/source/class/qx/ui/embed/Html.js +6 -2
- package/source/class/qx/ui/form/AbstractField.js +4 -12
- package/source/class/qx/ui/form/Button.js +6 -4
- package/source/class/qx/ui/form/CheckedSelectBox.js +8 -8
- package/source/class/qx/ui/form/FileSelectorButton.js +1 -1
- package/source/class/qx/ui/form/Form.js +3 -0
- package/source/class/qx/ui/form/IListItem.js +3 -1
- package/source/class/qx/ui/form/IRadioItem.js +3 -1
- package/source/class/qx/ui/form/MForm.js +3 -1
- package/source/class/qx/ui/form/Slider.js +6 -2
- package/source/class/qx/ui/form/SplitButton.js +5 -5
- package/source/class/qx/ui/form/TextField.js +1 -2
- package/source/class/qx/ui/form/validation/Manager.js +6 -2
- package/source/class/qx/ui/menubar/Button.js +1 -1
- package/source/class/qx/ui/mobile/basic/Atom.js +5 -5
- package/source/class/qx/ui/mobile/dialog/Menu.js +9 -31
- package/source/class/qx/ui/mobile/dialog/Popup.js +13 -1
- package/source/class/qx/ui/table/pane/FocusIndicator.js +5 -2
- package/source/class/qx/ui/table/pane/Scroller.js +11 -28
- package/source/class/qx/ui/table/selection/Model.js +1 -0
- package/source/class/qx/ui/toolbar/Button.js +1 -1
- package/source/class/qx/ui/toolbar/CheckBox.js +1 -1
- package/source/class/qx/ui/toolbar/FileSelectorButton.js +1 -2
- package/source/class/qx/ui/toolbar/Part.js +2 -2
- package/source/class/qx/ui/toolbar/PartContainer.js +2 -2
- package/source/class/qx/ui/toolbar/ToolBar.js +24 -49
- package/source/class/qx/ui/tree/VirtualTree.js +6 -4
- package/source/class/qx/ui/tree/core/AbstractItem.js +10 -17
- package/source/class/qx/ui/tree/core/IVirtualTree.js +4 -2
- package/source/class/qx/ui/tree/provider/IVirtualTreeProvider.js +20 -10
- package/source/class/qx/ui/treevirtual/SimpleTreeDataModel.js +4 -1
- package/source/class/qx/ui/virtual/cell/Cell.js +20 -48
- package/source/class/qx/ui/virtual/cell/WidgetCell.js +2 -4
- package/source/class/qx/ui/virtual/core/Axis.js +4 -0
- package/source/class/qx/ui/virtual/core/ILayer.js +14 -10
- package/source/class/qx/ui/virtual/core/Scroller.js +4 -4
- package/source/class/qx/ui/virtual/layer/WidgetCell.js +4 -0
- package/source/class/qx/ui/virtual/selection/Abstract.js +3 -0
- package/source/class/qx/ui/virtual/selection/MModel.js +1 -1
- package/source/class/qx/ui/window/IDesktop.js +6 -2
- package/source/class/qx/ui/window/IWindowManager.js +10 -4
- package/source/class/qx/ui/window/MDesktop.js +2 -1
- package/source/class/qx/ui/window/Manager.js +1 -1
- package/source/class/qx/ui/window/Window.js +6 -4
- package/source/class/qx/util/OOUtil.js +8 -9
- package/source/class/qx/util/PropertyUtil.js +34 -154
- package/source/class/qx/util/ResponseParser.js +2 -0
- package/source/class/qx/util/Serializer.js +69 -114
- package/source/class/qx/util/format/DateFormat.js +3 -2
- package/source/global.d.ts +4 -0
- package/source/resource/qx/tool/bin/download-assets +0 -2
- package/source/resource/qx/tool/{cli → compiler/cli}/templates/loader/loader-node.tmpl.js +1 -0
- package/{lib/resource/qx/tool → source/resource/qx/tool/compiler}/cli/templates/template_vars.js +12 -9
- package/{lib/resource/qx/tool → source/resource/qx/tool/compiler}/schema/Manifest-1-0-0.json +2 -2
- package/source/resource/qx/tool/{schema → compiler/schema}/Manifest-2-0-0.json +2 -2
- package/source/resource/qx/tool/{schema → compiler/schema}/compile-1-0-0.json +15 -3
- package/{lib/resource/qx/tool → source/resource/qx/tool/compiler}/schema/qooxdoo-1-0-0.json +1 -1
- package/source/resource/qx/tool/website/build/404.html +22 -22
- package/source/resource/qx/tool/website/build/about.html +23 -23
- package/source/resource/qx/tool/website/build/assets/common.js +30 -18
- package/source/resource/qx/tool/website/build/assets/custom.css +290 -0
- package/source/resource/qx/tool/website/build/assets/qxWeb.js +28 -0
- package/source/resource/qx/tool/website/build/diagnostics/dependson.html +30 -30
- package/source/resource/qx/tool/website/build/diagnostics/dependson.js +49 -40
- package/source/resource/qx/tool/website/build/diagnostics/requiredby.html +20 -23
- package/source/resource/qx/tool/website/build/diagnostics/requiredby.js +38 -31
- package/source/resource/qx/tool/website/build/index.html +24 -24
- package/source/resource/qx/tool/website/build/scripts/serve.js +63 -65
- package/source/resource/qx/tool/website/partials/footer.html +8 -13
- package/source/resource/qx/tool/website/partials/head.html +9 -7
- package/source/resource/qx/tool/website/partials/header.html +3 -3
- package/source/resource/qx/tool/website/src/assets/common.js +32 -0
- package/source/resource/qx/tool/website/src/assets/custom.css +290 -0
- package/source/resource/qx/tool/website/src/assets/qxWeb.js +28 -0
- package/source/resource/qx/tool/website/src/diagnostics/dependson.js +49 -40
- package/source/resource/qx/tool/website/src/diagnostics/requiredby.js +38 -31
- package/source/resource/qx/tool/website/src/index.html +2 -2
- package/source/resource/qx/tool/website/src/scripts/serve.js +63 -65
- package/lib/resource/qx/tool/bin/build-devtools +0 -13
- package/lib/resource/qx/tool/bin/build-website +0 -15
- package/lib/resource/qx/tool/bin/download-assets +0 -23
- package/lib/resource/qx/tool/cli/templates/skeleton/mobile/source/theme/custom/css/custom.css.map +0 -1
- package/lib/resource/qx/tool/website/build/assets/bootstrap.css +0 -7
- package/lib/resource/qx/tool/website/build/assets/bootstrap.min.css +0 -7
- package/lib/resource/qx/tool/website/build/assets/bootstrap.min.css.map +0 -1
- package/lib/resource/qx/tool/website/build/assets/jquery.js +0 -5453
- package/lib/resource/qx/tool/website/build/qooxdoo.css +0 -21
- package/lib/resource/qx/tool/website/sass/qooxdoo.css +0 -3
- package/lib/resource/qx/tool/website/sass/qooxdoo.css.map +0 -1
- package/lib/resource/qx/tool/website/src/assets/bootstrap.css +0 -7
- package/lib/resource/qx/tool/website/src/assets/bootstrap.min.css +0 -7
- package/lib/resource/qx/tool/website/src/assets/bootstrap.min.css.map +0 -1
- package/lib/resource/qx/tool/website/src/assets/jquery.js +0 -5453
- package/source/class/qx/core/Property.js +0 -2100
- package/source/class/qx/tool/cli/Application.js +0 -47
- package/source/class/qx/tool/cli/Cli.js +0 -713
- package/source/class/qx/tool/cli/commands/Add.js +0 -46
- package/source/class/qx/tool/cli/commands/Lint.js +0 -255
- package/source/class/qx/tool/cli/commands/Pkg.js +0 -56
- package/source/class/qx/tool/cli/commands/package/Migrate.js +0 -37
- package/source/class/qx/tool/compiler/app/Cldr.js +0 -725
- package/source/resource/qx/tool/bin/build-devtools +0 -13
- package/source/resource/qx/tool/bin/build-website +0 -15
- package/source/resource/qx/tool/website/build/assets/bootstrap.css +0 -7
- package/source/resource/qx/tool/website/build/assets/bootstrap.min.css +0 -7
- package/source/resource/qx/tool/website/build/assets/bootstrap.min.css.map +0 -1
- package/source/resource/qx/tool/website/build/assets/jquery.js +0 -5453
- package/source/resource/qx/tool/website/build/qooxdoo.css +0 -21
- package/source/resource/qx/tool/website/sass/qooxdoo.scss +0 -31
- package/source/resource/qx/tool/website/src/assets/bootstrap.css +0 -7
- package/source/resource/qx/tool/website/src/assets/bootstrap.min.css +0 -7
- package/source/resource/qx/tool/website/src/assets/bootstrap.min.css.map +0 -1
- package/source/resource/qx/tool/website/src/assets/jquery.js +0 -5453
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/TypeScriptWriter-base_declaration.d.ts +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/class/default.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/class/header.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/class/interface.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/class/mixin.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/class/singleton.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/loader/loader-browser.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/loader/loader-rhino.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/.gitignore.tmpl +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/Manifest.tmpl.json +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/compile.tmpl.json +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/readme.tmpl.md +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/boot/index.tmpl.html +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/boot/nojs.tmpl.html +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/Application.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/__init__.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/test/DemoTest.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Appearance.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Color.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Decoration.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Font.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Theme.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/app.png +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/favicon.png +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/js_256x256.png +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/test.png +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/translation/readme.txt +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/.gitignore.tmpl +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/Manifest.tmpl.json +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/compile.tmpl.json +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/readme.tmpl.md +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/boot/index.tmpl.html +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/boot/nojs.tmpl.html +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/Application.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/__init__.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/page/Login.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/page/Overview.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/page/__init__.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/app.png +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/css/.gitignore.tmpl +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/favicon.png +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/js_256x256.png +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/theme/custom/css/custom.css +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/translation/readme.txt +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/.gitignore.tmpl +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/Manifest.tmpl.json +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/compile.tmpl.json +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/readme.tmpl.md +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/Button.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/__init__.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/demo/Application.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/resource/custom/test.png +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/test/DemoTest.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Appearance.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Color.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Decoration.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Font.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Theme.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/resource/custom/test.png +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/translation/readme.txt +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/.gitignore.tmpl +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/Manifest.tmpl.json +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/compile.tmpl.json +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/readme.tmpl.txt +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/class/custom/Application.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/class/custom/__init__.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/class/custom/test/DemoTest.tmpl.js +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/resource/custom/.gitignore.tmpl +0 -0
- /package/lib/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/translation/readme.txt +0 -0
- /package/lib/resource/qx/tool/{loadsass.js → compiler/loadsass.js} +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/TypeScriptWriter-base_declaration.d.ts +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/class/default.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/class/header.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/class/interface.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/class/mixin.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/class/singleton.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/loader/loader-browser.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/loader/loader-rhino.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/.gitignore.tmpl +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/Manifest.tmpl.json +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/compile.tmpl.json +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/readme.tmpl.md +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/boot/index.tmpl.html +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/boot/nojs.tmpl.html +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/Application.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/__init__.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/test/DemoTest.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Appearance.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Color.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Decoration.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Font.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/class/custom/theme/Theme.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/app.png +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/favicon.png +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/js_256x256.png +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/resource/custom/test.png +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/desktop/source/translation/readme.txt +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/.gitignore.tmpl +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/Manifest.tmpl.json +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/compile.tmpl.json +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/readme.tmpl.md +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/boot/index.tmpl.html +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/boot/nojs.tmpl.html +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/Application.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/__init__.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/page/Login.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/page/Overview.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/class/custom/page/__init__.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/app.png +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/css/.gitignore.tmpl +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/favicon.png +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/resource/custom/js_256x256.png +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/theme/custom/scss/_styles.scss +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/theme/custom/scss/custom.scss +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/mobile/source/translation/readme.txt +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/.gitignore.tmpl +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/Manifest.tmpl.json +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/compile.tmpl.json +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/readme.tmpl.md +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/Button.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/__init__.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/demo/Application.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/resource/custom/test.png +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/test/DemoTest.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Appearance.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Color.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Decoration.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Font.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/class/custom/theme/Theme.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/resource/custom/test.png +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/package/source/translation/readme.txt +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/.gitignore.tmpl +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/Manifest.tmpl.json +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/compile.tmpl.json +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/readme.tmpl.txt +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/class/custom/Application.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/class/custom/__init__.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/class/custom/test/DemoTest.tmpl.js +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/resource/custom/.gitignore.tmpl +0 -0
- /package/source/resource/qx/tool/{cli → compiler/cli}/templates/skeleton/server/source/translation/readme.txt +0 -0
- /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
|
+
});
|