diff --git a/.github/workflows/bn_master_commit.yml b/.github/workflows/bn_master_commit.yml index 85b2f9cf3..beaf3270c 100644 --- a/.github/workflows/bn_master_commit.yml +++ b/.github/workflows/bn_master_commit.yml @@ -23,7 +23,7 @@ jobs: - name: Setup CMake uses: jwlawson/actions-setup-cmake@v1.8 with: - cmake-version: '3.19.6' # See https://gitlab.kitware.com/cmake/cmake/-/issues/22021 + cmake-version: '3.26.3' - name: Setup Ninja run: brew install ninja - name: NPM Install (Playground) diff --git a/.github/workflows/ios_android.yml b/.github/workflows/ios_android.yml index 12d6316cc..f501f8e61 100644 --- a/.github/workflows/ios_android.yml +++ b/.github/workflows/ios_android.yml @@ -28,7 +28,7 @@ jobs: - name: Setup CMake uses: jwlawson/actions-setup-cmake@v1.8 with: - cmake-version: '3.19.6' # See https://gitlab.kitware.com/cmake/cmake/-/issues/22021 + cmake-version: '3.26.3' - name: Setup Ninja run: brew install ninja - name: 'Select XCode ${{ inputs.xcode-version }}' diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index eb34d5003..0d762adbd 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -21,7 +21,7 @@ jobs: - name: Setup CMake uses: jwlawson/actions-setup-cmake@v1.8 with: - cmake-version: '3.19.6' # See https://gitlab.kitware.com/cmake/cmake/-/issues/22021 + cmake-version: '3.26.3' - name: Setup Ninja run: brew install ninja - name: NPM Install (Playground) @@ -77,7 +77,7 @@ jobs: - name: Setup CMake uses: jwlawson/actions-setup-cmake@v1.8 with: - cmake-version: '3.19.6' # See https://gitlab.kitware.com/cmake/cmake/-/issues/22021 + cmake-version: '3.26.3' - name: Setup Ninja run: brew install ninja - name: NPM Install (Playground) diff --git a/.github/workflows/test_compatibility.yml b/.github/workflows/test_compatibility.yml new file mode 100644 index 000000000..a76d443a2 --- /dev/null +++ b/.github/workflows/test_compatibility.yml @@ -0,0 +1,29 @@ +name: Test BabylonNative Compatibility +on: + workflow_dispatch: + inputs: + NPM_Mask: + description: 'NPM versions mask' + required: true + type: string + default: 5.*.* + +jobs: + build: + runs-on: windows-2019 + + steps: + - name: Checkout + uses: actions/checkout@master + - name: NPM Install + run: npm install + working-directory: ./Apps/TestCompatibility + - name: Run tests + run: npm run testPackages ${{ github.event.inputs.NPM_Mask }} + working-directory: ./Apps/TestCompatibility + - name: Upload Result + uses: actions/upload-artifact@v2 + with: + name: NPMCompatibility + path: | + ./Apps/TestCompatibility/compatibility.json \ No newline at end of file diff --git a/Apps/TestCompatibility/package-lock.json b/Apps/TestCompatibility/package-lock.json new file mode 100644 index 000000000..49c1b455a --- /dev/null +++ b/Apps/TestCompatibility/package-lock.json @@ -0,0 +1,415 @@ +{ + "name": "testcompatibility", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "testcompatibility", + "version": "0.0.1", + "dependencies": { + "babylonjs": "^5.0.3", + "babylonjs-gui": "^5.0.3", + "babylonjs-loaders": "^5.0.3", + "babylonjs-materials": "^5.0.3", + "shelljs": "^0.8.4" + } + }, + "node_modules/babylonjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-5.0.3.tgz", + "integrity": "sha512-FcvNJHOn9wJ+geohPCFOa2RwwADz3Ep1gyPeWui8C96KwbKXrW/k02N1Uh5MyMu8s2P9thPCHr298lrTs5pwnQ==" + }, + "node_modules/babylonjs-gltf2interface": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-5.50.1.tgz", + "integrity": "sha512-FgXTm/N0Vz/K4FA0X5OoHxQ7tyacxRvfd8MBYMEtvSSTyDpYEiEqhEmcUgAON0OGGJ3fBYl9jZXromXO2NG7ow==" + }, + "node_modules/babylonjs-gui": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs-gui/-/babylonjs-gui-5.0.3.tgz", + "integrity": "sha512-kyeNLfZ3hrK2MLkhX9VBy40Y0B7b7IqZhqQwK36BULKie7i6cL7PZbCh5jRndW1m19qT+nb0ePmbV27zAxZjNg==", + "dependencies": { + "babylonjs": "^5.0.3" + } + }, + "node_modules/babylonjs-loaders": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs-loaders/-/babylonjs-loaders-5.0.3.tgz", + "integrity": "sha512-3OAP06RsTj+DNVcVZyIOkJdU1SeJzrnHm5EiIS0EtSChAFVSJimY3q6MVm1VzSxqJtrdbe3AOG4qI5NOnSja/w==", + "dependencies": { + "babylonjs": "^5.0.3", + "babylonjs-gltf2interface": "^5.0.3" + } + }, + "node_modules/babylonjs-materials": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs-materials/-/babylonjs-materials-5.0.3.tgz", + "integrity": "sha512-VQ4Z5VU11AjjK+/ragkVdiIjvnCDzsYULTdKNDiKBmKxU1Idq9DM2TI9AO2LipZauXXvd0YhJSlVX5fCkG+Ubg==", + "dependencies": { + "babylonjs": "^5.0.3" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + }, + "dependencies": { + "babylonjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-5.0.3.tgz", + "integrity": "sha512-FcvNJHOn9wJ+geohPCFOa2RwwADz3Ep1gyPeWui8C96KwbKXrW/k02N1Uh5MyMu8s2P9thPCHr298lrTs5pwnQ==" + }, + "babylonjs-gltf2interface": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-5.50.1.tgz", + "integrity": "sha512-FgXTm/N0Vz/K4FA0X5OoHxQ7tyacxRvfd8MBYMEtvSSTyDpYEiEqhEmcUgAON0OGGJ3fBYl9jZXromXO2NG7ow==" + }, + "babylonjs-gui": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs-gui/-/babylonjs-gui-5.0.3.tgz", + "integrity": "sha512-kyeNLfZ3hrK2MLkhX9VBy40Y0B7b7IqZhqQwK36BULKie7i6cL7PZbCh5jRndW1m19qT+nb0ePmbV27zAxZjNg==", + "requires": { + "babylonjs": "^5.0.3" + } + }, + "babylonjs-loaders": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs-loaders/-/babylonjs-loaders-5.0.3.tgz", + "integrity": "sha512-3OAP06RsTj+DNVcVZyIOkJdU1SeJzrnHm5EiIS0EtSChAFVSJimY3q6MVm1VzSxqJtrdbe3AOG4qI5NOnSja/w==", + "requires": { + "babylonjs": "^5.0.3", + "babylonjs-gltf2interface": "^5.0.3" + } + }, + "babylonjs-materials": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs-materials/-/babylonjs-materials-5.0.3.tgz", + "integrity": "sha512-VQ4Z5VU11AjjK+/ragkVdiIjvnCDzsYULTdKNDiKBmKxU1Idq9DM2TI9AO2LipZauXXvd0YhJSlVX5fCkG+Ubg==", + "requires": { + "babylonjs": "^5.0.3" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Apps/TestCompatibility/package.json b/Apps/TestCompatibility/package.json new file mode 100644 index 000000000..58294d01d --- /dev/null +++ b/Apps/TestCompatibility/package.json @@ -0,0 +1,15 @@ +{ + "name": "testcompatibility", + "version": "0.0.1", + "private": true, + "scripts": { + "testCompatibility": "node testBNCompatibility.js" + }, + "dependencies": { + "babylonjs": "^5.0.3", + "babylonjs-gui": "^5.0.3", + "babylonjs-loaders": "^5.0.3", + "babylonjs-materials": "^5.0.3", + "shelljs": "^0.8.4" + } +} diff --git a/Apps/TestCompatibility/testBNCompatibility.js b/Apps/TestCompatibility/testBNCompatibility.js new file mode 100644 index 000000000..da1b97e74 --- /dev/null +++ b/Apps/TestCompatibility/testBNCompatibility.js @@ -0,0 +1,134 @@ +const fs = require('fs'); +const shelljs = require('shelljs'); + +let compatibility = []; +function execute(command, workingDirectory, callback){ + const res = shelljs.exec(command, { fatal: false, cwd: workingDirectory, async: false }); + callback(res.code, res.stdout, res.stderr); +}; + +function copy(source, destination) { + fs.copyFileSync(source, destination); + console.log(`${source} was copied to ${destination}`); +} + +const protocolChecker = "//BRNCHECK\r\nconsole.log(' * Checking Babylon.js / BabylonNative protocols');\r\n"+ + "if (_native.Engine.PROTOCOL_VERSION !== BABYLON.NativeEngine.PROTOCOL_VERSION) {\r\n"+ + "console.log(` * Protocol version mismatch: ${_native.Engine.PROTOCOL_VERSION} (Native) !== ${BABYLON.NativeEngine.PROTOCOL_VERSION} (JS)`);\r\n"+ + "TestUtils.exit(-1); } else { console.log(' * Protocol version OK! '); }\r\n"+ + "console.error = function(errorMsg) { console.log(errorMsg); TestUtils.exit(-1);}\r\n"; + +const exeFolder = './BabylonNative/build/Apps/ValidationTests/Release'; +const filesToCopy = [ + {source:'babylonjs', files:['babylon.max.js', 'babylon.max.js.map']}, + {source:'babylonjs-gui', files:['babylon.gui.js', 'babylon.gui.js.map']}, + {source:'babylonjs-loaders', files:['babylonjs.loaders.js', 'babylonjs.loaders.js.map']}, + {source:'babylonjs-materials', files:['babylonjs.materials.js', 'babylonjs.materials.js.map']}]; + +const BRNVersions = [ + {tag:'1.4.3', hash:'301ab90'}, + {tag:'1.4.4', hash:'75954f4'}, + {tag:'1.5.0', hash:'75954f4'}, + {tag:'1.5.1', hash:'a2cf1c7'}, + {tag:'1.6.0', hash:'409bc4b'}]; + +function patchTestScript() { + const filePath = `${exeFolder}/Scripts/validation_native.js`; + console.log("Patching test script."); + const testScript = fs.readFileSync(filePath); + if (testScript.includes("//BRNCHECK")) { + // already patched + return; + } + const newContent = protocolChecker + testScript; + fs.writeFileSync(filePath, newContent); +} + +function checkoutAndBuildBN(tag, hash, callback) { + console.log("Git clone."); + execute('git clone https://github.com/BabylonJS/BabylonNative.git', './', (error, stdout, stderr) => { + console.log("Submodule update."); + execute('git submodule update --init --recursive', './BabylonNative', (error, stdout, stderr) => { + //if (error) throw error; + console.log(`Checkout tag ${hash}.`); + execute(`git checkout ${hash}`, "./BabylonNative", (error, stdout, stderr) => { + if (error) throw error; + execute('git submodule update --recursive', './BabylonNative', (error, stdout, stderr) => { + console.log('Making build directory.'); + fs.rmSync('./BabylonNative/build', { recursive: true, force: true }); + execute(`mkdir build`, "./BabylonNative", (error, stdout, stderr) => { + if (error) throw error; + execute(`npm install`, "./BabylonNative/Apps", (error, stdout, stderr) => { + if (error) throw error; + console.log('Building win32 project.'); + + execute(`cmake -G "Visual Studio 16 2019" -A x64 ..`, "./BabylonNative/build", (error, stdout, stderr) => { + if (error) throw error; + console.log('Building win32 apps.'); + execute(`cmake --build build --config Release`, "./BabylonNative", (error, stdout, stderr) => { + if (error) throw error; + patchTestScript(); + callback(tag, hash); + }); + }); + }); + }); + }); + }); + }); + }); +} + +function testPackages(tag, hash) { + let compatiblePackageVersions = []; + + let bjsMask = '5.*.*'; + const [bjsVersion] = process.argv.slice(2); + if (bjsVersion != '') { + bjsMask = bjsVersion; + } + + console.log("Getting NPM versions ..."); + execute(`npm show babylonjs@${bjsMask} version --json`, "./", (error, stdout, stderr) => { + if (error) throw error; + + const versions = JSON.parse(stdout); + + versions.forEach(version => { + console.log("-".repeat(30)); + console.log(`Installing packages for ${version}`); + execute(`npm install babylonjs@${version} babylonjs-gui@${version} babylonjs-loaders@${version} babylonjs-materials@${version}`, "./", (error, stdout, stderr) => { + if (error) throw error; + + // copy package .js + console.log("Copying packages files."); + filesToCopy.forEach(entry => { + entry.files.forEach(file => { + copy(`node_modules/${entry.source}/${file}`, `${exeFolder}/Scripts/${file}`); + }); + }); + + // run validation test + console.log("Running validation tests."); + execute("ValidationTests", exeFolder, (error, stdout, stderr) => { + console.log(`Error Code ${error}`); + if (!!error) { + console.log(`${version} Failed!`); + } else { + compatiblePackageVersions.push(version); + console.log(`${version} OK!`); + } + }); + }); + }); + }); + console.log(`Compatible versions for BabylonReactNative ${tag} using BabylonNative ${hash}:`, compatiblePackageVersions); + compatibility.push({tag:tag, hash:hash, npms:compatiblePackageVersions}); +} + +BRNVersions.forEach((versionToTest) =>{ + checkoutAndBuildBN(versionToTest.tag, versionToTest.hash,(tag, hash) => { testPackages(tag, hash); }); +}); + +// and out! +fs.writeFileSync("compatibility.json", JSON.stringify(compatibility)); \ No newline at end of file diff --git a/Documentation/Images/compatibilityTest.jpg b/Documentation/Images/compatibilityTest.jpg new file mode 100644 index 000000000..ad04734fc Binary files /dev/null and b/Documentation/Images/compatibilityTest.jpg differ diff --git a/Documentation/TestingCompatibility.md b/Documentation/TestingCompatibility.md new file mode 100644 index 000000000..ce7104cb5 --- /dev/null +++ b/Documentation/TestingCompatibility.md @@ -0,0 +1,35 @@ +# Testing BabylonNative Compatibility + +`Apps/TestCompatibility` is a semi-automated tool to test compatibility between BabylonReactNative (more specificaly BabylonNative) +and Babylon.js NPM packages. +It checks out, builds and runs validation tests for every BabylonNative hash version from a list and every Babylon.js NPM package. +NPM Package version must correspond to a mask provided to the script. + +## Testing localy + +Testing takes time and multiple windows get opened and closed. This will make working in parrallel a bit difficult. Best is to leave running script without using the PC. + +Clone BabylonReactNative repo then : +``` +cd Apps/TestCompatibility +npm i +npm run testPackages +``` + +Result is a JSON file named `compatibility.json`. + +## Testing on CI + +Go to GitHub Action. + +![Preview](./Images/compatibilityTest.jpg) + +Result is the same .JSON as earlier than can be download as an artifact + +## Results + +Resulting JSON is an array that contains a list of Babylon.js NPM versions compatible with the BabylonNative commit hash. +There is a 1-1 link between a BabylonReactNative released version and a BabylonNative commit. + +Note: The script test is very restrictive. Any compatibility version mismatch, a crash, a bad Validation test ,... will result in that specific version being incompatible. +This means that a version marked as compatible is sure to run, at least, all the validation tests. \ No newline at end of file diff --git a/Modules/@babylonjs/react-native-iosandroid/android/CMakeLists.txt b/Modules/@babylonjs/react-native-iosandroid/android/CMakeLists.txt index 99bd84ed3..1396477f9 100644 --- a/Modules/@babylonjs/react-native-iosandroid/android/CMakeLists.txt +++ b/Modules/@babylonjs/react-native-iosandroid/android/CMakeLists.txt @@ -134,7 +134,7 @@ if (EXISTS "${TURBOMODULE_DIR}/CMakeLists.txt") turbomodulejsijni # prefab ready yoga # prefab ready AndroidExtensions - Graphics + GraphicsDevice JsRuntime NativeCamera NativeCapture @@ -196,7 +196,7 @@ else() jsi turbomodulejsijni AndroidExtensions - Graphics + GraphicsDevice JsRuntime NativeCamera NativeCapture diff --git a/Modules/@babylonjs/react-native-iosandroid/android/build.gradle b/Modules/@babylonjs/react-native-iosandroid/android/build.gradle index e7dfd3fd0..c64e1ec91 100644 --- a/Modules/@babylonjs/react-native-iosandroid/android/build.gradle +++ b/Modules/@babylonjs/react-native-iosandroid/android/build.gradle @@ -109,7 +109,7 @@ android { } externalNativeBuild { cmake { - version '3.19.6' + version '3.19.6+' path 'CMakeLists.txt' } } diff --git a/Modules/@babylonjs/react-native-iosandroid/ios/CMakeLists.txt b/Modules/@babylonjs/react-native-iosandroid/ios/CMakeLists.txt index fadbf2538..23ff53114 100644 --- a/Modules/@babylonjs/react-native-iosandroid/ios/CMakeLists.txt +++ b/Modules/@babylonjs/react-native-iosandroid/ios/CMakeLists.txt @@ -42,7 +42,7 @@ target_include_directories(BabylonNative PUBLIC ${CMAKE_CURRENT_LIST_DIR}) target_link_libraries(BabylonNative z arcana - Graphics + GraphicsDevice jsi reactnative JsRuntime diff --git a/Modules/@babylonjs/react-native-iosandroid/submodules/BabylonNative b/Modules/@babylonjs/react-native-iosandroid/submodules/BabylonNative index 409bc4b31..c89031ec5 160000 --- a/Modules/@babylonjs/react-native-iosandroid/submodules/BabylonNative +++ b/Modules/@babylonjs/react-native-iosandroid/submodules/BabylonNative @@ -1 +1 @@ -Subproject commit 409bc4b3178a5140462c618293e5ff984dfe5bd5 +Subproject commit c89031ec58bca5faffa92d3498230c5484175e57 diff --git a/Modules/@babylonjs/react-native-windows/README.md b/Modules/@babylonjs/react-native-windows/README.md index 4a84b9a19..e9ff6dc1f 100644 --- a/Modules/@babylonjs/react-native-windows/README.md +++ b/Modules/@babylonjs/react-native-windows/README.md @@ -10,3 +10,11 @@ This package has several **peer dependencies**. If these dependencies are unmet, This package will not work without installing the `@babylonjs/react-native` peer dependency. The `react-native-permissions` dependency is required for XR capabilities of Babylon.js. + +### Toolset + +Default toolset is v142. It's possible to change it using project variable named `BabylonReactNativeToolset`. +There are multiple ways to specify it: +- environment variable +- msbuild property (`msbuild /p:BabylonReactNativeToolset=v143` for example) +- customize the build by folder (https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-by-directory?view=vs-2022) \ No newline at end of file diff --git a/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonModule.cpp b/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonModule.cpp index 240cbc662..6cb24ca85 100644 --- a/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonModule.cpp +++ b/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonModule.cpp @@ -2,6 +2,12 @@ #include "BabylonModule.h" #include "JSI/JsiApiContext.h" +// see https://developercommunity.visualstudio.com/t/-imp-std-init-once-complete-unresolved-external-sy/1684365 +#if _MSC_VER >= 1932 // Visual Studio 2022 version 17.2+ +# pragma comment(linker, "/alternatename:__imp___std_init_once_complete=__imp_InitOnceComplete") +# pragma comment(linker, "/alternatename:__imp___std_init_once_begin_initialize=__imp_InitOnceBeginInitialize") +#endif + using namespace winrt::BabylonReactNative::implementation; REACT_INIT(Initialize); diff --git a/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj b/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj index 6960fe7a2..818b25733 100644 --- a/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj +++ b/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj @@ -77,8 +77,8 @@ DynamicLibrary v142 - v141 - v142 + $(BabylonReactNativeToolset) + Unicode false x64 diff --git a/Modules/@babylonjs/react-native-windows/windows/CMakeLists.txt b/Modules/@babylonjs/react-native-windows/windows/CMakeLists.txt index a23b717ff..7dcada09c 100644 --- a/Modules/@babylonjs/react-native-windows/windows/CMakeLists.txt +++ b/Modules/@babylonjs/react-native-windows/windows/CMakeLists.txt @@ -30,7 +30,7 @@ target_include_directories(BabylonNative PRIVATE ${SHARED_INCLUDES}) target_link_libraries(BabylonNative arcana - Graphics + GraphicsDevice jsi JsRuntime NativeCamera diff --git a/Modules/@babylonjs/react-native/shared/BabylonNative.cpp b/Modules/@babylonjs/react-native/shared/BabylonNative.cpp index a42f83bee..f1042c3b0 100644 --- a/Modules/@babylonjs/react-native/shared/BabylonNative.cpp +++ b/Modules/@babylonjs/react-native/shared/BabylonNative.cpp @@ -23,8 +23,8 @@ namespace BabylonNative namespace { Dispatcher g_inlineDispatcher{ [](const std::function& func) { func(); } }; - std::unique_ptr g_graphics{}; - std::unique_ptr g_update{}; + std::optional g_graphicsDevice{}; + std::optional g_update{}; std::unique_ptr g_nativeCanvas{}; } @@ -75,34 +75,34 @@ namespace BabylonNative void UpdateView(WindowType window, size_t width, size_t height) { - m_windowConfig.Window = window; - m_windowConfig.Width = width; - m_windowConfig.Height = height; + m_graphicsConfig.Window = window; + m_graphicsConfig.Width = width; + m_graphicsConfig.Height = height; UpdateGraphicsConfiguration(); } void UpdateGraphicsConfiguration() { - if (!g_graphics) + if (!g_graphicsDevice) { - g_graphics = Babylon::Graphics::Device::Create(m_windowConfig); - g_update = std::make_unique(g_graphics->GetUpdate("update")); + g_graphicsDevice.emplace(m_graphicsConfig); + g_update.emplace(g_graphicsDevice->GetUpdate("update")); } else { - g_graphics->UpdateWindow(m_windowConfig); - g_graphics->UpdateSize(m_windowConfig.Width, m_windowConfig.Height); + g_graphicsDevice->UpdateWindow(m_graphicsConfig.Window); + g_graphicsDevice->UpdateSize(m_graphicsConfig.Width, m_graphicsConfig.Height); } - g_graphics->UpdateMSAA(mMSAAValue); - g_graphics->UpdateAlphaPremultiplied(mAlphaPremultiplied); + g_graphicsDevice->UpdateMSAA(mMSAAValue); + g_graphicsDevice->UpdateAlphaPremultiplied(mAlphaPremultiplied); - g_graphics->EnableRendering(); + g_graphicsDevice->EnableRendering(); std::call_once(m_isGraphicsInitialized, [this]() { m_jsDispatcher([this]() { - g_graphics->AddToJavaScript(m_env); + g_graphicsDevice->AddToJavaScript(m_env); Babylon::Plugins::NativeEngine::Initialize(m_env); }); }); @@ -121,18 +121,18 @@ namespace BabylonNative void UpdateMSAA(uint8_t value) { mMSAAValue = value; - if (g_graphics) + if (g_graphicsDevice) { - g_graphics->UpdateMSAA(value); + g_graphicsDevice->UpdateMSAA(value); } } void UpdateAlphaPremultiplied(bool enabled) { mAlphaPremultiplied = enabled; - if (g_graphics) + if (g_graphicsDevice) { - g_graphics->UpdateAlphaPremultiplied(enabled); + g_graphicsDevice->UpdateAlphaPremultiplied(enabled); } } @@ -144,12 +144,12 @@ namespace BabylonNative } // If rendering has not been explicitly enabled, or has been explicitly disabled, then don't try to render. // Otherwise rendering can be implicitly enabled, which may not be desirable (e.g. after the engine is disposed). - if (g_graphics && m_isRenderingEnabled) + if (g_graphicsDevice && m_isRenderingEnabled) { - g_graphics->StartRenderingCurrentFrame(); + g_graphicsDevice->StartRenderingCurrentFrame(); g_update->Start(); g_update->Finish(); - g_graphics->FinishRenderingCurrentFrame(); + g_graphicsDevice->FinishRenderingCurrentFrame(); } } @@ -160,10 +160,10 @@ namespace BabylonNative void ResetView() { - if (g_graphics) + if (g_graphicsDevice) { g_nativeCanvas->FlushGraphicResources(); - g_graphics->DisableRendering(); + g_graphicsDevice->DisableRendering(); } m_isRenderingEnabled = false; @@ -264,7 +264,7 @@ namespace BabylonNative Babylon::Plugins::NativeInput* m_nativeInput{}; std::optional m_nativeXr{}; - Babylon::Graphics::WindowConfiguration m_windowConfig{}; + Babylon::Graphics::Configuration m_graphicsConfig{}; std::shared_ptr m_isXRActive{}; uint8_t mMSAAValue{}; diff --git a/README.md b/README.md index 82b323d29..f67b23db7 100644 --- a/README.md +++ b/README.md @@ -227,11 +227,11 @@ For iOS the XCode project needs to be generated with `CMake` as described [above | React Native | Babylon React Native | |---|---| -| 0.64 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.5.4-preview| -| 0.65 -> 0.68 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.5.4-preview | -| 0.69 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.5.4-preview | -| 0.70 | 1.5.0, 1.5.1, 1.5.4-preview | -| 0.71 | 1.5.4-preview | +| 0.64 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.3 | +| 0.65 -> 0.68 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.3 | +| 0.69 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.3 | +| 0.70 | 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.3 | +| 0.71 -> 0.72 | 1.6.0, 1.6.1, 1.6.3 | Here are the package names for Android/iOS and Windows: @@ -241,7 +241,7 @@ Here are the package names for Android/iOS and Windows: | 0.65 -> 0.68 | [@babylonjs/react-native-iosandroid-0-65](https://www.npmjs.com/package/@babylonjs/react-native-iosandroid-0-65) | [@babylonjs/react-native-windows-0-65](https://www.npmjs.com/package/@babylonjs/react-native-windows-0-65) | | 0.69 | [@babylonjs/react-native-iosandroid-0-69](https://www.npmjs.com/package/@babylonjs/react-native-iosandroid-0-69) | [@babylonjs/react-native-windows-0-69](https://www.npmjs.com/package/@babylonjs/react-native-windows-0-69) | | 0.70 | [@babylonjs/react-native-iosandroid-0-70](https://www.npmjs.com/package/@babylonjs/react-native-iosandroid-0-70) | [@babylonjs/react-native-windows-0-70](https://www.npmjs.com/package/@babylonjs/react-native-windows-0-70) | -| 0.71 | [@babylonjs/react-native-iosandroid-0-71](https://www.npmjs.com/package/@babylonjs/react-native-iosandroid-0-71) | [@babylonjs/react-native-windows-0-71](https://www.npmjs.com/package/@babylonjs/react-native-windows-0-71) | +| 0.71 -> 0.72 | [@babylonjs/react-native-iosandroid-0-71](https://www.npmjs.com/package/@babylonjs/react-native-iosandroid-0-71) | [@babylonjs/react-native-windows-0-71](https://www.npmjs.com/package/@babylonjs/react-native-windows-0-71) | Also, [@babylonjs/react-native](https://www.npmjs.com/package/@babylonjs/react-native) is a needed dependency for all platforms. @@ -251,14 +251,16 @@ Depending on the Babylon React Native NPM package version, some Babylon.js NPM d | Babylon React Native | Babylon.js ([@babylonjs/core](https://www.npmjs.com/package/@babylonjs/core), [@babylonjs/loaders](https://www.npmjs.com/package/@babylonjs/loaders), ...) | |---|---| -| 1.4.0 | 5.27.1 | -| 1.4.1 | 5.32.2, 5.33.0, 5.33.1, 5.33.2, 5.34.0, 5.35.0 | -| 1.4.2 | 5.35.1, 5.36.0, 5.37.0, 5.38.0, 5.39.0, 5.42.0, 5.42.1 | -| 1.4.3 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1 | -| 1.4.4 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1 | -| 1.5.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1 | -| 1.5.1 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1 | -| 1.5.4-preview | 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1 | +| 1.4.0 | 5.27.1 | +| 1.4.1 | 5.32.2, 5.33.0, 5.33.1, 5.33.2, 5.34.0, 5.35.0 | +| 1.4.2 | 5.35.1, 5.36.0, 5.37.0, 5.38.0, 5.39.0, 5.42.0, 5.42.1 | +| 1.4.3 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.1, 6.4.0, 6.4.1 | +| 1.4.4 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | +| 1.5.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | +| 1.5.1 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | +| 1.6.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.2, 5.46.0, 5.47.0, 5.48.0, 5.48.1, 5.49.1 | +| 1.6.1 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.2, 5.46.0, 5.47.0, 5.48.0, 5.48.1, 5.49.1 | +| 1.6.3 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.2, 5.46.0, 5.47.0, 5.48.0, 5.48.1, 5.49.1 | ## Security