diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 4b6b673ce4..1f02a0e753 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -33,7 +33,7 @@ This pull request is in the type of: -### After: How is it fixed in this PR? +### After: How does it behave after the fixing? @@ -41,11 +41,20 @@ This pull request is in the type of: +## Document Info + +One of the following should be checked. + +- [ ] This PR doesn't relate to document changes +- [ ] The document should be updated later +- [ ] The document changes have been made in apache/echarts-doc#xxx + + + ## Misc - +### ZRender Changes -- [ ] The API has been changed (apache/echarts-doc#xxx). - [ ] This PR depends on ZRender changes (ecomfe/zrender#xxx). ### Related test cases or examples to use the new APIs diff --git a/.github/workflows/nightly-next.yml b/.github/workflows/nightly-next.yml index a8f1f2a9cf..b8c7978846 100644 --- a/.github/workflows/nightly-next.yml +++ b/.github/workflows/nightly-next.yml @@ -11,6 +11,7 @@ on: jobs: build: runs-on: ubuntu-latest + if: ${{ github.repository_owner == 'apache' }} strategy: matrix: diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 030044bbb4..5f4a302383 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -11,6 +11,7 @@ on: jobs: build: runs-on: ubuntu-latest + if: ${{ github.repository_owner == 'apache' }} strategy: matrix: diff --git a/.github/workflows/source-release.yml b/.github/workflows/source-release.yml index db4c7e2f77..c98ba72345 100644 --- a/.github/workflows/source-release.yml +++ b/.github/workflows/source-release.yml @@ -7,6 +7,7 @@ on: jobs: materials: runs-on: ubuntu-latest + if: ${{ github.repository_owner == 'apache' }} strategy: matrix: diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 7f1420b4c5..2c293e76c8 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -11,9 +11,10 @@ on: jobs: stale: runs-on: ubuntu-latest + if: ${{ github.repository_owner == 'apache' }} steps: - name: Close Stale Issues - uses: actions/stale@v4 + uses: actions/stale@v5 with: days-before-stale: 730 days-before-close: 7 @@ -21,6 +22,7 @@ jobs: stale-pr-label: stale stale-issue-message: 'This issue has been automatically marked as stale because it did not have recent activity. It will be closed in 7 days if no further activity occurs. If you wish not to mark it as stale, please leave a comment in this issue.' close-issue-message: 'This issue has been automatically closed because it did not have recent activity. If this remains to be a problem with the latest version of Apache ECharts, please open a new issue and link this to it. Thanks!' + close-issue-reason: 'not_planned' stale-pr-message: 'This PR has been automatically marked as stale because it has not had recent activity. It will be closed in 7 days if no further activity occurs. If you wish not to mark it as stale, please leave a comment in this PR. We are sorry for this but 2 years is a long time and the code base has been changed a lot. Thanks for your contribution anyway.' close-pr-message: 'This PR has been automatically closed because it has not had recent activity. Sorry for that and we are looking forward to your next contribution.' exempt-issue-labels: 'FAQ,priority: high' diff --git a/extension-src/bmap/BMapCoordSys.ts b/extension-src/bmap/BMapCoordSys.ts index 79ec79f0f2..96f24de386 100644 --- a/extension-src/bmap/BMapCoordSys.ts +++ b/extension-src/bmap/BMapCoordSys.ts @@ -36,6 +36,8 @@ function BMapCoordSys(bmap, api) { this._projection = new BMap.MercatorProjection(); } +BMapCoordSys.prototype.type = 'bmap'; + BMapCoordSys.prototype.dimensions = ['lng', 'lat']; BMapCoordSys.prototype.setZoom = function (zoom) { @@ -107,6 +109,15 @@ BMapCoordSys.prototype.prepareCustoms = function () { }; }; +BMapCoordSys.prototype.convertToPixel = function (ecModel, finder, value) { + // here we ignore finder as only one bmap component is allowed + return this.dataToPoint(value); +}; + +BMapCoordSys.prototype.convertFromPixel = function (ecModel, finder, value) { + return this.pointToData(value); +}; + function dataToCoordSize(dataSize, dataItem) { dataItem = dataItem || [0, 0]; return zrUtil.map([0, 1], function (dimIdx) { @@ -229,6 +240,9 @@ BMapCoordSys.create = function (ecModel, api) { seriesModel.coordinateSystem = bmapCoordSys; } }); + + // return created coordinate systems + return bmapCoordSys && [bmapCoordSys]; }; export default BMapCoordSys; diff --git a/package-lock.json b/package-lock.json index 4259502b29..7db23f2bef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "tslib": "2.3.0", - "zrender": "5.3.2" + "zrender": "npm:zrender-nightly@^5.3.3-dev.20220820" }, "devDependencies": { "@babel/code-frame": "7.10.4", @@ -49,7 +49,7 @@ "semver": "6.3.0", "serve-handler": "6.1.1", "slugify": "1.3.4", - "socket.io": "2.2.0", + "socket.io": "2.5.0", "terser": "^5.3.8", "ts-jest": "^26.4.3", "typescript": "4.4.3" @@ -1457,6 +1457,64 @@ "node": ">=8" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@lang/rollup-plugin-dts": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@lang/rollup-plugin-dts/-/rollup-plugin-dts-2.0.2.tgz", @@ -2334,13 +2392,13 @@ "dev": true }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -2389,7 +2447,7 @@ "node_modules/after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==", "dev": true }, "node_modules/ajv": { @@ -2588,12 +2646,6 @@ "node": ">=8" } }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2836,7 +2888,7 @@ "node_modules/backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==", "dev": true }, "node_modules/balanced-match": { @@ -2914,9 +2966,9 @@ } }, "node_modules/base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==", "dev": true, "engines": { "node": ">= 0.6.0" @@ -2929,12 +2981,12 @@ "dev": true }, "node_modules/base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, "engines": { - "node": ">= 0.4.0" + "node": "^4.5.0 || >= 5.9" } }, "node_modules/bcrypt-pbkdf": { @@ -2946,18 +2998,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "dependencies": { - "callsite": "1.0.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/bin-build": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", @@ -3556,15 +3596,6 @@ "node": ">=0.10.0" } }, - "node_modules/callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3942,7 +3973,7 @@ "node_modules/component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==", "dev": true }, "node_modules/component-emitter": { @@ -3954,7 +3985,7 @@ "node_modules/component-inherit": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==", "dev": true }, "node_modules/concat-map": { @@ -4023,9 +4054,9 @@ } }, "node_modules/cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, "engines": { "node": ">= 0.6" @@ -4822,44 +4853,41 @@ } }, "node_modules/engine.io": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.3.2.tgz", - "integrity": "sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.6.0.tgz", + "integrity": "sha512-Kc8fo5bbg8F4a2f3HPHTEpGyq/IRIQpyeHu3H1ThR14XDD7VrLcsGBo16HUpahgp8YkHJDaU5gNxJZbuGcuueg==", "dev": true, "dependencies": { "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~6.1.0" + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "engines": { + "node": ">=8.0.0" } }, "node_modules/engine.io-client": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.3.tgz", - "integrity": "sha512-PXIgpzb1brtBzh8Q6vCjzCMeu4nfEPmaDm+L3Qb2sVHwLkxC1qRiBMSjOB0NJNjZ0hbPNUKQa+s8J2XxLOIEeQ==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", + "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", "dev": true, "dependencies": { - "component-emitter": "1.2.1", + "component-emitter": "~1.3.0", "component-inherit": "0.0.3", "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", + "engine.io-parser": "~2.2.0", "has-cors": "1.1.0", "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.6.3", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.6.2", "yeast": "0.1.2" } }, - "node_modules/engine.io-client/node_modules/component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "node_modules/engine.io-client/node_modules/debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -4872,53 +4900,72 @@ "node_modules/engine.io-client/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/engine.io-client/node_modules/ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", "dev": true, "dependencies": { "after": "0.8.2", "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", + "base64-arraybuffer": "0.1.4", "blob": "0.0.5", "has-binary2": "~1.0.2" } }, "node_modules/engine.io/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "node_modules/engine.io/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/engine.io/node_modules/ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/enquirer": { @@ -6346,13 +6393,13 @@ "node_modules/has-binary2/node_modules/isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==", "dev": true }, "node_modules/has-cors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==", "dev": true }, "node_modules/has-flag": { @@ -6817,7 +6864,7 @@ "node_modules/indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", "dev": true }, "node_modules/inflight": { @@ -9498,21 +9545,21 @@ } }, "node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -9623,9 +9670,9 @@ "dev": true }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "engines": { "node": ">= 0.6" @@ -9907,12 +9954,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -10210,22 +10251,16 @@ "dev": true }, "node_modules/parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "dependencies": { - "better-assert": "~1.0.0" - } + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true }, "node_modules/parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "dependencies": { - "better-assert": "~1.0.0" - } + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true }, "node_modules/parsimmon": { "version": "1.16.0", @@ -11585,17 +11620,17 @@ "dev": true }, "node_modules/socket.io": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.2.0.tgz", - "integrity": "sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.5.0.tgz", + "integrity": "sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==", "dev": true, "dependencies": { "debug": "~4.1.0", - "engine.io": "~3.3.1", + "engine.io": "~3.6.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.2.0", - "socket.io-parser": "~3.3.0" + "socket.io-client": "2.5.0", + "socket.io-parser": "~3.4.0" } }, "node_modules/socket.io-adapter": { @@ -11605,33 +11640,24 @@ "dev": true }, "node_modules/socket.io-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz", - "integrity": "sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.5.0.tgz", + "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==", "dev": true, "dependencies": { "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", - "component-emitter": "1.2.1", + "component-emitter": "~1.3.0", "debug": "~3.1.0", - "engine.io-client": "~3.3.1", + "engine.io-client": "~3.5.0", "has-binary2": "~1.0.2", - "has-cors": "1.1.0", "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", + "parseqs": "0.0.6", + "parseuri": "0.0.6", "socket.io-parser": "~3.3.0", "to-array": "0.1.4" } }, - "node_modules/socket.io-client/node_modules/component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "node_modules/socket.io-client/node_modules/debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -11641,13 +11667,19 @@ "ms": "2.0.0" } }, + "node_modules/socket.io-client/node_modules/isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==", + "dev": true + }, "node_modules/socket.io-client/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/socket.io-parser": { + "node_modules/socket.io-client/node_modules/socket.io-parser": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", @@ -11658,25 +11690,37 @@ "isarray": "2.0.1" } }, + "node_modules/socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "dev": true, + "dependencies": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + } + }, + "node_modules/socket.io-parser/node_modules/component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==", + "dev": true + }, "node_modules/socket.io-parser/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/socket.io-parser/node_modules/isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "node_modules/socket.io-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==", "dev": true }, "node_modules/socket.io/node_modules/debug": { @@ -11737,9 +11781,9 @@ } }, "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", @@ -12281,14 +12325,15 @@ } }, "node_modules/terser": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz", - "integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" @@ -12297,21 +12342,24 @@ "node": ">=10" } }, + "node_modules/terser/node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -12385,7 +12433,7 @@ "node_modules/to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==", "dev": true }, "node_modules/to-buffer": { @@ -13329,7 +13377,7 @@ "node_modules/yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==", "dev": true }, "node_modules/yocto-queue": { @@ -13362,9 +13410,10 @@ } }, "node_modules/zrender": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.3.2.tgz", - "integrity": "sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==", + "name": "zrender-nightly", + "version": "5.3.3-dev.20220820", + "resolved": "https://registry.npmjs.org/zrender-nightly/-/zrender-nightly-5.3.3-dev.20220820.tgz", + "integrity": "sha512-/4hBgw+X1EAZ+wE/4VYfOJEkOD+FWJ+GUEMYVNUoo8FWpU97avPhcTVMupP2w6qjuDY8178ivDs8PMBL7igdxQ==", "dependencies": { "tslib": "2.3.0" } @@ -14580,6 +14629,55 @@ } } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@lang/rollup-plugin-dts": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@lang/rollup-plugin-dts/-/rollup-plugin-dts-2.0.2.tgz", @@ -15279,13 +15377,13 @@ "dev": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -15320,7 +15418,7 @@ "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==", "dev": true }, "ajv": { @@ -15479,12 +15577,6 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -15677,7 +15769,7 @@ "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==", "dev": true }, "balanced-match": { @@ -15742,9 +15834,9 @@ } }, "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==", "dev": true }, "base64-js": { @@ -15754,9 +15846,9 @@ "dev": true }, "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, "bcrypt-pbkdf": { @@ -15768,15 +15860,6 @@ "tweetnacl": "^0.14.3" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, "bin-build": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", @@ -16285,12 +16368,6 @@ } } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -16605,7 +16682,7 @@ "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==", "dev": true }, "component-emitter": { @@ -16617,7 +16694,7 @@ "component-inherit": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==", "dev": true }, "concat-map": { @@ -16680,9 +16757,9 @@ } }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "copy-descriptor": { @@ -17341,70 +17418,56 @@ } }, "engine.io": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.3.2.tgz", - "integrity": "sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.6.0.tgz", + "integrity": "sha512-Kc8fo5bbg8F4a2f3HPHTEpGyq/IRIQpyeHu3H1ThR14XDD7VrLcsGBo16HUpahgp8YkHJDaU5gNxJZbuGcuueg==", "dev": true, "requires": { "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~6.1.0" + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } + "requires": {} } } }, "engine.io-client": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.3.tgz", - "integrity": "sha512-PXIgpzb1brtBzh8Q6vCjzCMeu4nfEPmaDm+L3Qb2sVHwLkxC1qRiBMSjOB0NJNjZ0hbPNUKQa+s8J2XxLOIEeQ==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", + "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", "dev": true, "requires": { - "component-emitter": "1.2.1", + "component-emitter": "~1.3.0", "component-inherit": "0.0.3", "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", + "engine.io-parser": "~2.2.0", "has-cors": "1.1.0", "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.6.3", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.6.2", "yeast": "0.1.2" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -17417,29 +17480,27 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } + "requires": {} } } }, "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", "dev": true, "requires": { "after": "0.8.2", "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", + "base64-arraybuffer": "0.1.4", "blob": "0.0.5", "has-binary2": "~1.0.2" } @@ -18581,7 +18642,7 @@ "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==", "dev": true } } @@ -18589,7 +18650,7 @@ "has-cors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==", "dev": true }, "has-flag": { @@ -18941,7 +19002,7 @@ "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", "dev": true }, "inflight": { @@ -21097,18 +21158,18 @@ } }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" } }, "minimatch": { @@ -21205,9 +21266,9 @@ "dev": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "nice-try": { @@ -21439,12 +21500,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -21672,22 +21727,16 @@ "dev": true }, "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true }, "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true }, "parsimmon": { "version": "1.16.0", @@ -22786,17 +22835,17 @@ } }, "socket.io": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.2.0.tgz", - "integrity": "sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.5.0.tgz", + "integrity": "sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==", "dev": true, "requires": { "debug": "~4.1.0", - "engine.io": "~3.3.1", + "engine.io": "~3.6.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.2.0", - "socket.io-parser": "~3.3.0" + "socket.io-client": "2.5.0", + "socket.io-parser": "~3.4.0" }, "dependencies": { "debug": { @@ -22817,33 +22866,24 @@ "dev": true }, "socket.io-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz", - "integrity": "sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.5.0.tgz", + "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==", "dev": true, "requires": { "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", - "component-emitter": "1.2.1", + "component-emitter": "~1.3.0", "debug": "~3.1.0", - "engine.io-client": "~3.3.1", + "engine.io-client": "~3.5.0", "has-binary2": "~1.0.2", - "has-cors": "1.1.0", "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", + "parseqs": "0.0.6", + "parseuri": "0.0.6", "socket.io-parser": "~3.3.0", "to-array": "0.1.4" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -22853,44 +22893,61 @@ "ms": "2.0.0" } }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true + }, + "socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } } } }, "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", "dev": true, "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", "isarray": "2.0.1" }, "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==", + "dev": true + }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==", "dev": true } } @@ -22933,9 +22990,9 @@ } }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -23379,27 +23436,28 @@ } }, "terser": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz", - "integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, "dependencies": { + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true } } }, @@ -23469,7 +23527,7 @@ "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==", "dev": true }, "to-buffer": { @@ -24219,7 +24277,7 @@ "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==", "dev": true }, "yocto-queue": { @@ -24241,9 +24299,9 @@ } }, "zrender": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.3.2.tgz", - "integrity": "sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==", + "version": "npm:zrender-nightly@5.3.3-dev.20220820", + "resolved": "https://registry.npmjs.org/zrender-nightly/-/zrender-nightly-5.3.3-dev.20220820.tgz", + "integrity": "sha512-/4hBgw+X1EAZ+wE/4VYfOJEkOD+FWJ+GUEMYVNUoo8FWpU97avPhcTVMupP2w6qjuDY8178ivDs8PMBL7igdxQ==", "requires": { "tslib": "2.3.0" } diff --git a/package.json b/package.json index 5acf86a154..86bccc91d9 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ }, "dependencies": { "tslib": "2.3.0", - "zrender": "5.3.2" + "zrender": "npm:zrender-nightly@^5.3.3-dev.20220820" }, "devDependencies": { "@babel/code-frame": "7.10.4", @@ -103,7 +103,7 @@ "semver": "6.3.0", "serve-handler": "6.1.1", "slugify": "1.3.4", - "socket.io": "2.2.0", + "socket.io": "2.5.0", "terser": "^5.3.8", "ts-jest": "^26.4.3", "typescript": "4.4.3" diff --git a/src/action/roamHelper.ts b/src/action/roamHelper.ts index d1721a93c3..f14c8ccfbe 100644 --- a/src/action/roamHelper.ts +++ b/src/action/roamHelper.ts @@ -22,7 +22,7 @@ import type View from '../coord/View'; import type ExtensionAPI from '../core/ExtensionAPI'; import type { Payload } from '../util/types'; -export interface RoamPaylod extends Payload { +export interface RoamPayload extends Payload { dx: number dy: number zoom: number @@ -39,7 +39,7 @@ function getCenterCoord(view: View, point: number[]) { export function updateCenterAndZoom( view: View, - payload: RoamPaylod, + payload: RoamPayload, zoomLimit?: { min?: number, max?: number diff --git a/src/animation/basicTrasition.ts b/src/animation/basicTransition.ts similarity index 100% rename from src/animation/basicTrasition.ts rename to src/animation/basicTransition.ts diff --git a/src/animation/customGraphicKeyframeAnimation.ts b/src/animation/customGraphicKeyframeAnimation.ts index 53f9fbbddc..36dd9ecb1c 100644 --- a/src/animation/customGraphicKeyframeAnimation.ts +++ b/src/animation/customGraphicKeyframeAnimation.ts @@ -22,8 +22,8 @@ import Element from 'zrender/src/Element'; import { keys, filter, each, isArray, indexOf } from 'zrender/src/core/util'; import { ELEMENT_ANIMATABLE_PROPS } from './customGraphicTransition'; import { AnimationOption, AnimationOptionMixin, Dictionary } from '../util/types'; -import { Model } from '../echarts.all'; -import { getAnimationConfig } from './basicTrasition'; +import type Model from '../model/Model'; +import { getAnimationConfig } from './basicTransition'; import { warn } from '../util/log'; import { makeInner } from '../util/model'; @@ -159,4 +159,4 @@ export function applyKeyframeAnimation>( .duration(duration) .start(animationOpts.easing); }); -} \ No newline at end of file +} diff --git a/src/animation/customGraphicTransition.ts b/src/animation/customGraphicTransition.ts index e1cdb68dac..73c12401aa 100644 --- a/src/animation/customGraphicTransition.ts +++ b/src/animation/customGraphicTransition.ts @@ -25,7 +25,7 @@ import { assert, bind, each, eqNaN, extend, hasOwn, indexOf, isArrayLike, keys, import { cloneValue } from 'zrender/src/animation/Animator'; import Displayable, { DisplayableProps } from 'zrender/src/graphic/Displayable'; import Model from '../model/Model'; -import { getAnimationConfig } from './basicTrasition'; +import { getAnimationConfig } from './basicTransition'; import { Path } from '../util/graphic'; import { warn } from '../util/log'; import { AnimationOption, AnimationOptionMixin, ZRStyleProps } from '../util/types'; diff --git a/src/animation/morphTransitionHelper.ts b/src/animation/morphTransitionHelper.ts index 6caafe39f4..f9672073ca 100644 --- a/src/animation/morphTransitionHelper.ts +++ b/src/animation/morphTransitionHelper.ts @@ -29,7 +29,7 @@ import { Path } from '../util/graphic'; import SeriesModel from '../model/Series'; import Element, { ElementAnimateConfig } from 'zrender/src/Element'; import { defaults, isArray} from 'zrender/src/core/util'; -import { getAnimationConfig } from './basicTrasition'; +import { getAnimationConfig } from './basicTransition'; import { ECElement, UniversalTransitionOption } from '../util/types'; import { clonePath } from 'zrender/src/tool/path'; import Model from '../model/Model'; diff --git a/src/animation/universalTransition.ts b/src/animation/universalTransition.ts index 0ccae06363..dabd7ee3ec 100644 --- a/src/animation/universalTransition.ts +++ b/src/animation/universalTransition.ts @@ -37,7 +37,7 @@ import { import { makeInner, normalizeToArray } from '../util/model'; import { warn } from '../util/log'; import ExtensionAPI from '../core/ExtensionAPI'; -import { getAnimationConfig, getOldStyle } from './basicTrasition'; +import { getAnimationConfig, getOldStyle } from './basicTransition'; import Model from '../model/Model'; import Displayable from 'zrender/src/graphic/Displayable'; diff --git a/src/chart/bar/BarView.ts b/src/chart/bar/BarView.ts index 70e6c34678..3cbad98de3 100644 --- a/src/chart/bar/BarView.ts +++ b/src/chart/bar/BarView.ts @@ -64,7 +64,7 @@ import {LayoutRect} from '../../util/layout'; import {EventCallback} from 'zrender/src/core/Eventful'; import { warn } from '../../util/log'; import {createSectorCalculateTextPosition, SectorTextPosition, setSectorTextRotation} from '../../label/sectorLabel'; -import { saveOldStyle } from '../../animation/basicTrasition'; +import { saveOldStyle } from '../../animation/basicTransition'; import Element from 'zrender/src/Element'; const mathMax = Math.max; @@ -1146,6 +1146,7 @@ function createLarge( const el = new LargePath({ shape: {points: data.getLayout('largePoints')}, incremental: !!incremental, + ignoreCoarsePointer: true, z2: 1 }); el.baseDimIdx = baseDimIdx; diff --git a/src/chart/boxplot/BoxplotView.ts b/src/chart/boxplot/BoxplotView.ts index f217e8af7f..f48cdf67b0 100644 --- a/src/chart/boxplot/BoxplotView.ts +++ b/src/chart/boxplot/BoxplotView.ts @@ -27,7 +27,7 @@ import GlobalModel from '../../model/Global'; import ExtensionAPI from '../../core/ExtensionAPI'; import SeriesData from '../../data/SeriesData'; import { BoxplotItemLayout } from './boxplotLayout'; -import { saveOldStyle } from '../../animation/basicTrasition'; +import { saveOldStyle } from '../../animation/basicTransition'; class BoxplotView extends ChartView { static type = 'boxplot'; diff --git a/src/chart/candlestick/CandlestickView.ts b/src/chart/candlestick/CandlestickView.ts index 9b2436db92..ed4f6660c6 100644 --- a/src/chart/candlestick/CandlestickView.ts +++ b/src/chart/candlestick/CandlestickView.ts @@ -31,7 +31,7 @@ import SeriesData from '../../data/SeriesData'; import {CandlestickItemLayout} from './candlestickLayout'; import { CoordinateSystemClipArea } from '../../coord/CoordinateSystem'; import Model from '../../model/Model'; -import { saveOldStyle } from '../../animation/basicTrasition'; +import { saveOldStyle } from '../../animation/basicTransition'; import Element from 'zrender/src/Element'; const SKIP_PROPS = ['color', 'borderColor'] as const; @@ -358,12 +358,14 @@ function createLarge( const elP = new LargeBoxPath({ shape: {points: largePoints}, - __sign: 1 + __sign: 1, + ignoreCoarsePointer: true }); group.add(elP); const elN = new LargeBoxPath({ shape: {points: largePoints}, - __sign: -1 + __sign: -1, + ignoreCoarsePointer: true }); group.add(elN); @@ -397,4 +399,3 @@ function setLargeStyle(sign: number, el: LargeBoxPath, seriesModel: CandlestickS export default CandlestickView; - diff --git a/src/chart/custom/CustomView.ts b/src/chart/custom/CustomView.ts index 49fad96860..e0ad444a36 100644 --- a/src/chart/custom/CustomView.ts +++ b/src/chart/custom/CustomView.ts @@ -99,6 +99,7 @@ import { applyKeyframeAnimation, stopPreviousKeyframeAnimationAndRestore } from '../../animation/customGraphicKeyframeAnimation'; +import type SeriesModel from '../../model/Series'; const EMPHASIS = 'emphasis' as const; const NORMAL = 'normal' as const; @@ -228,7 +229,7 @@ export default class CustomChartView extends ChartView { }) .remove(function (oldIdx) { const el = oldData.getItemGraphicEl(oldIdx); - applyLeaveTransition(el, customInnerStore(el).option, customSeries); + el && applyLeaveTransition(el, customInnerStore(el).option, customSeries); }) .update(function (newIdx, oldIdx) { const oldEl = oldData.getItemGraphicEl(oldIdx); @@ -1264,16 +1265,21 @@ function retrieveStyleOptionOnState( // Usage: -// (1) By default, `elOption.$mergeChildren` is `'byIndex'`, which indicates that -// the existing children will not be removed, and enables the feature that -// update some of the props of some of the children simply by construct +// (1) By default, `elOption.$mergeChildren` is `'byIndex'`, which indicates +// that the existing children will not be removed, and enables the feature +// that update some of the props of some of the children simply by construct // the returned children of `renderItem` like: // `var children = group.children = []; children[3] = {opacity: 0.5};` // (2) If `elOption.$mergeChildren` is `'byName'`, add/update/remove children // by child.name. But that might be lower performance. // (3) If `elOption.$mergeChildren` is `false`, the existing children will be // replaced totally. -// (4) If `!elOption.children`, following the "merge" principle, nothing will happen. +// (4) If `!elOption.children`, following the "merge" principle, nothing will +// happen. +// (5) If `elOption.$mergeChildren` is not `false` neither `'byName'` and the +// `el` is a group, and if any of the new child is null, it means to remove +// the element at the same index, if exists. On the other hand, if the new +// child is and empty object `{}`, it means to keep the element not changed. // // For implementation simpleness, do not provide a direct way to remove sinlge // child (otherwise the total indicies of the children array have to be modified). @@ -1316,24 +1322,59 @@ function mergeChildren( // might be better performance. let index = 0; for (; index < newLen; index++) { - newChildren[index] && doCreateOrUpdateEl( - api, - el.childAt(index), - dataIndex, - newChildren[index] as CustomElementOption, - seriesModel, - el - ); + const newChild = newChildren[index]; + const oldChild = el.childAt(index); + if (newChild) { + if (newChild.ignore == null) { + // The old child is set to be ignored if null (see comments + // below). So we need to set ignore to be false back. + newChild.ignore = false; + } + doCreateOrUpdateEl( + api, + oldChild, + dataIndex, + newChild as CustomElementOption, + seriesModel, + el + ); + } + else { + if (__DEV__) { + assert( + oldChild, + 'renderItem should not return a group containing elements' + + ' as null/undefined/{} if they do not exist before.' + ); + } + // If the new element option is null, it means to remove the old + // element. But we cannot really remove the element from the group + // directly, because the element order may not be stable when this + // element is added back. So we set the element to be ignored. + oldChild.ignore = true; + } } for (let i = el.childCount() - 1; i >= index; i--) { - // Do not supprot leave elements that are not mentioned in the latest - // `renderItem` return. Otherwise users may not have a clear and simple - // concept that how to contorl all of the elements. const child = el.childAt(i); - applyLeaveTransition(child, customInnerStore(el).option, seriesModel); + removeChildFromGroup(el, child, seriesModel); } } +function removeChildFromGroup( + group: graphicUtil.Group, + child: Element, + seriesModel: SeriesModel +) { + // Do not support leave elements that are not mentioned in the latest + // `renderItem` return. Otherwise users may not have a clear and simple + // concept that how to control all of the elements. + child && applyLeaveTransition( + child, + customInnerStore(group).option, + seriesModel + ); +} + type DiffGroupContext = { api: ExtensionAPI; oldChildren: Element[]; @@ -1383,7 +1424,7 @@ function processAddUpdate( function processRemove(this: DataDiffer, oldIndex: number): void { const context = this.context; const child = context.oldChildren[oldIndex]; - applyLeaveTransition(child, customInnerStore(child).option, context.seriesModel); + child && applyLeaveTransition(child, customInnerStore(child).option, context.seriesModel); } /** diff --git a/src/chart/funnel/FunnelView.ts b/src/chart/funnel/FunnelView.ts index 673c53ceb2..e4a922afca 100644 --- a/src/chart/funnel/FunnelView.ts +++ b/src/chart/funnel/FunnelView.ts @@ -27,7 +27,7 @@ import SeriesData from '../../data/SeriesData'; import { ColorString } from '../../util/types'; import { setLabelLineStyle, getLabelLineStatesModels } from '../../label/labelGuideHelper'; import { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle'; -import { saveOldStyle } from '../../animation/basicTrasition'; +import { saveOldStyle } from '../../animation/basicTransition'; const opacityAccessPath = ['itemStyle', 'opacity'] as const; diff --git a/src/chart/gauge/GaugeSeries.ts b/src/chart/gauge/GaugeSeries.ts index 07bfcc470e..7ffb508376 100644 --- a/src/chart/gauge/GaugeSeries.ts +++ b/src/chart/gauge/GaugeSeries.ts @@ -170,8 +170,9 @@ export interface GaugeSeriesOption extends SeriesOption & { formatter?: LabelFormatter | string + rotate?: 'tangential' | 'radial' | number } pointer?: PointerOption @@ -265,7 +266,8 @@ class GaugeSeriesModel extends SeriesModel { distance: 15, // formatter: null, color: '#464646', - fontSize: 12 + fontSize: 12, + rotate: 0 }, pointer: { icon: null, @@ -321,4 +323,4 @@ class GaugeSeriesModel extends SeriesModel { } -export default GaugeSeriesModel; \ No newline at end of file +export default GaugeSeriesModel; diff --git a/src/chart/gauge/GaugeView.ts b/src/chart/gauge/GaugeView.ts index b646607d75..a03243e1aa 100644 --- a/src/chart/gauge/GaugeView.ts +++ b/src/chart/gauge/GaugeView.ts @@ -31,7 +31,7 @@ import SeriesData from '../../data/SeriesData'; import Sausage from '../../util/shape/sausage'; import {createSymbol} from '../../util/symbol'; import ZRImage from 'zrender/src/graphic/Image'; -import {extend, isFunction, isString} from 'zrender/src/core/util'; +import {extend, isFunction, isString, isNumber} from 'zrender/src/core/util'; import {setCommonECData} from '../../util/innerStore'; import { normalizeArcAngles } from 'zrender/src/core/PathProxy'; @@ -272,19 +272,55 @@ class GaugeView extends ChartView { labelModel.get('formatter') ); const autoColor = getColor(i / splitNumber); + const textStyleX = unitX * (r - splitLineLen - distance) + cx; + const textStyleY = unitY * (r - splitLineLen - distance) + cy; + + const rotateType = labelModel.get('rotate'); + let rotate = 0; + if (rotateType === 'radial') { + rotate = -angle + 2 * Math.PI; + if (rotate > Math.PI / 2) { + rotate += Math.PI; + } + } + else if (rotateType === 'tangential') { + rotate = -angle - Math.PI / 2; + } + else if (isNumber(rotateType)) { + rotate = rotateType * Math.PI / 180; + } - group.add(new graphic.Text({ - style: createTextStyle(labelModel, { - text: label, - x: unitX * (r - splitLineLen - distance) + cx, - y: unitY * (r - splitLineLen - distance) + cy, - verticalAlign: unitY < -0.8 ? 'top' : (unitY > 0.8 ? 'bottom' : 'middle'), - align: unitX < -0.4 ? 'left' : (unitX > 0.4 ? 'right' : 'center') - }, { - inheritColor: autoColor - }), - silent: true - })); + if (rotate === 0) { + group.add(new graphic.Text({ + style: createTextStyle(labelModel, { + text: label, + x: textStyleX, + y: textStyleY, + verticalAlign: unitY < -0.8 ? 'top' : (unitY > 0.8 ? 'bottom' : 'middle'), + align: unitX < -0.4 ? 'left' : (unitX > 0.4 ? 'right' : 'center') + }, { + inheritColor: autoColor + }), + silent: true + })); + } + else { + group.add(new graphic.Text({ + style: createTextStyle(labelModel, { + text: label, + x: textStyleX, + y: textStyleY, + verticalAlign: 'middle', + align: 'center' + }, { + inheritColor: autoColor + }), + silent: true, + originX: textStyleX, + originY: textStyleY, + rotation: rotate + })); + } } // Axis tick diff --git a/src/chart/graph/GraphSeries.ts b/src/chart/graph/GraphSeries.ts index 299b9a44d9..e1b85bead6 100644 --- a/src/chart/graph/GraphSeries.ts +++ b/src/chart/graph/GraphSeries.ts @@ -184,7 +184,7 @@ export interface GraphSeriesOption emphasis?: { focus?: Exclude['focus'] - scale?: boolean + scale?: boolean | number label?: SeriesLabelOption edgeLabel?: SeriesLabelOption itemStyle?: ItemStyleOption @@ -513,4 +513,4 @@ class GraphSeriesModel extends SeriesModel { }; } -export default GraphSeriesModel; \ No newline at end of file +export default GraphSeriesModel; diff --git a/src/chart/graph/GraphView.ts b/src/chart/graph/GraphView.ts index 37d0086927..bd5b9669cc 100644 --- a/src/chart/graph/GraphView.ts +++ b/src/chart/graph/GraphView.ts @@ -37,6 +37,9 @@ import SeriesData from '../../data/SeriesData'; import Line from '../helper/Line'; import { getECData } from '../../util/innerStore'; +import { simpleLayoutEdge } from './simpleLayoutHelper'; +import { circularLayout, rotateNodeLabel } from './circularLayoutHelper'; + function isViewCoordSys(coordSys: CoordinateSystem): coordSys is View { return coordSys.type === 'view'; } @@ -122,6 +125,8 @@ class GraphView extends ChartView { this._startForceLayoutIteration(forceLayout, layoutAnimation); } + const layout = seriesModel.get('layout'); + data.graph.eachNode((node) => { const idx = node.dataIndex; const el = node.getGraphicEl() as Symbol; @@ -135,14 +140,31 @@ class GraphView extends ChartView { el.off('drag').off('dragend'); const draggable = itemModel.get('draggable'); if (draggable) { - el.on('drag', () => { - if (forceLayout) { - forceLayout.warmUp(); - !this._layouting - && this._startForceLayoutIteration(forceLayout, layoutAnimation); - forceLayout.setFixed(idx); - // Write position back to layout - data.setItemLayout(idx, [el.x, el.y]); + el.on('drag', (e) => { + switch (layout) { + case 'force': + forceLayout.warmUp(); + !this._layouting + && this._startForceLayoutIteration(forceLayout, layoutAnimation); + forceLayout.setFixed(idx); + // Write position back to layout + data.setItemLayout(idx, [el.x, el.y]); + break; + case 'circular': + data.setItemLayout(idx, [el.x, el.y]); + // mark node fixed + node.setLayout({ fixed: true }, true); + // recalculate circular layout + circularLayout(seriesModel, 'symbolSize', node, [e.offsetX, e.offsetY]); + this.updateLayout(seriesModel); + break; + case 'none': + default: + data.setItemLayout(idx, [el.x, el.y]); + // update edge + simpleLayoutEdge(seriesModel.getGraph(), seriesModel); + this.updateLayout(seriesModel); + break; } }).on('dragend', () => { if (forceLayout) { @@ -179,37 +201,8 @@ class GraphView extends ChartView { && seriesModel.get(['circular', 'rotateLabel']); const cx = data.getLayout('cx'); const cy = data.getLayout('cy'); - data.eachItemGraphicEl(function (el: Symbol, idx) { - const itemModel = data.getItemModel(idx); - let labelRotate = itemModel.get(['label', 'rotate']) || 0; - const symbolPath = el.getSymbolPath(); - if (circularRotateLabel) { - const pos = data.getItemLayout(idx); - let rad = Math.atan2(pos[1] - cy, pos[0] - cx); - if (rad < 0) { - rad = Math.PI * 2 + rad; - } - const isLeft = pos[0] < cx; - if (isLeft) { - rad = rad - Math.PI; - } - const textPosition = isLeft ? 'left' as const : 'right' as const; - - symbolPath.setTextConfig({ - rotation: -rad, - position: textPosition, - origin: 'center' - }); - const emphasisState = symbolPath.ensureState('emphasis'); - zrUtil.extend(emphasisState.textConfig || (emphasisState.textConfig = {}), { - position: textPosition - }); - } - else { - symbolPath.setTextConfig({ - rotation: labelRotate *= Math.PI / 180 - }); - } + data.graph.eachNode((node) => { + rotateNodeLabel(node, circularRotateLabel, cx, cy); }); this._firstRender = false; diff --git a/src/chart/graph/circularLayoutHelper.ts b/src/chart/graph/circularLayoutHelper.ts index 91265bea62..af01fb0f8c 100644 --- a/src/chart/graph/circularLayoutHelper.ts +++ b/src/chart/graph/circularLayoutHelper.ts @@ -20,8 +20,9 @@ import * as vec2 from 'zrender/src/core/vector'; import {getSymbolSize, getNodeGlobalScale} from './graphHelper'; -import GraphSeriesModel, { GraphEdgeItemOption } from './GraphSeries'; -import Graph from '../../data/Graph'; +import GraphSeriesModel, { GraphEdgeItemOption, GraphNodeItemOption } from './GraphSeries'; +import Graph, { GraphNode } from '../../data/Graph'; +import Symbol from '../helper/Symbol'; import SeriesData from '../../data/SeriesData'; import * as zrUtil from 'zrender/src/core/util'; import {getCurvenessForEdge} from '../helper/multipleGraphEdgeHelper'; @@ -51,7 +52,9 @@ const _symbolRadiansHalf: number[] = []; */ export function circularLayout( seriesModel: GraphSeriesModel, - basedOn: 'value' | 'symbolSize' + basedOn: 'value' | 'symbolSize', + draggingNode?: GraphNode, + pointer?: [number, number] ) { const coordSys = seriesModel.coordinateSystem; if (coordSys && coordSys.type !== 'view') { @@ -77,6 +80,17 @@ export function circularLayout( return; } + if (draggingNode) { + const [tempX, tempY] = coordSys.pointToData(pointer) as [number, number]; + const v = [tempX - cx, tempY - cy]; + vec2.normalize(v, v); + vec2.scale(v, v, r); + draggingNode.setLayout([cx + v[0], cy + v[1]], true); + + const circularRotateLabel = seriesModel.get(['circular', 'rotateLabel']); + rotateNodeLabel(draggingNode, circularRotateLabel, cx, cy); + } + _layoutNodesBasedOn[basedOn](seriesModel, graph, nodeData, r, cx, cy, count); graph.eachEdge(function (edge, index) { @@ -163,7 +177,11 @@ const _layoutNodesBasedOn: Record<'value' | 'symbolSize', LayoutNode> = { const radianHalf = halfRemainRadian + _symbolRadiansHalf[node.dataIndex]; angle += radianHalf; - node.setLayout([ + // init circular layout for + // 1. layout undefined node + // 2. not fixed node + (!node.getLayout() || !node.getLayout().fixed) + && node.setLayout([ r * Math.cos(angle) + cx, r * Math.sin(angle) + cy ]); @@ -171,3 +189,46 @@ const _layoutNodesBasedOn: Record<'value' | 'symbolSize', LayoutNode> = { }); } }; + +export function rotateNodeLabel( + node: GraphNode, + circularRotateLabel: boolean, + cx: number, + cy: number +) { + const el = node.getGraphicEl() as Symbol; + // need to check if el exists. '-' value may not create node element. + if (!el) { + return; + } + const nodeModel = node.getModel(); + let labelRotate = nodeModel.get(['label', 'rotate']) || 0; + const symbolPath = el.getSymbolPath(); + if (circularRotateLabel) { + const pos = node.getLayout(); + let rad = Math.atan2(pos[1] - cy, pos[0] - cx); + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + const isLeft = pos[0] < cx; + if (isLeft) { + rad = rad - Math.PI; + } + const textPosition = isLeft ? 'left' as const : 'right' as const; + + symbolPath.setTextConfig({ + rotation: -rad, + position: textPosition, + origin: 'center' + }); + const emphasisState = symbolPath.ensureState('emphasis'); + zrUtil.extend(emphasisState.textConfig || (emphasisState.textConfig = {}), { + position: textPosition + }); + } + else { + symbolPath.setTextConfig({ + rotation: labelRotate *= Math.PI / 180 + }); + } +} diff --git a/src/chart/graph/install.ts b/src/chart/graph/install.ts index b917be00ef..2ffec7b035 100644 --- a/src/chart/graph/install.ts +++ b/src/chart/graph/install.ts @@ -29,7 +29,7 @@ import createView from './createView'; import View from '../../coord/View'; import GraphView from './GraphView'; import GraphSeriesModel from './GraphSeries'; -import { RoamPaylod, updateCenterAndZoom } from '../../action/roamHelper'; +import { RoamPayload, updateCenterAndZoom } from '../../action/roamHelper'; import GlobalModel from '../../model/Global'; import { noop } from 'zrender/src/core/util'; import type ExtensionAPI from '../../core/ExtensionAPI'; @@ -73,7 +73,7 @@ export function install(registers: EChartsExtensionInstallRegisters) { }, noop); // Register roam action. - registers.registerAction(actionInfo, function (payload: RoamPaylod, ecModel: GlobalModel, api: ExtensionAPI) { + registers.registerAction(actionInfo, function (payload: RoamPayload, ecModel: GlobalModel, api: ExtensionAPI) { ecModel.eachComponent({ mainType: 'series', query: payload }, function (seriesModel: GraphSeriesModel) { diff --git a/src/chart/helper/EffectLine.ts b/src/chart/helper/EffectLine.ts index 412b27297c..f368d83ac0 100644 --- a/src/chart/helper/EffectLine.ts +++ b/src/chart/helper/EffectLine.ts @@ -47,6 +47,8 @@ class EffectLine extends graphic.Group { private _loop: boolean; + private _roundTrip: boolean; + private _symbolScale: number[]; constructor(lineData: SeriesData, idx: number, seriesScope: LineDrawSeriesScope) { @@ -121,6 +123,7 @@ class EffectLine extends graphic.Group { let period = effectModel.get('period') * 1000; const loop = effectModel.get('loop'); + const roundTrip = effectModel.get('roundTrip'); const constantSpeed = effectModel.get('constantSpeed'); const delayExpr = zrUtil.retrieve(effectModel.get('delay'), function (idx) { return idx / lineData.count() * period / 3; @@ -135,7 +138,7 @@ class EffectLine extends graphic.Group { period = this._getLineLength(symbol) / constantSpeed * 1000; } - if (period !== this._period || loop !== this._loop) { + if (period !== this._period || loop !== this._loop || roundTrip !== this._roundTrip) { symbol.stopAnimation(); let delayNum: number; if (zrUtil.isFunction(delayExpr)) { @@ -149,21 +152,23 @@ class EffectLine extends graphic.Group { } this._animateSymbol( - symbol, period, delayNum, loop + symbol, period, delayNum, loop, roundTrip ); } this._period = period; this._loop = loop; + this._roundTrip = roundTrip; } - private _animateSymbol(symbol: ECSymbolOnEffectLine, period: number, delayNum: number, loop: boolean) { + private _animateSymbol( + symbol: ECSymbolOnEffectLine, period: number, delayNum: number, loop: boolean, roundTrip: boolean) { if (period > 0) { symbol.__t = 0; const self = this; const animator = symbol.animate('', loop) - .when(period, { - __t: 1 + .when(roundTrip ? period * 2 : period, { + __t: roundTrip ? 2 : 1 }) .delay(delayNum) .during(function () { @@ -202,7 +207,7 @@ class EffectLine extends graphic.Group { const p1 = symbol.__p1; const p2 = symbol.__p2; const cp1 = symbol.__cp1; - const t = symbol.__t; + const t = symbol.__t < 1 ? symbol.__t : 2 - symbol.__t; const pos = [symbol.x, symbol.y]; const lastPos = pos.slice(); const quadraticAt = curveUtil.quadraticAt; @@ -211,8 +216,11 @@ class EffectLine extends graphic.Group { pos[1] = quadraticAt(p1[1], cp1[1], p2[1], t); // Tangent - const tx = quadraticDerivativeAt(p1[0], cp1[0], p2[0], t); - const ty = quadraticDerivativeAt(p1[1], cp1[1], p2[1], t); + const tx = symbol.__t < 1 ? quadraticDerivativeAt(p1[0], cp1[0], p2[0], t) + : quadraticDerivativeAt(p2[0], cp1[0], p1[0], 1 - t); + const ty = symbol.__t < 1 ? quadraticDerivativeAt(p1[1], cp1[1], p2[1], t) + : quadraticDerivativeAt(p2[1], cp1[1], p1[1], 1 - t); + symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; // enable continuity trail for 'line', 'rect', 'roundRect' symbolType @@ -247,4 +255,4 @@ class EffectLine extends graphic.Group { this._updateEffectAnimation(lineData, effectModel, idx); } } -export default EffectLine; \ No newline at end of file +export default EffectLine; diff --git a/src/chart/helper/EffectPolyline.ts b/src/chart/helper/EffectPolyline.ts index a250cb590a..389dbe4d83 100644 --- a/src/chart/helper/EffectPolyline.ts +++ b/src/chart/helper/EffectPolyline.ts @@ -67,7 +67,7 @@ class EffectPolyline extends EffectLine { // Override protected _updateSymbolPosition(symbol: ECSymbolOnEffectLine) { - const t = symbol.__t; + const t = symbol.__t < 1 ? symbol.__t : 2 - symbol.__t; const points = this._points; const offsets = this._offsets; const len = points.length; @@ -107,8 +107,8 @@ class EffectPolyline extends EffectLine { symbol.x = p0[0] * (1 - p) + p * p1[0]; symbol.y = p0[1] * (1 - p) + p * p1[1]; - const tx = p1[0] - p0[0]; - const ty = p1[1] - p0[1]; + const tx = symbol.__t < 1 ? p1[0] - p0[0] : p0[0] - p1[0]; + const ty = symbol.__t < 1 ? p1[1] - p0[1] : p0[1] - p1[1]; symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; this._lastFrame = frame; @@ -119,4 +119,4 @@ class EffectPolyline extends EffectLine { } -export default EffectPolyline; \ No newline at end of file +export default EffectPolyline; diff --git a/src/chart/helper/LargeLineDraw.ts b/src/chart/helper/LargeLineDraw.ts index 62f5b6d14b..88afd6b4c0 100644 --- a/src/chart/helper/LargeLineDraw.ts +++ b/src/chart/helper/LargeLineDraw.ts @@ -293,7 +293,8 @@ class LargeLineDraw { private _create() { const lineEl = new LargeLinesPath({ - cursor: 'default' + cursor: 'default', + ignoreCoarsePointer: true }); this._newAdded.push(lineEl); this.group.add(lineEl); diff --git a/src/chart/helper/LargeSymbolDraw.ts b/src/chart/helper/LargeSymbolDraw.ts index 22614b29f5..2aafb9d13c 100644 --- a/src/chart/helper/LargeSymbolDraw.ts +++ b/src/chart/helper/LargeSymbolDraw.ts @@ -315,6 +315,7 @@ class LargeSymbolDraw { const symbolEl = new LargeSymbolPath({ cursor: 'default' }); + symbolEl.ignoreCoarsePointer = true; this.group.add(symbolEl); this._newAdded.push(symbolEl); return symbolEl; diff --git a/src/chart/helper/LineDraw.ts b/src/chart/helper/LineDraw.ts index d96595395b..94c417f4f7 100644 --- a/src/chart/helper/LineDraw.ts +++ b/src/chart/helper/LineDraw.ts @@ -73,6 +73,7 @@ export interface LineDrawModelOption extends LineDrawStateOption, symbol?: string symbolSize?: number | number[] loop?: boolean + roundTrip?: boolean /** * Length of trail, 0 - 1 */ diff --git a/src/chart/helper/Symbol.ts b/src/chart/helper/Symbol.ts index 9295f306d8..58ddc36a66 100644 --- a/src/chart/helper/Symbol.ts +++ b/src/chart/helper/Symbol.ts @@ -27,10 +27,10 @@ import { ColorString, BlurScope, AnimationOption, ZRColor, AnimationOptionMixin import SeriesModel from '../../model/Series'; import { PathProps } from 'zrender/src/graphic/Path'; import { SymbolDrawSeriesScope, SymbolDrawItemModelOption } from './SymbolDraw'; -import { extend, isNumber } from 'zrender/src/core/util'; +import { extend } from 'zrender/src/core/util'; import { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle'; import ZRImage from 'zrender/src/graphic/Image'; -import { saveOldStyle } from '../../animation/basicTrasition'; +import { saveOldStyle } from '../../animation/basicTransition'; import Model from '../../model/Model'; type ECSymbol = ReturnType; @@ -336,11 +336,19 @@ class Symbol extends graphic.Group { symbolPath.ensureState('select').style = selectItemStyle; symbolPath.ensureState('blur').style = blurItemStyle; - if (hoverScale) { - const scaleRatio = Math.max(isNumber(hoverScale) ? hoverScale : 1.1, 3 / this._sizeY); - emphasisState.scaleX = this._sizeX * scaleRatio; - emphasisState.scaleY = this._sizeY * scaleRatio; - } + // null / undefined / true means to use default strategy. + // 0 / false / negative number / NaN / Infinity means no scale. + const scaleRatio = + hoverScale == null || hoverScale === true + ? Math.max(1.1, 3 / this._sizeY) + // PENDING: restrict hoverScale > 1? It seems unreasonable to scale down + : isFinite(hoverScale as number) && hoverScale > 0 + ? +hoverScale + : 1; + // always set scale to allow resetting + emphasisState.scaleX = this._sizeX * scaleRatio; + emphasisState.scaleY = this._sizeY * scaleRatio; + this.setSymbolScale(1); toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); diff --git a/src/chart/line/LineSeries.ts b/src/chart/line/LineSeries.ts index d46640bbc3..9faf5c5175 100644 --- a/src/chart/line/LineSeries.ts +++ b/src/chart/line/LineSeries.ts @@ -48,7 +48,7 @@ type LineDataValue = OptionDataValue | OptionDataValue[]; interface LineStateOptionMixin { emphasis?: { focus?: DefaultEmphasisFocus - scale?: boolean + scale?: boolean | number } } diff --git a/src/chart/line/LineView.ts b/src/chart/line/LineView.ts index 493c17d186..45414fb386 100644 --- a/src/chart/line/LineView.ts +++ b/src/chart/line/LineView.ts @@ -947,8 +947,8 @@ class LineView extends ChartView { if (this._clipShapeForSymbol && !this._clipShapeForSymbol.contain(x, y)) { return; } - const zlevel = seriesModel.get('zlevel'); - const z = seriesModel.get('z'); + const zlevel = seriesModel.get('zlevel') || 0; + const z = seriesModel.get('z') || 0; symbol = new SymbolClz(data, dataIndex); symbol.x = x; symbol.y = y; diff --git a/src/chart/parallel/ParallelView.ts b/src/chart/parallel/ParallelView.ts index 4f00445c28..a56c5579b7 100644 --- a/src/chart/parallel/ParallelView.ts +++ b/src/chart/parallel/ParallelView.ts @@ -29,7 +29,7 @@ import Parallel from '../../coord/parallel/Parallel'; import { OptionAxisType } from '../../coord/axisCommonTypes'; import { numericToNumber } from '../../util/number'; import { eqNaN } from 'zrender/src/core/util'; -import { saveOldStyle } from '../../animation/basicTrasition'; +import { saveOldStyle } from '../../animation/basicTransition'; import Element from 'zrender/src/Element'; const DEFAULT_SMOOTH = 0.3; diff --git a/src/chart/pie/PieSeries.ts b/src/chart/pie/PieSeries.ts index f306fafb30..fc22425605 100644 --- a/src/chart/pie/PieSeries.ts +++ b/src/chart/pie/PieSeries.ts @@ -20,7 +20,7 @@ import createSeriesDataSimply from '../helper/createSeriesDataSimply'; import * as zrUtil from 'zrender/src/core/util'; import * as modelUtil from '../../util/model'; -import { getPercentWithPrecision } from '../../util/number'; +import { getPercentSeats } from '../../util/number'; import { makeSeriesEncodeForNameBased } from '../../data/helper/sourceHelper'; import LegendVisualProvider from '../../visual/LegendVisualProvider'; import SeriesModel from '../../model/Series'; @@ -133,6 +133,8 @@ class PieSeriesModel extends SeriesModel { static type = 'series.pie' as const; + seats: number[]; + /** * @overwrite */ @@ -159,31 +161,25 @@ class PieSeriesModel extends SeriesModel { * @overwrite */ getInitialData(this: PieSeriesModel): SeriesData { - return createSeriesDataSimply(this, { + const data = createSeriesDataSimply(this, { coordDimensions: ['value'], encodeDefaulter: zrUtil.curry(makeSeriesEncodeForNameBased, this) }); + const valueList:number[] = []; + data.each(data.mapDimension('value'), function (value: number) { + valueList.push(value); + }); + + this.seats = getPercentSeats(valueList, data.hostModel.get('percentPrecision')); + return data; } /** * @overwrite */ getDataParams(dataIndex: number): PieCallbackDataParams { - const data = this.getData(); const params = super.getDataParams(dataIndex) as PieCallbackDataParams; - // FIXME toFixed? - - const valueList: number[] = []; - data.each(data.mapDimension('value'), function (value: number) { - valueList.push(value); - }); - - params.percent = getPercentWithPrecision( - valueList, - dataIndex, - data.hostModel.get('percentPrecision') - ); - + params.percent = this.seats[dataIndex]; params.$vars.push('percent'); return params; } diff --git a/src/chart/pie/PieView.ts b/src/chart/pie/PieView.ts index 9118f9267b..77f5c445e3 100644 --- a/src/chart/pie/PieView.ts +++ b/src/chart/pie/PieView.ts @@ -32,7 +32,7 @@ import labelLayout from './labelLayout'; import { setLabelLineStyle, getLabelLineStatesModels } from '../../label/labelGuideHelper'; import { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle'; import { getSectorCornerRadius } from '../helper/pieHelper'; -import { saveOldStyle } from '../../animation/basicTrasition'; +import { saveOldStyle } from '../../animation/basicTransition'; import { getBasicPieLayout } from './pieLayout'; /** diff --git a/src/chart/pie/labelLayout.ts b/src/chart/pie/labelLayout.ts index 9aaf1bf228..0c90908914 100644 --- a/src/chart/pie/labelLayout.ts +++ b/src/chart/pie/labelLayout.ts @@ -394,7 +394,8 @@ export default function pieLabelLayout( if (Math.abs(sectorShape.endAngle - sectorShape.startAngle) < minShowLabelRadian) { each(label.states, setNotShow); - label.ignore = true; + each(labelLine.states, setNotShow); + label.ignore = labelLine.ignore = true; return; } diff --git a/src/chart/pie/pieLayout.ts b/src/chart/pie/pieLayout.ts index 0598a779aa..0a6998c70c 100644 --- a/src/chart/pie/pieLayout.ts +++ b/src/chart/pie/pieLayout.ts @@ -53,10 +53,23 @@ export function getBasicPieLayout(seriesModel: PieSeriesModel, api: ExtensionAPI const width = parsePercent(viewRect.width, api.getWidth()); const height = parsePercent(viewRect.height, api.getHeight()); const size = Math.min(width, height); - const cx = parsePercent(center[0], width) + viewRect.x; - const cy = parsePercent(center[1], height) + viewRect.y; const r0 = parsePercent(radius[0], size / 2); const r = parsePercent(radius[1], size / 2); + + let cx: number; + let cy: number; + const coordSys = seriesModel.coordinateSystem; + if (coordSys) { + // percentage is not allowed when coordinate system is specified + const point = coordSys.dataToPoint(center); + cx = point[0] || 0; + cy = point[1] || 0; + } + else { + cx = parsePercent(center[0], width) + viewRect.x; + cy = parsePercent(center[1], height) + viewRect.y; + } + return { cx, cy, diff --git a/src/chart/radar/RadarView.ts b/src/chart/radar/RadarView.ts index 429b5a50e4..e51130d4bb 100644 --- a/src/chart/radar/RadarView.ts +++ b/src/chart/radar/RadarView.ts @@ -30,7 +30,7 @@ import GlobalModel from '../../model/Global'; import { VectorArray } from 'zrender/src/core/vector'; import { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle'; import ZRImage from 'zrender/src/graphic/Image'; -import { saveOldStyle } from '../../animation/basicTrasition'; +import { saveOldStyle } from '../../animation/basicTransition'; type RadarSymbol = ReturnType & { __dimIdx: number diff --git a/src/chart/scatter/ScatterSeries.ts b/src/chart/scatter/ScatterSeries.ts index 129b88cc63..5e2995ecad 100644 --- a/src/chart/scatter/ScatterSeries.ts +++ b/src/chart/scatter/ScatterSeries.ts @@ -50,7 +50,7 @@ interface ScatterStateOption { interface ScatterStatesOptionMixin { emphasis?: { focus?: DefaultEmphasisFocus - scale?: boolean + scale?: boolean | number } } @@ -163,4 +163,4 @@ class ScatterSeriesModel extends SeriesModel { } -export default ScatterSeriesModel; \ No newline at end of file +export default ScatterSeriesModel; diff --git a/src/chart/sunburst/SunburstPiece.ts b/src/chart/sunburst/SunburstPiece.ts index a44b7b2921..873a686f17 100644 --- a/src/chart/sunburst/SunburstPiece.ts +++ b/src/chart/sunburst/SunburstPiece.ts @@ -31,7 +31,7 @@ import { getECData } from '../../util/innerStore'; import { getSectorCornerRadius } from '../helper/pieHelper'; import {createOrUpdatePatternFromDecal} from '../../util/decal'; import ExtensionAPI from '../../core/ExtensionAPI'; -import { saveOldStyle } from '../../animation/basicTrasition'; +import { saveOldStyle } from '../../animation/basicTransition'; const DEFAULT_SECTOR_Z = 2; const DEFAULT_TEXT_Z = 4; diff --git a/src/chart/sunburst/SunburstSeries.ts b/src/chart/sunburst/SunburstSeries.ts index 9ef36b54d5..0887e2fd7f 100644 --- a/src/chart/sunburst/SunburstSeries.ts +++ b/src/chart/sunburst/SunburstSeries.ts @@ -81,7 +81,7 @@ export interface SunburstSeriesNodeItemOption extends StatesOptionMixin, SunburstStatesMixin>, OptionDataItemObject { - nodeClick?: 'rootToNode' | 'link' + nodeClick?: 'rootToNode' | 'link' | false // Available when nodeClick is link link?: string target?: string @@ -138,7 +138,7 @@ export interface SunburstSeriesOption extends */ // highlightPolicy?: 'descendant' | 'ancestor' | 'self' - nodeClick?: 'rootToNode' | 'link' + nodeClick?: 'rootToNode' | 'link' | false renderLabelForZeroData?: boolean diff --git a/src/chart/themeRiver/ThemeRiverView.ts b/src/chart/themeRiver/ThemeRiverView.ts index 754eb2bf7f..283d43a5c3 100644 --- a/src/chart/themeRiver/ThemeRiverView.ts +++ b/src/chart/themeRiver/ThemeRiverView.ts @@ -29,7 +29,7 @@ import GlobalModel from '../../model/Global'; import ExtensionAPI from '../../core/ExtensionAPI'; import { RectLike } from 'zrender/src/core/BoundingRect'; import { ColorString } from '../../util/types'; -import { saveOldStyle } from '../../animation/basicTrasition'; +import { saveOldStyle } from '../../animation/basicTransition'; type LayerSeries = ReturnType; diff --git a/src/chart/tree/treeAction.ts b/src/chart/tree/treeAction.ts index 2589d3ef75..358779919c 100644 --- a/src/chart/tree/treeAction.ts +++ b/src/chart/tree/treeAction.ts @@ -17,7 +17,7 @@ * under the License. */ -import {updateCenterAndZoom, RoamPaylod} from '../../action/roamHelper'; +import {updateCenterAndZoom, RoamPayload} from '../../action/roamHelper'; import { Payload } from '../../util/types'; import TreeSeriesModel from './TreeSeries'; import GlobalModel from '../../model/Global'; @@ -52,7 +52,7 @@ export function installTreeAction(registers: EChartsExtensionInstallRegisters) { // the layout. So don't need to go through the whole update process, such // as 'dataPrcocess', 'coordSystemUpdate', 'layout' and so on. update: 'none' - }, function (payload: RoamPaylod, ecModel: GlobalModel, api: ExtensionAPI) { + }, function (payload: RoamPayload, ecModel: GlobalModel, api: ExtensionAPI) { ecModel.eachComponent({ mainType: 'series', subType: 'tree', query: payload }, function (seriesModel: TreeSeriesModel) { @@ -67,4 +67,4 @@ export function installTreeAction(registers: EChartsExtensionInstallRegisters) { }); }); -} \ No newline at end of file +} diff --git a/src/chart/treemap/Breadcrumb.ts b/src/chart/treemap/Breadcrumb.ts index 6dd35c5df2..0875c4a2b3 100644 --- a/src/chart/treemap/Breadcrumb.ts +++ b/src/chart/treemap/Breadcrumb.ts @@ -29,7 +29,8 @@ import { ZRElementEvent, BoxLayoutOptionMixin, ECElement } from '../../util/type import Element from 'zrender/src/Element'; import Model from '../../model/Model'; import { convertOptionIdName } from '../../util/model'; -import { Z2_EMPHASIS_LIFT } from '../../util/states'; +import { toggleHoverEmphasis, Z2_EMPHASIS_LIFT } from '../../util/states'; +import { createTextStyle } from '../../label/labelStyle'; const TEXT_PADDING = 8; const ITEM_GAP = 8; @@ -55,6 +56,7 @@ interface LayoutParam { } type BreadcrumbItemStyleModel = Model; +type BreadcrumbEmphasisItemStyleModel = Model; type BreadcrumbTextStyleModel = Model; class Breadcrumb { @@ -81,8 +83,9 @@ class Breadcrumb { } const normalStyleModel = model.getModel('itemStyle'); - // let emphasisStyleModel = model.getModel('emphasis.itemStyle'); + const emphasisModel = model.getModel('emphasis'); const textStyleModel = normalStyleModel.getModel('textStyle'); + const emphasisTextStyleModel = emphasisModel.getModel(['itemStyle', 'textStyle']); const layoutParam: LayoutParam = { pos: { @@ -101,7 +104,10 @@ class Breadcrumb { }; this._prepare(targetNode, layoutParam, textStyleModel); - this._renderContent(seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect); + this._renderContent( + seriesModel, layoutParam, normalStyleModel, + emphasisModel, textStyleModel, emphasisTextStyleModel, onSelect + ); layout.positionElement(thisGroup, layoutParam.pos, layoutParam.box); } @@ -134,7 +140,9 @@ class Breadcrumb { seriesModel: TreemapSeriesModel, layoutParam: LayoutParam, normalStyleModel: BreadcrumbItemStyleModel, + emphasisModel: BreadcrumbEmphasisItemStyleModel, textStyleModel: BreadcrumbTextStyleModel, + emphasisTextStyleModel: BreadcrumbTextStyleModel, onSelect: OnSelectCallback ) { // Start rendering. @@ -144,6 +152,7 @@ class Breadcrumb { const availableSize = layout.getAvailableSize(layoutParam.pos, layoutParam.box); let totalWidth = layoutParam.totalWidth; const renderList = layoutParam.renderList; + const emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle(); for (let i = renderList.length - 1; i >= 0; i--) { const item = renderList[i]; @@ -172,11 +181,7 @@ class Breadcrumb { } ), textContent: new graphic.Text({ - style: { - text, - fill: textStyleModel.getTextColor(), - font: textStyleModel.getFont() - } + style: createTextStyle(textStyleModel, { text }) }), textConfig: { position: 'inside' @@ -185,7 +190,11 @@ class Breadcrumb { onclick: curry(onSelect, itemNode) }); (el as ECElement).disableLabelAnimation = true; - + el.getTextContent().ensureState('emphasis').style = createTextStyle(emphasisTextStyleModel, { text }); + el.ensureState('emphasis').style = emphasisItemStyle; + toggleHoverEmphasis( + el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled') + ); this.group.add(el); packEventData(el, seriesModel, itemNode); diff --git a/src/chart/treemap/TreemapSeries.ts b/src/chart/treemap/TreemapSeries.ts index 50228e4ed8..2e5f22835f 100644 --- a/src/chart/treemap/TreemapSeries.ts +++ b/src/chart/treemap/TreemapSeries.ts @@ -36,7 +36,8 @@ import { DecalObject, SeriesLabelOption, DefaultEmphasisFocus, - AriaOptionMixin + AriaOptionMixin, + BlurScope } from '../../util/types'; import GlobalModel from '../../model/Global'; import { LayoutRect } from '../../util/layout'; @@ -192,7 +193,7 @@ export interface TreemapSeriesOption * be on left depth, the behaviour would be changing root. Otherwise * use behavious defined above. */ - nodeClick?: 'zoomToNode' | 'link' + nodeClick?: 'zoomToNode' | 'link' | false breadcrumb?: BoxLayoutOptionMixin & { show?: boolean @@ -202,6 +203,9 @@ export interface TreemapSeriesOption itemStyle?: BreadcrumbItemStyleOption emphasis?: { + disabled?: boolean + focus?: DefaultEmphasisFocus + blurScope?: BlurScope itemStyle?: BreadcrumbItemStyleOption } } @@ -265,6 +269,11 @@ class TreemapSeriesModel extends SeriesModel { textStyle: { color: '#fff' } + }, + emphasis: { + itemStyle: { + color: 'rgba(0,0,0,0.9)' //'#5793f3', + } } }, label: { diff --git a/src/component/axis/AxisBuilder.ts b/src/component/axis/AxisBuilder.ts index 5ed1ed3f6b..d01d20d660 100644 --- a/src/component/axis/AxisBuilder.ts +++ b/src/component/axis/AxisBuilder.ts @@ -255,6 +255,7 @@ const builders: Record<'axisLine' | 'axisTickLabel' | 'axisName', AxisElementsBu const matrix = transformGroup.transform; const pt1 = [extent[0], 0]; const pt2 = [extent[1], 0]; + const inverse = pt1[0] > pt2[0]; if (matrix) { v2ApplyTransform(pt1, pt1, matrix); v2ApplyTransform(pt2, pt2, matrix); @@ -268,8 +269,6 @@ const builders: Record<'axisLine' | 'axisTickLabel' | 'axisName', AxisElementsBu ); const line = new graphic.Line({ - // Id for animation - subPixelOptimize: true, shape: { x1: pt1[0], y1: pt1[1], @@ -281,6 +280,7 @@ const builders: Record<'axisLine' | 'axisTickLabel' | 'axisName', AxisElementsBu silent: true, z2: 1 }); + graphic.subPixelOptimizeLine(line.shape, line.style.lineWidth); line.anid = 'line'; group.add(line); @@ -327,10 +327,11 @@ const builders: Record<'axisLine' | 'axisTickLabel' | 'axisName', AxisElementsBu // Calculate arrow position with offset const r = point.r + point.offset; + const pt = inverse ? pt2 : pt1; symbol.attr({ rotation: point.rotate, - x: pt1[0] + r * Math.cos(opt.rotation), - y: pt1[1] - r * Math.sin(opt.rotation), + x: pt[0] + r * Math.cos(opt.rotation), + y: pt[1] - r * Math.sin(opt.rotation), silent: true, z2: 11 }); @@ -341,7 +342,6 @@ const builders: Record<'axisLine' | 'axisTickLabel' | 'axisName', AxisElementsBu }, axisTickLabel(opt, axisModel, group, transformGroup) { - const ticksEls = buildAxisMajorTicks(group, transformGroup, axisModel, opt); const labelEls = buildAxisLabel(group, transformGroup, axisModel, opt); @@ -628,7 +628,6 @@ function createTicks( } // Tick line, Not use group transform to have better line draw const tickEl = new graphic.Line({ - subPixelOptimize: true, shape: { x1: pt1[0], y1: pt1[1], @@ -640,6 +639,7 @@ function createTicks( autoBatch: true, silent: true }); + graphic.subPixelOptimizeLine(tickEl.shape, tickEl.style.lineWidth); tickEl.anid = anidPrefix + '_' + ticksCoords[i].tickValue; tickEls.push(tickEl); } diff --git a/src/component/axis/CartesianAxisView.ts b/src/component/axis/CartesianAxisView.ts index e040398902..3cc48e3041 100644 --- a/src/component/axis/CartesianAxisView.ts +++ b/src/component/axis/CartesianAxisView.ts @@ -157,9 +157,8 @@ const axisElementBuilders: Record { + const currECData = getECData(target); + if (currECData.dataIndex != null) { + ecData = currECData; + return true; + } + }, true); - if (!el || getECData(el).dataIndex == null) { + if (!ecData) { return; } - const ecData = getECData(el); const dataModel = this.ecModel.getSeriesByIndex(ecData.seriesIndex); + const visualMapModel = this.visualMapModel; if (!visualMapModel.isTargetSeries(dataModel)) { return; } @@ -947,4 +955,4 @@ function getCursor(orient: Orient) { return orient === 'vertical' ? 'ns-resize' : 'ew-resize'; } -export default ContinuousView; \ No newline at end of file +export default ContinuousView; diff --git a/src/coord/geo/geoCreator.ts b/src/coord/geo/geoCreator.ts index 1d4bd3730e..f51700ae0b 100644 --- a/src/coord/geo/geoCreator.ts +++ b/src/coord/geo/geoCreator.ts @@ -27,15 +27,14 @@ import MapSeries, { MapSeriesOption } from '../../chart/map/MapSeries'; import ExtensionAPI from '../../core/ExtensionAPI'; import { CoordinateSystemCreator } from '../CoordinateSystem'; import { NameMap } from './geoTypes'; -import SeriesModel from '../../model/Series'; import { SeriesOption, SeriesOnGeoOptionMixin } from '../../util/types'; import { Dictionary } from 'zrender/src/core/types'; -import GlobalModel from '../../model/Global'; -import ComponentModel from '../../model/Component'; -import { Model } from '../../echarts.all'; +import type Model from '../../model/Model'; +import type GlobalModel from '../../model/Global'; +import type SeriesModel from '../../model/Series'; +import type ComponentModel from '../../model/Component'; import * as vector from 'zrender/src/core/vector'; - export type resizeGeoType = typeof resizeGeo; /** diff --git a/src/coord/single/Single.ts b/src/coord/single/Single.ts index 4632190e41..c9226b5aae 100644 --- a/src/coord/single/Single.ts +++ b/src/coord/single/Single.ts @@ -140,7 +140,7 @@ class Single implements CoordinateSystem, CoordinateSystemMaster { const isHorizontal = axis.isHorizontal(); const extent = isHorizontal ? [0, rect.width] : [0, rect.height]; - const idx = axis.reverse ? 1 : 0; + const idx = axis.inverse ? 1 : 0; axis.setExtent(extent[idx], extent[1 - idx]); diff --git a/src/coord/single/SingleAxis.ts b/src/coord/single/SingleAxis.ts index 6009149be6..ff2db92516 100644 --- a/src/coord/single/SingleAxis.ts +++ b/src/coord/single/SingleAxis.ts @@ -43,8 +43,6 @@ class SingleAxis extends Axis { orient: LayoutOrient; - reverse: boolean; - coordinateSystem: Single; model: SingleAxisModel; diff --git a/src/core/echarts.ts b/src/core/echarts.ts index 500dbe9ddd..538c819707 100644 --- a/src/core/echarts.ts +++ b/src/core/echarts.ts @@ -34,7 +34,8 @@ import { isDom, isArray, noop, - isString + isString, + retrieve2 } from 'zrender/src/core/util'; import env from 'zrender/src/core/env'; import timsort from 'zrender/src/core/timsort'; @@ -324,6 +325,8 @@ type EChartsInitOpts = { renderer?: RendererType, devicePixelRatio?: number, useDirtyRect?: boolean, + useCoarsePointer?: boolean, + pointerSize?: number, ssr?: boolean, width?: number, height?: number @@ -409,6 +412,7 @@ class ECharts extends Eventful { this._dom = dom; let defaultRenderer = 'canvas'; + let defaultCoarsePointer: 'auto' | boolean = 'auto'; let defaultUseDirtyRect = false; if (__DEV__) { const root = ( @@ -418,6 +422,8 @@ class ECharts extends Eventful { defaultRenderer = root.__ECHARTS__DEFAULT__RENDERER__ || defaultRenderer; + defaultCoarsePointer = retrieve2(root.__ECHARTS__DEFAULT__COARSE_POINTER, defaultCoarsePointer); + const devUseDirtyRect = root.__ECHARTS__DEFAULT__USE_DIRTY_RECT__; defaultUseDirtyRect = devUseDirtyRect == null ? defaultUseDirtyRect @@ -430,7 +436,9 @@ class ECharts extends Eventful { width: opts.width, height: opts.height, ssr: opts.ssr, - useDirtyRect: opts.useDirtyRect == null ? defaultUseDirtyRect : opts.useDirtyRect + useDirtyRect: retrieve2(opts.useDirtyRect, defaultUseDirtyRect), + useCoarsePointer: retrieve2(opts.useCoarsePointer, defaultCoarsePointer), + pointerSize: opts.pointerSize }); this._ssr = opts.ssr; diff --git a/src/data/DataStore.ts b/src/data/DataStore.ts index b839d8b0f3..bb9dcf179c 100644 --- a/src/data/DataStore.ts +++ b/src/data/DataStore.ts @@ -448,7 +448,7 @@ class DataStore { } getValues(idx: number): ParsedValue[]; - getValues(dimensions: readonly DimensionIndex[], idx?: number): ParsedValue[] + getValues(dimensions: readonly DimensionIndex[], idx?: number): ParsedValue[]; getValues(dimensions: readonly DimensionIndex[] | number, idx?: number): ParsedValue[] { const values = []; let dimArr: DimensionIndex[] = []; diff --git a/src/data/Graph.ts b/src/data/Graph.ts index a250ad9632..f7939a5304 100644 --- a/src/data/Graph.ts +++ b/src/data/Graph.ts @@ -360,8 +360,8 @@ class GraphNode { } // TODO: TYPE Same type with Model#getModel - getModel(): Model - getModel(path: S): Model + getModel(): Model; + getModel(path: S): Model; getModel(path?: string): Model { if (this.dataIndex < 0) { return; @@ -410,8 +410,8 @@ class GraphEdge { this.dataIndex = dataIndex == null ? -1 : dataIndex; } - getModel(): Model - getModel(path: S): Model + getModel(): Model; + getModel(path: S): Model; // eslint-disable-next-line @typescript-eslint/no-unused-vars getModel(path?: string): Model { if (this.dataIndex < 0) { diff --git a/src/data/Tree.ts b/src/data/Tree.ts index ad7ae4241c..8467084945 100644 --- a/src/data/Tree.ts +++ b/src/data/Tree.ts @@ -98,9 +98,9 @@ export class TreeNode { * @param cb If in preorder and return false, * its subtree will not be visited. */ - eachNode(options: TreeTraverseOrder, cb: TreeTraverseCallback, context?: Ctx): void - eachNode(options: TreeTraverseOption, cb: TreeTraverseCallback, context?: Ctx): void - eachNode(cb: TreeTraverseCallback, context?: Ctx): void + eachNode(options: TreeTraverseOrder, cb: TreeTraverseCallback, context?: Ctx): void; + eachNode(options: TreeTraverseOption, cb: TreeTraverseCallback, context?: Ctx): void; + eachNode(cb: TreeTraverseCallback, context?: Ctx): void; eachNode( options: TreeTraverseOrder | TreeTraverseOption | TreeTraverseCallback, cb?: TreeTraverseCallback | Ctx, @@ -225,7 +225,7 @@ export class TreeNode { return this.hostTree.data.getItemLayout(this.dataIndex); } - getModel(): Model + getModel(): Model; // @depcrecated // getModel(path: S): Model // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -251,8 +251,8 @@ export class TreeNode { * }); */ // TODO: TYPE - setVisual(key: string, value: any): void - setVisual(obj: Dictionary): void + setVisual(key: string, value: any): void; + setVisual(obj: Dictionary): void; setVisual(key: string | Dictionary, value?: any) { this.dataIndex >= 0 && this.hostTree.data.setItemVisual(this.dataIndex, key as any, value); @@ -353,9 +353,9 @@ class Tree { * @param cb * @param context */ - eachNode(options: TreeTraverseOrder, cb: TreeTraverseCallback, context?: Ctx): void - eachNode(options: TreeTraverseOption, cb: TreeTraverseCallback, context?: Ctx): void - eachNode(cb: TreeTraverseCallback, context?: Ctx): void + eachNode(options: TreeTraverseOrder, cb: TreeTraverseCallback, context?: Ctx): void; + eachNode(options: TreeTraverseOption, cb: TreeTraverseCallback, context?: Ctx): void; + eachNode(cb: TreeTraverseCallback, context?: Ctx): void; eachNode( options: TreeTraverseOrder | TreeTraverseOption | TreeTraverseCallback, cb?: TreeTraverseCallback | Ctx, diff --git a/src/i18n/langUA.ts b/src/i18n/langUA.ts new file mode 100644 index 0000000000..38b2e10498 --- /dev/null +++ b/src/i18n/langUA.ts @@ -0,0 +1,143 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Language: Ukrainian. + */ + +export default { + time: { + month: [ + 'Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень', + 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень' + ], + monthAbbr: [ + 'Січ', 'Лют', 'Бер', 'Кві', 'Тра', 'Чер', + 'Лип', 'Сер', 'Вер', 'Жов', 'Лис', 'Гру' + ], + dayOfWeek: [ + 'Неділя', 'Понеділок', 'Вівторок', 'Середа', 'Четвер', 'П\'ятниця', 'Субота' + ], + dayOfWeekAbbr: [ + 'нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб' + ] + }, + legend: { + selector: { + all: 'Все', + inverse: 'Обернути' + } + }, + toolbox: { + brush: { + title: { + rect: 'Выділити область', + polygon: 'Інструмент «Ласо»', + lineX: 'Горизонтальне виділення', + lineY: 'Вертикальне виділення', + keep: 'Залишити обране', + clear: 'Очистити обране' + } + }, + dataView: { + title: 'Дані', + lang: ['Дані', 'Закрити', 'Оновити'] + }, + dataZoom: { + title: { + zoom: 'Збільшити', + back: 'Скасувати збільшення' + } + }, + magicType: { + title: { + line: 'Переключитися на лінійний графік', + bar: 'Переключитися на стовпчикову діаграму', + stack: 'Стопка', + tiled: 'Плитка' + } + }, + restore: { + title: 'Відновити' + }, + saveAsImage: { + title: 'Зберегти зображення', + lang: ['Правий клік, щоб зберегти зображення'] + } + }, + series: { + typeNames: { + pie: 'Кругова діаграма', + bar: 'Стовпчикова діаграма', + line: 'Лінійний графік', + scatter: 'Точкова діаграма', + effectScatter: 'Точкова діаграма з хвилями', + radar: 'Пелюсткова діаграма', + tree: 'Дерево', + treemap: 'Пласке дерево', + boxplot: 'Ящик з вусами', + candlestick: 'Свічний графік', + k: 'Графік К-ліній', + heatmap: 'Теплова мапа', + map: 'Мапа', + parallel: 'Діаграма паралельних координат', + lines: 'Лінійний граф', + graph: 'Граф отношений', + sankey: 'Діаграма Санкей', + funnel: 'Воронкообразна діаграма', + gauge: 'Шкала', + pictorialBar: 'Стовпчик-картинка', + themeRiver: 'Тематична ріка', + sunburst: 'Сонячне проміння' + } + }, + aria: { + general: { + withTitle: 'Це графік, що відрображує "{title}"', + withoutTitle: 'Це графік' + }, + series: { + single: { + prefix: '', + withName: ' з типом {seriesType} та іменем {seriesName}.', + withoutName: ' з типом {seriesType}.' + }, + multiple: { + prefix: '. Він складається з {seriesCount} серій.', + withName: + ' Серія {seriesId} має тип {seriesType} та відображає {seriesName}.', + withoutName: ' Серія {seriesId} має тип {seriesType}.', + separator: { + middle: '', + end: '' + } + } + }, + data: { + allData: 'Дані такі: ', + partialData: 'Перші {displayCnt} елементів: ', + withName: 'значення для {name} — {value}', + withoutName: '{value}', + separator: { + middle: ', ', + end: '. ' + } + } + } +}; diff --git a/src/model/Global.ts b/src/model/Global.ts index d4777a4ee9..cadc98b20d 100644 --- a/src/model/Global.ts +++ b/src/model/Global.ts @@ -696,17 +696,17 @@ echarts.use([${seriesImportName}]);`); eachComponent( cb: EachComponentAllCallback, context?: T - ): void + ): void; eachComponent( mainType: string, cb: EachComponentInMainTypeCallback, context?: T - ): void + ): void; eachComponent( mainType: QueryConditionKindA, cb: EachComponentInMainTypeCallback, context?: T - ): void + ): void; eachComponent( mainType: string | QueryConditionKindA | EachComponentAllCallback, cb?: EachComponentInMainTypeCallback | T, diff --git a/src/scale/Interval.ts b/src/scale/Interval.ts index 1f4a7f98e8..866051dcf2 100644 --- a/src/scale/Interval.ts +++ b/src/scale/Interval.ts @@ -250,7 +250,8 @@ class IntervalScale = Dictionary> e if (extent[0] === extent[1]) { if (extent[0] !== 0) { // Expand extent - const expandSize = extent[0]; + // Note that extents can be both negative. See #13154 + const expandSize = Math.abs(extent[0]); // In the fowllowing case // Axis has been fixed max 100 // Plus data are all 100 and axis extent are [100, 100]. diff --git a/src/scale/Log.ts b/src/scale/Log.ts index 41586e8775..b1f4d08b16 100644 --- a/src/scale/Log.ts +++ b/src/scale/Log.ts @@ -85,9 +85,10 @@ class LogScale extends Scale { } setExtent(start: number, end: number): void { - const base = this.base; - start = mathLog(start) / mathLog(base); - end = mathLog(end) / mathLog(base); + const base = mathLog(this.base); + // log(-Infinity) is NaN, so safe guard here + start = mathLog(Math.max(0, start)) / base; + end = mathLog(Math.max(0, end)) / base; intervalScaleProto.setExtent.call(this, start, end); } diff --git a/src/util/format.ts b/src/util/format.ts index ce85f6c83a..8aa00685ad 100644 --- a/src/util/format.ts +++ b/src/util/format.ts @@ -18,6 +18,7 @@ */ import * as zrUtil from 'zrender/src/core/util'; +import { encodeHTML } from 'zrender/src/core/dom'; import { parseDate, isNumeric, numericToNumber } from './number'; import { TooltipRenderMode, ColorString, ZRColor, DimensionType } from './types'; import { Dictionary } from 'zrender/src/core/types'; @@ -51,24 +52,7 @@ export function toCamelCase(str: string, upperCaseFirst?: boolean): string { export const normalizeCssArray = zrUtil.normalizeCssArray; - -const replaceReg = /([&<>"'])/g; -const replaceMap: Dictionary = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''' -}; - -export function encodeHTML(source: string): string { - return source == null - ? '' - : (source + '').replace(replaceReg, function (str, c) { - return replaceMap[c]; - }); -} - +export { encodeHTML }; /** * Make value user readable for tooltip and label. diff --git a/src/util/graphic.ts b/src/util/graphic.ts index 2f66a79c7e..0c09c04fae 100644 --- a/src/util/graphic.ts +++ b/src/util/graphic.ts @@ -75,7 +75,7 @@ import { removeElement, removeElementWithFadeOut, isElementRemoved -} from '../animation/basicTrasition'; +} from '../animation/basicTransition'; /** * @deprecated export for compatitable reason @@ -268,16 +268,14 @@ export function resizePath(path: SVGPath, rect: ZRRectLike): void { /** * Sub pixel optimize line for canvas */ -export function subPixelOptimizeLine(param: { +export function subPixelOptimizeLine( shape: { x1: number, y1: number, x2: number, y2: number }, - style: { - lineWidth: number - } -}) { - subPixelOptimizeUtil.subPixelOptimizeLine(param.shape, param.shape, param.style); - return param; + lineWidth: number +) { + subPixelOptimizeUtil.subPixelOptimizeLine(shape, shape, {lineWidth}); + return shape; } /** diff --git a/src/util/number.ts b/src/util/number.ts index aab32f1703..bf5b2562f0 100644 --- a/src/util/number.ts +++ b/src/util/number.ts @@ -233,11 +233,27 @@ export function getPercentWithPrecision(valueList: number[], idx: number, precis return 0; } + const seats = getPercentSeats(valueList, precision); + + return seats[idx] || 0; +} + +/** + * Get a data of given precision, assuring the sum of percentages + * in valueList is 1. + * The largest remainer method is used. + * https://en.wikipedia.org/wiki/Largest_remainder_method + * + * @param valueList a list of all data + * @param precision integer number showing digits of precision + * @return {Array} + */ +export function getPercentSeats(valueList: number[], precision: number): number[] { const sum = zrUtil.reduce(valueList, function (acc, val) { return acc + (isNaN(val) ? 0 : val); }, 0); if (sum === 0) { - return 0; + return []; } const digits = Math.pow(10, precision); @@ -275,8 +291,9 @@ export function getPercentWithPrecision(valueList: number[], idx: number, precis remainder[maxId] = 0; ++currentSum; } - - return seats[idx] / digits; + return zrUtil.map(seats, function (seat) { + return seat / digits; + }); } /** diff --git a/src/visual/VisualMapping.ts b/src/visual/VisualMapping.ts index 8898bc7b06..f964e3fb0a 100644 --- a/src/visual/VisualMapping.ts +++ b/src/visual/VisualMapping.ts @@ -377,13 +377,13 @@ class VisualMapping { } } - static mapVisual(visual: T, callback: (visual: T, key?: string | number) => T, context?: Ctx): T - static mapVisual(visual: T[], callback: (visual: T, key?: string | number) => T[], context?: Ctx): T[] + static mapVisual(visual: T, callback: (visual: T, key?: string | number) => T, context?: Ctx): T; + static mapVisual(visual: T[], callback: (visual: T, key?: string | number) => T[], context?: Ctx): T[]; static mapVisual( visual: Dictionary, callback: (visual: T, key?: string | number) => Dictionary, context?: Ctx - ): Dictionary + ): Dictionary; static mapVisual( visual: T | T[] | Dictionary, callback: (visual: T, key?: string | number) => T | T[] | Dictionary, diff --git a/test/axis-arrow.html b/test/axis-arrow.html index 4194631f7b..d6a4a5defc 100644 --- a/test/axis-arrow.html +++ b/test/axis-arrow.html @@ -23,19 +23,18 @@ + + -
+
+
+ + diff --git a/test/bar-race.html b/test/bar-race.html index 766ae138e9..332e4f4f2e 100644 --- a/test/bar-race.html +++ b/test/bar-race.html @@ -75,6 +75,11 @@ formatter: function (n) { return Math.round(n); } + }, + splitLine: { + lineStyle: { + color: 'red' + } } }, dataset: { diff --git a/test/coarse-pointer.html b/test/coarse-pointer.html new file mode 100644 index 0000000000..959d8babfd --- /dev/null +++ b/test/coarse-pointer.html @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + +

__ECHARTS__DEFAULT__COARSE_POINTER:

+ +
+
+
+ + + + + + + + + + + + diff --git a/test/custom-update.html b/test/custom-update.html new file mode 100644 index 0000000000..2015c4bbb6 --- /dev/null +++ b/test/custom-update.html @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + diff --git a/test/custom.html b/test/custom.html index 1485c8a155..a8b727ea82 100644 --- a/test/custom.html +++ b/test/custom.html @@ -90,29 +90,37 @@

Custom Single Axis

{name: 'GPU', color: '#72b362'} ]; + var renderCount = 0; // Generate mock data - echarts.util.each(categories, function (category, index) { - var baseTime = startTime; - for (var i = 0; i < dataCount; i++) { - var typeItem = types[Math.round(Math.random() * (types.length - 1))]; - var duration = Math.round(Math.random() * 10000); - data.push({ - name: typeItem.name, - value: [ - index, - baseTime, - baseTime += duration, - duration - ], - itemStyle: { - normal: { - color: typeItem.color + function updateData() { + data = []; + echarts.util.each(categories, function (category, index) { + var baseTime = startTime; + for (var i = 0; i < dataCount; i++) { + var typeItem = types[Math.round(Math.random() * (types.length - 1))]; + var duration = Math.round(Math.random() * 10000); + var isEven = renderCount % 2 === 0; + data.push({ + name: typeItem.name, + value: [ + index, + baseTime, + isEven ? (baseTime += duration) : NaN, + duration + ], + itemStyle: { + normal: { + color: typeItem.color + } } - } - }); - baseTime += Math.round(Math.random() * 2000); - } - }); + }); + isEven && (baseTime += Math.round(Math.random() * 2000)); + } + }); + renderCount++; + } + + updateData(); console.log(JSON.stringify({ startTime: startTime, @@ -211,7 +219,26 @@

Custom Single Axis

}] }; - testHelper.createChart(echarts, 'profile', option); + var chart = testHelper.create(echarts, 'profile', { + option: option, + title: [ + 'The data should be cleared when clicking the **updateData** button firstly', + 'Should have no errors when clicking the **updateData** button once again' + ], + buttons: [ + { + text: 'updateData', + onclick: function () { + updateData(); + chart.setOption({ + series: [{ + data: data + }] + }); + } + } + ] + }); }); @@ -1398,4 +1425,4 @@

Custom Single Axis

- \ No newline at end of file + diff --git a/test/gauge-case.html b/test/gauge-case.html index 94f8bd5626..cdbf852b32 100644 --- a/test/gauge-case.html +++ b/test/gauge-case.html @@ -65,6 +65,10 @@ show: true, width: 18 }, + axisLabel: { + distance: 30, + rotate: 50 + }, data: [ { value: 0 @@ -101,6 +105,10 @@ name: 'SCORE' } ], + axisLabel: { + distance: 30, + rotate: 'radial' + }, progress: { show: true, roundCap: true diff --git a/test/gauge-simple.html b/test/gauge-simple.html index d92a979c5c..076e0af123 100644 --- a/test/gauge-simple.html +++ b/test/gauge-simple.html @@ -210,6 +210,7 @@ color: '#464646', fontSize: 20, distance: -60, + rotate: 'tangential', formatter: function(value) { if (value === 0.875) { return '优' @@ -252,4 +253,4 @@ - \ No newline at end of file + diff --git a/test/graph-draggable.html b/test/graph-draggable.html new file mode 100644 index 0000000000..d681e98e19 --- /dev/null +++ b/test/graph-draggable.html @@ -0,0 +1,441 @@ + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/lib/caseFrame.js b/test/lib/caseFrame.js index fb2a1703da..bd3e193377 100644 --- a/test/lib/caseFrame.js +++ b/test/lib/caseFrame.js @@ -207,6 +207,17 @@ var matchResult = (pageURL || '').match(/[?&]__RENDERER__=(canvas|svg)(&|$)/); return matchResult && matchResult[1] || 'canvas'; }, + // true, false, 'auto' + useCoarsePointer: function (pageURL) { + var matchResult = (pageURL || '').match(/[?&]__USE_COARSE_POINTER__=(true|false|auto)(&|$)/); + return matchResult && matchResult[1] + ? matchResult[1] === 'true' + ? true + : matchResult[1] === 'false' + ? false + : 'auto' + : 'auto'; + }, // true, false useDirtyRect: function (pageURL) { var matchResult = (pageURL || '').match(/[?&]__USE_DIRTY_RECT__=(true|false)(&|$)/); diff --git a/test/lib/config.js b/test/lib/config.js index 1c99b359ac..bc36037e79 100644 --- a/test/lib/config.js +++ b/test/lib/config.js @@ -30,6 +30,21 @@ if (params.__RENDERER__) { window.__ECHARTS__DEFAULT__RENDERER__ = params.__RENDERER__; } + if (params.__COARSE__POINTER__) { + switch (params.__COARSE__POINTER__) { + case 'true': + window.__ECHARTS__COARSE__POINTER__ = true; + break; + + case 'false': + window.__ECHARTS__COARSE__POINTER__ = false; + break; + + default: + window.__ECHARTS__COARSE__POINTER__ = 'auto'; + break; + } + } if (params.__USE_DIRTY_RECT__) { window.__ECHARTS__DEFAULT__USE_DIRTY_RECT__ = params.__USE_DIRTY_RECT__ === 'true'; } diff --git a/test/lib/testHelper.js b/test/lib/testHelper.js index 93fb9bbb60..6df2c44a6e 100644 --- a/test/lib/testHelper.js +++ b/test/lib/testHelper.js @@ -262,6 +262,8 @@ * @param {boolean|number} opt If number, means height * @param {boolean} opt.lazyUpdate * @param {boolean} opt.notMerge + * @param {boolean} opt.useCoarsePointer + * @param {boolean} opt.pointerSize * @param {number} opt.width * @param {number} opt.height * @param {boolean} opt.draggable @@ -284,7 +286,10 @@ dom.style.height = opt.height + 'px'; } - var chart = echarts.init(dom); + var chart = echarts.init(dom, null, { + useCoarsePointer: opt.useCoarsePointer, + pointerSize: opt.pointerSize + }); if (opt.draggable) { if (!window.draggable) { diff --git a/test/line-case.html b/test/line-case.html index aa54d7c77c..8d76e8e412 100644 --- a/test/line-case.html +++ b/test/line-case.html @@ -41,6 +41,7 @@
+
@@ -610,6 +611,39 @@ }); + + diff --git a/test/logScale.html b/test/logScale.html index e91507ac10..def5bfdfdc 100644 --- a/test/logScale.html +++ b/test/logScale.html @@ -26,12 +26,13 @@
+
+ \ No newline at end of file diff --git a/test/pie-coordinate-system.html b/test/pie-coordinate-system.html new file mode 100644 index 0000000000..ad0703eddf --- /dev/null +++ b/test/pie-coordinate-system.html @@ -0,0 +1,381 @@ + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + diff --git a/test/pie-label.html b/test/pie-label.html index 85541efd72..23cb8d39a7 100644 --- a/test/pie-label.html +++ b/test/pie-label.html @@ -51,7 +51,7 @@
- +
+ + diff --git a/test/pie-percent.html b/test/pie-percent.html new file mode 100644 index 0000000000..06372ba5ac --- /dev/null +++ b/test/pie-percent.html @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + diff --git a/test/pie3.html b/test/pie3.html index e799aaae16..1f3b418b3a 100644 --- a/test/pie3.html +++ b/test/pie3.html @@ -74,7 +74,7 @@ formatter: function (params) { return '
\

' + params.name + '

\ -
' + (params.percent * 100).toFixed(1) + '%
\ +
' + params.percent.toFixed(1) + '%
\
- \ No newline at end of file + diff --git a/test/runTest/actions/__meta__.json b/test/runTest/actions/__meta__.json index 473fa64b8f..42f3d8e2ef 100644 --- a/test/runTest/actions/__meta__.json +++ b/test/runTest/actions/__meta__.json @@ -50,19 +50,21 @@ "candlestick-large2": 1, "candlestickConnect": 4, "clip": 12, + "coarse-pointer": 3, "color-mix-aqi": 2, "connect": 1, "connect-dynamic": 2, "connect-manually": 1, "connect2": 1, "css-transform": 4, - "custom": 5, + "custom": 6, "custom-bmap-grid": 1, "custom-children-remove": 1, "custom-hexbin": 2, "custom-large": 1, "custom-shape-morphing": 1, "custom-text-content": 6, + "custom-update": 4, "dataSelect": 7, "dataset-case": 6, "dataZoom-action": 4, @@ -88,7 +90,7 @@ "emphasis-inherit": 1, "funnel": 2, "gauge-simple": 2, - "geo-map": 3, + "geo-map": 4, "geo-map-features": 3, "geo-svg": 8, "geo-svg-demo": 6, @@ -121,7 +123,7 @@ "line-animation": 1, "line-animation-update": 3, "line-boldWhenHover": 1, - "line-case": 1, + "line-case": 2, "line-crash": 1, "line-endLabel": 1, "line-sampling": 2, @@ -149,6 +151,7 @@ "pie-animation": 2, "pie-calculable": 1, "pie-cornerRadius": 1, + "pie-label": 2, "pie-label-extreme": 2, "polar-rounded": 3, "polarLine": 1, @@ -169,6 +172,7 @@ "stackBar-dataZoom": 7, "sunburst-book": 1, "sunburst-canvas": 1, + "symbol": 1, "symbol2": 1, "themeRiver": 1, "timeScale": 1, @@ -189,8 +193,8 @@ "tooltip-valueFormatter": 3, "tree-image": 1, "tree-legend": 1, - "tree-radial": 2, "tree-polyline": 1, + "tree-radial": 2, "treemap-action": 3, "treemap-disk": 3, "treemap-disk2": 3, diff --git a/test/runTest/actions/coarse-pointer.json b/test/runTest/actions/coarse-pointer.json new file mode 100644 index 0000000000..4b7d7ed09b --- /dev/null +++ b/test/runTest/actions/coarse-pointer.json @@ -0,0 +1 @@ +[{"name":"Action 1","ops":[{"type":"mousemove","time":427,"x":507,"y":250},{"type":"mousemove","time":627,"x":469,"y":258},{"type":"mousemove","time":830,"x":403,"y":272},{"type":"mousemove","time":1042,"x":365,"y":279},{"type":"mousemove","time":1242,"x":345,"y":306},{"type":"mousemove","time":1446,"x":338,"y":330},{"type":"mousemove","time":1626,"x":337,"y":330},{"type":"mousemove","time":1827,"x":304,"y":339},{"type":"mousemove","time":2027,"x":303,"y":338},{"type":"mousemove","time":2231,"x":298,"y":331},{"type":"mousemove","time":2447,"x":298,"y":330},{"type":"mousedown","time":2686,"x":298,"y":330},{"type":"mouseup","time":2831,"x":298,"y":330},{"time":2832,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":4028,"x":298,"y":333},{"type":"mousemove","time":4230,"x":330,"y":386},{"type":"mousemove","time":4446,"x":339,"y":395},{"type":"mousemove","time":4692,"x":339,"y":395},{"type":"mousemove","time":4892,"x":344,"y":402}],"scrollY":0,"scrollX":0,"timestamp":1657770168133},{"name":"Action 2","ops":[{"type":"mousemove","time":777,"x":394,"y":369},{"type":"mousemove","time":977,"x":351,"y":337},{"type":"mousemove","time":1178,"x":322,"y":311},{"type":"mousemove","time":1378,"x":312,"y":297},{"type":"mousemove","time":1578,"x":305,"y":292},{"type":"mousemove","time":1779,"x":304,"y":291},{"type":"mousedown","time":2165,"x":304,"y":291},{"type":"mouseup","time":2308,"x":304,"y":291},{"time":2309,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3131,"x":304,"y":292},{"type":"mousemove","time":3333,"x":335,"y":337},{"type":"mousemove","time":3545,"x":354,"y":365},{"type":"mousemove","time":3749,"x":357,"y":369}],"scrollY":512,"scrollX":0,"timestamp":1657770178748},{"name":"Action 3","ops":[{"type":"mousemove","time":351,"x":589,"y":312},{"type":"mousemove","time":551,"x":481,"y":373},{"type":"mousemove","time":755,"x":446,"y":397},{"type":"mousemove","time":967,"x":417,"y":416},{"type":"mousemove","time":1168,"x":410,"y":420},{"type":"mousemove","time":1401,"x":409,"y":420},{"type":"mousemove","time":1408,"x":408,"y":420},{"type":"mousemove","time":1608,"x":375,"y":433},{"type":"mousemove","time":1818,"x":353,"y":433},{"type":"mousemove","time":2018,"x":352,"y":433},{"type":"mousemove","time":2618,"x":352,"y":433},{"type":"mousemove","time":2823,"x":406,"y":439},{"type":"mousemove","time":3035,"x":467,"y":431},{"type":"mousemove","time":3237,"x":467,"y":431}],"scrollY":870.5,"scrollX":0,"timestamp":1657770187725}] \ No newline at end of file diff --git a/test/runTest/actions/custom-update.json b/test/runTest/actions/custom-update.json new file mode 100644 index 0000000000..dbacd6ff19 --- /dev/null +++ b/test/runTest/actions/custom-update.json @@ -0,0 +1 @@ +[{"name":"Action 1","ops":[{"type":"mousemove","time":678,"x":793,"y":218},{"type":"mousemove","time":878,"x":436,"y":281},{"type":"mousemove","time":1079,"x":285,"y":329},{"type":"mousemove","time":1285,"x":283,"y":329},{"type":"mousemove","time":1362,"x":282,"y":329},{"type":"mousemove","time":1562,"x":239,"y":316},{"type":"mousemove","time":1765,"x":176,"y":325},{"type":"mousemove","time":1979,"x":158,"y":325},{"type":"mousemove","time":2180,"x":72,"y":178},{"type":"mousemove","time":2386,"x":43,"y":114},{"type":"mousemove","time":2580,"x":43,"y":114},{"type":"mousedown","time":2591,"x":43,"y":114},{"type":"mouseup","time":2723,"x":43,"y":114},{"time":2724,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":4303,"x":43,"y":114},{"type":"mouseup","time":4435,"x":43,"y":114},{"time":4436,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":6044,"x":43,"y":114},{"type":"mouseup","time":6177,"x":43,"y":114},{"time":6178,"delay":400,"type":"screenshot-auto"}],"scrollY":0,"scrollX":0,"timestamp":1658736074386},{"name":"Action 2","ops":[{"type":"mousemove","time":477,"x":484,"y":279},{"type":"mousemove","time":680,"x":226,"y":164},{"type":"mousemove","time":893,"x":119,"y":145},{"type":"mousemove","time":1094,"x":59,"y":132},{"type":"mousemove","time":1301,"x":51,"y":129},{"type":"mousedown","time":1423,"x":51,"y":129},{"type":"mouseup","time":1547,"x":51,"y":129},{"time":1548,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":2550,"x":51,"y":129},{"type":"mouseup","time":2684,"x":51,"y":129},{"time":2685,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":3923,"x":51,"y":129},{"type":"mouseup","time":4056,"x":51,"y":129},{"time":4057,"delay":400,"type":"screenshot-auto"}],"scrollY":530,"scrollX":0,"timestamp":1658736087421},{"name":"Action 3","ops":[{"type":"mousemove","time":399,"x":153,"y":147},{"type":"mousemove","time":600,"x":77,"y":88},{"type":"mousemove","time":805,"x":48,"y":69},{"type":"mousedown","time":931,"x":45,"y":66},{"type":"mousemove","time":1021,"x":45,"y":66},{"type":"mouseup","time":1062,"x":45,"y":66},{"time":1063,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":2000,"x":45,"y":66},{"type":"mouseup","time":2122,"x":45,"y":66},{"time":2123,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2934,"x":45,"y":66},{"type":"mousedown","time":2988,"x":45,"y":67},{"type":"mousemove","time":3136,"x":45,"y":67},{"type":"mouseup","time":3146,"x":45,"y":67},{"time":3147,"delay":400,"type":"screenshot-auto"}],"scrollY":1128,"scrollX":0,"timestamp":1658736095915},{"name":"Action 4","ops":[{"type":"mousemove","time":166,"x":266,"y":215},{"type":"mousemove","time":370,"x":79,"y":198},{"type":"mousemove","time":582,"x":55,"y":185},{"type":"mousedown","time":751,"x":52,"y":184},{"type":"mousemove","time":786,"x":52,"y":184},{"type":"mouseup","time":851,"x":52,"y":184},{"time":852,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":1708,"x":52,"y":184},{"type":"mousemove","time":1715,"x":52,"y":184},{"type":"mouseup","time":1854,"x":52,"y":184},{"time":1855,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2698,"x":52,"y":184},{"type":"mousedown","time":2732,"x":52,"y":185},{"type":"mouseup","time":2874,"x":52,"y":185},{"time":2875,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2903,"x":52,"y":185}],"scrollY":1548,"scrollX":0,"timestamp":1658736103250}] \ No newline at end of file diff --git a/test/runTest/actions/custom.json b/test/runTest/actions/custom.json index 7e80989310..9d0864af42 100644 --- a/test/runTest/actions/custom.json +++ b/test/runTest/actions/custom.json @@ -1 +1 @@ -[{"name":"Action 1","ops":[{"type":"mousedown","time":408,"x":81,"y":475},{"type":"mousemove","time":570,"x":85,"y":475},{"type":"mousemove","time":770,"x":209,"y":479},{"type":"mouseup","time":1011,"x":209,"y":479},{"time":1012,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":1403,"x":209,"y":479},{"type":"mousemove","time":1537,"x":210,"y":478},{"type":"mousemove","time":1738,"x":322,"y":473},{"type":"mousemove","time":1945,"x":325,"y":473},{"type":"mousemove","time":2155,"x":326,"y":474},{"type":"mouseup","time":2168,"x":326,"y":474},{"time":2169,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2271,"x":326,"y":474},{"type":"mousedown","time":2520,"x":326,"y":474},{"type":"mousemove","time":2605,"x":327,"y":474},{"type":"mousemove","time":2806,"x":621,"y":480},{"type":"mousemove","time":3012,"x":631,"y":480},{"type":"mouseup","time":3269,"x":631,"y":480},{"time":3270,"delay":400,"type":"screenshot-auto"}],"scrollY":0,"scrollX":0,"timestamp":1568035195567},{"name":"Action 2","ops":[{"type":"mousedown","time":344,"x":458,"y":537},{"type":"mousemove","time":423,"x":457,"y":537},{"type":"mousemove","time":624,"x":310,"y":538},{"type":"mousemove","time":833,"x":300,"y":540},{"type":"mouseup","time":939,"x":300,"y":540},{"time":940,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1625,"x":305,"y":540},{"type":"mousemove","time":1830,"x":384,"y":535},{"type":"mousemove","time":2043,"x":368,"y":534},{"type":"mousemove","time":2308,"x":368,"y":534},{"type":"mousedown","time":2321,"x":368,"y":534},{"type":"mousemove","time":2508,"x":430,"y":524},{"type":"mousemove","time":2709,"x":613,"y":516},{"type":"mousemove","time":2909,"x":659,"y":519},{"type":"mousemove","time":3118,"x":682,"y":517},{"type":"mousemove","time":3368,"x":686,"y":517},{"type":"mouseup","time":3436,"x":686,"y":517},{"time":3437,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3676,"x":685,"y":512},{"type":"mousemove","time":3877,"x":498,"y":192},{"type":"mousemove","time":4077,"x":437,"y":106},{"type":"mousemove","time":4280,"x":387,"y":72},{"type":"mousemove","time":4501,"x":384,"y":71},{"type":"mousedown","time":4618,"x":384,"y":71},{"type":"mouseup","time":4719,"x":384,"y":71},{"time":4720,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":5562,"x":386,"y":71},{"type":"mousemove","time":5768,"x":431,"y":68},{"type":"mousedown","time":5985,"x":431,"y":68},{"type":"mouseup","time":6086,"x":431,"y":68},{"time":6087,"delay":400,"type":"screenshot-auto"}],"scrollY":1749,"scrollX":0,"timestamp":1568035212695},{"name":"Action 3","ops":[{"type":"screenshot","time":1787},{"type":"mousedown","time":2426,"x":408,"y":89},{"type":"mouseup","time":2504,"x":408,"y":89},{"time":2505,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":3672,"x":408,"y":89},{"type":"mouseup","time":3754,"x":408,"y":89},{"time":3755,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":4015,"x":416,"y":99},{"type":"mousemove","time":4216,"x":677,"y":586},{"type":"mousemove","time":4417,"x":696,"y":564},{"type":"mousemove","time":4624,"x":711,"y":556},{"type":"mousemove","time":4840,"x":719,"y":554},{"type":"mousedown","time":5007,"x":719,"y":553},{"type":"mousemove","time":5105,"x":719,"y":553},{"type":"mousemove","time":5117,"x":717,"y":554},{"type":"mousemove","time":5317,"x":613,"y":548},{"type":"mousemove","time":5517,"x":511,"y":548},{"type":"mousemove","time":5724,"x":406,"y":555},{"type":"mousemove","time":5935,"x":312,"y":549},{"type":"mouseup","time":6333,"x":312,"y":549},{"time":6334,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":6543,"x":309,"y":550},{"type":"mousemove","time":6750,"x":304,"y":551},{"type":"mousemove","time":6984,"x":323,"y":549},{"type":"mousemove","time":7194,"x":322,"y":549},{"type":"mousemove","time":7394,"x":318,"y":549},{"type":"mousemove","time":7594,"x":264,"y":556},{"type":"mousemove","time":7800,"x":255,"y":557},{"type":"mousedown","time":7855,"x":255,"y":557},{"type":"mousemove","time":8010,"x":308,"y":555},{"type":"mousemove","time":8211,"x":522,"y":557},{"type":"mousemove","time":8421,"x":577,"y":556},{"type":"mouseup","time":8854,"x":577,"y":556},{"time":8855,"delay":400,"type":"screenshot-auto"}],"scrollY":2309,"scrollX":0,"timestamp":1568035234459},{"name":"Action 4","ops":[{"type":"mousedown","time":392,"x":485,"y":521},{"type":"mousemove","time":487,"x":477,"y":520},{"type":"mousemove","time":690,"x":396,"y":521},{"type":"mousemove","time":895,"x":315,"y":522},{"type":"mouseup","time":1150,"x":315,"y":522},{"time":1151,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1403,"x":315,"y":521},{"type":"mousemove","time":1604,"x":221,"y":201},{"type":"mousemove","time":1812,"x":176,"y":58},{"type":"mousemove","time":2004,"x":170,"y":48},{"type":"mousemove","time":2212,"x":174,"y":52},{"type":"mousedown","time":2335,"x":174,"y":52},{"type":"mouseup","time":2469,"x":174,"y":52},{"time":2470,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2499,"x":175,"y":52},{"type":"mousemove","time":2699,"x":247,"y":52},{"type":"mousemove","time":2997,"x":247,"y":52},{"type":"mousedown","time":3049,"x":247,"y":52},{"type":"mouseup","time":3138,"x":247,"y":52},{"time":3139,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3212,"x":251,"y":52},{"type":"mousemove","time":3413,"x":304,"y":58},{"type":"mousemove","time":3620,"x":320,"y":58},{"type":"mousedown","time":3669,"x":320,"y":58},{"type":"mouseup","time":3775,"x":320,"y":58},{"time":3776,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3980,"x":323,"y":58},{"type":"mousemove","time":4180,"x":376,"y":64},{"type":"mousedown","time":4360,"x":376,"y":64},{"type":"mousemove","time":4387,"x":376,"y":64},{"type":"mouseup","time":4470,"x":376,"y":64},{"time":4471,"delay":400,"type":"screenshot-auto"}],"scrollY":2916,"scrollX":0,"timestamp":1568035317710},{"name":"Action 5","ops":[{"type":"mousedown","time":448,"x":717,"y":482},{"type":"mousemove","time":556,"x":712,"y":482},{"type":"mousemove","time":756,"x":493,"y":483},{"type":"mousemove","time":957,"x":407,"y":481},{"type":"mousemove","time":1158,"x":355,"y":479},{"type":"mouseup","time":1415,"x":355,"y":479},{"time":1416,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":2050,"x":355,"y":479},{"type":"mousemove","time":2176,"x":345,"y":480},{"type":"mousemove","time":2382,"x":175,"y":486},{"type":"mousemove","time":2599,"x":161,"y":486},{"type":"mousemove","time":2725,"x":161,"y":486},{"type":"mousemove","time":2933,"x":153,"y":487},{"type":"mouseup","time":3205,"x":153,"y":487},{"time":3206,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3542,"x":152,"y":487},{"type":"mousemove","time":3744,"x":132,"y":485},{"type":"mousedown","time":3901,"x":130,"y":485},{"type":"mousemove","time":3944,"x":131,"y":485},{"type":"mousemove","time":4144,"x":267,"y":485},{"type":"mousemove","time":4344,"x":278,"y":484},{"type":"mousemove","time":4552,"x":303,"y":482},{"type":"mouseup","time":4705,"x":303,"y":482},{"time":4706,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":5380,"x":305,"y":482},{"type":"mousemove","time":5587,"x":340,"y":475},{"type":"mousemove","time":5780,"x":337,"y":475},{"type":"mousemove","time":5986,"x":333,"y":476},{"type":"mousemove","time":6236,"x":333,"y":477},{"type":"mousemove","time":6437,"x":333,"y":477},{"type":"mousedown","time":6544,"x":333,"y":477},{"type":"mousemove","time":6653,"x":339,"y":477},{"type":"mousemove","time":6862,"x":668,"y":473},{"type":"mousemove","time":7080,"x":684,"y":473},{"type":"mousemove","time":7354,"x":684,"y":473},{"type":"mouseup","time":7730,"x":684,"y":473},{"time":7731,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":7888,"x":678,"y":473},{"type":"mousemove","time":8088,"x":639,"y":472},{"type":"mousedown","time":8265,"x":620,"y":474},{"type":"mousemove","time":8296,"x":620,"y":474},{"type":"mousemove","time":8548,"x":732,"y":473},{"type":"mouseup","time":8782,"x":732,"y":473},{"time":8783,"delay":400,"type":"screenshot-auto"}],"scrollY":3541,"scrollX":0,"timestamp":1568035375040}] \ No newline at end of file +[{"name":"Action 1","ops":[{"type":"mousedown","time":408,"x":81,"y":475},{"type":"mousemove","time":570,"x":85,"y":475},{"type":"mousemove","time":770,"x":209,"y":479},{"type":"mouseup","time":1011,"x":209,"y":479},{"time":1012,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":1403,"x":209,"y":479},{"type":"mousemove","time":1537,"x":210,"y":478},{"type":"mousemove","time":1738,"x":322,"y":473},{"type":"mousemove","time":1945,"x":325,"y":473},{"type":"mousemove","time":2155,"x":326,"y":474},{"type":"mouseup","time":2168,"x":326,"y":474},{"time":2169,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2271,"x":326,"y":474},{"type":"mousedown","time":2520,"x":326,"y":474},{"type":"mousemove","time":2605,"x":327,"y":474},{"type":"mousemove","time":2806,"x":621,"y":480},{"type":"mousemove","time":3012,"x":631,"y":480},{"type":"mouseup","time":3269,"x":631,"y":480},{"time":3270,"delay":400,"type":"screenshot-auto"}],"scrollY":0,"scrollX":0,"timestamp":1568035195567},{"name":"Action 2","ops":[{"type":"mousedown","time":344,"x":458,"y":537},{"type":"mousemove","time":423,"x":457,"y":537},{"type":"mousemove","time":624,"x":310,"y":538},{"type":"mousemove","time":833,"x":300,"y":540},{"type":"mouseup","time":939,"x":300,"y":540},{"time":940,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1625,"x":305,"y":540},{"type":"mousemove","time":1830,"x":384,"y":535},{"type":"mousemove","time":2043,"x":368,"y":534},{"type":"mousemove","time":2308,"x":368,"y":534},{"type":"mousedown","time":2321,"x":368,"y":534},{"type":"mousemove","time":2508,"x":430,"y":524},{"type":"mousemove","time":2709,"x":613,"y":516},{"type":"mousemove","time":2909,"x":659,"y":519},{"type":"mousemove","time":3118,"x":682,"y":517},{"type":"mousemove","time":3368,"x":686,"y":517},{"type":"mouseup","time":3436,"x":686,"y":517},{"time":3437,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3676,"x":685,"y":512},{"type":"mousemove","time":3877,"x":498,"y":192},{"type":"mousemove","time":4077,"x":437,"y":106},{"type":"mousemove","time":4280,"x":387,"y":72},{"type":"mousemove","time":4501,"x":384,"y":71},{"type":"mousedown","time":4618,"x":384,"y":71},{"type":"mouseup","time":4719,"x":384,"y":71},{"time":4720,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":5562,"x":386,"y":71},{"type":"mousemove","time":5768,"x":431,"y":68},{"type":"mousedown","time":5985,"x":431,"y":68},{"type":"mouseup","time":6086,"x":431,"y":68},{"time":6087,"delay":400,"type":"screenshot-auto"}],"scrollY":1749,"scrollX":0,"timestamp":1568035212695},{"name":"Action 3","ops":[{"type":"screenshot","time":1787},{"type":"mousedown","time":2426,"x":408,"y":89},{"type":"mouseup","time":2504,"x":408,"y":89},{"time":2505,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":3672,"x":408,"y":89},{"type":"mouseup","time":3754,"x":408,"y":89},{"time":3755,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":4015,"x":416,"y":99},{"type":"mousemove","time":4216,"x":677,"y":586},{"type":"mousemove","time":4417,"x":696,"y":564},{"type":"mousemove","time":4624,"x":711,"y":556},{"type":"mousemove","time":4840,"x":719,"y":554},{"type":"mousedown","time":5007,"x":719,"y":553},{"type":"mousemove","time":5105,"x":719,"y":553},{"type":"mousemove","time":5117,"x":717,"y":554},{"type":"mousemove","time":5317,"x":613,"y":548},{"type":"mousemove","time":5517,"x":511,"y":548},{"type":"mousemove","time":5724,"x":406,"y":555},{"type":"mousemove","time":5935,"x":312,"y":549},{"type":"mouseup","time":6333,"x":312,"y":549},{"time":6334,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":6543,"x":309,"y":550},{"type":"mousemove","time":6750,"x":304,"y":551},{"type":"mousemove","time":6984,"x":323,"y":549},{"type":"mousemove","time":7194,"x":322,"y":549},{"type":"mousemove","time":7394,"x":318,"y":549},{"type":"mousemove","time":7594,"x":264,"y":556},{"type":"mousemove","time":7800,"x":255,"y":557},{"type":"mousedown","time":7855,"x":255,"y":557},{"type":"mousemove","time":8010,"x":308,"y":555},{"type":"mousemove","time":8211,"x":522,"y":557},{"type":"mousemove","time":8421,"x":577,"y":556},{"type":"mouseup","time":8854,"x":577,"y":556},{"time":8855,"delay":400,"type":"screenshot-auto"}],"scrollY":2309,"scrollX":0,"timestamp":1568035234459},{"name":"Action 4","ops":[{"type":"mousedown","time":392,"x":485,"y":521},{"type":"mousemove","time":487,"x":477,"y":520},{"type":"mousemove","time":690,"x":396,"y":521},{"type":"mousemove","time":895,"x":315,"y":522},{"type":"mouseup","time":1150,"x":315,"y":522},{"time":1151,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1403,"x":315,"y":521},{"type":"mousemove","time":1604,"x":221,"y":201},{"type":"mousemove","time":1812,"x":176,"y":58},{"type":"mousemove","time":2004,"x":170,"y":48},{"type":"mousemove","time":2212,"x":174,"y":52},{"type":"mousedown","time":2335,"x":174,"y":52},{"type":"mouseup","time":2469,"x":174,"y":52},{"time":2470,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2499,"x":175,"y":52},{"type":"mousemove","time":2699,"x":247,"y":52},{"type":"mousemove","time":2997,"x":247,"y":52},{"type":"mousedown","time":3049,"x":247,"y":52},{"type":"mouseup","time":3138,"x":247,"y":52},{"time":3139,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3212,"x":251,"y":52},{"type":"mousemove","time":3413,"x":304,"y":58},{"type":"mousemove","time":3620,"x":320,"y":58},{"type":"mousedown","time":3669,"x":320,"y":58},{"type":"mouseup","time":3775,"x":320,"y":58},{"time":3776,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3980,"x":323,"y":58},{"type":"mousemove","time":4180,"x":376,"y":64},{"type":"mousedown","time":4360,"x":376,"y":64},{"type":"mousemove","time":4387,"x":376,"y":64},{"type":"mouseup","time":4470,"x":376,"y":64},{"time":4471,"delay":400,"type":"screenshot-auto"}],"scrollY":2916,"scrollX":0,"timestamp":1568035317710},{"name":"Action 5","ops":[{"type":"mousedown","time":448,"x":717,"y":482},{"type":"mousemove","time":556,"x":712,"y":482},{"type":"mousemove","time":756,"x":493,"y":483},{"type":"mousemove","time":957,"x":407,"y":481},{"type":"mousemove","time":1158,"x":355,"y":479},{"type":"mouseup","time":1415,"x":355,"y":479},{"time":1416,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":2050,"x":355,"y":479},{"type":"mousemove","time":2176,"x":345,"y":480},{"type":"mousemove","time":2382,"x":175,"y":486},{"type":"mousemove","time":2599,"x":161,"y":486},{"type":"mousemove","time":2725,"x":161,"y":486},{"type":"mousemove","time":2933,"x":153,"y":487},{"type":"mouseup","time":3205,"x":153,"y":487},{"time":3206,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3542,"x":152,"y":487},{"type":"mousemove","time":3744,"x":132,"y":485},{"type":"mousedown","time":3901,"x":130,"y":485},{"type":"mousemove","time":3944,"x":131,"y":485},{"type":"mousemove","time":4144,"x":267,"y":485},{"type":"mousemove","time":4344,"x":278,"y":484},{"type":"mousemove","time":4552,"x":303,"y":482},{"type":"mouseup","time":4705,"x":303,"y":482},{"time":4706,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":5380,"x":305,"y":482},{"type":"mousemove","time":5587,"x":340,"y":475},{"type":"mousemove","time":5780,"x":337,"y":475},{"type":"mousemove","time":5986,"x":333,"y":476},{"type":"mousemove","time":6236,"x":333,"y":477},{"type":"mousemove","time":6437,"x":333,"y":477},{"type":"mousedown","time":6544,"x":333,"y":477},{"type":"mousemove","time":6653,"x":339,"y":477},{"type":"mousemove","time":6862,"x":668,"y":473},{"type":"mousemove","time":7080,"x":684,"y":473},{"type":"mousemove","time":7354,"x":684,"y":473},{"type":"mouseup","time":7730,"x":684,"y":473},{"time":7731,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":7888,"x":678,"y":473},{"type":"mousemove","time":8088,"x":639,"y":472},{"type":"mousedown","time":8265,"x":620,"y":474},{"type":"mousemove","time":8296,"x":620,"y":474},{"type":"mousemove","time":8548,"x":732,"y":473},{"type":"mouseup","time":8782,"x":732,"y":473},{"time":8783,"delay":400,"type":"screenshot-auto"}],"scrollY":3541,"scrollX":0,"timestamp":1568035375040},{"name":"Action 6","ops":[{"type":"mousedown","time":512,"x":40,"y":163},{"type":"mouseup","time":662,"x":40,"y":163},{"type":"mousedown","time":1019,"x":40,"y":163},{"type":"mouseup","time":1164,"x":40,"y":163},{"time":1165,"delay":400,"type":"screenshot-auto"}],"scrollY":0,"scrollX":0,"timestamp":1656920000014}] \ No newline at end of file diff --git a/test/runTest/actions/geo-map.json b/test/runTest/actions/geo-map.json index ffbe5bcc13..b9f1566534 100644 --- a/test/runTest/actions/geo-map.json +++ b/test/runTest/actions/geo-map.json @@ -1 +1 @@ -[{"name":"Action 1","ops":[{"type":"mousedown","time":750,"x":67,"y":8},{"type":"mouseup","time":835,"x":67,"y":8},{"time":836,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1086,"x":67,"y":8},{"type":"mousemove","time":1291,"x":65,"y":29},{"type":"mousemove","time":1491,"x":65,"y":30},{"type":"mousedown","time":1667,"x":65,"y":30},{"type":"mouseup","time":1785,"x":65,"y":30},{"time":1786,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2142,"x":65,"y":31},{"type":"mousemove","time":2342,"x":61,"y":61},{"type":"mousemove","time":2568,"x":61,"y":61},{"type":"mousedown","time":2652,"x":61,"y":61},{"type":"mouseup","time":2725,"x":61,"y":61},{"time":2726,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":3702,"x":61,"y":61},{"type":"mouseup","time":3775,"x":61,"y":61},{"time":3776,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3955,"x":61,"y":61},{"type":"mousemove","time":4155,"x":68,"y":46},{"type":"mousemove","time":4362,"x":71,"y":37},{"type":"mousedown","time":4510,"x":71,"y":37},{"type":"mouseup","time":4605,"x":71,"y":37},{"time":4606,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":5004,"x":71,"y":36},{"type":"mousemove","time":5226,"x":72,"y":16},{"type":"mousedown","time":5406,"x":72,"y":15},{"type":"mousemove","time":5426,"x":72,"y":15},{"type":"mouseup","time":5493,"x":72,"y":15},{"time":5494,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":6071,"x":72,"y":16},{"type":"mousemove","time":6272,"x":69,"y":35},{"type":"mousemove","time":6486,"x":69,"y":35},{"type":"mousedown","time":6614,"x":69,"y":35},{"type":"mouseup","time":6697,"x":69,"y":35},{"time":6698,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":7099,"x":69,"y":36},{"type":"mousemove","time":7299,"x":66,"y":56},{"type":"mousemove","time":7499,"x":62,"y":65},{"type":"mousedown","time":7766,"x":62,"y":65},{"type":"mouseup","time":7841,"x":62,"y":65},{"time":7842,"delay":400,"type":"screenshot-auto"}],"scrollY":0,"scrollX":0,"timestamp":1568040771612},{"name":"Action 2","ops":[{"type":"mousedown","time":465,"x":18,"y":430},{"type":"mousemove","time":578,"x":18,"y":432},{"type":"mousemove","time":914,"x":24,"y":475},{"type":"mouseup","time":1111,"x":23,"y":477},{"time":1112,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1140,"x":23,"y":477},{"type":"mousemove","time":1357,"x":19,"y":571},{"type":"mousemove","time":1603,"x":21,"y":579},{"type":"mousemove","time":1807,"x":21,"y":576},{"type":"mousemove","time":2020,"x":21,"y":574},{"type":"mousedown","time":2170,"x":21,"y":573},{"type":"mousemove","time":2228,"x":21,"y":573},{"type":"mousemove","time":2277,"x":21,"y":573},{"type":"mousemove","time":2493,"x":23,"y":549},{"type":"mousemove","time":2715,"x":23,"y":543},{"type":"mousemove","time":2929,"x":23,"y":543},{"type":"mouseup","time":3233,"x":23,"y":543},{"time":3234,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3327,"x":23,"y":542},{"type":"mousemove","time":3549,"x":18,"y":516},{"type":"mousemove","time":3768,"x":14,"y":510},{"type":"mousedown","time":4021,"x":14,"y":510},{"type":"mouseup","time":4111,"x":14,"y":510},{"time":4112,"delay":400,"type":"screenshot-auto"}],"scrollY":0,"scrollX":0,"timestamp":1603890244262},{"name":"Action 3","ops":[{"type":"mousemove","time":550,"x":429,"y":336},{"type":"mousedown","time":674,"x":431,"y":335},{"type":"mousemove","time":793,"x":431,"y":336},{"type":"mousemove","time":1006,"x":346,"y":462},{"type":"mousemove","time":1207,"x":350,"y":458},{"type":"mouseup","time":1343,"x":350,"y":458},{"time":1344,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1410,"x":350,"y":458},{"type":"mousemove","time":1603,"x":350,"y":457},{"type":"mousewheel","time":1686,"x":350,"y":457,"deltaY":4.000244140625},{"type":"mousewheel","time":1719,"x":350,"y":457,"deltaY":40.41015625},{"type":"mousewheel","time":1748,"x":350,"y":457,"deltaY":377.4566650390625},{"type":"mousewheel","time":1775,"x":350,"y":457,"deltaY":252.0208740234375},{"type":"mousewheel","time":1801,"x":350,"y":457,"deltaY":274.16015625},{"type":"mousewheel","time":1901,"x":350,"y":457,"deltaY":263.7664794921875},{"type":"mousemove","time":2236,"x":347,"y":454},{"type":"mousemove","time":2441,"x":308,"y":411},{"type":"mousedown","time":2514,"x":308,"y":411},{"type":"mousemove","time":2644,"x":443,"y":385},{"type":"mousemove","time":2855,"x":648,"y":301},{"type":"mousemove","time":3059,"x":670,"y":288},{"type":"mouseup","time":3161,"x":670,"y":288},{"time":3162,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3270,"x":662,"y":291},{"type":"mousemove","time":3476,"x":581,"y":308},{"type":"mousewheel","time":3521,"x":581,"y":308,"deltaY":-4.000244140625},{"type":"mousewheel","time":3545,"x":581,"y":308,"deltaY":-37.410888671875},{"type":"mousewheel","time":3570,"x":581,"y":308,"deltaY":-385.2349853515625},{"type":"mousewheel","time":3602,"x":581,"y":308,"deltaY":-252.042236328125},{"type":"mousewheel","time":3627,"x":581,"y":308,"deltaY":-271.1181640625}],"scrollY":0,"scrollX":0,"timestamp":1568969626016}] \ No newline at end of file +[{"name":"Action 1","ops":[{"type":"mousemove","time":461,"x":229,"y":419},{"type":"mousemove","time":735,"x":246,"y":350},{"type":"mousemove","time":1019,"x":249,"y":366},{"type":"screenshot","time":2182}],"scrollY":0,"scrollX":0,"timestamp":1657527803250},{"name":"Action 2","ops":[{"type":"mousedown","time":750,"x":67,"y":8},{"type":"mouseup","time":835,"x":67,"y":8},{"time":836,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1086,"x":67,"y":8},{"type":"mousemove","time":1291,"x":65,"y":29},{"type":"mousemove","time":1491,"x":65,"y":30},{"type":"mousedown","time":1667,"x":65,"y":30},{"type":"mouseup","time":1785,"x":65,"y":30},{"time":1786,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2142,"x":65,"y":31},{"type":"mousemove","time":2342,"x":61,"y":61},{"type":"mousemove","time":2568,"x":61,"y":61},{"type":"mousedown","time":2652,"x":61,"y":61},{"type":"mouseup","time":2725,"x":61,"y":61},{"time":2726,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":3702,"x":61,"y":61},{"type":"mouseup","time":3775,"x":61,"y":61},{"time":3776,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3955,"x":61,"y":61},{"type":"mousemove","time":4155,"x":68,"y":46},{"type":"mousemove","time":4362,"x":71,"y":37},{"type":"mousedown","time":4510,"x":71,"y":37},{"type":"mouseup","time":4605,"x":71,"y":37},{"time":4606,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":5004,"x":71,"y":36},{"type":"mousemove","time":5226,"x":72,"y":16},{"type":"mousedown","time":5406,"x":72,"y":15},{"type":"mousemove","time":5426,"x":72,"y":15},{"type":"mouseup","time":5493,"x":72,"y":15},{"time":5494,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":6071,"x":72,"y":16},{"type":"mousemove","time":6272,"x":69,"y":35},{"type":"mousemove","time":6486,"x":69,"y":35},{"type":"mousedown","time":6614,"x":69,"y":35},{"type":"mouseup","time":6697,"x":69,"y":35},{"time":6698,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":7099,"x":69,"y":36},{"type":"mousemove","time":7299,"x":66,"y":56},{"type":"mousemove","time":7499,"x":62,"y":65},{"type":"mousedown","time":7766,"x":62,"y":65},{"type":"mouseup","time":7841,"x":62,"y":65},{"time":7842,"delay":400,"type":"screenshot-auto"}],"scrollY":0,"scrollX":0,"timestamp":1568040771612},{"name":"Action 3","ops":[{"type":"mousedown","time":465,"x":18,"y":430},{"type":"mousemove","time":578,"x":18,"y":432},{"type":"mousemove","time":914,"x":24,"y":475},{"type":"mouseup","time":1111,"x":23,"y":477},{"time":1112,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1140,"x":23,"y":477},{"type":"mousemove","time":1357,"x":19,"y":571},{"type":"mousemove","time":1603,"x":21,"y":579},{"type":"mousemove","time":1807,"x":21,"y":576},{"type":"mousemove","time":2020,"x":21,"y":574},{"type":"mousedown","time":2170,"x":21,"y":573},{"type":"mousemove","time":2228,"x":21,"y":573},{"type":"mousemove","time":2277,"x":21,"y":573},{"type":"mousemove","time":2493,"x":23,"y":549},{"type":"mousemove","time":2715,"x":23,"y":543},{"type":"mousemove","time":2929,"x":23,"y":543},{"type":"mouseup","time":3233,"x":23,"y":543},{"time":3234,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3327,"x":23,"y":542},{"type":"mousemove","time":3549,"x":18,"y":516},{"type":"mousemove","time":3768,"x":14,"y":510},{"type":"mousedown","time":4021,"x":14,"y":510},{"type":"mouseup","time":4111,"x":14,"y":510},{"time":4112,"delay":400,"type":"screenshot-auto"}],"scrollY":0,"scrollX":0,"timestamp":1603890244262},{"name":"Action 4","ops":[{"type":"mousemove","time":550,"x":429,"y":336},{"type":"mousedown","time":674,"x":431,"y":335},{"type":"mousemove","time":793,"x":431,"y":336},{"type":"mousemove","time":1006,"x":346,"y":462},{"type":"mousemove","time":1207,"x":350,"y":458},{"type":"mouseup","time":1343,"x":350,"y":458},{"time":1344,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1410,"x":350,"y":458},{"type":"mousemove","time":1603,"x":350,"y":457},{"type":"mousewheel","time":1686,"x":350,"y":457,"deltaY":4.000244140625},{"type":"mousewheel","time":1719,"x":350,"y":457,"deltaY":40.41015625},{"type":"mousewheel","time":1748,"x":350,"y":457,"deltaY":377.4566650390625},{"type":"mousewheel","time":1775,"x":350,"y":457,"deltaY":252.0208740234375},{"type":"mousewheel","time":1801,"x":350,"y":457,"deltaY":274.16015625},{"type":"mousewheel","time":1901,"x":350,"y":457,"deltaY":263.7664794921875},{"type":"mousemove","time":2236,"x":347,"y":454},{"type":"mousemove","time":2441,"x":308,"y":411},{"type":"mousedown","time":2514,"x":308,"y":411},{"type":"mousemove","time":2644,"x":443,"y":385},{"type":"mousemove","time":2855,"x":648,"y":301},{"type":"mousemove","time":3059,"x":670,"y":288},{"type":"mouseup","time":3161,"x":670,"y":288},{"time":3162,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3270,"x":662,"y":291},{"type":"mousemove","time":3476,"x":581,"y":308},{"type":"mousewheel","time":3521,"x":581,"y":308,"deltaY":-4.000244140625},{"type":"mousewheel","time":3545,"x":581,"y":308,"deltaY":-37.410888671875},{"type":"mousewheel","time":3570,"x":581,"y":308,"deltaY":-385.2349853515625},{"type":"mousewheel","time":3602,"x":581,"y":308,"deltaY":-252.042236328125},{"type":"mousewheel","time":3627,"x":581,"y":308,"deltaY":-271.1181640625}],"scrollY":0,"scrollX":0,"timestamp":1568969626016}] \ No newline at end of file diff --git a/test/runTest/actions/line-case.json b/test/runTest/actions/line-case.json index 318b5d1ac1..3de8815477 100644 --- a/test/runTest/actions/line-case.json +++ b/test/runTest/actions/line-case.json @@ -1 +1 @@ -[{"name":"Action 1","ops":[{"type":"mousedown","time":264,"x":423,"y":226},{"type":"mouseup","time":353,"x":423,"y":226},{"time":354,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":426,"x":425,"y":227},{"type":"mousemove","time":626,"x":456,"y":261},{"type":"mousemove","time":826,"x":499,"y":322},{"type":"mousedown","time":936,"x":499,"y":322},{"type":"mousemove","time":1027,"x":495,"y":317},{"type":"mousemove","time":1231,"x":443,"y":252},{"type":"mouseup","time":1403,"x":443,"y":251},{"time":1404,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1493,"x":443,"y":251},{"type":"mousemove","time":1976,"x":443,"y":251},{"type":"mousemove","time":2180,"x":455,"y":233},{"type":"mousemove","time":2393,"x":455,"y":231},{"type":"mousedown","time":2469,"x":455,"y":231},{"type":"mouseup","time":2532,"x":454,"y":231},{"time":2533,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2593,"x":454,"y":231}],"scrollY":1268,"scrollX":0,"timestamp":1641536392159}] \ No newline at end of file +[{"name":"Action 1","ops":[{"type":"mousedown","time":264,"x":423,"y":226},{"type":"mouseup","time":353,"x":423,"y":226},{"time":354,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":426,"x":425,"y":227},{"type":"mousemove","time":626,"x":456,"y":261},{"type":"mousemove","time":826,"x":499,"y":322},{"type":"mousedown","time":936,"x":499,"y":322},{"type":"mousemove","time":1027,"x":495,"y":317},{"type":"mousemove","time":1231,"x":443,"y":252},{"type":"mouseup","time":1403,"x":443,"y":251},{"time":1404,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1493,"x":443,"y":251},{"type":"mousemove","time":1976,"x":443,"y":251},{"type":"mousemove","time":2180,"x":455,"y":233},{"type":"mousemove","time":2393,"x":455,"y":231},{"type":"mousedown","time":2469,"x":455,"y":231},{"type":"mouseup","time":2532,"x":454,"y":231},{"time":2533,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2593,"x":454,"y":231}],"scrollY":1268,"scrollX":0,"timestamp":1641536392159},{"name":"Action 2","ops":[{"type":"mousemove","time":556,"x":40,"y":566},{"type":"mousemove","time":757,"x":172,"y":441},{"type":"mousemove","time":963,"x":180,"y":424},{"type":"mousemove","time":1290,"x":180,"y":425}],"scrollY":1726,"scrollX":0,"timestamp":1655695727357}] \ No newline at end of file diff --git a/test/runTest/actions/pie-label.json b/test/runTest/actions/pie-label.json new file mode 100644 index 0000000000..44ede7c777 --- /dev/null +++ b/test/runTest/actions/pie-label.json @@ -0,0 +1 @@ +[{"name":"Action 1","ops":[{"type":"mousemove","time":299,"x":274,"y":345},{"type":"mousemove","time":499,"x":336,"y":332},{"type":"screenshot","time":1769},{"type":"mousemove","time":2799,"x":337,"y":332},{"type":"mousemove","time":2999,"x":316,"y":331},{"type":"mousemove","time":3205,"x":188,"y":277},{"type":"mousemove","time":3419,"x":152,"y":223},{"type":"mousemove","time":3620,"x":134,"y":197},{"type":"mousedown","time":3688,"x":133,"y":189},{"type":"mousemove","time":3837,"x":133,"y":189},{"type":"mouseup","time":3858,"x":133,"y":189},{"time":3859,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":4250,"x":133,"y":191},{"type":"mousemove","time":4450,"x":315,"y":338},{"type":"mousemove","time":4656,"x":345,"y":345},{"type":"mousemove","time":5632,"x":346,"y":345},{"type":"screenshot","time":6169}],"scrollY":4134.8564453125,"scrollX":0,"timestamp":1658391799998},{"name":"Action 2","ops":[{"type":"mousemove","time":257,"x":145,"y":492},{"type":"mousemove","time":465,"x":146,"y":478},{"type":"mousedown","time":518,"x":146,"y":478},{"type":"mouseup","time":633,"x":146,"y":478},{"time":634,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":1553,"x":146,"y":478},{"type":"mouseup","time":1719,"x":146,"y":478},{"time":1720,"delay":400,"type":"screenshot-auto"}],"scrollY":4431.60009765625,"scrollX":0,"timestamp":1658392063110}] \ No newline at end of file diff --git a/test/runTest/actions/symbol.json b/test/runTest/actions/symbol.json new file mode 100644 index 0000000000..a3eaba4eea --- /dev/null +++ b/test/runTest/actions/symbol.json @@ -0,0 +1 @@ +[{"name":"Action 1","ops":[{"type":"mousemove","time":191,"x":749,"y":85},{"type":"mousemove","time":392,"x":733,"y":119},{"type":"mousemove","time":606,"x":704,"y":150},{"type":"screenshot","time":2032},{"type":"mousemove","time":2274,"x":705,"y":150},{"type":"mousemove","time":2479,"x":711,"y":74},{"type":"mousemove","time":2689,"x":706,"y":36},{"type":"mousemove","time":2897,"x":700,"y":20},{"type":"mousemove","time":3361,"x":697,"y":5},{"type":"mousemove","time":3407,"x":697,"y":7},{"type":"mousemove","time":3612,"x":696,"y":21},{"type":"valuechange","selector":"div.dg.ac>div.dg.main.a>ul>li.cr.string>div>div.c>select","value":"2","time":4315,"target":"select"},{"type":"mouseup","time":4316,"x":277,"y":-15},{"type":"mousemove","time":4330,"x":683,"y":59},{"type":"mousemove","time":4533,"x":714,"y":73},{"type":"mousedown","time":4750,"x":741,"y":109},{"type":"mousemove","time":4762,"x":741,"y":109},{"type":"mouseup","time":4863,"x":741,"y":109},{"type":"mousemove","time":5041,"x":741,"y":110},{"type":"mousemove","time":5245,"x":739,"y":117},{"type":"mousemove","time":5607,"x":737,"y":122},{"type":"mousemove","time":5821,"x":712,"y":154},{"type":"mousemove","time":7472,"x":711,"y":155},{"type":"mousemove","time":7673,"x":709,"y":137},{"type":"mousemove","time":7879,"x":703,"y":130},{"type":"mousemove","time":8090,"x":708,"y":152},{"type":"screenshot","time":8290},{"type":"mousemove","time":8495,"x":721,"y":153},{"type":"mousedown","time":15040,"x":721,"y":153},{"type":"mouseup","time":15178,"x":721,"y":153},{"type":"mousemove","time":17358,"x":721,"y":146},{"type":"mousemove","time":17576,"x":697,"y":70},{"type":"mousemove","time":17786,"x":689,"y":15},{"type":"mousemove","time":18161,"x":689,"y":21},{"type":"valuechange","selector":"div.dg.ac>div.dg.main.a>ul>li.cr.string>div>div.c>select","value":"undefined","time":19684,"target":"select"},{"type":"mouseup","time":19684,"x":277,"y":-15},{"type":"mousemove","time":19700,"x":699,"y":82},{"type":"mousemove","time":19909,"x":708,"y":105},{"type":"mousemove","time":20141,"x":711,"y":133},{"type":"mousedown","time":20325,"x":711,"y":133},{"type":"mouseup","time":20522,"x":711,"y":133},{"time":20523,"delay":400,"type":"screenshot-auto"}],"scrollY":0,"scrollX":0,"timestamp":1659016158148}] \ No newline at end of file diff --git a/test/runTest/cli.js b/test/runTest/cli.js index 582fa9928f..7b7755fda0 100644 --- a/test/runTest/cli.js +++ b/test/runTest/cli.js @@ -41,6 +41,7 @@ program .option('--expected ', 'Expected version') .option('--actual ', 'Actual version') .option('--renderer ', 'svg/canvas renderer') + .option('--use-coarse-pointer ', '"auto" (by default) or "true" or "false"') .option('--threads ', 'How many threads to run concurrently') .option('--no-save', 'Don\'t save result') .option('--dir ', 'Out dir'); @@ -51,6 +52,7 @@ program.speed = +program.speed || 1; program.actual = program.actual || 'local'; program.threads = +program.threads || 1; program.renderer = (program.renderer || 'canvas').toLowerCase(); +program.useCoarsePointer = (program.useCoarsePointer || 'auto').toLowerCase(); program.dir = program.dir || (__dirname + '/tmp'); if (!program.tests) { @@ -265,7 +267,7 @@ async function runTestPage(browser, testOpt, version, runtimeCode, isExpected) { width: 800, height: 600 }); - await page.goto(`${origin}/test/${fileUrl}?__RENDERER__=${program.renderer}`, { + await page.goto(`${origin}/test/${fileUrl}?__RENDERER__=${program.renderer}&__COARSE__POINTER__=${program.useCoarsePointer}`, { waitUntil: 'networkidle2', timeout: 10000 }); @@ -384,6 +386,7 @@ async function runTest(browser, testOpt, runtimeCode, expectedVersion, actualVer testOpt.actualVersion = actualVersion; testOpt.expectedVersion = expectedVersion; testOpt.useSVG = program.renderer === 'svg'; + testOpt.useCoarsePointer = program.useCoarsePointer; testOpt.lastRun = Date.now(); } else { @@ -407,7 +410,7 @@ async function runTests(pendingTests) { }); async function eachTask(testOpt) { - console.log(`Running test: ${testOpt.name}, renderer: ${program.renderer}`); + console.log(`Running test: ${testOpt.name}, renderer: ${program.renderer}, useCoarsePointer: ${program.useCoarsePointer}`); try { await runTest(browser, testOpt, runtimeCode, program.expected, program.actual); } diff --git a/test/runTest/client/client.css b/test/runTest/client/client.css index dcb6956374..1cce88083b 100644 --- a/test/runTest/client/client.css +++ b/test/runTest/client/client.css @@ -71,7 +71,6 @@ } .nav-toolbar, .test-run-controls { - padding: 10px 10px; background: #fff; position: fixed; width: 330px; @@ -84,17 +83,14 @@ z-index: 1; position: sticky; width: 100%; - padding: 5px 40px; top: 0px; - background: #896bda; box-shadow: 0 0 20px rgb(0 0 0 / 20%); border-bottom: none; } -.test-run-controls>* { - display: inline-block; - vertical-align: middle; +.test-run-row { + padding: 5px 20px; } .nav-toolbar .el-button { @@ -106,6 +102,8 @@ margin: 0 5px; color: #fff; font-size: 12px; + display: inline-block; + vertical-align: middle; } .run-config-item>* { display: inline-block; diff --git a/test/runTest/client/client.js b/test/runTest/client/client.js index f110fbd3f1..0c34e0ff0e 100644 --- a/test/runTest/client/client.js +++ b/test/runTest/client/client.js @@ -137,6 +137,7 @@ const app = new Vue({ expectedVersion: null, renderer: 'canvas', + useCoarsePointer: 'auto', threads: 4 }, urlRunConfig) }, @@ -344,6 +345,9 @@ const app = new Vue({ if (test.useSVG) { searches.push('__RENDERER__=svg'); } + if (test.useCoarsePointer) { + searches.push('__COARSE__POINTER__=true'); + } let src = test.fileUrl; if (searches.length) { src = src + '?' + searches.join('&'); @@ -366,6 +370,7 @@ const app = new Vue({ this.runConfig.isExpectedNightly = runResult.expectedVersion.includes('-dev.'); this.runConfig.isActualNightly = runResult.actualVersion.includes('-dev.'); this.runConfig.renderer = runResult.renderer; + this.runConfig.useCoarsePointer = runResult.useCoarsePointer; this.showRunsDialog = false; }, @@ -418,6 +423,7 @@ function runTests(tests, noHeadless) { actualVersion: app.runConfig.actualVersion, threads: app.runConfig.threads, renderer: app.runConfig.renderer, + useCoarsePointer: app.runConfig.useCoarsePointer, noHeadless, replaySpeed: noHeadless ? 5 : 5 }); diff --git a/test/runTest/client/index.html b/test/runTest/client/index.html index 9d52c1ae12..e8978f8e43 100644 --- a/test/runTest/client/index.html +++ b/test/runTest/client/index.html @@ -101,83 +101,94 @@

Visual Regression Testing Tool

-
- -
- - ALL RUNS -
-
-
- -
- - RUN ({{selectedTests.length}}) - - Run unfinished ({{unfinishedTests.length}}) - Run failed ({{failedTests.length}}) - Run all ({{fullTests.length}}) - - +
+
+ +
+ + LIST OF RUNNING RESULTS +
+
+
- - Stop - - +
+ + RUN ({{selectedTests.length}}) + + Run unfinished ({{unfinishedTests.length}}) + Run failed ({{failedTests.length}}) + Run all ({{fullTests.length}}) + + - - - -
+ + Stop + + -
- - Expected - - - - - - - - - - Actual - - + + - - - - -
-
- Renderer - - - - +
-
- Threads +
+
+ + Expected + + + + + + + + + + Actual + + + + + + + +
+
+ Renderer + + + + +
+
+ Coarse Pointer + + + + + +
+
+ Threads - - - - + + + + +
diff --git a/test/runTest/runtime/ActionPlayback.js b/test/runTest/runtime/ActionPlayback.js index 6a41f4271c..aa50caa676 100644 --- a/test/runTest/runtime/ActionPlayback.js +++ b/test/runTest/runtime/ActionPlayback.js @@ -186,7 +186,10 @@ export class ActionPlayback { screenshotTaken = true; break; case 'valuechange': - document.querySelector(op.selector).value = op.value; + const selector = document.querySelector(op.selector); + selector.value = op.value; + // changing value via js won't trigger `change` event, so trigger it manually + selector.dispatchEvent(new Event('change')); break; } @@ -213,4 +216,4 @@ export class ActionPlayback { return true; } -}; \ No newline at end of file +}; diff --git a/test/runTest/server.js b/test/runTest/server.js index f74b001956..f7b598f6fc 100644 --- a/test/runTest/server.js +++ b/test/runTest/server.js @@ -131,6 +131,7 @@ function startTests(testsNameList, socket, { actualVersion, expectedVersion, renderer, + useCoarsePointer, noSave }) { console.log('Received: ', testsNameList.join(',')); @@ -190,6 +191,7 @@ function startTests(testsNameList, socket, { '--actual', actualVersion, '--expected', expectedVersion, '--renderer', renderer || '', + '--use-coarse-pointer', useCoarsePointer, '--threads', Math.min(threadsCount, CLI_FIXED_THREADS_COUNT), '--dir', getResultBaseDir(), ...(noHeadless ? ['--no-headless'] : []), @@ -339,6 +341,7 @@ async function start() { actualVersion: data.actualVersion, expectedVersion: data.expectedVersion, renderer: data.renderer, + useCoarsePointer: data.useCoarsePointer, noSave: false } ); @@ -399,6 +402,7 @@ async function start() { actualVersion: data.actualVersion, expectedVersion: data.expectedVersion, renderer: data.renderer || '', + useCoarsePointer: data.useCoarsePointer, noSave: true }); } diff --git a/test/runTest/store.js b/test/runTest/store.js index 5eb3e1dd10..3430bd47e8 100644 --- a/test/runTest/store.js +++ b/test/runTest/store.js @@ -80,7 +80,8 @@ function getRunHash(params) { return [ params.expectedVersion, params.actualVersion, - params.renderer + params.renderer, + params.useCoarsePointer ].join(TEST_HASH_SPLITTER); } @@ -92,7 +93,8 @@ function parseRunHash(str) { return { expectedVersion: parts[0], actualVersion: parts[1], - renderer: parts[2] + renderer: parts[2], + useCoarsePointer: parts[3] }; } @@ -111,7 +113,8 @@ module.exports.checkStoreVersion = function (runParams) { console.log('Store ', _runHash); return storeParams.expectedVersion === runParams.expectedVersion && storeParams.actualVersion === runParams.actualVersion - && storeParams.renderer === runParams.renderer; + && storeParams.renderer === runParams.renderer + && storeParams.useCoarsePointer === runParams.useCoarsePointer; } function getResultFilePath() { diff --git a/test/symbol.html b/test/symbol.html index 808f9a7cfb..465cb38904 100644 --- a/test/symbol.html +++ b/test/symbol.html @@ -23,6 +23,8 @@ + +