diff --git a/.eslintrc-common.yaml b/.eslintrc-common.yaml index 081c0bfcd3..4ae0d21d48 100644 --- a/.eslintrc-common.yaml +++ b/.eslintrc-common.yaml @@ -163,7 +163,7 @@ rules: - 2 - "never" space-unary-ops: 2 - spaced-comment: 0 + spaced-comment: "error" max-nested-callbacks: - 1 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 471f1aa7ec..23981bcde3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - name: Fetch commit count @@ -44,7 +44,7 @@ jobs: - name: Collect changed files run: | mkdir ~/tmp/ - git diff ${{ github.event.pull_request.base.sha }} ${{ github.sha }} --name-only --relative '*src/**/*.ts' > ~/tmp/changed_files + git diff ${{ github.event.pull_request.base.sha }} ${{ github.sha }} --diff-filter=ACM --name-only --relative '*src/**/*.ts' > ~/tmp/changed_files echo -e "Changed files: \n$(cat ~/tmp/changed_files)" - name: Lint @@ -58,7 +58,7 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/nightly-next.yml b/.github/workflows/nightly-next.yml index b8c7978846..c2a6dd870f 100644 --- a/.github/workflows/nightly-next.yml +++ b/.github/workflows/nightly-next.yml @@ -2,7 +2,7 @@ name: Publish Nightly Next on: schedule: - - cron: '0 9 * * *' # After zrender nightly published + - cron: '10 9 * * *' # After zrender nightly published # committers can manually trigger with workflow_dispatch workflow_dispatch: {} repository_dispatch: @@ -15,24 +15,27 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: ref: next - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: registry-url: https://registry.npmjs.org/ - name: Setup and publish nightly run: | + node build/nightly/prepare.js --next + npm i zrender@npm:zrender-nightly@next npm ci + npm ls zrender + node build/nightly/post.js npm run release npm run test npm run test:dts - node build/prepareNightly.js --next npm publish --tag next env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 5f4a302383..ddbcd98412 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -15,21 +15,24 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: registry-url: https://registry.npmjs.org/ - name: Setup and publish nightly run: | + node build/nightly/prepare.js + npm i zrender@npm:zrender-nightly npm ci + npm ls zrender + node build/nightly/post.js npm run release npm run test npm run test:dts - node build/prepareNightly.js npm publish env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/.github/workflows/source-release.yml b/.github/workflows/source-release.yml index c98ba72345..87b85d5ccb 100644 --- a/.github/workflows/source-release.yml +++ b/.github/workflows/source-release.yml @@ -11,13 +11,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} @@ -26,7 +26,7 @@ jobs: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - name: Cache node modules - uses: actions/cache@v2 + uses: actions/cache@v3 env: cache-name: cache-node-modules with: @@ -34,7 +34,7 @@ jobs: path: ~/.npm key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} - - name: Prepare releaes materials + - name: Prepare release materials run: | npm i node build/source-release/prepareReleaseMaterials.js \ @@ -44,7 +44,7 @@ jobs: --out tmp/materials - name: Archive materials - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: apache-echarts-${{env.RELEASE_VERSION}}-release-materials path: | @@ -56,13 +56,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} @@ -72,7 +72,7 @@ jobs: # Get RELEASE_NOTE.txt and pack it into zip. - name: Download materials - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: apache-echarts-${{env.RELEASE_VERSION}}-release-materials @@ -80,7 +80,7 @@ jobs: # Archive before run others to avoid packing unknown files. - name: Archive source release - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: apache-echarts-${{env.RELEASE_VERSION}}-src path: | @@ -109,11 +109,11 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} @@ -122,7 +122,7 @@ jobs: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - name: Download source release - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: apache-echarts-${{env.RELEASE_VERSION}}-src path: tmp/echarts diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 2c293e76c8..5cf94e3b0c 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -14,7 +14,7 @@ jobs: if: ${{ github.repository_owner == 'apache' }} steps: - name: Close Stale Issues - uses: actions/stale@v5 + uses: actions/stale@v6 with: days-before-stale: 730 days-before-close: 7 @@ -26,5 +26,6 @@ jobs: 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' + exempt-all-milestones: true operations-per-run: 500 ascending: true diff --git a/.huskyrc b/.huskyrc index 92e4551cbd..3f05f5dbad 100644 --- a/.huskyrc +++ b/.huskyrc @@ -1,5 +1,5 @@ { "hooks": { - "pre-commit": "npm run lint && npm run checktype", + "pre-commit": "npm run lint && npm run checktype" } } diff --git a/README.md b/README.md index 8c98532b32..78472efa78 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,9 @@ Execute the instructions in the root directory of the echarts: npm install # Rebuild source code immediately in watch mode when changing the source code. +# It opens the `./test` directory and you may open `-cases.html` to get the list +# of all test cases. +# If you wish to create a test case, run `npm run mktest:help` to learn more. npm run dev # Check correctness of TypeScript code. diff --git a/src/chart/boxplot/boxplotVisual.ts b/build/nightly/post.js similarity index 56% rename from src/chart/boxplot/boxplotVisual.ts rename to build/nightly/post.js index 067738a7b0..a06bf338a6 100644 --- a/src/chart/boxplot/boxplotVisual.ts +++ b/build/nightly/post.js @@ -17,10 +17,14 @@ * under the License. */ -import GlobalModel from '../../model/Global'; -import ExtensionAPI from '../../core/ExtensionAPI'; -import BoxplotSeriesModel from './BoxplotSeries'; +const fs = require('fs'); -export default function boxplotVisual(ecModel: GlobalModel, api: ExtensionAPI) { +const root = __dirname + '/../../'; +const echartsPkg = JSON.parse(fs.readFileSync(root + 'package.json'), 'utf-8'); +const zrenderPkg = JSON.parse(fs.readFileSync(root + 'node_modules/zrender/package.json', 'utf-8')); -} \ No newline at end of file +const echartsCorePath = root + 'src/core/echarts.ts'; +const echartsCoreFile = fs.readFileSync(echartsCorePath, 'utf-8') + .replace(/export const version = '\S+'/, `export const version = '${echartsPkg.version}'`) + .replace(/(export const dependencies = {\s+zrender: ')\S+('\s+})/, `$1${zrenderPkg.version}$2`); +fs.writeFileSync(echartsCorePath, echartsCoreFile, 'utf-8'); diff --git a/build/prepareNightly.js b/build/nightly/prepare.js similarity index 95% rename from build/prepareNightly.js rename to build/nightly/prepare.js index 0dccab4efb..edec4a966d 100644 --- a/build/prepareNightly.js +++ b/build/nightly/prepare.js @@ -19,7 +19,7 @@ const fs = require('fs'); -const packageJsonPath = __dirname + '/../package.json'; +const packageJsonPath = __dirname + '/../../package.json'; const nightlyPackageName = 'echarts-nightly'; const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); @@ -57,8 +57,7 @@ packageJson.version = updateVersion(packageJson.version); fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2), 'utf-8'); - -const readmePath = __dirname + '/../README.md'; +const readmePath = __dirname + '/../../README.md'; const readmeAttention = `

⚠️ ATTENTION PLEASE

This is nightly build of Apache ECharts. Please DON't use it in your production environment.

@@ -70,4 +69,4 @@ ${readmeAttention} ${readmeContent} `, 'utf-8'); -} \ No newline at end of file +} diff --git a/extension-src/bmap/BMapModel.ts b/extension-src/bmap/BMapModel.ts index 6e0f3e6be7..f84c127c8d 100644 --- a/extension-src/bmap/BMapModel.ts +++ b/extension-src/bmap/BMapModel.ts @@ -48,10 +48,10 @@ export default echarts.extendComponentModel({ zoom: 5, - // 2.0 http://lbsyun.baidu.com/custom/index.htm + // 2.0 https://lbsyun.baidu.com/custom/index.htm mapStyle: {}, - // 3.0 http://lbsyun.baidu.com/index.php?title=open/custom + // 3.0 https://lbsyun.baidu.com/index.php?title=open/custom mapStyleV2: {}, // See https://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference.html#a0b1 diff --git a/extension-src/bmap/README.md b/extension-src/bmap/README.md index 61b9a86acf..f651075a1b 100644 --- a/extension-src/bmap/README.md +++ b/extension-src/bmap/README.md @@ -1,6 +1,6 @@ ## 百度地图扩展 -ECharts 百度地图扩展,可以在百度地图上展现 [点图](https://echarts.apache.org/zh/option.html#series-scatter),[线图](https://echarts.apache.org/zh/option.html#series-line),[热力图](https://echarts.apache.org/zh/option.html#series-heatmap) 等可视化。 +ECharts 百度地图扩展,可以在百度地图上展现 [点图](https://echarts.apache.org/zh/option.html#series-scatter),[线图](https://echarts.apache.org/zh/option.html#series-lines),[热力图](https://echarts.apache.org/zh/option.html#series-heatmap) 等可视化。 ### 示例 @@ -11,18 +11,19 @@ ECharts 百度地图扩展,可以在百度地图上展现 [点图](https://ech [北京公交路线特效](https://echarts.apache.org/examples/zh/editor.html?c=lines-bmap-effect) -[北京公交路线特效](https://echarts.apache.org/examples/zh/editor.html?c=lines-bmap-effect) - [杭州热门步行路线](https://echarts.apache.org/examples/zh/editor.html?c=heatmap-bmap) +[在地图上显示分箱图](https://echarts.apache.org/examples/zh/editor.html?c=map-bin) + ### 引入 可以直接引入打包好的扩展文件和百度地图的 jssdk ```html - - + + + @@ -46,21 +47,32 @@ require('echarts/extension/bmap/bmap'); option = { // 加载 bmap 组件 bmap: { - // 百度地图中心经纬度 + // 百度地图中心经纬度。默认为 [104.114129, 37.550339]。 center: [120.13066322374, 30.240018034923], - // 百度地图缩放 + // 百度地图缩放级别。默认为 5。 zoom: 14, - // 是否开启拖拽缩放,可以只设置 'scale' 或者 'move' + // 是否开启拖拽缩放,可以只设置 'scale' 或者 'move'。默认关闭。 roam: true, - // 百度地图的自定义样式,见 http://developer.baidu.com/map/jsdevelop-11.htm - mapStyle: {} + // 百度地图的旧版自定义样式,见 https://lbsyun.baidu.com/custom/index.htm + mapStyle: {}, + // 百度地图 3.0 之后的新版自定义样式,见 https://lbsyun.baidu.com/index.php?title=open/custom + mapStyleV2: {}, + // 百度地图的初始化配置,见 https://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference.html#a0b1 + mapOptions: { + // 禁用百度地图自带的底图可点功能 + enableMapClick: false + } }, series: [{ type: 'scatter', // 使用百度地图坐标系 coordinateSystem: 'bmap', // 数据格式跟在 geo 坐标系上一样,每一项都是 [经度,纬度,数值大小,其它维度...] - data: [ [120, 30, 1] ] + data: [ [120, 30, 1] ], + // 编码数据项中第三个元素作为 value 维度 + encode: { + value: 2 + } }] } diff --git a/i18n/langUA-obj.js b/i18n/langUK-obj.js similarity index 100% rename from i18n/langUA-obj.js rename to i18n/langUK-obj.js diff --git a/i18n/langUA.js b/i18n/langUK.js similarity index 99% rename from i18n/langUA.js rename to i18n/langUK.js index 4394070af4..edb8db04d0 100644 --- a/i18n/langUA.js +++ b/i18n/langUK.js @@ -165,6 +165,6 @@ var localeObj = { } }; - echarts.registerLocale('UA', localeObj); + echarts.registerLocale('UK', localeObj); }); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 260b4e7178..bd4b785054 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "tslib": "2.3.0", - "zrender": "5.4.0" + "zrender": "npm:zrender-nightly@^5.4.1-dev.20221104" }, "devDependencies": { "@babel/code-frame": "7.10.4", @@ -19,7 +19,7 @@ "@definitelytyped/typescript-versions": "0.0.64", "@definitelytyped/utils": "0.0.64", "@lang/rollup-plugin-dts": "2.0.2", - "@microsoft/api-extractor": "7.7.2", + "@microsoft/api-extractor": "7.31.2", "@rollup/plugin-commonjs": "^17.0.0", "@rollup/plugin-node-resolve": "^11.0.0", "@rollup/plugin-replace": "^2.3.4", @@ -38,7 +38,7 @@ "husky": "^4.2.5", "jest": "^26.6.1", "jest-canvas-mock": "^2.2.0", - "jshint": "2.10.2", + "jshint": "2.13.5", "magic-string": "^0.25.7", "open": "6.4.0", "pixelmatch": "5.0.2", @@ -681,12 +681,6 @@ "tar-stream": "^2.1.4" } }, - "node_modules/@definitelytyped/utils/node_modules/@types/node": { - "version": "12.19.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", - "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==", - "dev": true - }, "node_modules/@definitelytyped/utils/node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -1532,42 +1526,52 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.7.2.tgz", - "integrity": "sha512-W75kcjWlONyB9kQKYAfSMiG3v2JMGlgUihny8PucZqdRatcYADeQiEcX5qE5sWdNRHD/J+5INiwlooZDd82sDQ==", + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.31.2.tgz", + "integrity": "sha512-ZODCU9ckTS9brXiZpUW2iDrnAg7jLxeLBM1AkPpSZFcbG/8HGLvfKOKrd71VIJHjc52x2lB8xj7ZWksnP7AOBA==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.7.2", - "@microsoft/node-core-library": "3.18.2", - "@microsoft/ts-command-line": "4.3.7", - "@microsoft/tsdoc": "0.12.14", + "@microsoft/api-extractor-model": "7.24.2", + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.52.0", + "@rushstack/rig-package": "0.3.15", + "@rushstack/ts-command-line": "4.12.3", "colors": "~1.2.1", "lodash": "~4.17.15", - "resolve": "1.8.1", + "resolve": "~1.17.0", + "semver": "~7.3.0", "source-map": "~0.6.1", - "typescript": "~3.7.2" + "typescript": "~4.7.4" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.7.2.tgz", - "integrity": "sha512-USwWUPV3YLS8ZOS11vFh3nzEWXC2d8OZJ6CGp0nRnCXtbqmKqAq4Jg9J5gs1PCemo7JQEbzbHGGwycC0DbRJqw==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.24.2.tgz", + "integrity": "sha512-uUvjqTCY7hYERWGks+joTioN1QYHIucCDy7I/JqLxFxLbFXE5dpc1X7L+FG4PN/s8QYL24DKt0fqJkgcrFKLTw==", "dev": true, "dependencies": { - "@microsoft/node-core-library": "3.18.2", - "@microsoft/tsdoc": "0.12.14" + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.52.0" } }, - "node_modules/@microsoft/api-extractor/node_modules/resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { - "path-parse": "^1.0.5" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/@microsoft/api-extractor/node_modules/source-map": { @@ -1580,9 +1584,9 @@ } }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -1592,61 +1596,43 @@ "node": ">=4.2.0" } }, - "node_modules/@microsoft/node-core-library": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/@microsoft/node-core-library/-/node-core-library-3.18.2.tgz", - "integrity": "sha512-IRoRmLwNvrR0rTNavYlfNObz9pr4Epo8Hd//0SNptt7adOySd735ur7YBO7SzafeijHsD3/dC4PXLLwhIsMU7Q==", - "dev": true, - "dependencies": { - "@types/node": "8.10.54", - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "jju": "~1.4.0", - "semver": "~5.3.0", - "timsort": "~0.3.0", - "z-schema": "~3.18.3" - } + "node_modules/@microsoft/tsdoc": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", + "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", + "dev": true }, - "node_modules/@microsoft/node-core-library/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "node_modules/@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" } }, - "node_modules/@microsoft/node-core-library/node_modules/semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true, - "bin": { - "semver": "bin/semver" - } + "node_modules/@microsoft/tsdoc-config/node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true }, - "node_modules/@microsoft/ts-command-line": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/@microsoft/ts-command-line/-/ts-command-line-4.3.7.tgz", - "integrity": "sha512-dl7j5E4Ly4vin0dFRNyDEmslpqLTeFkSvWi1Ux2OhTXbORpaRm2qivTQzUgbPSh8Mtc1LSZGekqEMNl0e0OMNw==", + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "dependencies": { - "@types/argparse": "1.0.33", - "argparse": "~1.0.9", - "colors": "~1.2.1" + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@microsoft/tsdoc": { - "version": "0.12.14", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.12.14.tgz", - "integrity": "sha512-518yewjSga1jLdiLrcmpMFlaba5P+50b0TWNFUpC+SL9Yzf0kMi57qw+bMl+rQ08cGqH1vLx4eg9YFUbZXgZ0Q==", - "dev": true - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -1749,15 +1735,6 @@ "node": ">=6" } }, - "node_modules/@rollup/plugin-node-resolve/node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, "node_modules/@rollup/plugin-node-resolve/node_modules/resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", @@ -1804,6 +1781,94 @@ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, + "node_modules/@rushstack/node-core-library": { + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.52.0.tgz", + "integrity": "sha512-Z+MAP//G3rEGZd3JxJcBGcPYJlh8pvPoLMTLa5Sy6FTE6hRPzN+5J8DT7BbTmlqZaL6SZpXF30heRUbnYOvujw==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.15.tgz", + "integrity": "sha512-jxVfvO5OnkRlYRhcVDZWvwiI2l4pv37HDJRtyg5HbD8Z/I8Xj32RICgrxS5xMeGGytobrg5S6OfPOHskg7Nw+A==", + "dev": true, + "dependencies": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/rig-package/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.12.3.tgz", + "integrity": "sha512-Pdij22RotMXzI+HWHyYCvw0RMZhiP5a6Za/96XamZ1+mxmpSm4ujf8TROKxGAHySmR5A8iNVSlzhNMnUlFQE6g==", + "dev": true, + "dependencies": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, "node_modules/@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", @@ -1831,10 +1896,19 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/@types/argparse": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.33.tgz", - "integrity": "sha512-VQgHxyPMTj3hIlq9SY1mctqx+Jj8kpQfoLvDlVSDNOyuYs8JYfkuY3OW/4+dO657yPmNhHpePRx0/Tje5ImNVQ==", + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, "node_modules/@types/babel__core": { @@ -1934,9 +2008,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "8.10.54", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.54.tgz", - "integrity": "sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg==", + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -2325,6 +2399,18 @@ "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==", "dev": true }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4651,12 +4737,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/dtslint/node_modules/@types/node": { - "version": "12.19.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", - "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==", - "dev": true - }, "node_modules/dtslint/node_modules/fs-extra": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", @@ -4889,13 +4969,13 @@ } }, "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "dependencies": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1" }, @@ -4904,12 +4984,21 @@ "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=4.0" + "node": ">=6.0" }, "optionalDependencies": { "source-map": "~0.6.1" } }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6442,6 +6531,20 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -6457,6 +6560,19 @@ "npm": ">=1.3.7" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -6775,15 +6891,6 @@ "node": ">=4" } }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -6833,12 +6940,15 @@ } }, "node_modules/is-core-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", - "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "dependencies": { "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-descriptor": { @@ -7002,9 +7112,9 @@ } }, "node_modules/is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, "node_modules/is-reference": { @@ -7772,75 +7882,6 @@ "node": ">= 10.14.2" } }, - "node_modules/jest-environment-jsdom/node_modules/jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jest-environment-jsdom/node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-environment-jsdom/node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-environment-node": { "version": "26.6.1", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.1.tgz", @@ -9044,7 +9085,7 @@ "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, "node_modules/js-tokens": { @@ -9072,6 +9113,78 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/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/jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9085,18 +9198,17 @@ } }, "node_modules/jshint": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz", - "integrity": "sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==", + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.5.tgz", + "integrity": "sha512-dB2n1w3OaQ35PLcBGIWXlszjbPZwsgZoxsg6G8PtNf2cFMC1l0fObkYLUuXqTTdi6tKw4sAjfUseTdmDMHQRcg==", "dev": true, "dependencies": { "cli": "~1.0.0", "console-browserify": "1.1.x", "exit": "0.1.x", "htmlparser2": "3.8.x", - "lodash": "~4.17.11", + "lodash": "~4.17.21", "minimatch": "~3.0.2", - "shelljs": "0.3.x", "strip-json-comments": "1.0.x" }, "bin": { @@ -9247,7 +9359,7 @@ "node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "dependencies": { "prelude-ls": "~1.1.2", @@ -9284,13 +9396,13 @@ "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, "node_modules/lodash.memoize": { @@ -9299,12 +9411,6 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -10118,9 +10224,9 @@ } }, "node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, "node_modules/parseqs": { @@ -10324,7 +10430,7 @@ "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -10636,52 +10742,6 @@ "node": ">= 6" } }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/request/node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -11074,6 +11134,18 @@ "node": ">=0.10.0" } }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/seedrandom": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.3.tgz", @@ -11238,18 +11310,6 @@ "node": ">=0.10.0" } }, - "node_modules/shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", @@ -11556,9 +11616,9 @@ "dev": true }, "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==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.3.tgz", + "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==", "dev": true, "dependencies": { "component-emitter": "~1.3.0", @@ -11567,14 +11627,17 @@ } }, "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==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.2.tgz", + "integrity": "sha512-QFZBaZDNqZXeemwejc7D39jrq2eGK/qZuVDiMPKzZK1hLlNvjGilGt4ckfQZeVX4dGmuPzCytN9ZW1nQlEWjgA==", "dev": true, "dependencies": { "component-emitter": "1.2.1", "debug": "~4.1.0", "isarray": "2.0.1" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/socket.io-parser/node_modules/component-emitter": { @@ -11818,15 +11881,6 @@ "node": ">=0.10.0" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -11845,6 +11899,15 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", @@ -12294,12 +12357,6 @@ "node": ">=0.10.0" } }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -12379,23 +12436,23 @@ } }, "node_modules/tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" }, "engines": { "node": ">=6" } }, "node_modules/tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, "dependencies": { "punycode": "^2.1.1" @@ -12599,7 +12656,7 @@ "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, "dependencies": { "prelude-ls": "~1.1.2" @@ -12847,9 +12904,9 @@ } }, "node_modules/validator": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", - "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==", + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", "dev": true, "engines": { "node": ">= 0.10" @@ -12875,7 +12932,19 @@ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "dev": true, "dependencies": { - "browser-process-hrtime": "^1.0.0" + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/walker": { @@ -12912,13 +12981,13 @@ "dev": true }, "node_modules/whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", + "lodash": "^4.7.0", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" }, "engines": { @@ -13248,26 +13317,37 @@ } }, "node_modules/z-schema": { - "version": "3.18.4", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.18.4.tgz", - "integrity": "sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.4.tgz", + "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", "dev": true, "dependencies": { - "lodash.get": "^4.0.0", - "lodash.isequal": "^4.0.0", - "validator": "^8.0.0" + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" }, "bin": { "z-schema": "bin/z-schema" }, + "engines": { + "node": ">=8.0.0" + }, "optionalDependencies": { - "commander": "^2.7.1" + "commander": "^2.20.3" } }, + "node_modules/z-schema/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, + "optional": true + }, "node_modules/zrender": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.0.tgz", - "integrity": "sha512-rOS09Z2HSVGFs2dn/TuYk5BlCaZcVe8UDLLjj1ySYF828LATKKdxuakSZMvrDz54yiKPDYVfjdKqcX8Jky3BIA==", + "name": "zrender-nightly", + "version": "5.4.1-dev.20221104", + "resolved": "https://registry.npmjs.org/zrender-nightly/-/zrender-nightly-5.4.1-dev.20221104.tgz", + "integrity": "sha512-FigVUqINkG/qOxCGi9oYO3raMxEked55dnCAx3Gc47DKePVibOXhVeIqSCdPlu9wUJat6L9A5Jm/ImpoC8DH7A==", "dependencies": { "tslib": "2.3.0" } @@ -13856,12 +13936,6 @@ "tar-stream": "^2.1.4" }, "dependencies": { - "@types/node": { - "version": "12.19.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", - "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==", - "dev": true - }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -14543,29 +14617,32 @@ } }, "@microsoft/api-extractor": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.7.2.tgz", - "integrity": "sha512-W75kcjWlONyB9kQKYAfSMiG3v2JMGlgUihny8PucZqdRatcYADeQiEcX5qE5sWdNRHD/J+5INiwlooZDd82sDQ==", + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.31.2.tgz", + "integrity": "sha512-ZODCU9ckTS9brXiZpUW2iDrnAg7jLxeLBM1AkPpSZFcbG/8HGLvfKOKrd71VIJHjc52x2lB8xj7ZWksnP7AOBA==", "dev": true, "requires": { - "@microsoft/api-extractor-model": "7.7.2", - "@microsoft/node-core-library": "3.18.2", - "@microsoft/ts-command-line": "4.3.7", - "@microsoft/tsdoc": "0.12.14", + "@microsoft/api-extractor-model": "7.24.2", + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.52.0", + "@rushstack/rig-package": "0.3.15", + "@rushstack/ts-command-line": "4.12.3", "colors": "~1.2.1", "lodash": "~4.17.15", - "resolve": "1.8.1", + "resolve": "~1.17.0", + "semver": "~7.3.0", "source-map": "~0.6.1", - "typescript": "~3.7.2" + "typescript": "~4.7.4" }, "dependencies": { - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "lru-cache": "^6.0.0" } }, "source-map": { @@ -14575,74 +14652,60 @@ "dev": true }, "typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true } } }, "@microsoft/api-extractor-model": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.7.2.tgz", - "integrity": "sha512-USwWUPV3YLS8ZOS11vFh3nzEWXC2d8OZJ6CGp0nRnCXtbqmKqAq4Jg9J5gs1PCemo7JQEbzbHGGwycC0DbRJqw==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.24.2.tgz", + "integrity": "sha512-uUvjqTCY7hYERWGks+joTioN1QYHIucCDy7I/JqLxFxLbFXE5dpc1X7L+FG4PN/s8QYL24DKt0fqJkgcrFKLTw==", "dev": true, "requires": { - "@microsoft/node-core-library": "3.18.2", - "@microsoft/tsdoc": "0.12.14" + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.52.0" } }, - "@microsoft/node-core-library": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/@microsoft/node-core-library/-/node-core-library-3.18.2.tgz", - "integrity": "sha512-IRoRmLwNvrR0rTNavYlfNObz9pr4Epo8Hd//0SNptt7adOySd735ur7YBO7SzafeijHsD3/dC4PXLLwhIsMU7Q==", + "@microsoft/tsdoc": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", + "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", + "dev": true + }, + "@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", "dev": true, "requires": { - "@types/node": "8.10.54", - "colors": "~1.2.1", - "fs-extra": "~7.0.1", + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", "jju": "~1.4.0", - "semver": "~5.3.0", - "timsort": "~0.3.0", - "z-schema": "~3.18.3" + "resolve": "~1.19.0" }, "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true } } }, - "@microsoft/ts-command-line": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/@microsoft/ts-command-line/-/ts-command-line-4.3.7.tgz", - "integrity": "sha512-dl7j5E4Ly4vin0dFRNyDEmslpqLTeFkSvWi1Ux2OhTXbORpaRm2qivTQzUgbPSh8Mtc1LSZGekqEMNl0e0OMNw==", - "dev": true, - "requires": { - "@types/argparse": "1.0.33", - "argparse": "~1.0.9", - "colors": "~1.2.1" - } - }, - "@microsoft/tsdoc": { - "version": "0.12.14", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.12.14.tgz", - "integrity": "sha512-518yewjSga1jLdiLrcmpMFlaba5P+50b0TWNFUpC+SL9Yzf0kMi57qw+bMl+rQ08cGqH1vLx4eg9YFUbZXgZ0Q==", - "dev": true - }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -14720,15 +14783,6 @@ "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, "resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", @@ -14770,6 +14824,80 @@ } } }, + "@rushstack/node-core-library": { + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.52.0.tgz", + "integrity": "sha512-Z+MAP//G3rEGZd3JxJcBGcPYJlh8pvPoLMTLa5Sy6FTE6hRPzN+5J8DT7BbTmlqZaL6SZpXF30heRUbnYOvujw==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@rushstack/rig-package": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.15.tgz", + "integrity": "sha512-jxVfvO5OnkRlYRhcVDZWvwiI2l4pv37HDJRtyg5HbD8Z/I8Xj32RICgrxS5xMeGGytobrg5S6OfPOHskg7Nw+A==", + "dev": true, + "requires": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, + "@rushstack/ts-command-line": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.12.3.tgz", + "integrity": "sha512-Pdij22RotMXzI+HWHyYCvw0RMZhiP5a6Za/96XamZ1+mxmpSm4ujf8TROKxGAHySmR5A8iNVSlzhNMnUlFQE6g==", + "dev": true, + "requires": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, "@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", @@ -14794,10 +14922,16 @@ "@sinonjs/commons": "^1.7.0" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, "@types/argparse": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.33.tgz", - "integrity": "sha512-VQgHxyPMTj3hIlq9SY1mctqx+Jj8kpQfoLvDlVSDNOyuYs8JYfkuY3OW/4+dO657yPmNhHpePRx0/Tje5ImNVQ==", + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, "@types/babel__core": { @@ -14897,9 +15031,9 @@ "dev": true }, "@types/node": { - "version": "8.10.54", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.54.tgz", - "integrity": "sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg==", + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", "dev": true }, "@types/normalize-package-data": { @@ -15167,6 +15301,15 @@ "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==", "dev": true }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -17092,12 +17235,6 @@ } } }, - "@types/node": { - "version": "12.19.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", - "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==", - "dev": true - }, "fs-extra": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", @@ -17288,18 +17425,24 @@ "dev": true }, "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "requires": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -18544,6 +18687,17 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -18555,6 +18709,16 @@ "sshpk": "^1.7.0" } }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -18782,12 +18946,6 @@ "p-is-promise": "^1.1.0" } }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -18830,9 +18988,9 @@ } }, "is-core-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", - "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "requires": { "has": "^1.0.3" @@ -18961,9 +19119,9 @@ } }, "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, "is-reference": { @@ -19647,60 +19805,6 @@ "jest-mock": "^26.6.1", "jest-util": "^26.6.1", "jsdom": "^16.4.0" - }, - "dependencies": { - "jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - } } }, "jest-environment-node": { @@ -20591,7 +20695,7 @@ "jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, "js-tokens": { @@ -20616,6 +20720,60 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -20623,18 +20781,17 @@ "dev": true }, "jshint": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz", - "integrity": "sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==", + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.5.tgz", + "integrity": "sha512-dB2n1w3OaQ35PLcBGIWXlszjbPZwsgZoxsg6G8PtNf2cFMC1l0fObkYLUuXqTTdi6tKw4sAjfUseTdmDMHQRcg==", "dev": true, "requires": { "cli": "~1.0.0", "console-browserify": "1.1.x", "exit": "0.1.x", "htmlparser2": "3.8.x", - "lodash": "~4.17.11", + "lodash": "~4.17.21", "minimatch": "~3.0.2", - "shelljs": "0.3.x", "strip-json-comments": "1.0.x" }, "dependencies": { @@ -20757,7 +20914,7 @@ "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "requires": { "prelude-ls": "~1.1.2", @@ -20788,13 +20945,13 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, "lodash.memoize": { @@ -20803,12 +20960,6 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -21466,9 +21617,9 @@ } }, "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, "parseqs": { @@ -21627,7 +21778,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true }, "prepend-http": { @@ -21900,38 +22051,6 @@ } } }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -22235,6 +22354,15 @@ } } }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, "seedrandom": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.3.tgz", @@ -22371,12 +22499,6 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", @@ -22651,9 +22773,9 @@ "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==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.3.tgz", + "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==", "dev": true, "requires": { "component-emitter": "~1.3.0", @@ -22664,9 +22786,9 @@ } }, "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==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.2.tgz", + "integrity": "sha512-QFZBaZDNqZXeemwejc7D39jrq2eGK/qZuVDiMPKzZK1hLlNvjGilGt4ckfQZeVX4dGmuPzCytN9ZW1nQlEWjgA==", "dev": true, "requires": { "component-emitter": "1.2.1", @@ -22875,12 +22997,6 @@ } } }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -22896,6 +23012,12 @@ "safe-buffer": "~5.1.0" } }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, "string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", @@ -23257,12 +23379,6 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", "dev": true }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -23329,20 +23445,20 @@ } }, "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" } }, "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, "requires": { "punycode": "^2.1.1" @@ -23495,7 +23611,7 @@ "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, "requires": { "prelude-ls": "~1.1.2" @@ -23696,9 +23812,9 @@ } }, "validator": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", - "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==", + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", "dev": true }, "verror": { @@ -23721,6 +23837,15 @@ "browser-process-hrtime": "^1.0.0" } }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -23752,13 +23877,13 @@ "dev": true }, "whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", + "lodash": "^4.7.0", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" } }, @@ -24015,21 +24140,30 @@ "dev": true }, "z-schema": { - "version": "3.18.4", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.18.4.tgz", - "integrity": "sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.4.tgz", + "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", "dev": true, "requires": { - "commander": "^2.7.1", - "lodash.get": "^4.0.0", - "lodash.isequal": "^4.0.0", - "validator": "^8.0.0" + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "dependencies": { + "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, + "optional": true + } } }, "zrender": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.0.tgz", - "integrity": "sha512-rOS09Z2HSVGFs2dn/TuYk5BlCaZcVe8UDLLjj1ySYF828LATKKdxuakSZMvrDz54yiKPDYVfjdKqcX8Jky3BIA==", + "version": "npm:zrender-nightly@5.4.1-dev.20221104", + "resolved": "https://registry.npmjs.org/zrender-nightly/-/zrender-nightly-5.4.1-dev.20221104.tgz", + "integrity": "sha512-FigVUqINkG/qOxCGi9oYO3raMxEked55dnCAx3Gc47DKePVibOXhVeIqSCdPlu9wUJat6L9A5Jm/ImpoC8DH7A==", "requires": { "tslib": "2.3.0" } diff --git a/package.json b/package.json index 9ee583cf52..3bc3365d82 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "build:lib": "node build/build.js --prepublish", "build:extension": "node build/build.js --type extension", "dev:fast": "node build/build-i18n.js && node build/dev-fast.js", - "dev": "npm run dev:fast", + "dev": "npx -y concurrently -n build,server \"npm run dev:fast\" \"npx -y http-server -c-1 -s -o test\"", "prepublish": "npm run build:lib", "release": "npm run build:lib && npm run build:i18n && npm run build && npm run build:esm && npm run build:extension", "help": "node build/build.js --help", @@ -64,7 +64,7 @@ }, "dependencies": { "tslib": "2.3.0", - "zrender": "5.4.0" + "zrender": "npm:zrender-nightly@^5.4.1-dev.20221104" }, "devDependencies": { "@babel/code-frame": "7.10.4", @@ -73,7 +73,7 @@ "@definitelytyped/typescript-versions": "0.0.64", "@definitelytyped/utils": "0.0.64", "@lang/rollup-plugin-dts": "2.0.2", - "@microsoft/api-extractor": "7.7.2", + "@microsoft/api-extractor": "7.31.2", "@rollup/plugin-commonjs": "^17.0.0", "@rollup/plugin-node-resolve": "^11.0.0", "@rollup/plugin-replace": "^2.3.4", @@ -92,7 +92,7 @@ "husky": "^4.2.5", "jest": "^26.6.1", "jest-canvas-mock": "^2.2.0", - "jshint": "2.10.2", + "jshint": "2.13.5", "magic-string": "^0.25.7", "open": "6.4.0", "pixelmatch": "5.0.2", diff --git a/src/animation/customGraphicTransition.ts b/src/animation/customGraphicTransition.ts index 73c12401aa..a2bf490c51 100644 --- a/src/animation/customGraphicTransition.ts +++ b/src/animation/customGraphicTransition.ts @@ -427,12 +427,12 @@ function duringCall( return; } // If el is remove from zr by reason like legend, during still need to called, - // becuase el will be added back to zr and the prop value should not be incorrect. + // because el will be added back to zr and the prop value should not be incorrect. const latestUserDuring = transitionInnerStore(el).userDuring; const scopeUserDuring = scope.userDuring; // Ensured a during is only called once in each animation frame. - // If a during is called multiple times in one frame, maybe some users' calulation logic + // If a during is called multiple times in one frame, maybe some users' calculation logic // might be wrong (not sure whether this usage exists). // The case of a during might be called twice can be: by default there is a animator for // 'x', 'y' when init. Before the init animation finished, call `setOption` to start @@ -629,4 +629,4 @@ if (__DEV__) { + 'Only `' + keys(TRANSFORM_PROPS_MAP).join('`, `') + '` are permitted.'); } }; -} \ No newline at end of file +} diff --git a/src/animation/universalTransition.ts b/src/animation/universalTransition.ts index dabd7ee3ec..c82d3d78f8 100644 --- a/src/animation/universalTransition.ts +++ b/src/animation/universalTransition.ts @@ -43,16 +43,18 @@ import Displayable from 'zrender/src/graphic/Displayable'; const DATA_COUNT_THRESHOLD = 1e4; -interface GlobalStore { oldSeries: SeriesModel[], oldData: SeriesData[] }; +interface GlobalStore { oldSeries: SeriesModel[], oldDataGroupIds: string[], oldData: SeriesData[] }; const getUniversalTransitionGlobalStore = makeInner(); interface DiffItem { + dataGroupId: string data: SeriesData dim: DimensionLoose divide: UniversalTransitionOption['divideShape'] dataIndex: number } interface TransitionSeries { + dataGroupId: string data: SeriesData divide: UniversalTransitionOption['divideShape'] dim?: DimensionLoose @@ -83,6 +85,7 @@ function flattenDataDiffItems(list: TransitionSeries[]) { const groupDim = getGroupIdDimension(data); for (let dataIndex = 0; dataIndex < indices.length; dataIndex++) { items.push({ + dataGroupId: seriesInfo.dataGroupId, data, dim: seriesInfo.dim || groupDim, divide: seriesInfo.divide, @@ -207,7 +210,7 @@ function transitionBetween( // Use group id as transition key by default. // So we can achieve multiple to multiple animation like drilldown / up naturally. // If group id not exits. Use id instead. If so, only one to one transition will be applied. - const dataGroupId = data.hostModel && (data.hostModel as SeriesModel).get('dataGroupId') as string; + const dataGroupId = diffItem.dataGroupId; // If specified key dimension(itemGroupId by default). Use this same dimension from other data. // PENDING: If only use key dimension of newData. @@ -470,26 +473,35 @@ function findTransitionSeriesBatches( ) { const updateBatches = createHashMap(); - const oldDataMap = createHashMap(); + const oldDataMap = createHashMap<{ + dataGroupId: string, + data: SeriesData + }>(); // Map that only store key in array seriesKey. // Which is used to query the old data when transition from one to multiple series. const oldDataMapForSplit = createHashMap<{ key: string, + dataGroupId: string, data: SeriesData }>(); each(globalStore.oldSeries, (series, idx) => { + const oldDataGroupId = globalStore.oldDataGroupIds[idx] as string; const oldData = globalStore.oldData[idx]; const transitionKey = getSeriesTransitionKey(series); const transitionKeyStr = convertArraySeriesKeyToString(transitionKey); - oldDataMap.set(transitionKeyStr, oldData); + oldDataMap.set(transitionKeyStr, { + dataGroupId: oldDataGroupId, + data: oldData + }); if (isArray(transitionKey)) { // Same key can't in different array seriesKey. each(transitionKey, key => { oldDataMapForSplit.set(key, { - data: oldData, - key: transitionKeyStr + key: transitionKeyStr, + dataGroupId: oldDataGroupId, + data: oldData }); }); } @@ -502,6 +514,7 @@ function findTransitionSeriesBatches( } each(params.updatedSeries, series => { if (series.isUniversalTransitionEnabled() && series.isAnimationEnabled()) { + const newDataGroupId = series.get('dataGroupId') as string; const newData = series.getData(); const transitionKey = getSeriesTransitionKey(series); const transitionKeyStr = convertArraySeriesKeyToString(transitionKey); @@ -515,16 +528,18 @@ function findTransitionSeriesBatches( // TODO check if data is same? updateBatches.set(transitionKeyStr, { oldSeries: [{ - divide: getDivideShapeFromData(oldData), - data: oldData + dataGroupId: oldData.dataGroupId, + divide: getDivideShapeFromData(oldData.data), + data: oldData.data }], newSeries: [{ + dataGroupId: newDataGroupId, divide: getDivideShapeFromData(newData), data: newData }] }); } - else { + else { // Transition from multiple series. if (isArray(transitionKey)) { if (__DEV__) { @@ -533,10 +548,11 @@ function findTransitionSeriesBatches( const oldSeries: TransitionSeries[] = []; each(transitionKey, key => { const oldData = oldDataMap.get(key); - if (oldData) { + if (oldData.data) { oldSeries.push({ - divide: getDivideShapeFromData(oldData), - data: oldData + dataGroupId: oldData.dataGroupId, + divide: getDivideShapeFromData(oldData.data), + data: oldData.data }); } }); @@ -544,6 +560,7 @@ function findTransitionSeriesBatches( updateBatches.set(transitionKeyStr, { oldSeries, newSeries: [{ + dataGroupId: newDataGroupId, data: newData, divide: getDivideShapeFromData(newData) }] @@ -558,6 +575,7 @@ function findTransitionSeriesBatches( if (!batch) { batch = { oldSeries: [{ + dataGroupId: oldData.dataGroupId, data: oldData.data, divide: getDivideShapeFromData(oldData.data) }], @@ -566,6 +584,7 @@ function findTransitionSeriesBatches( updateBatches.set(oldData.key, batch); } batch.newSeries.push({ + dataGroupId: newDataGroupId, data: newData, divide: getDivideShapeFromData(newData) }); @@ -600,6 +619,7 @@ function transitionSeriesFromOpt( const idx = querySeries(globalStore.oldSeries, finder); if (idx >= 0) { from.push({ + dataGroupId: globalStore.oldDataGroupIds[idx], data: globalStore.oldData[idx], // TODO can specify divideShape in transition. divide: getDivideShapeFromData(globalStore.oldData[idx]), @@ -612,6 +632,7 @@ function transitionSeriesFromOpt( if (idx >= 0) { const data = params.updatedSeries[idx].getData(); to.push({ + dataGroupId: globalStore.oldDataGroupIds[idx], data, divide: getDivideShapeFromData(data), dim: finder.dimension @@ -671,6 +692,7 @@ export function installUniversalTransition(registers: EChartsExtensionInstallReg // Save all series of current update. Not only the updated one. const allSeries = ecModel.getSeries(); const savedSeries: SeriesModel[] = globalStore.oldSeries = []; + const savedDataGroupIds: string[] = globalStore.oldDataGroupIds = []; const savedData: SeriesData[] = globalStore.oldData = []; for (let i = 0; i < allSeries.length; i++) { const data = allSeries[i].getData(); @@ -678,8 +700,9 @@ export function installUniversalTransition(registers: EChartsExtensionInstallReg // Avoid large data costing too much extra memory if (data.count() < DATA_COUNT_THRESHOLD) { savedSeries.push(allSeries[i]); + savedDataGroupIds.push(allSeries[i].get('dataGroupId') as string); savedData.push(data); } } }); -} \ No newline at end of file +} diff --git a/src/chart/bar/BarView.ts b/src/chart/bar/BarView.ts index 3cbad98de3..0de06c481f 100644 --- a/src/chart/bar/BarView.ts +++ b/src/chart/bar/BarView.ts @@ -698,7 +698,7 @@ const clip: { // When xClipped or yClipped, the element will be marked as `ignore`. // But we should also place the element at the edge of the coord sys bounding rect. - // Beause if data changed and the bar show again, its transition animaiton + // Because if data changed and the bar shows again, its transition animation // will begin at this place. layout.x = (xClipped && x > coordSysX2) ? x2 : x; layout.y = (yClipped && y > coordSysY2) ? y2 : y; diff --git a/src/chart/bar/BaseBarSeries.ts b/src/chart/bar/BaseBarSeries.ts index 45e2836a99..bff11b8837 100644 --- a/src/chart/bar/BaseBarSeries.ts +++ b/src/chart/bar/BaseBarSeries.ts @@ -30,6 +30,9 @@ import { import GlobalModel from '../../model/Global'; import Cartesian2D from '../../coord/cartesian/Cartesian2D'; import SeriesData from '../../data/SeriesData'; +import {dimPermutations} from '../../component/marker/MarkAreaView'; +import { each } from 'zrender/src/core/util'; +import type Axis2D from '../../coord/cartesian/Axis2D'; export interface BaseBarSeriesOption @@ -42,12 +45,12 @@ export interface BaseBarSeriesOption = BaseBarSeri return createSeriesData(null, this, {useEncodeDefaulter: true}); } - getMarkerPosition(value: ScaleDataValue[]) { + getMarkerPosition( + value: ScaleDataValue[], + dims?: typeof dimPermutations[number], + startingAtTick?: boolean + ) { const coordSys = this.coordinateSystem; if (coordSys && coordSys.clampData) { // PENDING if clamp ? const pt = coordSys.dataToPoint(coordSys.clampData(value)); - const data = this.getData(); - const offset = data.getLayout('offset'); - const size = data.getLayout('size'); - const offsetIndex = (coordSys as Cartesian2D).getBaseAxis().isHorizontal() ? 0 : 1; - pt[offsetIndex] += offset + size / 2; + if (startingAtTick) { + each(coordSys.getAxes(), function (axis: Axis2D, idx: number) { + // If axis type is category, use tick coords instead + if (axis.type === 'category') { + const tickCoords = axis.getTicksCoords(); + let tickIdx = coordSys.clampData(value)[idx]; + // The index of rightmost tick of markArea is 1 larger than x1/y1 index + if (dims && (dims[idx] === 'x1' || dims[idx] === 'y1')) { + tickIdx += 1; + } + (tickIdx > tickCoords.length - 1) && (tickIdx = tickCoords.length - 1); + (tickIdx < 0) && (tickIdx = 0); + tickCoords[tickIdx] && (pt[idx] = axis.toGlobalCoord(tickCoords[tickIdx].coord)); + } + }); + } + else { + const data = this.getData(); + const offset = data.getLayout('offset'); + const size = data.getLayout('size'); + const offsetIndex = (coordSys as Cartesian2D).getBaseAxis().isHorizontal() ? 0 : 1; + pt[offsetIndex] += offset + size / 2; + } return pt; } return [NaN, NaN]; diff --git a/src/chart/bar/install.ts b/src/chart/bar/install.ts index 56c07d9670..156f03e26e 100644 --- a/src/chart/bar/install.ts +++ b/src/chart/bar/install.ts @@ -32,7 +32,7 @@ export function install(registers: EChartsExtensionInstallRegisters) { registers.registerSeriesModel(BarSeries); registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, zrUtil.curry(layout, 'bar')); - // Do layout after other overall layout, which can preapre some informations. + // Do layout after other overall layout, which can prepare some information. registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('bar')); // Down sample after filter @@ -67,4 +67,4 @@ export function install(registers: EChartsExtensionInstallRegisters) { ); }); -} \ No newline at end of file +} diff --git a/src/chart/bar/installPictorialBar.ts b/src/chart/bar/installPictorialBar.ts index d30ee58afe..ec49128b83 100644 --- a/src/chart/bar/installPictorialBar.ts +++ b/src/chart/bar/installPictorialBar.ts @@ -28,6 +28,6 @@ export function install(registers: EChartsExtensionInstallRegisters) { registers.registerSeriesModel(PictorialBarSeriesModel); registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry(layout, 'pictorialBar')); - // Do layout after other overall layout, which can preapre some informations. + // Do layout after other overall layout, which can prepare some information. registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('pictorialBar')); -} \ No newline at end of file +} diff --git a/src/chart/boxplot/install.ts b/src/chart/boxplot/install.ts index e579f296f2..b5a7efcd98 100644 --- a/src/chart/boxplot/install.ts +++ b/src/chart/boxplot/install.ts @@ -20,14 +20,12 @@ import { EChartsExtensionInstallRegisters } from '../../extension'; import BoxplotSeriesModel from './BoxplotSeries'; import BoxplotView from './BoxplotView'; -import boxplotVisual from './boxplotVisual'; import boxplotLayout from './boxplotLayout'; import { boxplotTransform } from './boxplotTransform'; export function install(registers: EChartsExtensionInstallRegisters) { registers.registerSeriesModel(BoxplotSeriesModel); registers.registerChartView(BoxplotView); - registers.registerVisual(boxplotVisual); registers.registerLayout(boxplotLayout); registers.registerTransform(boxplotTransform); -} \ No newline at end of file +} diff --git a/src/chart/candlestick/CandlestickSeries.ts b/src/chart/candlestick/CandlestickSeries.ts index 6f104e5bfb..019e1c55f4 100644 --- a/src/chart/candlestick/CandlestickSeries.ts +++ b/src/chart/candlestick/CandlestickSeries.ts @@ -43,6 +43,7 @@ type CandlestickDataValue = OptionDataValue[]; interface CandlestickItemStyleOption extends ItemStyleOption { color0?: ZRColor borderColor0?: ColorString + borderColorDoji?: ZRColor } export interface CandlestickStateOption { itemStyle?: CandlestickItemStyleOption @@ -116,6 +117,7 @@ class CandlestickSeriesModel extends SeriesModel { color0: '#47b262', // negative borderColor: '#eb5454', borderColor0: '#47b262', + borderColorDoji: null, // when close === open // borderColor: '#d24040', // borderColor0: '#398f4f', borderWidth: 1 diff --git a/src/chart/candlestick/CandlestickView.ts b/src/chart/candlestick/CandlestickView.ts index ed4f6660c6..3d05e81c70 100644 --- a/src/chart/candlestick/CandlestickView.ts +++ b/src/chart/candlestick/CandlestickView.ts @@ -368,9 +368,16 @@ function createLarge( ignoreCoarsePointer: true }); group.add(elN); + const elDoji = new LargeBoxPath({ + shape: {points: largePoints}, + __sign: 0, + ignoreCoarsePointer: true + }); + group.add(elDoji); setLargeStyle(1, elP, seriesModel, data); setLargeStyle(-1, elN, seriesModel, data); + setLargeStyle(0, elDoji, seriesModel, data); if (incremental) { elP.incremental = true; @@ -384,8 +391,12 @@ function createLarge( function setLargeStyle(sign: number, el: LargeBoxPath, seriesModel: CandlestickSeriesModel, data: SeriesData) { // TODO put in visual? - const borderColor = seriesModel.get(['itemStyle', sign > 0 ? 'borderColor' : 'borderColor0']) + let borderColor = seriesModel.get(['itemStyle', sign > 0 ? 'borderColor' : 'borderColor0']) + // Use color for border color by default. || seriesModel.get(['itemStyle', sign > 0 ? 'color' : 'color0']); + if (sign === 0) { + borderColor = seriesModel.get(['itemStyle', 'borderColorDoji']); + } // Color must be excluded. // Because symbol provide setColor individually to set fill and stroke diff --git a/src/chart/candlestick/candlestickLayout.ts b/src/chart/candlestick/candlestickLayout.ts index 2a9afd9975..f655b381f0 100644 --- a/src/chart/candlestick/candlestickLayout.ts +++ b/src/chart/candlestick/candlestickLayout.ts @@ -22,7 +22,7 @@ import createRenderPlanner from '../helper/createRenderPlanner'; import {parsePercent} from '../../util/number'; import {map, retrieve2} from 'zrender/src/core/util'; import { DimensionIndex, StageHandler, StageHandlerProgressParams } from '../../util/types'; -import CandlestickSeriesModel from './CandlestickSeries'; +import CandlestickSeriesModel, { CandlestickDataItemOption } from './CandlestickSeries'; import SeriesData from '../../data/SeriesData'; import { RectLike } from 'zrender/src/core/BoundingRect'; import DataStore from '../../data/DataStore'; @@ -106,8 +106,10 @@ const candlestickLayout: StageHandler = { subPixelOptimizePoint(ocLowPoint) ); + const itemModel = data.getItemModel(dataIndex); + const hasDojiColor = !!itemModel.get(['itemStyle', 'borderColorDoji']); data.setItemLayout(dataIndex, { - sign: getSign(store, dataIndex, openVal, closeVal, closeDimI), + sign: getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor), initBaseline: openVal > closeVal ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx], // open point. ends: ends, @@ -170,6 +172,7 @@ const candlestickLayout: StageHandler = { const tmpOut: number[] = []; let dataIndex; const store = data.getStore(); + const hasDojiColor = !!seriesModel.get(['itemStyle', 'borderColorDoji']); while ((dataIndex = params.next()) != null) { const axisDimVal = store.get(cDimI, dataIndex) as number; @@ -184,7 +187,7 @@ const candlestickLayout: StageHandler = { continue; } - points[offset++] = getSign(store, dataIndex, openVal, closeVal, closeDimI); + points[offset++] = getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor); tmpIn[cDimIdx] = axisDimVal; @@ -202,10 +205,18 @@ const candlestickLayout: StageHandler = { } }; +/** + * Get the sign of a single data. + * + * @returns 0 for doji with hasDojiColor: true, + * 1 for positive, + * -1 for negative. + */ function getSign( - store: DataStore, dataIndex: number, openVal: number, closeVal: number, closeDimI: DimensionIndex -): -1 | 1 { - let sign: -1 | 1; + store: DataStore, dataIndex: number, openVal: number, closeVal: number, closeDimI: DimensionIndex, + hasDojiColor: boolean +): -1 | 1 | 0 { + let sign: -1 | 1 | 0; if (openVal > closeVal) { sign = -1; } @@ -213,11 +224,15 @@ function getSign( sign = 1; } else { - sign = dataIndex > 0 - // If close === open, compare with close of last record - ? (store.get(closeDimI, dataIndex - 1) <= closeVal ? 1 : -1) - // No record of previous, set to be positive - : 1; + sign = hasDojiColor + // When doji color is set, use it instead of color/color0. + ? 0 + : (dataIndex > 0 + // If close === open, compare with close of last record + ? (store.get(closeDimI, dataIndex - 1) <= closeVal ? 1 : -1) + // No record of previous, set to be positive + : 1 + ); } return sign; diff --git a/src/chart/candlestick/candlestickVisual.ts b/src/chart/candlestick/candlestickVisual.ts index 963d3dd56e..8882d63333 100644 --- a/src/chart/candlestick/candlestickVisual.ts +++ b/src/chart/candlestick/candlestickVisual.ts @@ -25,6 +25,7 @@ import { extend } from 'zrender/src/core/util'; const positiveBorderColorQuery = ['itemStyle', 'borderColor'] as const; const negativeBorderColorQuery = ['itemStyle', 'borderColor0'] as const; +const dojiBorderColorQuery = ['itemStyle', 'borderColorDoji'] as const; const positiveColorQuery = ['itemStyle', 'color'] as const; const negativeColorQuery = ['itemStyle', 'color0'] as const; @@ -47,7 +48,10 @@ const candlestickVisual: StageHandler = { function getBorderColor(sign: number, model: Model>) { return model.get( - sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery + sign === 0 ? dojiBorderColorQuery + : sign > 0 + ? positiveBorderColorQuery + : negativeBorderColorQuery ); } diff --git a/src/chart/custom/CustomView.ts b/src/chart/custom/CustomView.ts index e0ad444a36..ee4e244cf7 100644 --- a/src/chart/custom/CustomView.ts +++ b/src/chart/custom/CustomView.ts @@ -305,7 +305,7 @@ export default class CustomChartView extends ChartView { } // Enable to give a name on a group made by `renderItem`, and listen - // events that triggerd by its descendents. + // events that are triggered by its descendents. while ((targetEl = (targetEl.__hostTarget || targetEl.parent)) && targetEl !== this.group) { if (targetEl.name === elementName) { return true; @@ -382,23 +382,23 @@ function createEl(elOption: CustomElementOption): Element { * ---------------------------------------------------------- * [STRATEGY_MERGE] Merge properties or erase all properties: * - * Based on the fact that the existing zr element probably be reused, we now consider whether - * merge or erase all properties to the exsiting elements. - * That is, if a certain props is not specified in the lastest return of `renderItem`: + * Based on the fact that the existing zr element probably is reused, we now consider whether + * merge or erase all properties to the existing elements. + * That is, if a certain props is not specified in the latest return of `renderItem`: * + "Merge" means that do not modify the value on the existing element. * + "Erase all" means that use a default value to the existing element. * - * "Merge" might bring some unexpected state retaining for users and "erase all" seams to be - * more safe. "erase all" force users to specify all of the props each time, which is recommanded + * "Merge" might bring some unexpected state retaining for users and "erase all" seems to be + * more safe. "erase all" forces users to specify all of the props each time, which is recommended * in most cases. * But "erase all" theoretically disables the chance of performance optimization (e.g., just * generete shape and style at the first time rather than always do that). * So we still use "merge" rather than "erase all". If users need "erase all", they can - * simple always set all of the props each time. + * simply always set all of the props each time. * Some "object-like" config like `textConfig`, `textContent`, `style` which are not needed for - * every elment, so we replace them only when user specify them. And the that is a total replace. + * every element, so we replace them only when users specify them. And that is a total replace. * - * TODO: there is no hint of 'isFirst' to users. So the performance enhancement can not be + * TODO: There is no hint of 'isFirst' to users. So the performance enhancement cannot be * performed yet. Consider the case: * (1) setOption to "mergeChildren" with a smaller children count * (2) Use dataZoom to make an item disappear. @@ -412,7 +412,7 @@ function createEl(elOption: CustomElementOption): Element { * So we trade a {xx: null} or {xx: undefined} as "not specified" if possible rather than * "set them to null/undefined". In most cases, props can not be cleared. Some typicall * clearable props like `style`/`textConfig`/`textContent` we enable `false` to means - * "clear". In some othere special cases that the prop is able to set as null/undefined, + * "clear". In some other special cases that the prop is able to set as null/undefined, * but not suitable to use `false`, `hasOwnProperty` is checked. * * --------------------------------------------- @@ -526,7 +526,7 @@ function updateElOnState( } } else { - // style is needed to enable defaut emphasis. + // style is needed to enable default emphasis. stateObj.style = styleOpt || null; } // If `elOption.styleEmphasis` or `elOption.emphasis.style` is `false`, @@ -732,9 +732,9 @@ function makeRenderItem( } /** - * @deprecated The orgininal intention of `api.style` is enable to set itemStyle - * like other series. But it not necessary and not easy to give a strict definition - * of what it return. And since echarts5 it needs to be make compat work. So + * @deprecated The original intention of `api.style` is enable to set itemStyle + * like other series. But it is not necessary and not easy to give a strict definition + * of what it returns. And since echarts5 it needs to be make compat work. So * deprecates it since echarts5. * * By default, `visual` is applied to style (to support visualMap). @@ -767,7 +767,7 @@ function makeRenderItem( const opt = {inheritColor: isString(visualColor) ? visualColor : '#000'}; const labelModel = getLabelModel(dataIndexInside, NORMAL); - // Now that the feture of "auto adjust text fill/stroke" has been migrated to zrender + // Now that the feature of "auto adjust text fill/stroke" has been migrated to zrender // since ec5, we should set `isAttached` as `false` here and make compat in // `convertToEC4StyleForCustomSerise`. const textStyle = labelStyleHelper.createTextStyle(labelModel, null, opt, false, true); @@ -1134,7 +1134,7 @@ function doCreateOrUpdateAttachedTx( isInit: boolean, attachedTxInfo: AttachedTxInfo ): void { - // group do not support textContent temporarily untill necessary. + // Group does not support textContent temporarily until necessary. if (el.isGroup) { return; } @@ -1143,7 +1143,7 @@ function doCreateOrUpdateAttachedTx( processTxInfo(elOption, null, attachedTxInfo); processTxInfo(elOption, EMPHASIS, attachedTxInfo); - // If `elOption.textConfig` or `elOption.textContent` is null/undefined, it does not make sence. + // If `elOption.textConfig` or `elOption.textContent` is null/undefined, it does not make sense. // So for simplicity, if "elOption hasOwnProperty of them but be null/undefined", we do not // trade them as set to null to el. // Especially: @@ -1232,7 +1232,7 @@ function processTxInfo( // `textContent: {type: 'text'}`, the "type" is easy to be missing. So we tolerate it. !txConOptNormal.type && (txConOptNormal.type = 'text'); if (__DEV__) { - // Do not tolerate incorret type for forward compat. + // Do not tolerate incorrcet type for forward compat. assert( txConOptNormal.type === 'text', 'textContent.type must be "text"' @@ -1281,9 +1281,9 @@ function retrieveStyleOptionOnState( // 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). -// User can remove a single child by set its `ignore` as `true`. +// For implementation simpleness, do not provide a direct way to remove single +// child (otherwise the total indices of the children array have to be modified). +// User can remove a single child by setting its `ignore` to `true`. function mergeChildren( api: ExtensionAPI, el: graphicUtil.Group, diff --git a/src/chart/gauge/GaugeView.ts b/src/chart/gauge/GaugeView.ts index a03243e1aa..a4bb3994c9 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, isNumber} from 'zrender/src/core/util'; +import { extend, isFunction, isString, isNumber, each } from 'zrender/src/core/util'; import {setCommonECData} from '../../util/innerStore'; import { normalizeArcAngles } from 'zrender/src/core/PathProxy'; @@ -127,6 +127,7 @@ class GaugeView extends ChartView { let prevEndAngle = startAngle; + const sectors: (Sausage | graphic.Sector)[] = []; for (let i = 0; showAxis && i < colorList.length; i++) { // Clamp const percent = Math.min(Math.max(colorList[i][0], 0), 1); @@ -154,11 +155,14 @@ class GaugeView extends ChartView { ['color', 'width'] )); - group.add(sector); + sectors.push(sector); prevEndAngle = endAngle; } + sectors.reverse(); + each(sectors, sector => group.add(sector)); + const getColor = function (percent: number) { // Less than 0 if (percent <= 0) { diff --git a/src/chart/graph/GraphView.ts b/src/chart/graph/GraphView.ts index bd5b9669cc..d5f51eba4c 100644 --- a/src/chart/graph/GraphView.ts +++ b/src/chart/graph/GraphView.ts @@ -17,7 +17,6 @@ * under the License. */ -import * as zrUtil from 'zrender/src/core/util'; import SymbolDraw, { ListForSymbolDraw } from '../helper/SymbolDraw'; import LineDraw from '../helper/LineDraw'; import RoamController, { RoamControllerHost } from '../../component/helper/RoamController'; @@ -172,7 +171,7 @@ class GraphView extends ChartView { } }); } - el.setDraggable(draggable && !!forceLayout, !!itemModel.get('cursor')); + el.setDraggable(draggable, !!itemModel.get('cursor')); const focus = itemModel.get(['emphasis', 'focus']); @@ -307,4 +306,4 @@ class GraphView extends ChartView { } } -export default GraphView; \ No newline at end of file +export default GraphView; diff --git a/src/chart/graph/forceHelper.ts b/src/chart/graph/forceHelper.ts index 5e83a9b33f..71f1c564ca 100644 --- a/src/chart/graph/forceHelper.ts +++ b/src/chart/graph/forceHelper.ts @@ -18,7 +18,7 @@ */ /* -* A third-party license is embeded for some of the code in this file: +* A third-party license is embedded for some of the code in this file: * Some formulas were originally copied from "d3.js" with some * modifications made for this project. * (See more details in the comment of the method "step" below.) diff --git a/src/chart/heatmap/HeatmapView.ts b/src/chart/heatmap/HeatmapView.ts index 88933e278d..d0de889ba1 100644 --- a/src/chart/heatmap/HeatmapView.ts +++ b/src/chart/heatmap/HeatmapView.ts @@ -33,7 +33,7 @@ import { StageHandlerProgressParams, Dictionary, OptionDataValue } from '../../u import type Cartesian2D from '../../coord/cartesian/Cartesian2D'; import type Calendar from '../../coord/calendar/Calendar'; import { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle'; -import Element from 'zrender/src/Element'; +import type Element from 'zrender/src/Element'; // Coord can be 'geo' 'bmap' 'amap' 'leaflet'... interface GeoLikeCoordSys extends CoordinateSystem { @@ -94,7 +94,7 @@ function getIsInContinuousRange(dataExtent: number[], range: number[]) { function isGeoCoordSys(coordSys: CoordinateSystem): coordSys is GeoLikeCoordSys { const dimensions = coordSys.dimensions; - // Not use coorSys.type === 'geo' because coordSys maybe extended + // Not use coordSys.type === 'geo' because coordSys maybe extended return dimensions[0] === 'lng' && dimensions[1] === 'lat'; } @@ -235,6 +235,8 @@ class HeatmapView extends ChartView { // Ignore empty data and out of extent data if (isNaN(data.get(dataDims[2], idx) as number) + || isNaN(dataDimX as number) + || isNaN(dataDimY as number) || dataDimX < xAxisExtent[0] || dataDimX > xAxisExtent[1] || dataDimY < yAxisExtent[0] @@ -271,7 +273,7 @@ class HeatmapView extends ChartView { }); } - // Optimization for large datset + // Optimization for large dataset if (data.hasItemOption) { const itemModel = data.getItemModel(idx); const emphasisModel = itemModel.getModel('emphasis'); diff --git a/src/chart/line/LineView.ts b/src/chart/line/LineView.ts index 45414fb386..daf1cbfb52 100644 --- a/src/chart/line/LineView.ts +++ b/src/chart/line/LineView.ts @@ -404,7 +404,7 @@ function canShowAllSymbolForCategory( categoryAxis: Axis2D, data: SeriesData ) { - // In mose cases, line is monotonous on category axis, and the label size + // In most cases, line is monotonous on category axis, and the label size // is close with each other. So we check the symbol size and some of the // label size alone with the category axis to estimate whether all symbol // can be shown without overlap. @@ -778,7 +778,7 @@ class LineView extends ChartView { } // Always update, or it is wrong in the case turning on legend - // because points are not changed + // because points are not changed. showSymbol && symbolDraw.updateData(data, { isIgnore: isIgnoreFunc, clipShape: clipShapeForSymbol, @@ -788,8 +788,8 @@ class LineView extends ChartView { } }); - // In the case data zoom triggerred refreshing frequently - // Data may not change if line has a category axis. So it should animate nothing + // In the case data zoom triggered refreshing frequently + // Data may not change if line has a category axis. So it should animate nothing. if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) || !isPointsSame(this._points, points) ) { @@ -943,7 +943,7 @@ class LineView extends ChartView { // Null data return; } - // fix #11360: should't draw symbol outside clipShapeForSymbol + // fix #11360: shouldn't draw symbol outside clipShapeForSymbol if (this._clipShapeForSymbol && !this._clipShapeForSymbol.contain(x, y)) { return; } diff --git a/src/chart/line/helper.ts b/src/chart/line/helper.ts index c9ebef65e1..13a1c2c01a 100644 --- a/src/chart/line/helper.ts +++ b/src/chart/line/helper.ts @@ -58,11 +58,11 @@ export function prepareDataCoordInfo( let stacked = false; const stackResultDim = data.getCalculationInfo('stackResultDimension'); - if (isDimensionStacked(data, dims[0] /*, dims[1]*/)) { // jshint ignore:line + if (isDimensionStacked(data, dims[0] /* , dims[1] */)) { // jshint ignore:line stacked = true; dims[0] = stackResultDim; } - if (isDimensionStacked(data, dims[1] /*, dims[0]*/)) { // jshint ignore:line + if (isDimensionStacked(data, dims[1] /* , dims[0] */)) { // jshint ignore:line stacked = true; dims[1] = stackResultDim; } diff --git a/src/chart/lines/LinesSeries.ts b/src/chart/lines/LinesSeries.ts index f97b6a0b97..2c1fc29c88 100644 --- a/src/chart/lines/LinesSeries.ts +++ b/src/chart/lines/LinesSeries.ts @@ -93,8 +93,8 @@ export interface LinesStateOption { label?: SeriesLineLabelOption } -export interface LinesDataItemOption extends LinesStateOption, - StatesOptionMixin, LinesStatesMixin> { +export interface LinesDataItemOption extends LinesStateOption, + StatesOptionMixin { name?: string fromName?: string @@ -111,7 +111,7 @@ export interface LinesDataItemOption extends LinesStateOption, LinesStateOption, + extends SeriesOption, LinesStateOption, SeriesOnCartesianOptionMixin, SeriesOnGeoOptionMixin, SeriesOnPolarOptionMixin, SeriesOnCalendarOptionMixin, SeriesLargeOptionMixin { @@ -306,7 +306,7 @@ class LinesSeriesModel extends SeriesModel { if (__DEV__) { const CoordSys = CoordinateSystem.get(option.coordinateSystem); if (!CoordSys) { - throw new Error('Unkown coordinate system ' + option.coordinateSystem); + throw new Error('Unknown coordinate system ' + option.coordinateSystem); } } diff --git a/src/chart/lines/LinesView.ts b/src/chart/lines/LinesView.ts index fabb84968b..5d9cbfeefb 100644 --- a/src/chart/lines/LinesView.ts +++ b/src/chart/lines/LinesView.ts @@ -106,7 +106,7 @@ class LinesView extends ChartView { const lineDraw = this._updateLineDraw(data, seriesModel); - lineDraw.incrementalPrepareUpdate(data); + lineDraw.incrementalPrepareUpdate(data as any); this._clearLayer(api); @@ -118,7 +118,7 @@ class LinesView extends ChartView { seriesModel: LinesSeriesModel, ecModel: GlobalModel ) { - this._lineDraw.incrementalUpdate(taskParams, seriesModel.getData()); + this._lineDraw.incrementalUpdate(taskParams, seriesModel.getData() as any); this._finished = taskParams.end === seriesModel.getData().count(); } diff --git a/src/chart/map/MapSeries.ts b/src/chart/map/MapSeries.ts index acca989f1c..157678f412 100644 --- a/src/chart/map/MapSeries.ts +++ b/src/chart/map/MapSeries.ts @@ -286,9 +286,9 @@ class MapSeries extends SeriesModel { // for geoJSON source: 0.75. aspectScale: null, - ///// Layout with center and size - // If you wan't to put map in a fixed size box with right aspect ratio - // This two properties may more conveninet + // Layout with center and size + // If you want to put map in a fixed size box with right aspect ratio + // This two properties may be more convenient. // layoutCenter: [50%, 50%] // layoutSize: 100 diff --git a/src/chart/map/MapView.ts b/src/chart/map/MapView.ts index 84145b920e..dc0d6135fd 100644 --- a/src/chart/map/MapView.ts +++ b/src/chart/map/MapView.ts @@ -75,7 +75,7 @@ class MapView extends ChartView { this._mapDraw = mapDraw; } else { - // Remove drawed map + // Remove drawn map this._mapDraw && this._mapDraw.remove(); this._mapDraw = null; } @@ -165,8 +165,8 @@ class MapView extends ChartView { // FIXME // If this is not the `mainSeries`, the item model (like label formatter) // set on original data item will never get. But it has been working - // like that from the begining, and this scenario is rarely encountered. - // So it won't be fixed until have to. + // like that from the beginning, and this scenario is rarely encountered. + // So it won't be fixed until we have to. setLabelStyle(circle, getLabelStatesModels(itemModel), { labelFetcher: { diff --git a/src/chart/pie/PieSeries.ts b/src/chart/pie/PieSeries.ts index fc22425605..ed427bfff0 100644 --- a/src/chart/pie/PieSeries.ts +++ b/src/chart/pie/PieSeries.ts @@ -38,7 +38,7 @@ import { SeriesLabelOption, DefaultEmphasisFocus } from '../../util/types'; -import SeriesData from '../../data/SeriesData'; +import type SeriesData from '../../data/SeriesData'; interface PieItemStyleOption extends ItemStyleOption { // can be 10 @@ -100,7 +100,7 @@ export interface PieDataItemOption extends export interface PieSeriesOption extends Omit, ExtraStateOption>, 'labelLine'>, PieStateOption, - CircleLayoutOptionMixin, + Omit, BoxLayoutOptionMixin, SeriesEncodeOptionMixin { @@ -108,6 +108,8 @@ export interface PieSeriesOption extends roseType?: 'radius' | 'area' + center?: string | number | (string | number)[] + clockwise?: boolean startAngle?: number minAngle?: number @@ -129,12 +131,14 @@ export interface PieSeriesOption extends data?: (OptionDataValueNumeric | OptionDataValueNumeric[] | PieDataItemOption)[] } +const innerData = modelUtil.makeInner<{ + seats?: number[] +}, SeriesData>(); + class PieSeriesModel extends SeriesModel { static type = 'series.pie' as const; - seats: number[]; - /** * @overwrite */ @@ -161,25 +165,30 @@ class PieSeriesModel extends SeriesModel { * @overwrite */ getInitialData(this: PieSeriesModel): SeriesData { - const data = createSeriesDataSimply(this, { + return 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(); + // update seats when data is changed + const dataInner = innerData(data); + let seats = dataInner.seats; + if (!seats) { + const valueList: number[] = []; + data.each(data.mapDimension('value'), function (value: number) { + valueList.push(value); + }); + seats = dataInner.seats = getPercentSeats(valueList, data.hostModel.get('percentPrecision')); + } const params = super.getDataParams(dataIndex) as PieCallbackDataParams; - params.percent = this.seats[dataIndex]; + // seats may be empty when sum is 0 + params.percent = seats[dataIndex] || 0; params.$vars.push('percent'); return params; } @@ -254,8 +263,8 @@ class PieSeriesModel extends SeriesModel { bleedMargin: 10, // Distance between text and label line. distanceToLabelLine: 5 - // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 - // 默认使用全局文本样式,详见TEXTSTYLE + // formatter: 标签文本格式器,同 tooltip.formatter,不支持异步回调 + // 默认使用全局文本样式,详见 textStyle // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数 }, // Enabled when label.normal.position is 'outer' diff --git a/src/chart/pie/labelLayout.ts b/src/chart/pie/labelLayout.ts index 0c90908914..934b49cadc 100644 --- a/src/chart/pie/labelLayout.ts +++ b/src/chart/pie/labelLayout.ts @@ -288,12 +288,12 @@ function constrainTextWidth( const oldHeight = textRect.height; if (overflow && overflow.match('break')) { // Temporarily set background to be null to calculate - // the bounding box without backgroud. + // the bounding box without background. label.setStyle('backgroundColor', null); // Set constraining width label.setStyle('width', availableWidth - paddingH); - // This is the real bounding box of the text without padding + // This is the real bounding box of the text without padding. const innerRect = label.getBoundingRect(); label.setStyle('width', Math.ceil(innerRect.width)); @@ -394,8 +394,11 @@ export default function pieLabelLayout( if (Math.abs(sectorShape.endAngle - sectorShape.startAngle) < minShowLabelRadian) { each(label.states, setNotShow); - each(labelLine.states, setNotShow); - label.ignore = labelLine.ignore = true; + label.ignore = true; + if (labelLine) { + each(labelLine.states, setNotShow); + labelLine.ignore = true; + } return; } diff --git a/src/chart/pie/pieLayout.ts b/src/chart/pie/pieLayout.ts index 0a6998c70c..c5c52ccfcd 100644 --- a/src/chart/pie/pieLayout.ts +++ b/src/chart/pie/pieLayout.ts @@ -41,15 +41,13 @@ export function getBasicPieLayout(seriesModel: PieSeriesModel, api: ExtensionAPI Pick { const viewRect = getViewRect(seriesModel, api); + // center can be string or number when coordinateSystem is specified let center = seriesModel.get('center'); let radius = seriesModel.get('radius'); if (!zrUtil.isArray(radius)) { radius = [0, radius]; } - if (!zrUtil.isArray(center)) { - center = [center, center]; - } const width = parsePercent(viewRect.width, api.getWidth()); const height = parsePercent(viewRect.height, api.getHeight()); const size = Math.min(width, height); @@ -66,6 +64,9 @@ export function getBasicPieLayout(seriesModel: PieSeriesModel, api: ExtensionAPI cy = point[1] || 0; } else { + if (!zrUtil.isArray(center)) { + center = [center, center]; + } cx = parsePercent(center[0], width) + viewRect.x; cy = parsePercent(center[1], height) + viewRect.y; } diff --git a/src/chart/sankey/SankeySeries.ts b/src/chart/sankey/SankeySeries.ts index 2ef1e77795..bc07d45004 100644 --- a/src/chart/sankey/SankeySeries.ts +++ b/src/chart/sankey/SankeySeries.ts @@ -85,6 +85,7 @@ export interface SankeyEdgeItemOption extends StatesOptionMixin, GraphEdgeItemObject { focusNodeAdjacency?: FocusNodeAdjacency + edgeLabel?: SeriesLabelOption } export interface SankeyLevelOption extends SankeyNodeStateOption, SankeyEdgeStateOption { @@ -137,6 +138,10 @@ export interface SankeySeriesOption links?: SankeyEdgeItemOption[] levels?: SankeyLevelOption[] + + edgeLabel?: SeriesLabelOption & { + position?: 'inside' + } } class SankeySeriesModel extends SeriesModel { @@ -298,6 +303,11 @@ class SankeySeriesModel extends SeriesModel { fontSize: 12 }, + edgeLabel: { + show: false, + fontSize: 12 + }, + levels: [], nodeAlign: 'justify', diff --git a/src/chart/sankey/SankeyView.ts b/src/chart/sankey/SankeyView.ts index 5a9110f760..5432908d48 100644 --- a/src/chart/sankey/SankeyView.ts +++ b/src/chart/sankey/SankeyView.ts @@ -220,6 +220,16 @@ class SankeyView extends ChartView { } } + setLabelStyle( + curve, getLabelStatesModels(edgeModel, 'edgeLabel'), + { + labelFetcher: seriesModel, + labelDataIndex: edge.dataIndex, + defaultText: `${edgeModel.get('value')}` + } + ); + curve.setTextConfig({ position: 'inside' }); + const emphasisModel = edgeModel.getModel('emphasis'); setStatesStylesFromModel(curve, edgeModel, 'lineStyle', (model) => model.getItemStyle()); diff --git a/src/chart/sankey/sankeyLayout.ts b/src/chart/sankey/sankeyLayout.ts index c4343694b1..0ae24df1c5 100644 --- a/src/chart/sankey/sankeyLayout.ts +++ b/src/chart/sankey/sankeyLayout.ts @@ -122,7 +122,7 @@ function computeNodeBreadths( const remainEdges = []; // Storage each node's indegree. const indegreeArr = []; - //Used to storage the node with indegree is equal to 0. + // Used to storage the node with indegree is equal to 0. let zeroIndegrees: GraphNode[] = []; let nextTargetNode: GraphNode[] = []; let x = 0; diff --git a/src/chart/sankey/sankeyVisual.ts b/src/chart/sankey/sankeyVisual.ts index 9425a615a9..a0f4add053 100644 --- a/src/chart/sankey/sankeyVisual.ts +++ b/src/chart/sankey/sankeyVisual.ts @@ -20,12 +20,13 @@ import * as zrUtil from 'zrender/src/core/util'; import VisualMapping from '../../visual/VisualMapping'; import GlobalModel from '../../model/Global'; -import SankeySeriesModel, { SankeyNodeItemOption } from './SankeySeries'; +import SankeySeriesModel, { SankeyEdgeItemOption, SankeyNodeItemOption } from './SankeySeries'; export default function sankeyVisual(ecModel: GlobalModel) { ecModel.eachSeriesByType('sankey', function (seriesModel: SankeySeriesModel) { const graph = seriesModel.getGraph(); const nodes = graph.nodes; + const edges = graph.edges; if (nodes.length) { let minValue = Infinity; let maxValue = -Infinity; @@ -59,5 +60,11 @@ export default function sankeyVisual(ecModel: GlobalModel) { } }); } + if (edges.length) { + zrUtil.each(edges, function (edge) { + const edgeStyle = edge.getModel().get('lineStyle'); + edge.setVisual('style', edgeStyle); + }); + } }); } \ No newline at end of file diff --git a/src/chart/sunburst/SunburstSeries.ts b/src/chart/sunburst/SunburstSeries.ts index 0887e2fd7f..402de0110d 100644 --- a/src/chart/sunburst/SunburstSeries.ts +++ b/src/chart/sunburst/SunburstSeries.ts @@ -238,7 +238,7 @@ class SunburstSeriesModel extends SeriesModel { rotate: 'radial', show: true, opacity: 1, - // 'left' is for inner side of inside, and 'right' is for outter + // 'left' is for inner side of inside, and 'right' is for outer // side for inside align: 'center', position: 'inside', @@ -269,7 +269,7 @@ class SunburstSeriesModel extends SeriesModel { } }, - // Animation type canbe expansion, scale + // Animation type can be expansion, scale. animationType: 'expansion', animationDuration: 1000, animationDurationUpdate: 500, diff --git a/src/chart/sunburst/sunburstLayout.ts b/src/chart/sunburst/sunburstLayout.ts index f84fc3b53e..a45f211c50 100644 --- a/src/chart/sunburst/sunburstLayout.ts +++ b/src/chart/sunburst/sunburstLayout.ts @@ -21,9 +21,8 @@ import { parsePercent } from '../../util/number'; import * as zrUtil from 'zrender/src/core/util'; import GlobalModel from '../../model/Global'; import ExtensionAPI from '../../core/ExtensionAPI'; -import SunburstSeriesModel, { SunburstSeriesNodeItemOption, SunburstSeriesOption } from './SunburstSeries'; +import SunburstSeriesModel, { SunburstSeriesOption } from './SunburstSeries'; import { TreeNode } from '../../data/Tree'; -import SeriesModel from '../../model/Series'; // let PI2 = Math.PI * 2; const RADIAN = Math.PI / 180; diff --git a/src/chart/themeRiver/ThemeRiverSeries.ts b/src/chart/themeRiver/ThemeRiverSeries.ts index f1fb0bc495..31e5b0ad37 100644 --- a/src/chart/themeRiver/ThemeRiverSeries.ts +++ b/src/chart/themeRiver/ThemeRiverSeries.ts @@ -156,7 +156,7 @@ class ThemeRiverSeriesModel extends SeriesModel { /** * @override - * @param option the initial option that user gived + * @param option the initial option that user gave * @param ecModel the model object for themeRiver option */ getInitialData(option: ThemeRiverSeriesOption, ecModel: GlobalModel): SeriesData { @@ -326,4 +326,4 @@ class ThemeRiverSeriesModel extends SeriesModel { }; } -export default ThemeRiverSeriesModel; \ No newline at end of file +export default ThemeRiverSeriesModel; diff --git a/src/chart/tree/TreeSeries.ts b/src/chart/tree/TreeSeries.ts index 659dfc16cf..245bf91dc8 100644 --- a/src/chart/tree/TreeSeries.ts +++ b/src/chart/tree/TreeSeries.ts @@ -146,7 +146,7 @@ class TreeSeriesModel extends SeriesModel { */ getInitialData(option: TreeSeriesOption): SeriesData { - //create an virtual root + // create a virtual root const root: TreeSeriesNodeItemOption = { name: option.name, children: option.data diff --git a/src/chart/tree/layoutHelper.ts b/src/chart/tree/layoutHelper.ts index 1c56275a31..2aada604ec 100644 --- a/src/chart/tree/layoutHelper.ts +++ b/src/chart/tree/layoutHelper.ts @@ -18,7 +18,7 @@ */ /* -* A third-party license is embeded for some of the code in this file: +* A third-party license is embedded for some of the code in this file: * The tree layoutHelper implementation was originally copied from * "d3.js"(https://github.com/d3/d3-hierarchy) with * some modifications made for this project. @@ -328,4 +328,4 @@ function defaultSeparation(node1: TreeLayoutNode, node2: TreeLayoutNode): number interface SeparationFunc { (node1: TreeLayoutNode, node2: TreeLayoutNode): number -} \ No newline at end of file +} diff --git a/src/chart/treemap/TreemapSeries.ts b/src/chart/treemap/TreemapSeries.ts index 2e5f22835f..9e4dc340aa 100644 --- a/src/chart/treemap/TreemapSeries.ts +++ b/src/chart/treemap/TreemapSeries.ts @@ -46,7 +46,7 @@ import { normalizeToArray } from '../../util/model'; import { createTooltipMarkup } from '../../component/tooltip/tooltipMarkup'; import enableAriaDecalForTree from '../helper/enableAriaDecalForTree'; -// Only support numberic value. +// Only support numeric value. type TreemapSeriesDataValue = number | number[]; interface BreadcrumbItemStyleOption extends ItemStyleOption { @@ -113,7 +113,7 @@ export interface TreemapSeriesVisualOption { colorAlpha?: number[] | 'none' colorSaturation?: number[] | 'none' // A color list for a level. Each node in the level will obtain a color from the color list. - // Only suuport ColorString for interpolation + // Only support ColorString for interpolation. // color?: ColorString[] /** @@ -191,7 +191,7 @@ export interface TreemapSeriesOption * Leaf node click behaviour: 'zoomToNode', 'link', false. * If leafDepth is set and clicking a node which has children but * be on left depth, the behaviour would be changing root. Otherwise - * use behavious defined above. + * use behaviour defined above. */ nodeClick?: 'zoomToNode' | 'link' | false @@ -265,14 +265,14 @@ class TreemapSeriesModel extends SeriesModel { // bottom emptyItemWidth: 25, // Width of empty node. itemStyle: { - color: 'rgba(0,0,0,0.7)', //'#5793f3', + color: 'rgba(0,0,0,0.7)', // '#5793f3', textStyle: { color: '#fff' } }, emphasis: { itemStyle: { - color: 'rgba(0,0,0,0.9)' //'#5793f3', + color: 'rgba(0,0,0,0.9)' // '#5793f3', } } }, @@ -281,7 +281,7 @@ class TreemapSeriesModel extends SeriesModel { // Do not use textDistance, for ellipsis rect just the same as treemap node rect. distance: 0, padding: 5, - position: 'inside', // Can be [5, '5%'] or position stirng like 'insideTopLeft', ... + position: 'inside', // Can be [5, '5%'] or position string like 'insideTopLeft', ... // formatter: null, color: '#fff', overflow: 'truncate' diff --git a/src/chart/treemap/TreemapView.ts b/src/chart/treemap/TreemapView.ts index 02c8f3bcee..b4f159dc24 100644 --- a/src/chart/treemap/TreemapView.ts +++ b/src/chart/treemap/TreemapView.ts @@ -254,9 +254,9 @@ class TreemapView extends ChartView { ); } - // Notice: when thisTree and oldTree are the same tree (see list.cloneShallow), - // the oldTree is actually losted, so we can not find all of the old graphic - // elements from tree. So we use this stragegy: make element storage, move + // Notice: When thisTree and oldTree are the same tree (see list.cloneShallow), + // the oldTree is actually losted, so we cannot find all of the old graphic + // elements from tree. So we use this strategy: make element storage, move // from old storage to new storage, clear old storage. dualTravel( @@ -684,7 +684,7 @@ class TreemapView extends ChartView { const point = bgEl.transformCoordToLocal(x, y); const shape = bgEl.shape; - // For performance consideration, dont use 'getBoundingRect'. + // For performance consideration, don't use 'getBoundingRect'. if (shape.x <= point[0] && point[0] <= shape.x + shape.width && shape.y <= point[1] @@ -1098,9 +1098,9 @@ function renderNode( } -// We can not set all backgroud with the same z, Because the behaviour of +// We cannot set all background with the same z, because the behaviour of // drill down and roll up differ background creation sequence from tree -// hierarchy sequence, which cause that lowser background element overlap +// hierarchy sequence, which cause lower background elements to overlap // upper ones. So we calculate z based on depth. // Moreover, we try to shrink down z interval to [0, 1] to avoid that // treemap with large z overlaps other components. diff --git a/src/chart/treemap/treemapLayout.ts b/src/chart/treemap/treemapLayout.ts index 26003794b0..62872f37b2 100644 --- a/src/chart/treemap/treemapLayout.ts +++ b/src/chart/treemap/treemapLayout.ts @@ -18,7 +18,7 @@ */ /* -* A third-party license is embeded for some of the code in this file: +* A third-party license is embedded for some of the code in this file: * The treemap layout implementation was originally copied from * "d3.js" with some modifications made for this project. * (See more details in the comment of the method "squarify" below.) @@ -573,7 +573,7 @@ function estimateRootSize( containerHeight: number ) { // If targetInfo.node exists, we zoom to the node, - // so estimate whold width and heigth by target node. + // so estimate whole width and height by target node. let currNode = (targetInfo || {}).node; const defaultSize = [containerWidth, containerHeight]; @@ -616,7 +616,7 @@ function estimateRootSize( return [containerWidth * scale, containerHeight * scale]; } -// Root postion base on coord of containerGroup +// Root position based on coord of containerGroup function calculateRootPosition( layoutInfo: layout.LayoutRect, rootRect: RectLike, diff --git a/src/chart/treemap/treemapVisual.ts b/src/chart/treemap/treemapVisual.ts index 3554ceb86f..b7f710b824 100644 --- a/src/chart/treemap/treemapVisual.ts +++ b/src/chart/treemap/treemapVisual.ts @@ -226,16 +226,16 @@ function buildVisualMapping( return mapping; } -// Notice: If we dont have the attribute 'colorRange', but only use +// Notice: If we don't have the attribute 'colorRange', but only use // attribute 'color' to represent both concepts of 'colorRange' and 'color', // (It means 'colorRange' when 'color' is Array, means 'color' when not array), // this problem will be encountered: -// If a level-1 node dont have children, and its siblings has children, -// and colorRange is set on level-1, then the node can not be colored. +// If a level-1 node doesn't have children, and its siblings have children, +// and colorRange is set on level-1, then the node cannot be colored. // So we separate 'colorRange' and 'color' to different attributes. function getRangeVisual(nodeModel: NodeModel, name: keyof TreemapVisual) { // 'colorRange', 'colorARange', 'colorSRange'. - // If not exsits on this node, fetch from levels and series. + // If not exists on this node, fetch from levels and series. const range = nodeModel.get(name); return (isArray(range) && range.length) ? { name: name, diff --git a/src/component/dataZoom/AxisProxy.ts b/src/component/dataZoom/AxisProxy.ts index e7be785fca..8c05f8cea7 100644 --- a/src/component/dataZoom/AxisProxy.ts +++ b/src/component/dataZoom/AxisProxy.ts @@ -189,15 +189,20 @@ class AxisProxy { // valueWindow[idx] = round(boundValue); // percentWindow[idx] = round(boundPercent); - valueWindow[idx] = boundValue; - percentWindow[idx] = boundPercent; + // fallback to extent start/end when parsed value or percent is invalid + valueWindow[idx] = boundValue == null || isNaN(boundValue) + ? dataExtent[idx] + : boundValue; + percentWindow[idx] = boundPercent == null || isNaN(boundPercent) + ? percentExtent[idx] + : boundPercent; }); asc(valueWindow); asc(percentWindow); // The windows from user calling of `dispatchAction` might be out of the extent, - // or do not obey the `min/maxSpan`, `min/maxValueSpan`. But we dont restrict window + // or do not obey the `min/maxSpan`, `min/maxValueSpan`. But we don't restrict window // by `zoomLock` here, because we see `zoomLock` just as a interaction constraint, // where API is able to initialize/modify the window size even though `zoomLock` // specified. @@ -232,8 +237,8 @@ class AxisProxy { } /** - * Notice: reset should not be called before series.restoreData() called, - * so it is recommanded to be called in "process stage" but not "model init + * Notice: reset should not be called before series.restoreData() is called, + * so it is recommended to be called in "process stage" but not "model init * stage". */ reset(dataZoomModel: DataZoomModel) { diff --git a/src/component/dataZoom/DataZoomModel.ts b/src/component/dataZoom/DataZoomModel.ts index 12382f3ef1..0fd8d78015 100644 --- a/src/component/dataZoom/DataZoomModel.ts +++ b/src/component/dataZoom/DataZoomModel.ts @@ -234,7 +234,7 @@ class DataZoomModel extends Compon mergeOption(newOption: Opts): void { const inputRawOption = retrieveRawOption(newOption); - //FIX #2591 + // FIX #2591 merge(this.option, newOption, true); merge(this.settledOption, inputRawOption, true); @@ -291,7 +291,7 @@ class DataZoomModel extends Compon const refering = this.getReferringComponents(getAxisMainType(axisDim), MULTIPLE_REFERRING); // When user set axisIndex as a empty array, we think that user specify axisIndex // but do not want use auto mode. Because empty array may be encountered when - // some error occured. + // some error occurred. if (!refering.specified) { return; } @@ -577,8 +577,8 @@ class DataZoomModel extends Compon } /** - * Retrieve the those raw params from option, which will be cached separately. - * becasue they will be overwritten by normalized/calculated values in the main + * Retrieve those raw params from option, which will be cached separately, + * because they will be overwritten by normalized/calculated values in the main * process. */ function retrieveRawOption(option: T) { @@ -592,4 +592,4 @@ function retrieveRawOption(option: T) { return ret; } -export default DataZoomModel; \ No newline at end of file +export default DataZoomModel; diff --git a/src/component/dataZoom/roams.ts b/src/component/dataZoom/roams.ts index c4f281d53d..d33e1e287a 100644 --- a/src/component/dataZoom/roams.ts +++ b/src/component/dataZoom/roams.ts @@ -233,7 +233,7 @@ export function installDataZoomRoamProcessor(registers: EChartsExtensionInstallR || (apiInner.coordSysRecordMap = createHashMap()); coordSysRecordMap.each(function (coordSysRecord) { - // `coordSysRecordMap` always exists (becuase it hold the `roam controller`, which should + // `coordSysRecordMap` always exists (because it holds the `roam controller`, which should // better not re-create each time), but clear `dataZoomInfoMap` each round of the workflow. coordSysRecord.dataZoomInfoMap = null; }); @@ -294,4 +294,4 @@ export function installDataZoomRoamProcessor(registers: EChartsExtensionInstallR }); }); -} \ No newline at end of file +} diff --git a/src/component/graphic/GraphicModel.ts b/src/component/graphic/GraphicModel.ts index e51a509874..fc9f220499 100644 --- a/src/component/graphic/GraphicModel.ts +++ b/src/component/graphic/GraphicModel.ts @@ -54,7 +54,7 @@ interface GraphicComponentBaseElementOption extends >>, /** * left/right/top/bottom: (like 12, '22%', 'center', default undefined) - * If left/rigth is set, shape.x/shape.cx/position will not be used. + * If left/right is set, shape.x/shape.cx/position will not be used. * If top/bottom is set, shape.y/shape.cy/position will not be used. * This mechanism is useful when you want to position a group/element * against the right side or the center of this container. @@ -132,8 +132,8 @@ export interface GraphicComponentGroupOption /** * width/height: (can only be pixel value, default 0) - * Only be used to specify contianer(group) size, if needed. And - * can not be percentage value (like '33%'). See the reason in the + * Is only used to specify container (group) size, if needed. And + * cannot be a percentage value (like '33%'). See the reason in the * layout algorithm below. */ width?: number; @@ -163,7 +163,7 @@ export interface GraphicComponentImageOption // interface GraphicComponentImageOptionOnState extends GraphicComponentDisplayableOptionOnState { // style?: ImageStyleProps; // } -interface GraphicComponentTextOption +export interface GraphicComponentTextOption extends Omit, TransitionOptionMixin { type?: 'text'; style?: TextStyleProps & TransitionOptionMixin; @@ -316,9 +316,9 @@ function setLayoutInfoToExist( return; } existItem.hv = newElOption.hv = [ - // Rigid body, dont care `width`. + // Rigid body, don't care about `width`. isSetLoc(newElOption, ['left', 'right']), - // Rigid body, dont care `height`. + // Rigid body, don't care about `height`. isSetLoc(newElOption, ['top', 'bottom']) ]; // Give default group size. Otherwise layout error may occur. diff --git a/src/component/graphic/install.ts b/src/component/graphic/install.ts index 4251932ecc..40c0e2ef02 100644 --- a/src/component/graphic/install.ts +++ b/src/component/graphic/install.ts @@ -43,8 +43,8 @@ export function install(registers: EChartsExtensionInstallRegisters) { option.graphic = [{ elements: graphicOption }]; } else { - // Only one graphic instance can be instantiated. (We dont - // want that too many views are created in echarts._viewMap) + // Only one graphic instance can be instantiated. (We don't + // want that too many views are created in echarts._viewMap.) option.graphic = [(option.graphic as any)[0]]; } } @@ -52,4 +52,4 @@ export function install(registers: EChartsExtensionInstallRegisters) { option.graphic = [{ elements: [graphicOption] }]; } }); -} \ No newline at end of file +} diff --git a/src/component/helper/MapDraw.ts b/src/component/helper/MapDraw.ts index 5296014546..89827f9570 100644 --- a/src/component/helper/MapDraw.ts +++ b/src/component/helper/MapDraw.ts @@ -617,7 +617,7 @@ class MapDraw { * `ignore` might have been modified by `LabelManager`, and `LabelManager#addLabelsOfSeries` * will subsequently cache `defaultAttr` like `ignore`. If do not do this reset, the modified * props will have no chance to be restored. - * Note: this reset should be after `clearStates` in `renderSeries` becuase `useStates` in + * Note: This reset should be after `clearStates` in `renderSeries` because `useStates` in * `renderSeries` will cache the modified `ignore` to `el._normalState`. * TODO: * Use clone/immutable in `LabelManager`? @@ -672,7 +672,7 @@ function applyOptionStyleForRegion( } > ): void { - // All of the path are using `itemStyle`, becuase + // All of the path are using `itemStyle`, because // (1) Some SVG also use fill on polyline (The different between // polyline and polygon is "open" or "close" but not fill or not). // (2) For the common props like opacity, if some use itemStyle diff --git a/src/component/legend/LegendModel.ts b/src/component/legend/LegendModel.ts index b121c94a9a..70a6fd59ff 100644 --- a/src/component/legend/LegendModel.ts +++ b/src/component/legend/LegendModel.ts @@ -247,7 +247,7 @@ class LegendModel extends ComponentMode readonly layoutMode = { type: 'box', // legend.width/height are maxWidth/maxHeight actually, - // whereas realy width/height is calculated by its content. + // whereas real width/height is calculated by its content. // (Setting {left: 10, right: 10} does not make sense). // So consider the case: // `setOption({legend: {left: 10});` @@ -350,10 +350,11 @@ class LegendModel extends ComponentMode */ this._availableNames = availableNames; - // If legend.data not specified in option, use availableNames as data, - // which is convinient for user preparing option. + // If legend.data is not specified in option, use availableNames as data, + // which is convenient for user preparing option. const rawData = this.get('data') || potentialData; + const legendNameMap = zrUtil.createHashMap(); const legendData = zrUtil.map(rawData, function (dataItem) { // Can be string or number if (zrUtil.isString(dataItem) || zrUtil.isNumber(dataItem)) { @@ -361,6 +362,11 @@ class LegendModel extends ComponentMode name: dataItem as string }; } + if (legendNameMap.get(dataItem.name)) { + // remove legend name duplicate + return null; + } + legendNameMap.set(dataItem.name, true); return new Model(dataItem, this, this.ecModel); }, this); @@ -368,7 +374,7 @@ class LegendModel extends ComponentMode * @type {Array.} * @private */ - this._data = legendData; + this._data = zrUtil.filter(legendData, item => !!item); } getData() { diff --git a/src/component/legend/LegendView.ts b/src/component/legend/LegendView.ts index 6e6c9ceb8c..5b4a342599 100644 --- a/src/component/legend/LegendView.ts +++ b/src/component/legend/LegendView.ts @@ -69,7 +69,7 @@ class LegendView extends ComponentView { /** * If first rendering, `contentGroup.position` is [0, 0], which - * does not make sense and may cause unexepcted animation if adopted. + * does not make sense and may cause unexpected animation if adopted. */ private _isFirstRender: boolean; @@ -199,7 +199,7 @@ class LegendView extends ComponentView { SeriesModel; if (legendDrawnMap.get(name)) { - // Have been drawed + // Have been drawn return; } @@ -510,7 +510,7 @@ class LegendView extends ComponentView { contentPos[orientIdx] += selectorRect[wh] + selectorButtonGap; } - //Always align selector to content as 'middle' + // Always align selector to content as 'middle' selectorPos[1 - orientIdx] += contentRect[hw] / 2 - selectorRect[hw] / 2; selectorGroup.x = selectorPos[0]; selectorGroup.y = selectorPos[1]; @@ -663,7 +663,7 @@ function dispatchSelectAction( name: seriesName != null ? seriesName : dataName }); // highlight after select - // TODO higlight immediately may cause animation loss. + // TODO highlight immediately may cause animation loss. dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId); } diff --git a/src/component/marker/MarkAreaView.ts b/src/component/marker/MarkAreaView.ts index 785d107d87..9ecf7d32ee 100644 --- a/src/component/marker/MarkAreaView.ts +++ b/src/component/marker/MarkAreaView.ts @@ -66,8 +66,15 @@ const markAreaTransform = function ( maModel: MarkAreaModel, item: MarkArea2DDataItemOption ): MarkAreaMergedItemOption { - const lt = markerHelper.dataTransform(seriesModel, item[0]); - const rb = markerHelper.dataTransform(seriesModel, item[1]); + // item may be null + const item0 = item[0]; + const item1 = item[1]; + if (!item0 || !item1) { + return; + } + + const lt = markerHelper.dataTransform(seriesModel, item0); + const rb = markerHelper.dataTransform(seriesModel, item1); // FIXME make sure lt is less than rb const ltCoord = lt.coord; @@ -133,11 +140,11 @@ function markAreaFilter(coordSys: CoordinateSystem, item: MarkAreaMergedItemOpti ) { return true; } - //Directly returning true may also do the work, - //because markArea will not be shown automatically - //when it's not included in coordinate system. - //But filtering ahead can avoid keeping rendering markArea - //when there are too many of them. + // Directly returning true may also do the work, + // because markArea will not be shown automatically + // when it's not included in coordinate system. + // But filtering ahead can avoid keeping rendering markArea + // when there are too many of them. return markerHelper.zoneFilter(coordSys, item0, item1); } return markerHelper.dataFilter(coordSys, item0) @@ -164,9 +171,28 @@ function getSingleMarkerEndPoint( else { // Chart like bar may have there own marker positioning logic if (seriesModel.getMarkerPosition) { + // Consider the case that user input the right-bottom point first + // Pick the larger x and y as 'x1' and 'y1' + const pointValue0 = data.getValues(['x0', 'y0'], idx); + const pointValue1 = data.getValues(['x1', 'y1'], idx); + const clampPointValue0 = coordSys.clampData(pointValue0); + const clampPointValue1 = coordSys.clampData(pointValue1); + const pointValue = []; + if (dims[0] === 'x0') { + pointValue[0] = (clampPointValue0[0] > clampPointValue1[0]) ? pointValue1[0] : pointValue0[0]; + } + else { + pointValue[0] = (clampPointValue0[0] > clampPointValue1[0]) ? pointValue0[0] : pointValue1[0]; + } + if (dims[1] === 'y0') { + pointValue[1] = (clampPointValue0[1] > clampPointValue1[1]) ? pointValue1[1] : pointValue0[1]; + } + else { + pointValue[1] = (clampPointValue0[1] > clampPointValue1[1]) ? pointValue0[1] : pointValue1[1]; + } // Use the getMarkerPosition point = seriesModel.getMarkerPosition( - data.getValues(dims, idx) + pointValue, dims, true ); } else { @@ -202,7 +228,7 @@ function getSingleMarkerEndPoint( return point; } -const dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']] as const; +export const dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']] as const; class MarkAreaView extends MarkerView { diff --git a/src/component/marker/MarkLineModel.ts b/src/component/marker/MarkLineModel.ts index c10025c648..903f196ec8 100644 --- a/src/component/marker/MarkLineModel.ts +++ b/src/component/marker/MarkLineModel.ts @@ -118,7 +118,7 @@ class MarkLineModel extends MarkerModel { symbol: ['circle', 'arrow'], symbolSize: [8, 16], - //symbolRotate: 0, + // symbolRotate: 0, symbolOffset: 0, precision: 2, diff --git a/src/component/marker/MarkPointModel.ts b/src/component/marker/MarkPointModel.ts index 4a4a67a1a3..1b672317c7 100644 --- a/src/component/marker/MarkPointModel.ts +++ b/src/component/marker/MarkPointModel.ts @@ -73,8 +73,8 @@ class MarkPointModel extends MarkerModel { z: 5, symbol: 'pin', symbolSize: 50, - //symbolRotate: 0, - //symbolOffset: [0, 0] + // symbolRotate: 0, + // symbolOffset: [0, 0] tooltip: { trigger: 'item' }, diff --git a/src/component/marker/markerHelper.ts b/src/component/marker/markerHelper.ts index 1616df4226..2777b137f4 100644 --- a/src/component/marker/markerHelper.ts +++ b/src/component/marker/markerHelper.ts @@ -61,7 +61,7 @@ function markerTypeCalculatorWithExtent( ): [ParsedValue[], ParsedValue] { const coordArr: ParsedValue[] = []; - const stacked = isDimensionStacked(data, targetDataDim /*, otherDataDim*/); + const stacked = isDimensionStacked(data, targetDataDim /* , otherDataDim */); const calcDataDim = stacked ? data.getCalculationInfo('stackResultDimension') : targetDataDim; @@ -99,16 +99,20 @@ export function dataTransform( seriesModel: SeriesModel, item: MarkerPositionOption ) { + if (!item) { + return; + } + const data = seriesModel.getData(); const coordSys = seriesModel.coordinateSystem; + const dims = coordSys.dimensions; // 1. If not specify the position with pixel directly // 2. If `coord` is not a data array. Which uses `xAxis`, // `yAxis` to specify the coord on each dimension // parseFloat first because item.x and item.y can be percent string like '20%' - if (item && !hasXAndY(item) && !isArray(item.coord) && coordSys) { - const dims = coordSys.dimensions; + if (!hasXAndY(item) && !isArray(item.coord) && coordSys) { const axisInfo = getAxisInfo(item, data, coordSys, seriesModel); // Clone the option @@ -130,21 +134,26 @@ export function dataTransform( // Force to use the value of calculated value. // let item use the value without stack. item.value = coordInfo[1]; - } else { // FIXME Only has one of xAxis and yAxis. - const coord = [ + item.coord = [ item.xAxis != null ? item.xAxis : item.radiusAxis, item.yAxis != null ? item.yAxis : item.angleAxis ]; - // Each coord support max, min, average - for (let i = 0; i < 2; i++) { - if (markerTypeCalculator[coord[i] as MarkerStatisticType]) { - coord[i] = numCalculate(data, data.mapDimension(dims[i]), coord[i] as MarkerStatisticType); - } + } + } + // x y is provided + if (item.coord == null) { + item.coord = []; + } + else { + // Each coord support max, min, average + const coord = item.coord; + for (let i = 0; i < 2; i++) { + if (markerTypeCalculator[coord[i] as MarkerStatisticType]) { + coord[i] = numCalculate(data, data.mapDimension(dims[i]), coord[i] as MarkerStatisticType); } - item.coord = coord; } } return item; diff --git a/src/component/parallel/ParallelView.ts b/src/component/parallel/ParallelView.ts index 7ba445e786..1d7a0c63aa 100644 --- a/src/component/parallel/ParallelView.ts +++ b/src/component/parallel/ParallelView.ts @@ -58,7 +58,7 @@ class ParallelView extends ComponentView { } /** * @internal - * @param {Object} [opt] If null, cancle the last action triggering for debounce. + * @param {Object} [opt] If null, cancel the last action triggering for debounce. */ _throttledDispatchExpand(this: ParallelView, opt: Omit): void { this._dispatchExpand(opt); @@ -105,7 +105,7 @@ const handlers: Partial> = { && (this._throttledDispatchExpand as ParallelView['_throttledDispatchExpand'] & ThrottleController) .debounceNextCall(model.get('axisExpandDebounce')); this._throttledDispatchExpand(behavior === 'none' - ? null // Cancle the last trigger, in case that mouse slide out of the area quickly. + ? null // Cancel the last trigger, in case that mouse slide out of the area quickly. : { axisExpandWindow: result.axisExpandWindow, // Jumping uses animation, and sliding suppresses animation. @@ -120,4 +120,4 @@ function checkTrigger(view: ParallelView, triggerOn: ParallelCoordinateSystemOpt return model.get('axisExpandable') && model.get('axisExpandTriggerOn') === triggerOn; } -export default ParallelView; \ No newline at end of file +export default ParallelView; diff --git a/src/component/timeline/SliderTimelineView.ts b/src/component/timeline/SliderTimelineView.ts index 32eb7d6fc2..f993e57138 100644 --- a/src/component/timeline/SliderTimelineView.ts +++ b/src/component/timeline/SliderTimelineView.ts @@ -420,7 +420,7 @@ class SliderTimelineView extends TimelineView { this._tickSymbols = []; - // The value is dataIndex, see the costomized scale. + // The value is dataIndex, see the customized scale. each(ticks, (tick: ScaleTick) => { const tickCoord = axis.dataToCoord(tick.value); const itemModel = data.getItemModel(tick.value); @@ -470,7 +470,7 @@ class SliderTimelineView extends TimelineView { this._tickLabels = []; each(labels, (labelItem) => { - // The tickValue is dataIndex, see the costomized scale. + // The tickValue is dataIndex, see the customized scale. const dataIndex = labelItem.tickValue; const itemModel = data.getItemModel(dataIndex); @@ -626,8 +626,11 @@ class SliderTimelineView extends TimelineView { this._currentPointer.x = toCoord; this._currentPointer.markRedraw(); - this._progressLine.shape.x2 = toCoord; - this._progressLine.dirty(); + const progressLine = this._progressLine; + if (progressLine) { + progressLine.shape.x2 = toCoord; + progressLine.dirty(); + } const targetDataIndex = this._findNearestTick(toCoord); const timelineModel = this.model; diff --git a/src/component/tooltip/TooltipHTMLContent.ts b/src/component/tooltip/TooltipHTMLContent.ts index baca229954..02496857b0 100644 --- a/src/component/tooltip/TooltipHTMLContent.ts +++ b/src/component/tooltip/TooltipHTMLContent.ts @@ -93,7 +93,7 @@ function assembleArrow( const borderStyle = `${borderColor} solid ${borderWidth}px;`; const styleCss = [ - `position:absolute;width:${arrowSize}px;height:${arrowSize}px;`, + `position:absolute;width:${arrowSize}px;height:${arrowSize}px;z-index:-1;`, `${positionStyle};${transformStyle};`, `border-bottom:${borderStyle}`, `border-right:${borderStyle}`, diff --git a/src/coord/Axis.ts b/src/coord/Axis.ts index 7a334a0a4b..a71051507c 100644 --- a/src/coord/Axis.ts +++ b/src/coord/Axis.ts @@ -232,7 +232,7 @@ class Axis { * Notice here we only get the default tick model. For splitLine * or splitArea, we should pass the splitLineModel or splitAreaModel * manually when calling `getTicksCoords`. - * In GL, this method may be overrided to: + * In GL, this method may be overridden to: * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));` */ getTickModel(): Model { @@ -262,7 +262,7 @@ class Axis { /** * Only be called in category axis. - * Can be overrided, consider other axes like in 3D. + * Can be overridden, consider other axes like in 3D. * @return Auto interval for cateogry axis tick and label */ calculateCategoryInterval(): ReturnType { @@ -338,7 +338,7 @@ function fixOnBandTicksCoords( function littleThan(a: number, b: number): boolean { // Avoid rounding error cause calculated tick coord different with extent. - // It may cause an extra unecessary tick added. + // It may cause an extra unnecessary tick added. a = round(a); b = round(b); return inverse ? a > b : a < b; diff --git a/src/coord/CoordinateSystem.ts b/src/coord/CoordinateSystem.ts index 0ebe41e916..f89235b77b 100644 --- a/src/coord/CoordinateSystem.ts +++ b/src/coord/CoordinateSystem.ts @@ -57,17 +57,17 @@ export interface CoordinateSystemMaster { update?: (ecModel: GlobalModel, api: ExtensionAPI) => void; - // This methods is also responsible for determine whether this - // coodinate system is applicable to the given `finder`. - // Each coordinate system will be tried, util one returns none + // This methods is also responsible for determining whether this + // coordinate system is applicable to the given `finder`. + // Each coordinate system will be tried, until one returns non- // null/undefined value. convertToPixel?( ecModel: GlobalModel, finder: ParsedModelFinder, value: ScaleDataValue | ScaleDataValue[] ): number | number[]; - // This methods is also responsible for determine whether this - // coodinate system is applicable to the given `finder`. - // Each coordinate system will be tried, util one returns none + // This methods is also responsible for determining whether this + // coordinate system is applicable to the given `finder`. + // Each coordinate system will be tried, until one returns non- // null/undefined value. convertFromPixel?( ecModel: GlobalModel, finder: ParsedModelFinder, pixelValue: number | number[] @@ -137,6 +137,8 @@ export interface CoordinateSystem { // @param point Point in global pixel coordinate system. containPoint(point: number[]): boolean; + getAxes?: () => Axis[]; + getAxis?: (dim?: DimensionName) => Axis; getBaseAxis?: () => Axis; diff --git a/src/coord/View.ts b/src/coord/View.ts index bb4c1affb8..60fbb0318f 100644 --- a/src/coord/View.ts +++ b/src/coord/View.ts @@ -232,9 +232,9 @@ class View extends Transformable implements CoordinateSystemMaster, CoordinateSy const rawTransformable = this._rawTransformable; const roamTransformable = this._roamTransformable; - // Becuase roamTransformabel has `originX/originY` modified, + // Because roamTransformabel has `originX/originY` modified, // but the caller of `getTransformInfo` can not handle `originX/originY`, - // so need to recalcualte them. + // so need to recalculate them. const dummyTransformable = new Transformable(); dummyTransformable.transform = roamTransformable.transform; dummyTransformable.decomposeTransform(); @@ -310,7 +310,7 @@ class View extends Transformable implements CoordinateSystemMaster, CoordinateSy * @return {number} */ // getScalarScale() { - // // Use determinant square root of transform to mutiply scalar + // // Use determinant square root of transform to multiply scalar // let m = this.transform; // let det = Math.sqrt(Math.abs(m[0] * m[3] - m[2] * m[1])); // return det; diff --git a/src/coord/axisCommonTypes.ts b/src/coord/axisCommonTypes.ts index e3241cb02e..bb4d1b7bf1 100644 --- a/src/coord/axisCommonTypes.ts +++ b/src/coord/axisCommonTypes.ts @@ -22,6 +22,7 @@ import { AreaStyleOption, ComponentOption, ColorString, AnimationOptionMixin, Dictionary, ScaleDataValue, CommonAxisPointerOption } from '../util/types'; +import { TextStyleProps } from 'zrender/src/graphic/Text'; export const AXIS_TYPES = {value: 1, category: 1, time: 1, log: 1} as const; @@ -90,7 +91,7 @@ export interface NumericAxisBaseOptionCommon extends AxisBaseOptionCommon { boundaryGap?: [number | string, number | string] /** - * AxisTick and axisLabel and splitLine are caculated based on splitNumber. + * AxisTick and axisLabel and splitLine are calculated based on splitNumber. */ splitNumber?: number; /** @@ -127,7 +128,7 @@ export interface CategoryAxisBaseOption extends AxisBaseOptionCommon { })[]; /* * Set false to faster category collection. - * Only usefull in the case like: category is + * Only useful in the case like: category is * ['2012-01-01', '2012-01-02', ...], where the input * data has been ensured not duplicate and is large data. * null means "auto": @@ -230,6 +231,7 @@ interface AxisLabelBaseOption extends Omit { hideOverlap?: boolean; // Color can be callback color?: ColorString | ((value?: string | number, index?: number) => ColorString) + overflow?: TextStyleProps['overflow'] } interface AxisLabelOption extends AxisLabelBaseOption { formatter?: LabelFormatters[TType] diff --git a/src/coord/axisDefault.ts b/src/coord/axisDefault.ts index 05bc4083ee..4d2c6674b3 100644 --- a/src/coord/axisDefault.ts +++ b/src/coord/axisDefault.ts @@ -151,7 +151,7 @@ const valueAxis: AxisBaseOption = zrUtil.merge({ show: false, // Split number of minor ticks. The value should be in range of (0, 100) splitNumber: 5, - // Lenght of minor tick + // Length of minor tick length: 3, // Line style diff --git a/src/coord/axisHelper.ts b/src/coord/axisHelper.ts index c487d52871..53485fb31e 100644 --- a/src/coord/axisHelper.ts +++ b/src/coord/axisHelper.ts @@ -77,7 +77,7 @@ export function getScaleExtent(scale: Scale, model: AxisBaseModel) { // (4) Consider other chart types using `barGrid`? // See #6728, #4862, `test/bar-overflow-time-plot.html` const ecModel = model.ecModel; - if (ecModel && (scaleType === 'time' /*|| scaleType === 'interval' */)) { + if (ecModel && (scaleType === 'time' /* || scaleType === 'interval' */)) { const barSeriesModels = prepareLayoutBarSeries('bar', ecModel); let isBaseAxisAndHasBarSeries = false; @@ -147,7 +147,7 @@ function adjustScaleForOverflow( } // Precondition of calling this method: -// The scale extent has been initailized using series data extent via +// The scale extent has been initialized using series data extent via // `scale.setExtent` or `scale.unionExtentFromData`; export function niceScaleExtent( scale: Scale, @@ -364,7 +364,7 @@ export function getOptionCategoryInterval(model: Model interval // If the axis change is caused by chart resize, the cache should not - // be used. Otherwise some hiden labels might not be shown again. + // be used. Otherwise some hidden labels might not be shown again. && cache.axisExtent0 === axisExtent[0] && cache.axisExtent1 === axisExtent[1] ) { diff --git a/src/coord/cartesian/Grid.ts b/src/coord/cartesian/Grid.ts index 691effdd0e..d22ddef556 100644 --- a/src/coord/cartesian/Grid.ts +++ b/src/coord/cartesian/Grid.ts @@ -369,7 +369,7 @@ class Grid implements CoordinateSystemMaster { y: 0 }; - /// Create axis + // Create axis ecModel.eachComponent('xAxis', createAxisCreator('x'), this); ecModel.eachComponent('yAxis', createAxisCreator('y'), this); @@ -382,7 +382,7 @@ class Grid implements CoordinateSystemMaster { this._axesMap = axesMap; - /// Create cartesian2d + // Create cartesian2d each(axesMap.x, (xAxis, xAxisIndex) => { each(axesMap.y, (yAxis, yAxisIndex) => { const key = 'x' + xAxisIndex + 'y' + yAxisIndex; diff --git a/src/coord/cartesian/defaultAxisExtentFromData.ts b/src/coord/cartesian/defaultAxisExtentFromData.ts index 1ca8442446..736eafee91 100644 --- a/src/coord/cartesian/defaultAxisExtentFromData.ts +++ b/src/coord/cartesian/defaultAxisExtentFromData.ts @@ -141,7 +141,7 @@ function calculateFilteredExtent( let tarAxisRecord: AxisRecord; function addCondition(axis: Axis, axisRecord: AxisRecord) { - // But for simplicity and safty and performance, we only adopt this + // But for simplicity and safety and performance, we only adopt this // feature on category axis at present. const condExtent = axisRecord.condExtent; const rawExtentResult = axisRecord.rawExtentResult; diff --git a/src/coord/geo/Geo.ts b/src/coord/geo/Geo.ts index e0b44025f7..130d959163 100644 --- a/src/coord/geo/Geo.ts +++ b/src/coord/geo/Geo.ts @@ -137,7 +137,7 @@ class Geo extends View { // Ignore default aspect scale if projection exits. this.aspectScale = projection ? 1 : zrUtil.retrieve2(opt.aspectScale, defaultParams.aspectScale); - // Not invert longitute if projection exits. + // Not invert longitude if projection exits. this._invertLongitute = projection ? false : defaultParams.invertLongitute; } @@ -148,7 +148,7 @@ class Geo extends View { rect = rect.clone(); if (invertLongitute) { - // Longitute is inverted + // Longitude is inverted. rect.y = -rect.y - rect.height; } @@ -196,7 +196,7 @@ class Geo extends View { */ getGeoCoord(name: string): number[] { const region = this._regionsMap.get(name); - // calcualte center only on demand. + // Calculate center only on demand. return this._nameCoordMap.get(name) || (region && region.getCenter()); } diff --git a/src/coord/geo/GeoModel.ts b/src/coord/geo/GeoModel.ts index 796f77282e..c3dde67848 100644 --- a/src/coord/geo/GeoModel.ts +++ b/src/coord/geo/GeoModel.ts @@ -81,9 +81,9 @@ export interface GeoCommonOptionMixin extends RoamOptionMixin { // This parameter is used for scale this aspect aspectScale?: number; - ///// Layout with center and size - // If you wan't to put map in a fixed size box with right aspect ratio - // This two properties may more conveninet + // Layout with center and size + // If you want to put map in a fixed size box with right aspect ratio + // This two properties may be more convenient // Like: `40` or `'50%'`. layoutCenter?: (number | string)[]; // Like: `40` or `'50%'`. @@ -156,9 +156,9 @@ class GeoModel extends ComponentModel { // for geoJSON source: 0.75. aspectScale: null, - ///// Layout with center and size - // If you wan't to put map in a fixed size box with right aspect ratio - // This two properties may more conveninet + // /// Layout with center and size + // If you want to put map in a fixed size box with right aspect ratio + // This two properties may be more convenient // layoutCenter: [50%, 50%] // layoutSize: 100 diff --git a/src/coord/geo/GeoSVGResource.ts b/src/coord/geo/GeoSVGResource.ts index e0e6d5900b..b423f85839 100644 --- a/src/coord/geo/GeoSVGResource.ts +++ b/src/coord/geo/GeoSVGResource.ts @@ -55,7 +55,7 @@ export interface GeoSVGGraphicRecord { */ const REGION_AVAILABLE_SVG_TAG_MAP = createHashMap([ 'rect', 'circle', 'line', 'ellipse', 'polygon', 'polyline', 'path', - // are also enabled becuase some SVG might paint text itself, + // are also enabled because some SVG might paint text itself, // but still need to trigger events or tooltip. 'text', 'tspan', // is also enabled because this case: if multiple tags share one name @@ -168,7 +168,7 @@ export class GeoSVGResource implements GeoResource { // If both `svgWidth/svgHeight/viewBox` are specified in a SVG file, the transform rule will be: // 0. `boundingRect` is `(0, 0, svgWidth, svgHeight)`. Set it to Geo['_rect'] (View['_rect']). // 1. Make a transform from `viewBox` to `boundingRect`. - // Note: only suport `preserveAspectRatio 'xMidYMid'` here. That is, this transform will preserve + // Note: only support `preserveAspectRatio 'xMidYMid'` here. That is, this transform will preserve // the aspect ratio. // 2. Make a transform from boundingRect to Geo['_viewRect'] (View['_viewRect']) // (`Geo`/`View` will do this job). @@ -267,7 +267,7 @@ export class GeoSVGResource implements GeoResource { * So we maintain graphic elements in this module, and enables `view` to use/return these * graphics from/to the pool with it's uid. */ - useGraphic(hostKey: string /*, nameMap: NameMap */): GeoSVGGraphicRecord { + useGraphic(hostKey: string /* , nameMap: NameMap */): GeoSVGGraphicRecord { const usedRootMap = this._usedGraphicMap; let svgGraphic = usedRootMap.get(hostKey); diff --git a/src/coord/geo/Region.ts b/src/coord/geo/Region.ts index c29377ef1a..095efcd4b8 100644 --- a/src/coord/geo/Region.ts +++ b/src/coord/geo/Region.ts @@ -295,7 +295,7 @@ export class GeoSVGRegion extends Region { readonly type = 'geoSVG'; // Can only be used to calculate, but not be modified. - // Becuase this el may not belongs to this view, + // Because this el may not belong to this view, // but been displaying on some other view. private _elOnlyForCalculate: Element; diff --git a/src/coord/geo/fix/textCoord.ts b/src/coord/geo/fix/textCoord.ts index 813e26a44c..3c9647bc19 100644 --- a/src/coord/geo/fix/textCoord.ts +++ b/src/coord/geo/fix/textCoord.ts @@ -26,7 +26,7 @@ const coordsOffsetMap = { '广东': [0, -10], '香港': [10, 5], '澳门': [-10, 10], - //'北京': [-10, 0], + // '北京': [-10, 0], '天津': [5, 5] } as Dictionary; diff --git a/src/coord/geo/geoTypes.ts b/src/coord/geo/geoTypes.ts index db4477d9a7..b66cf6e182 100644 --- a/src/coord/geo/geoTypes.ts +++ b/src/coord/geo/geoTypes.ts @@ -76,7 +76,7 @@ type GeoJSONGeometry = type GeoJSONGeometryCompressed = // GeoJSONGeometryPoint // | GeoJSONGeometryMultiPoint - // Currenly only Polygon and MultiPolygon can be parsed from compression. + // Currently only Polygon and MultiPolygon can be parsed from compression. | GeoJSONGeometryPolygonCompressed | GeoJSONGeometryMultiPolygonCompressed | GeoJSONGeometryLineStringCompressed @@ -178,4 +178,4 @@ export interface GeoProjection { * project will be ignored if projectStream is given. */ stream?(outStream: ProjectionStream): ProjectionStream -} \ No newline at end of file +} diff --git a/src/coord/parallel/Parallel.ts b/src/coord/parallel/Parallel.ts index f8c472dad1..c694f55ff1 100644 --- a/src/coord/parallel/Parallel.ts +++ b/src/coord/parallel/Parallel.ts @@ -454,7 +454,7 @@ class Parallel implements CoordinateSystemMaster, CoordinateSystem { return {behavior: 'none', axisExpandWindow: axisExpandWindow}; } - // Conver the point from global to expand coordinates. + // Convert the point from global to expand coordinates. const pointCoord = point[pixelDimIndex] - layoutInfo.layoutBase - layoutInfo.axisExpandWindow0Pos; // For dragging operation convenience, the window should not be diff --git a/src/coord/parallel/ParallelModel.ts b/src/coord/parallel/ParallelModel.ts index 9044d313dd..edbe7c4846 100644 --- a/src/coord/parallel/ParallelModel.ts +++ b/src/coord/parallel/ParallelModel.ts @@ -70,7 +70,7 @@ class ParallelModel extends ComponentModel { dimensions: DimensionName[]; /** - * Coresponding to dimensions. + * Corresponding to dimensions. */ parallelAxisIndex: number[]; diff --git a/src/coord/scaleRawExtentInfo.ts b/src/coord/scaleRawExtentInfo.ts index d0753cc985..52f6b8d062 100644 --- a/src/coord/scaleRawExtentInfo.ts +++ b/src/coord/scaleRawExtentInfo.ts @@ -80,7 +80,7 @@ export class ScaleRawExtentInfo { } /** - * Parameters depending on ouside (like model, user callback) + * Parameters depending on outside (like model, user callback) * are prepared and fixed here. */ private _prepareParams( @@ -100,7 +100,7 @@ export class ScaleRawExtentInfo { const modelMinRaw = this._modelMinRaw = model.get('min', true); if (isFunction(modelMinRaw)) { - // This callback alway provide users the full data extent (before data filtered). + // This callback always provides users the full data extent (before data is filtered). this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw({ min: dataExtent[0], max: dataExtent[1] @@ -112,7 +112,7 @@ export class ScaleRawExtentInfo { const modelMaxRaw = this._modelMaxRaw = model.get('max', true); if (isFunction(modelMaxRaw)) { - // This callback alway provide users the full data extent (before data filtered). + // This callback always provides users the full data extent (before data is filtered). this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw({ min: dataExtent[0], max: dataExtent[1] @@ -285,7 +285,7 @@ const DATA_MIN_MAX_ATTR = { min: '_dataMin', max: '_dataMax' } as const; * (3) `coordSys.update` use it to finally decide the scale extent. * But the callback of `min`/`max` should not be called multiple times. * The code below should not be implemented repeatedly either. - * So we cache the result in the scale instance, which will be recreated at the begining + * So we cache the result in the scale instance, which will be recreated at the beginning * of the workflow (because `scale` instance will be recreated each round of the workflow). */ export function ensureScaleRawExtentInfo( diff --git a/src/core/CoordinateSystem.ts b/src/core/CoordinateSystem.ts index 1e58d66478..b1f59222c3 100644 --- a/src/core/CoordinateSystem.ts +++ b/src/core/CoordinateSystem.ts @@ -31,8 +31,8 @@ class CoordinateSystemManager { create(ecModel: GlobalModel, api: ExtensionAPI): void { let coordinateSystems: CoordinateSystemMaster[] = []; - zrUtil.each(coordinateSystemCreators, function (creater, type) { - const list = creater.create(ecModel, api); + zrUtil.each(coordinateSystemCreators, function (creator, type) { + const list = creator.create(ecModel, api); coordinateSystems = coordinateSystems.concat(list || []); }); diff --git a/src/core/Scheduler.ts b/src/core/Scheduler.ts index 4d67411a4c..745631111d 100644 --- a/src/core/Scheduler.ts +++ b/src/core/Scheduler.ts @@ -350,12 +350,12 @@ class Scheduler { } const performArgs: PerformArgs = scheduler.getPerformArgs(task, opt.block); // FIXME - // if intending to decalare `performRawSeries` in handlers, only + // if intending to declare `performRawSeries` in handlers, only // stream-independent (specifically, data item independent) operations can be - // performed. Because is a series is filtered, most of the tasks will not + // performed. Because if a series is filtered, most of the tasks will not // be performed. A stream-dependent operation probably cause wrong biz logic. // Perhaps we should not provide a separate callback for this case instead - // of providing the config `performRawSeries`. The stream-dependent operaions + // of providing the config `performRawSeries`. The stream-dependent operations // and stream-independent operations should better not be mixed. performArgs.skip = !stageHandler.performRawSeries && ecModel.isSeriesFiltered(task.context.model); @@ -499,8 +499,8 @@ class Scheduler { // we set the pipeline block. let errMsg = ''; if (__DEV__) { - errMsg = '"createOnAllSeries" do not supported for "overallReset", ' - + 'becuase it will block all streams.'; + errMsg = '"createOnAllSeries" is not supported for "overallReset", ' + + 'because it will block all streams.'; } assert(!stageHandler.createOnAllSeries, errMsg); if (seriesType) { @@ -509,10 +509,10 @@ class Scheduler { else if (getTargetSeries) { getTargetSeries(ecModel, api).each(createStub); } - // Otherwise, (usually it is legancy case), the overall task will only be - // executed when upstream dirty. Otherwise the progressive rendering of all + // Otherwise, (usually it is legacy case), the overall task will only be + // executed when upstream is dirty. Otherwise the progressive rendering of all // pipelines will be disabled unexpectedly. But it still needs stubs to receive - // dirty info from upsteam. + // dirty info from upstream. else { overallProgress = false; each(ecModel.getSeries(), createStub); diff --git a/src/core/echarts.ts b/src/core/echarts.ts index 65ac63f857..3724b48af5 100644 --- a/src/core/echarts.ts +++ b/src/core/echarts.ts @@ -152,7 +152,7 @@ const PRIORITY_PROCESSOR_SERIES_FILTER = 800; // So data stack stage should be in front of data processing stage. const PRIORITY_PROCESSOR_DATASTACK = 900; // "Data filter" will block the stream, so it should be -// put at the begining of data processing. +// put at the beginning of data processing. const PRIORITY_PROCESSOR_FILTER = 1000; const PRIORITY_PROCESSOR_DEFAULT = 2000; const PRIORITY_PROCESSOR_STATISTIC = 5000; @@ -328,8 +328,8 @@ type EChartsInitOpts = { useCoarsePointer?: boolean, pointerSize?: number, ssr?: boolean, - width?: number, - height?: number + width?: number | string, + height?: number | string }; class ECharts extends Eventful { @@ -541,8 +541,8 @@ class ECharts extends Eventful { // Do not update coordinate system here. Because that coord system update in // each frame is not a good user experience. So we follow the rule that - // the extent of the coordinate system is determin in the first frame (the - // frame is executed immedietely after task reset. + // the extent of the coordinate system is determined in the first frame (the + // frame is executed immediately after task reset. // this._coordSysMgr.update(ecModel, api); // console.log('--- ec frame visual ---', remainTime); @@ -1382,9 +1382,9 @@ class ECharts extends Eventful { this._zr.flush(); } else if (flush !== false && env.browser.weChat) { - // In WeChat embeded browser, `requestAnimationFrame` and `setInterval` + // In WeChat embedded browser, `requestAnimationFrame` and `setInterval` // hang when sliding page (on touch event), which cause that zr does not - // refresh util user interaction finished, which is not expected. + // refresh until user interaction finished, which is not expected. // But `dispatchAction` may be called too frequently when pan on touch // screen, which impacts performance if do not throttle them. this._throttledZrFlush(); @@ -1474,7 +1474,7 @@ class ECharts extends Eventful { : ecModel.eachSeries(doPrepare); function doPrepare(model: ComponentModel): void { - // By defaut view will be reused if possible for the case that `setOption` with "notMerge" + // By default view will be reused if possible for the case that `setOption` with "notMerge" // mode and need to enable transition animation. (Usually, when they have the same id, or // especially no id but have the same type & name & index. See the `model.id` generation // rule in `makeIdAndName` and `viewId` generation rule here). @@ -1677,20 +1677,20 @@ class ECharts extends Eventful { // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call. // Create new coordinate system each update - // In LineView may save the old coordinate system and use it to get the orignal point + // In LineView may save the old coordinate system and use it to get the original point. coordSysMgr.create(ecModel, api); scheduler.performDataProcessorTasks(ecModel, payload); // Current stream render is not supported in data process. So we can update // stream modes after data processing, where the filtered data is used to - // deteming whether use progressive rendering. + // determine whether to use progressive rendering. updateStreamModes(this, ecModel); // We update stream modes before coordinate system updated, then the modes info // can be fetched when coord sys updating (consider the barGrid extent fix). But // the drawback is the full coord info can not be fetched. Fortunately this full - // coord is not requied in stream mode updater currently. + // coord is not required in stream mode updater currently. coordSysMgr.update(ecModel, api); clearColorPalette(ecModel); @@ -2019,8 +2019,8 @@ class ECharts extends Eventful { ecIns.trigger('rendered', params); - // The `finished` event should not be triggered repeatly, - // so it should only be triggered when rendering indeed happend + // The `finished` event should not be triggered repeatedly, + // so it should only be triggered when rendering indeed happens // in zrender. (Consider the case that dipatchAction is keep // triggering when mouse move). if ( @@ -2221,7 +2221,7 @@ class ECharts extends Eventful { chartView.group.silent = !!seriesModel.get('silent'); // Should not call markRedraw on group, because it will disable zrender - // increamental render (alway render from the __startIndex each frame) + // incremental render (always render from the __startIndex each frame) // chartView.group.markRedraw(); updateBlend(seriesModel, chartView); @@ -2335,7 +2335,7 @@ class ECharts extends Eventful { chartView.eachRendered((el: Displayable) => { // FIXME marker and other components if (!el.isGroup) { - // DONT mark the element dirty. In case element is incremental and don't wan't to rerender. + // DON'T mark the element dirty. In case element is incremental and don't want to rerender. el.style.blend = blendMode; } }); @@ -2447,7 +2447,7 @@ class ECharts extends Eventful { savePathStates(el); } - // Only updated on changed element. In case element is incremental and don't wan't to rerender. + // Only updated on changed element. In case element is incremental and don't want to rerender. // TODO, a more proper way? if (el.__dirty) { const prevStates = el.prevStates; @@ -2471,7 +2471,7 @@ class ECharts extends Eventful { } } - // The use higlighted and selected flag to toggle states. + // Use highlighted and selected flag to toggle states. if (el.__dirty) { applyElementStates(el); } @@ -2734,7 +2734,7 @@ export function disConnect(groupId: string): void { } /** - * Alias and backword compat + * Alias and backward compatibility */ export const disconnect = disConnect; @@ -3016,7 +3016,7 @@ export const registerTransform = registerExternalTransform; -// Buitlin global visual +// Builtin global visual registerVisual(PRIORITY_VISUAL_GLOBAL, seriesStyleTask); registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataStyleTask); registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataColorPaletteTask); diff --git a/src/core/impl.ts b/src/core/impl.ts index 4fecd09cc8..ffc8f21893 100644 --- a/src/core/impl.ts +++ b/src/core/impl.ts @@ -21,7 +21,7 @@ import { error } from '../util/log'; // Implementation of exported APIs. For example registerMap, getMap. -// The implentations will be registered when installing the component. +// The implementations will be registered when installing the component. // Avoid these code being bundled to the core module. const implsStore: Record = {}; @@ -43,4 +43,4 @@ export function getImpl(name: string) { } } return implsStore[name]; -} \ No newline at end of file +} diff --git a/src/core/task.ts b/src/core/task.ts index 08d7e23ff6..6a25c1c127 100644 --- a/src/core/task.ts +++ b/src/core/task.ts @@ -331,11 +331,11 @@ export class Task { } setOutputEnd(end: number): void { - // This only happend in dataTask, dataZoom, map, currently. + // This only happens in dataTask, dataZoom, map, currently. // where dataZoom do not set end each time, but only set - // when reset. So we should record the setted end, in case + // when reset. So we should record the set end, in case // that the stub of dataZoom perform again and earse the - // setted end by upstream. + // set end by upstream. this._outputDueEnd = this._settedOutputEnd = end; } @@ -384,7 +384,7 @@ const iterator: TaskDataIterator = (function () { -/////////////////////////////////////////////////////////// +// ----------------------------------------------------------------------------- // For stream debug (Should be commented out after used!) // @usage: printTask(this, 'begin'); // @usage: printTask(this, null, {someExtraProp}); diff --git a/src/data/DataStore.ts b/src/data/DataStore.ts index bb9dcf179c..abc3bb4b9e 100644 --- a/src/data/DataStore.ts +++ b/src/data/DataStore.ts @@ -91,7 +91,7 @@ export interface DataStoreDimensionDefine { * For example, in `[{bb: 124, aa: 543}, ...]`, "aa" and "bb" is "object property". * * Deliberately name it as "property" rather than "name" to prevent it from been used in - * SOURCE_FORMAT_ARRAY_ROWS, becuase if it comes from series, it probably + * SOURCE_FORMAT_ARRAY_ROWS, because if it comes from series, it probably * can not be shared by different series. */ property?: string; @@ -527,7 +527,7 @@ class DataStore { } /** - * Retreive the index with given raw data index + * Retrieve the index with given raw data index. */ indexOfRawIndex(rawIndex: number): number { if (rawIndex >= this._rawCount || rawIndex < 0) { @@ -566,11 +566,11 @@ class DataStore { /** - * Retreive the index of nearest value + * Retrieve the index of nearest value. * @param dim * @param value * @param [maxDistance=Infinity] - * @return If and only if multiple indices has + * @return If and only if multiple indices have * the same value, they are put to the result. */ indicesOfNearest( diff --git a/src/data/SeriesData.ts b/src/data/SeriesData.ts index 83421ccb53..9267177778 100644 --- a/src/data/SeriesData.ts +++ b/src/data/SeriesData.ts @@ -53,7 +53,7 @@ const map = zrUtil.map; const CtorInt32Array = typeof Int32Array === 'undefined' ? Array : Int32Array; // Use prefix to avoid index to be the same as otherIdList[idx], -// which will cause weird udpate animation. +// which will cause weird update animation. const ID_PREFIX = 'e\0\0'; const INDEX_NOT_FOUND = -1; @@ -159,12 +159,12 @@ class SeriesData< * Name of dimensions list of SeriesData. * * @caution Carefully use the index of this array. - * Becuase when DataStore is an extra high dimension(>30) dataset. We will only pick + * Because when DataStore is an extra high dimension(>30) dataset. We will only pick * the used dimensions from DataStore to avoid performance issue. */ readonly dimensions: SeriesDimensionName[]; - // Infomation of each data dimension, like data type. + // Information of each data dimension, like data type. private _dimInfos: Record; private _dimOmitted = false; @@ -192,7 +192,7 @@ class SeriesData< /** * @readonly - * Host tree if List is used to store tree ndoes. + * Host tree if List is used to store tree nodes. */ tree?: Tree; @@ -208,7 +208,7 @@ class SeriesData< // Global visual properties after visual coding private _visual: Dictionary = {}; - // Globel layout properties. + // Global layout properties. private _layout: Dictionary = {}; // Item visual properties after visual coding @@ -217,7 +217,7 @@ class SeriesData< // Item layout properties after layout private _itemLayouts: any[] = []; - // Graphic elemnents + // Graphic elements private _graphicEls: Element[] = []; // key: dim, value: extent @@ -357,7 +357,7 @@ class SeriesData< * Because only those dimensions will have auto-generated dimension names if not * have a user-specified name, and other dimensions will get a return of null/undefined. * - * @notice Becuause of this reason, should better use `getDimensionIndex` instead, for examples: + * @notice Because of this reason, should better use `getDimensionIndex` instead, for examples: * ```js * const val = data.getStore().get(data.getDimensionIndex(dim), dataIdx); * ``` @@ -375,7 +375,7 @@ class SeriesData< return this.dimensions[dimIdx]; } - // Retrieve from series dimension definition becuase it probably contains + // Retrieve from series dimension definition because it probably contains // generated dimension name (like 'x', 'y'). const dimName = this._dimIdxToName.get(dimIdx); if (dimName != null) { @@ -419,7 +419,7 @@ class SeriesData< * + If there is the same concrete dim name defined in `series.dimensions` or `dataset.dimensions`, * it means that concrete name. * + If not, it will be converted to a number, which means the index of the dimension. - * (why? because of the backward compatbility. We have been tolerating number-like string in + * (why? because of the backward compatibility. We have been tolerating number-like string in * dimension setting, although now it seems that it is not a good idea.) * For example, `visualMap[i].dimension: "1"` is the same meaning as `visualMap[i].dimension: 1`, * if no dimension name is defined as `"1"`. @@ -427,7 +427,7 @@ class SeriesData< * For example, it can be be default name `"x"`, `"y"`, `"z"`, `"lng"`, `"lat"`, `"angle"`, `"radius"`, * or customized in `dimensions` property of option like `"age"`. * - * @return recogonized `DimensionIndex`. Otherwise return null/undefined (means that dim is `DimensionName`). + * @return recognized `DimensionIndex`. Otherwise return null/undefined (means that dim is `DimensionName`). */ private _recognizeDimIndex(dim: DimensionLoose): DimensionIndex { if (zrUtil.isNumber(dim) @@ -447,7 +447,7 @@ class SeriesData< const dimIdx = this.getDimensionIndex(dim); if (__DEV__) { if (dimIdx == null) { - throw new Error('Unkown dimension ' + dim); + throw new Error('Unknown dimension ' + dim); } } return dimIdx; @@ -580,7 +580,7 @@ class SeriesData< * [NaN, 43, 1], * ['-', 'asdf', 0] * ] - * Each item is exaclty cooresponding to a dimension. + * Each item is exactly corresponding to a dimension. */ appendValues(values: any[][], names?: string[]): void { const {start, end} = this._store.appendValues(values, names.length); @@ -690,7 +690,7 @@ class SeriesData< /** * Calculate extent on a filtered data might be time consuming. - * Approximate extent is only used for: calculte extent of filtered data outside. + * Approximate extent is only used for: calculate extent of filtered data outside. */ setApproximateExtent(extent: [number, number], dim: SeriesDimensionLoose): void { dim = this.getDimension(dim); @@ -723,7 +723,7 @@ class SeriesData< } /** - * @return Never be null/undefined. `number` will be converted to string. Becuase: + * @return Never be null/undefined. `number` will be converted to string. Because: * In most cases, name is used in display, where returning a string is more convenient. * In other cases, name is used in query (see `indexOfName`), where we can keep the * rule that name `2` equals to name `'2'`. @@ -750,7 +750,7 @@ class SeriesData< } /** - * @return Never null/undefined. `number` will be converted to string. Becuase: + * @return Never null/undefined. `number` will be converted to string. Because: * In all cases having encountered at present, id is used in making diff comparison, which * are usually based on hash map. We can keep the rule that the internal id are always string * (treat `2` is the same as `'2'`) to make the related logic simple. @@ -816,7 +816,7 @@ class SeriesData< } /** - * If value is NaN. Inlcuding '-' + * If value is NaN. Including '-' * Only check the coord dimensions. */ hasValue(idx: number): boolean { @@ -833,7 +833,7 @@ class SeriesData< } /** - * Retreive the index with given name + * Retrieve the index with given name */ indexOfName(name: string): number { for (let i = 0, len = this._store.count(); i < len; i++) { @@ -874,7 +874,7 @@ class SeriesData< } /** - * Retreive the index of nearest value + * Retrieve the index of nearest value * @param dim * @param value * @param [maxDistance=Infinity] @@ -1069,8 +1069,8 @@ class SeriesData< ); // If do shallow clone here, if there are too many stacked series, - // it still cost lots of memory, becuase `_store.dimensions` are not shared. - // We should consider there probably be shallow clone happen in each sereis + // it still cost lots of memory, because `_store.dimensions` are not shared. + // We should consider there probably be shallow clone happen in each series // in consequent filter/map. this._store.modify( dimIndices, @@ -1124,7 +1124,7 @@ class SeriesData< */ // TODO: Type of data item getItemModel(idx: number): Model > { const hostModel = this.hostModel; @@ -1433,7 +1433,7 @@ class SeriesData< }; /** - * Data in excludeDimensions is copied, otherwise transfered. + * Data in excludeDimensions is copied, otherwise transferred. */ cloneListForMapAndSample = function (original: SeriesData): SeriesData { const list = new SeriesData( diff --git a/src/data/Source.ts b/src/data/Source.ts index a530a50811..7e27cc6aa8 100644 --- a/src/data/Source.ts +++ b/src/data/Source.ts @@ -319,7 +319,7 @@ function determineSourceDimensions( let dimensionsDetectedCount; let startIndex: number; - // PEDING: could data be null/undefined here? + // PENDING: Could data be null/undefined here? // currently, if `dataset.source` not specified, error thrown. // if `series.data` not specified, nothing rendered without error thrown. // Should test these cases. @@ -415,7 +415,7 @@ function objectRowsCollectDimensions(data: OptionSourceDataObjectRows): Dimensio // Consider dimensions defined like ['A', 'price', 'B', 'price', 'C', 'price'], // which is reasonable. But dimension name is duplicated. -// Returns undefined or an array contains only object without null/undefiend or string. +// Returns undefined or an array contains only object without null/undefined or string. function normalizeDimensionsOption(dimensionsDefine: DimensionDefinitionLoose[]): DimensionDefinition[] { if (!dimensionsDefine) { // The meaning of null/undefined is different from empty array. @@ -432,8 +432,8 @@ function normalizeDimensionsOption(dimensionsDefine: DimensionDefinitionLoose[]) }; // User can set null in dimensions. - // We dont auto specify name, othewise a given name may - // cause it be refered unexpectedly. + // We don't auto specify name, otherwise a given name may + // cause it to be referred unexpectedly. if (item.name == null) { return item; } diff --git a/src/data/helper/SeriesDataSchema.ts b/src/data/helper/SeriesDataSchema.ts index 67e9f1fc9a..975f92ba23 100644 --- a/src/data/helper/SeriesDataSchema.ts +++ b/src/data/helper/SeriesDataSchema.ts @@ -157,8 +157,8 @@ export class SeriesDataSchema { // If retrieving data by index, // use to determine whether data can be shared. - // (Becuase in this case there might be no dimension name defined in dataset, but indices always exists). - // (indices are always 0, 1, 2, ..., so we can ignore them to shorten the hash). + // (Because in this case there might be no dimension name defined in dataset, but indices always exists). + // (Indices are always 0, 1, 2, ..., so we can ignore them to shorten the hash). // Otherwise if retrieving data by property name (like `data: [{aa: 123, bb: 765}, ...]`), // use in hash. if (willRetrieveDataByName diff --git a/src/data/helper/createDimensions.ts b/src/data/helper/createDimensions.ts index cd44440aa7..d480e43da7 100644 --- a/src/data/helper/createDimensions.ts +++ b/src/data/helper/createDimensions.ts @@ -114,7 +114,7 @@ export default function prepareSeriesDataSchema( const resultList: SeriesDimensionDefine[] = []; const dimCount = getDimCount(source, sysDims, dimsDef, opt.dimensionsCount); - // Try to ignore unsed dimensions if sharing a high dimension datastore + // Try to ignore unused dimensions if sharing a high dimension datastore // 30 is an experience value. const omitUnusedDimensions = opt.canOmitUnusedDimensions && shouldOmitUnusedDimensions(dimCount); @@ -142,7 +142,7 @@ export default function prepareSeriesDataSchema( const userDimName = dimDefItem.name; if (userDimName != null && dataDimNameMap.get(userDimName) != null) { // Only if `series.dimensions` is defined in option - // displayName, will be set, and dimension will be diplayed vertically in + // displayName, will be set, and dimension will be displayed vertically in // tooltip by default. resultItem.name = resultItem.displayName = userDimName; } @@ -188,7 +188,7 @@ export default function prepareSeriesDataSchema( }); }); - // Apply templetes and default order from `sysDims`. + // Apply templates and default order from `sysDims`. let availDimIdx = 0; each(sysDims, function (sysDimItemRaw) { let coordDim: DimensionName; @@ -313,8 +313,8 @@ export default function prepareSeriesDataSchema( // ]}, // series: {type: 'pie'} // } - // The first colum should better be treated as a "ordinal" although it - // might not able to be detected as an "ordinal" by `guessOrdinal`. + // The first column should better be treated as a "ordinal" although it + // might not be detected as an "ordinal" by `guessOrdinal`. || (resultItem.isExtraCoord && (resultItem.otherDims.itemName != null || resultItem.otherDims.seriesName != null @@ -368,7 +368,7 @@ function removeDuplication(result: SeriesDimensionDefine[]) { // But // (1) custom series should be considered. where other dims // may be visited. -// (2) sometimes user need to calcualte bubble size or use visualMap +// (2) sometimes user need to calculate bubble size or use visualMap // on other dimensions besides coordSys needed. // So, dims that is not used by system, should be shared in data store? function getDimCount( @@ -399,10 +399,9 @@ function genCoordDimName( map: HashMap, fromZero: boolean ) { - const mapData = map.data; - if (fromZero || mapData.hasOwnProperty(name)) { + if (fromZero || map.hasKey(name)) { let i = 0; - while (mapData.hasOwnProperty(name + i)) { + while (map.hasKey(name + i)) { i++; } name += i; diff --git a/src/data/helper/dataProvider.ts b/src/data/helper/dataProvider.ts index 37247edb2c..caf047fb91 100644 --- a/src/data/helper/dataProvider.ts +++ b/src/data/helper/dataProvider.ts @@ -399,7 +399,7 @@ export function getRawSourceDataCounter( ): RawSourceDataCounter { const method = rawSourceDataCounterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; if (__DEV__) { - assert(method, 'Do not suppport count on "' + sourceFormat + '", "' + seriesLayoutBy + '".'); + assert(method, 'Do not support count on "' + sourceFormat + '", "' + seriesLayoutBy + '".'); } return method; } @@ -446,7 +446,7 @@ const rawSourceValueGetterMap: Partial unknown; const valueParserMap = createHashMap({ 'number': function (val): number { - // Do not use `numericToNumber` here. We have by defualt `numericToNumber`. + // Do not use `numericToNumber` here. We have `numericToNumber` by default. // Here the number parser can have loose rule: // enable to cut suffix: "120px" => 120, "14%" => 14. return parseFloat(val as string); @@ -138,10 +138,10 @@ export class SortOrderComparator { private _incomparable: number; private _resultLT: -1 | 1; /** - * @param order by defualt: 'asc' - * @param incomparable by defualt: Always on the tail. + * @param order by default: 'asc' + * @param incomparable by default: Always on the tail. * That is, if 'asc' => 'max', if 'desc' => 'min' - * See the definition of "incomparable" in [SORT_COMPARISON_RULE] + * See the definition of "incomparable" in [SORT_COMPARISON_RULE]. */ constructor(order: 'asc' | 'desc', incomparable: 'min' | 'max') { const isDesc = order === 'desc'; @@ -235,14 +235,14 @@ export type RelationalOperator = OrderRelationOperator | 'eq' | 'ne'; * "non-numeric-string" vs "others": "others" is treated as "incomparable". * "incomparable" will be seen as -Infinity or Infinity (depends on the settings). * MEMO: - * non-numeric string sort make sence when need to put the items with the same tag together. + * Non-numeric string sort makes sense when we need to put the items with the same tag together. * But if we support string sort, we still need to avoid the misleading like `'2' > '12'`, * So we treat "numeric-string" sorted by number order rather than string comparison. * * * [CHECK_LIST_OF_THE_RULE_DESIGN] * + Do not support string comparison until required. And also need to - * void the misleading of "2" > "12". + * avoid the misleading of "2" > "12". * + Should avoid the misleading case: * `" 22 " gte "22"` is `true` but `" 22 " eq "22"` is `false`. * + JS bad case should be avoided: null <= 0, [] <= 0, ' ' <= 0, ... diff --git a/src/data/helper/dimensionHelper.ts b/src/data/helper/dimensionHelper.ts index e4d9899ca0..7a4276fafc 100644 --- a/src/data/helper/dimensionHelper.ts +++ b/src/data/helper/dimensionHelper.ts @@ -163,8 +163,8 @@ export function summarizeDimensions( summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra; const encodeLabel = encode.label; - // FIXME `encode.label` is not recommanded, because formatter can not be set - // in this way. Use label.formatter instead. May be remove this approach someday. + // FIXME `encode.label` is not recommended, because formatter cannot be set + // in this way. Use label.formatter instead. Maybe remove this approach someday. if (encodeLabel && encodeLabel.length) { defaultedLabel = encodeLabel.slice(); } diff --git a/src/data/helper/sourceHelper.ts b/src/data/helper/sourceHelper.ts index e0ef9ddd0b..f0277d3a1d 100644 --- a/src/data/helper/sourceHelper.ts +++ b/src/data/helper/sourceHelper.ts @@ -148,9 +148,9 @@ export function makeSeriesEncodeForAxisCoordSys( // ??? TODO give a better default series name rule? // especially when encode x y specified. - // consider: when mutiple series share one dimension + // consider: when multiple series share one dimension // category axis, series name should better use - // the other dimsion name. On the other hand, use + // the other dimension name. On the other hand, use // both dimensions name. } // In category way, the first category axis. @@ -274,8 +274,8 @@ export function makeSeriesEncodeForNameBased( encode.value = [idxResult.v]; // `potentialNameDimIndex` has highest priority. const nameDimIndex = potentialNameDimIndex != null ? potentialNameDimIndex : idxResult.n; - // By default, label use itemName in charts. - // So we dont set encodeLabel here. + // By default, label uses itemName in charts. + // So we don't set encodeLabel here. encode.itemName = [nameDimIndex]; encode.seriesName = [nameDimIndex]; } diff --git a/src/data/helper/sourceManager.ts b/src/data/helper/sourceManager.ts index 611238a67f..254a3e2468 100644 --- a/src/data/helper/sourceManager.ts +++ b/src/data/helper/sourceManager.ts @@ -51,7 +51,7 @@ type DataStoreMap = Dictionary; * (3) Transforms should specify `metaRawOption` in each output, just like they can be * declared in `root-dataset`. * (4) At present only support visit source in `SERIES_LAYOUT_BY_COLUMN` in transforms. - * That is for reducing complexity in transfroms. + * That is for reducing complexity in transforms. * PENDING: Whether to provide transposition transform? * * [IMPLEMENTAION_MEMO]: @@ -236,7 +236,7 @@ export class SourceManager { const dimensions = retrieve2(newMetaRawOption.dimensions, upMetaRawOption.dimensions); // We share source with dataset as much as possible - // to avoid extra memroy cost of high dimensional data. + // to avoid extra memory cost of high dimensional data. const needsCreateSource = seriesLayoutBy !== upMetaRawOption.seriesLayoutBy || !!sourceHeader !== !!upMetaRawOption.sourceHeader || dimensions; @@ -334,7 +334,7 @@ export class SourceManager { return true; } - // All sourceList is from the some upsteam. + // All sourceList is from the some upstream. const upSourceMgrList = this._getUpstreamSourceManagers(); for (let i = 0; i < upSourceMgrList.length; i++) { const upSrcMgr = upSourceMgrList[i]; @@ -350,8 +350,8 @@ export class SourceManager { } /** - * @param sourceIndex By defualt 0, means "main source". - * Most cases there is only one source. + * @param sourceIndex By default 0, means "main source". + * In most cases there is only one source. */ getSource(sourceIndex?: number): Source { sourceIndex = sourceIndex || 0; @@ -423,13 +423,13 @@ export class SourceManager { } /** - * PEDING: Is it fast enough? + * PENDING: Is it fast enough? * If no upstream, return empty array. */ private _getUpstreamSourceManagers(): SourceManager[] { // Always get the relationship from the raw option. // Do not cache the link of the dependency graph, so that - // no need to update them when change happen. + // there is no need to update them when change happens. const sourceHost = this._sourceHost; if (isSeries(sourceHost)) { @@ -467,7 +467,7 @@ export class SourceManager { } // Call this method after `super.init` and `super.mergeOption` to -// disable the transform merge, but do not disable transfrom clone from rawOption. +// disable the transform merge, but do not disable transform clone from rawOption. export function disableTransformOptionMerge(datasetModel: DatasetModel): void { const transformOption = datasetModel.option.transform; transformOption && setAsPrimitive(datasetModel.option.transform); diff --git a/src/data/helper/transform.ts b/src/data/helper/transform.ts index cfb2b188be..62bcea0b2d 100644 --- a/src/data/helper/transform.ts +++ b/src/data/helper/transform.ts @@ -95,8 +95,8 @@ export class ExternalSource { * This instance is to be exposed to users. * (1) DO NOT mount private members on this instance directly. * If we have to use private members, we can make them in closure or use `makeInner`. - * (2) "soruce header count" is not provided to transform, because it's complicated to manage - * header and dimensions definition in each transfrom. Source header are all normalized to + * (2) "source header count" is not provided to transform, because it's complicated to manage + * header and dimensions definition in each transform. Source headers are all normalized to * dimensions definitions in transforms and their downstreams. */ @@ -143,7 +143,7 @@ export class ExternalSource { /** * Only support by dimension index. * No need to support by dimension name in transform function, - * becuase transform function is not case-specific, no need to use name literally. + * because transform function is not case-specific, no need to use name literally. */ retrieveValue(dataIndex: number, dimIndex: DimensionIndex): OptionDataValue { return; @@ -180,8 +180,8 @@ function createExternalSource(internalSource: Source, externalTransform: Externa // [MEMO] // Create a new dimensions structure for exposing. // Do not expose all dimension info to users directly. - // Becuase the dimension is probably auto detected from data and not might reliable. - // Should not lead the transformers to think that is relialbe and return it. + // Because the dimension is probably auto detected from data and not might reliable. + // Should not lead the transformers to think that is reliable and return it. // See [DIMENSION_INHERIT_RULE] in `sourceManager.ts`. const dimensions = [] as ExternalDimensionDefinition[]; const dimsByName = {} as Dictionary; @@ -196,11 +196,11 @@ function createExternalSource(internalSource: Source, externalTransform: Externa displayName: dimDef.displayName }; dimensions.push(dimDefExt); - // Users probably not sepcify dimension name. For simplicity, data transform - // do not generate dimension name. + // Users probably do not specify dimension name. For simplicity, data transform + // does not generate dimension name. if (name != null) { // Dimension name should not be duplicated. - // For simplicity, data transform forbid name duplication, do not generate + // For simplicity, data transform forbids name duplication, do not generate // new name like module `completeDimensions.ts` did, but just tell users. let errMsg = ''; if (hasOwn(dimsByName, name)) { @@ -505,7 +505,7 @@ function applySingleDataTransform( && !result.dimensions ) { const startIndex = firstUpSource.startIndex; - // We copy the header of upstream to the result becuase: + // We copy the header of upstream to the result, because: // (1) The returned data always does not contain header line and can not be used // as dimension-detection. In this case we can not use "detected dimensions" of // upstream directly, because it might be detected based on different `seriesLayoutBy`. diff --git a/src/export/api.ts b/src/export/api.ts index 4b777a2370..3c6e9d4b21 100644 --- a/src/export/api.ts +++ b/src/export/api.ts @@ -41,7 +41,7 @@ export {use} from '../extension'; export {setPlatformAPI} from 'zrender/src/core/platform'; -//////////////// Helper Methods ///////////////////// +// --------------------- Helper Methods --------------------- export {default as parseGeoJSON} from '../coord/geo/parseGeoJson'; export {default as parseGeoJson} from '../coord/geo/parseGeoJson'; @@ -55,7 +55,7 @@ export * as util from './api/util'; export {default as env} from 'zrender/src/core/env'; -//////////////// Export for Exension Usage //////////////// +// --------------------- Export for Extension Usage --------------------- // export {SeriesData}; export {SeriesData as List}; // TODO: Compatitable with exists echarts-gl code export {default as Model} from '../model/Model'; @@ -72,12 +72,12 @@ export { export {brushSingle as innerDrawElementOnCanvas} from 'zrender/src/canvas/graphic'; -//////////////// Deprecated Extension Methods //////////////// +// --------------------- Deprecated Extension Methods --------------------- // Should use `ComponentModel.extend` or `class XXXX extend ComponentModel` to create class. // Then use `registerComponentModel` in `install` parameter when `use` this extension. For example: // class Bar3DModel extends ComponentModel {} -// export function install(registers) { regsiters.registerComponentModel(Bar3DModel); } +// export function install(registers) { registers.registerComponentModel(Bar3DModel); } // echarts.use(install); export function extendComponentModel(proto: object): ComponentModel { const Model = (ComponentModel as ComponentModelConstructor).extend(proto) as any; diff --git a/src/export/api/helper.ts b/src/export/api/helper.ts index 3d63a7b140..92a4ddf66a 100644 --- a/src/export/api/helper.ts +++ b/src/export/api/helper.ts @@ -40,7 +40,7 @@ import { createTextStyle as innerCreateTextStyle } from '../../label/labelStyle' import { DisplayState, TextCommonOption } from '../../util/types'; /** - * Create a muti dimension List structure from seriesModel. + * Create a multi dimension List structure from seriesModel. */ export function createList(seriesModel: SeriesModel) { return createSeriesData(null, seriesModel); @@ -86,9 +86,9 @@ export function createScale(dataExtent: number[], option: object | AxisBaseModel // FIXME // Currently AxisModelCommonMixin has nothing to do with the // the requirements of `axisHelper.createScaleByModel`. For - // example the method `getCategories` and `getOrdinalMeta` - // are required for `'category'` axis, and ecModel are required - // for `'time'` axis. But occationally echarts-gl happened + // example the methods `getCategories` and `getOrdinalMeta` + // are required for `'category'` axis, and ecModel is required + // for `'time'` axis. But occasionally echarts-gl happened // to only use `'value'` axis. // zrUtil.mixin(axisModel, AxisModelCommonMixin); } @@ -103,7 +103,7 @@ export function createScale(dataExtent: number[], option: object | AxisBaseModel /** * Mixin common methods to axis model, * - * Inlcude methods + * Include methods * `getFormattedLabels() => Array.` * `getCategories() => Array.` * `getMin(origin: boolean) => number` @@ -127,4 +127,4 @@ export function createTextStyle( ) { opts = opts || {}; return innerCreateTextStyle(textStyleModel, null, null, opts.state !== 'normal'); -} \ No newline at end of file +} diff --git a/src/export/charts.ts b/src/export/charts.ts index 1faf7c1b39..4356de9147 100644 --- a/src/export/charts.ts +++ b/src/export/charts.ts @@ -49,7 +49,7 @@ export {install as SunburstChart} from '../chart/sunburst/install'; export {install as CustomChart} from '../chart/custom/install'; -// // NOTE: Don't use XXXSeriesOption from 'option.ts' becuase they have been injected markPoint, markLine etc. +// // NOTE: Don't use XXXSeriesOption from 'option.ts' because they have been injected markPoint, markLine etc. // export {LineSeriesOption} from '../chart/line/LineSeries'; // export {BarSeriesOption} from '../chart/bar/BarSeries'; // export {ScatterSeriesOption} from '../chart/scatter/ScatterSeries'; @@ -96,4 +96,4 @@ export { ThemeRiverSeriesOption, SunburstSeriesOption, CustomSeriesOption -} from './option'; \ No newline at end of file +} from './option'; diff --git a/src/export/core.ts b/src/export/core.ts index 9c3107ecf1..c47986981c 100644 --- a/src/export/core.ts +++ b/src/export/core.ts @@ -30,7 +30,7 @@ use(installLabelLayout); // Export necessary types -export {ZRColor as Color, Payload} from '../util/types'; +export {ZRColor as Color, Payload, ECElementEvent} from '../util/types'; export {LinearGradientObject} from 'zrender/src/graphic/LinearGradient'; export {RadialGradientObject} from 'zrender/src/graphic/RadialGradient'; export {PatternObject, ImagePatternObject, SVGPatternObject} from 'zrender/src/graphic/Pattern'; @@ -115,4 +115,4 @@ export type ComposeOption = ComposeUnitOption & { baseOption?: ComposeUnitOption options?: ComposeUnitOption[] - }; \ No newline at end of file + }; diff --git a/src/i18n/langUA.ts b/src/i18n/langUK.ts similarity index 100% rename from src/i18n/langUA.ts rename to src/i18n/langUK.ts diff --git a/src/label/labelGuideHelper.ts b/src/label/labelGuideHelper.ts index 13008a7642..fdb70665e1 100644 --- a/src/label/labelGuideHelper.ts +++ b/src/label/labelGuideHelper.ts @@ -321,7 +321,7 @@ function nearestPointOnPath(pt: Point, path: PathProxy, out: Point) { return minDist; } -// Temporal varible for intermediate usage. +// Temporal variable for intermediate usage. const pt0 = new Point(); const pt1 = new Point(); const pt2 = new Point(); @@ -673,4 +673,4 @@ export function getLabelLineStatesModels statesModels[stateName] = itemModel.getModel([stateName, labelLineName]); } return statesModels; -} \ No newline at end of file +} diff --git a/src/label/labelStyle.ts b/src/label/labelStyle.ts index 622d574bed..007f080c4c 100644 --- a/src/label/labelStyle.ts +++ b/src/label/labelStyle.ts @@ -263,7 +263,7 @@ function setLabelStyle( // PENDING: if there is many requirements that emphasis position // need to be different from normal position, we might consider - // auto slient is those cases. + // auto silent is those cases. textContent.silent = !!normalModel.getShallow('silent'); // Keep x and y if (textContent.style.x != null) { diff --git a/src/layout/barGrid.ts b/src/layout/barGrid.ts index 9ca8442e9a..726c084f82 100644 --- a/src/layout/barGrid.ts +++ b/src/layout/barGrid.ts @@ -347,7 +347,7 @@ function doCalBarWidthAndOffset(seriesInfoList: LayoutSeriesInfo[]) { if (maxWidth && maxWidth < finalWidth) { finalWidth = Math.min(maxWidth, remainedWidth); } - // `minWidth` has higher priority. `minWidth` decide that wheter the + // `minWidth` has higher priority. `minWidth` decide that whether the // bar is able to be visible. So `minWidth` should not be restricted // by `maxWidth` or `remainedWidth` (which is from `bandWidth`). In // the extreme cases for `value` axis, bars are allowed to overlap @@ -363,7 +363,7 @@ function doCalBarWidthAndOffset(seriesInfoList: LayoutSeriesInfo[]) { } else { // `barMinWidth/barMaxWidth` has higher priority than `barWidth`, as - // CSS does. Becuase barWidth can be a percent value, where + // CSS does. Because barWidth can be a percent value, where // `barMaxWidth` can be used to restrict the final width. let finalWidth = column.width; if (maxWidth) { diff --git a/src/layout/barPolar.ts b/src/layout/barPolar.ts index bc63fcba99..48d8b4fa95 100644 --- a/src/layout/barPolar.ts +++ b/src/layout/barPolar.ts @@ -100,7 +100,7 @@ function barLayoutPolar(seriesType: string, ecModel: GlobalModel, api: Extension const valueDim = data.mapDimension(valueAxis.dim); const baseDim = data.mapDimension(baseAxis.dim); - const stacked = isDimensionStacked(data, valueDim /*, baseDim*/); + const stacked = isDimensionStacked(data, valueDim /* , baseDim */); const clampLayout = baseAxis.dim !== 'radius' || !seriesModel.get('roundCap', true); diff --git a/src/model/Component.ts b/src/model/Component.ts index e7728f0f1b..889159ff4d 100644 --- a/src/model/Component.ts +++ b/src/model/Component.ts @@ -50,7 +50,7 @@ const inner = makeInner<{ class ComponentModel extends Model { - // [Caution]: Becuase this class or desecendants can be used as `XXX.extend(subProto)`, + // [Caution]: Because this class or desecendants can be used as `XXX.extend(subProto)`, // the class members must not be initialized in constructor or declaration place. // Otherwise there is bad case: // class A {xxx = 1;} @@ -72,10 +72,10 @@ class ComponentModel extends Mode /** * Because simplified concept is probably better, series.name (or component.name) - * has been having too many resposibilities: + * has been having too many responsibilities: * (1) Generating id (which requires name in option should not be modified). * (2) As an index to mapping series when merging option or calling API (a name - * can refer to more then one components, which is convinient is some case). + * can refer to more than one component, which is convenient is some cases). * (3) Display. * @readOnly But injected */ @@ -281,7 +281,7 @@ class ComponentModel extends Mode getReferringComponents(mainType: ComponentMainType, opt: QueryReferringOpt): { // Always be array rather than null/undefined, which is convenient to use. models: ComponentModel[]; - // Whether target compoent specified + // Whether target component is specified specified: boolean; } { const indexKey = (mainType + 'Index') as keyof Opt; diff --git a/src/model/Global.ts b/src/model/Global.ts index cadc98b20d..b845d7263d 100644 --- a/src/model/Global.ts +++ b/src/model/Global.ts @@ -164,7 +164,7 @@ class GlobalModel extends Model { private _componentsMap: HashMap; /** - * `_componentsMap` might have "hole" becuase of remove. + * `_componentsMap` might have "hole" because of remove. * So save components count for a certain mainType here. */ private _componentsCount: HashMap; @@ -275,7 +275,7 @@ class GlobalModel extends Model { // By design, if `setOption(option2)` at the second time, and `option2` is a `ECUnitOption`, // it should better not have the same props with `MediaUnit['option']`. - // Becuase either `option2` or `MediaUnit['option']` will be always merged to "current option" + // Because either `option2` or `MediaUnit['option']` will be always merged to "current option" // rather than original "baseOption". If they both override a prop, the result might be // unexpected when media state changed after `setOption` called. // If we really need to modify a props in each `MediaUnit['option']`, use the full version @@ -427,7 +427,7 @@ import { ${seriesImportName} } from 'echarts/charts'; echarts.use([${seriesImportName}]);`); } else { - error(`Unkown series ${subType}`); + error(`Unknown series ${subType}`); } } } @@ -787,7 +787,7 @@ echarts.use([${seriesImportName}]);`); /** * After filtering, series may be different - * frome raw series. + * from raw series. */ eachSeries( cb: (this: T, series: SeriesModel, rawSeriesIndex: number) => void, @@ -817,7 +817,7 @@ echarts.use([${seriesImportName}]);`); /** * After filtering, series may be different. - * frome raw series. + * from raw series. */ eachSeriesByType( subType: ComponentSubType, @@ -921,8 +921,8 @@ echarts.use([${seriesImportName}]);`); }; initBase = function (ecModel: GlobalModel, baseOption: ECUnitOption & AriaOptionMixin): void { - // Using OPTION_INNER_KEY to mark that this option can not be used outside, - // i.e. `chart.setOption(chart.getModel().option);` is forbiden. + // Using OPTION_INNER_KEY to mark that this option cannot be used outside, + // i.e. `chart.setOption(chart.getModel().option);` is forbidden. ecModel.option = {} as ECUnitOption; ecModel.option[OPTION_INNER_KEY] = OPTION_INNER_VALUE; diff --git a/src/model/Model.ts b/src/model/Model.ts index 54babe69f0..542123ce31 100644 --- a/src/model/Model.ts +++ b/src/model/Model.ts @@ -47,7 +47,7 @@ interface Model extends LineStyleMixin, ItemStyleMixin, TextStyleMixin, AreaStyleMixin {} class Model { // TODO: TYPE use unknown instead of any? - // [Caution]: Becuase this class or desecendants can be used as `XXX.extend(subProto)`, + // [Caution]: Because this class or desecendants can be used as `XXX.extend(subProto)`, // the class members must not be initialized in constructor or declaration place. // Otherwise there is bad case: // class A {xxx = 1;} diff --git a/src/model/OptionManager.ts b/src/model/OptionManager.ts index 21af55f54b..ef795ba58e 100644 --- a/src/model/OptionManager.ts +++ b/src/model/OptionManager.ts @@ -127,7 +127,7 @@ class OptionManager { // the mapping can not be 100% consistent with ecModel, which probably brings // potential bug! - // The first merge is delayed, becuase in most cases, users do not call `setOption` twice. + // The first merge is delayed, because in most cases, users do not call `setOption` twice. // let fakeCmptsMap = this._fakeCmptsMap; // if (!fakeCmptsMap) { // fakeCmptsMap = this._fakeCmptsMap = createHashMap(); @@ -140,7 +140,7 @@ class OptionManager { // For simplicity, timeline options and media options do not support merge, // that is, if you `setOption` twice and both has timeline options, the latter - // timeline opitons will not be merged to the formers, but just substitude them. + // timeline options will not be merged to the former, but just substitute them. if (newParsedOption.timelineOptions.length) { optionBackup.timelineOptions = newParsedOption.timelineOptions; } @@ -392,10 +392,10 @@ function applyMediaQuery(query: MediaQuery, ecWidth: number, ecHeight: number): const realMap = { width: ecWidth, height: ecHeight, - aspectratio: ecWidth / ecHeight // lowser case for convenientce. + aspectratio: ecWidth / ecHeight // lower case for convenience. }; - let applicatable = true; + let applicable = true; each(query, function (value: number, attr) { const matched = attr.match(QUERY_REG); @@ -408,11 +408,11 @@ function applyMediaQuery(query: MediaQuery, ecWidth: number, ecHeight: number): const realAttr = matched[2].toLowerCase(); if (!compare(realMap[realAttr as keyof typeof realMap], value, operator)) { - applicatable = false; + applicable = false; } }); - return applicatable; + return applicable; } function compare(real: number, expect: number, operator: string): boolean { @@ -449,9 +449,9 @@ function indicesEquals(indices1: number[], indices2: number[]): boolean { * this might be the only simple way to implement that feature. * * MEMO: We've considered some other approaches: - * 1. Each model handle its self restoration but not uniform treatment. + * 1. Each model handles its self restoration but not uniform treatment. * (Too complex in logic and error-prone) - * 2. Use a shadow ecModel. (Performace expensive) + * 2. Use a shadow ecModel. (Performance expensive) * * FIXME: A possible solution: * Add a extra level of model for each component model. The inheritance chain would be: diff --git a/src/model/Series.ts b/src/model/Series.ts index 4c9b14186e..e2a5577b9e 100644 --- a/src/model/Series.ts +++ b/src/model/Series.ts @@ -57,6 +57,7 @@ import { defaultSeriesFormatTooltip } from '../component/tooltip/seriesFormatToo import {ECSymbol} from '../util/symbol'; import {Group} from '../util/graphic'; import {LegendIconParams} from '../component/legend/LegendModel'; +import {dimPermutations} from '../component/marker/MarkAreaView'; const inner = modelUtil.makeInner<{ data: SeriesData @@ -72,7 +73,7 @@ export const SERIES_UNIVERSAL_TRANSITION_PROP = '__universalTransitionEnabled'; interface SeriesModel { /** - * Convinient for override in extended class. + * Convenient for override in extended class. * Implement it if needed. */ preventIncremental(): boolean; @@ -99,7 +100,11 @@ interface SeriesModel { /** * Get position for marker */ - getMarkerPosition(value: ScaleDataValue[]): number[]; + getMarkerPosition( + value: ScaleDataValue[], + dims?: typeof dimPermutations[number], + startingAtTick?: boolean + ): number[]; /** * Get legend icon symbol according to each series type @@ -122,7 +127,7 @@ interface SeriesModel { class SeriesModel extends ComponentModel { - // [Caution]: Becuase this class or desecendants can be used as `XXX.extend(subProto)`, + // [Caution]: Because this class or desecendants can be used as `XXX.extend(subProto)`, // the class members must not be initialized in constructor or declaration place. // Otherwise there is bad case: // class A {xxx = 1;} @@ -315,7 +320,7 @@ class SeriesModel extends ComponentMode /** * Init a data structure from data related option in series - * Must be overriden. + * Must be overridden. */ getInitialData(option: Opt, ecModel: GlobalModel): SeriesData { return; @@ -422,7 +427,7 @@ class SeriesModel extends ComponentMode /** * Get base axis if has coordinate system and has axis. * By default use coordSys.getBaseAxis(); - * Can be overrided for some chart. + * Can be overridden for some chart. * @return {type} description */ getBaseAxis(): Axis { @@ -611,7 +616,7 @@ class SeriesModel extends ComponentMode const selectedMap = option.selectedMap; for (let i = 0; i < len; i++) { const dataIndex = innerDataIndices[i]; - // TODO diffrent types of data share same object. + // TODO different types of data share same object. const nameOrId = getSelectionKey(data, dataIndex); selectedMap[nameOrId] = true; this._selectedDataIndicesMap[nameOrId] = data.getRawIndex(dataIndex); diff --git a/src/model/internalComponentCreator.ts b/src/model/internalComponentCreator.ts index ad8dfe5cc7..df53e66f2d 100644 --- a/src/model/internalComponentCreator.ts +++ b/src/model/internalComponentCreator.ts @@ -28,9 +28,9 @@ import { isComponentIdInternal } from '../util/model'; // It is added since echarts 3. // (3) Why keep supporting "internal component" in global model rather than // make each type components manage their models themselves? -// Because a protential feature that reproduce a chart from a diffferent chart instance -// might be useful in some BI analysis scenario, where the entire state need to be -// retrieved from the current chart instance. So we'd bettern manage the all of the +// Because a potential feature that reproduces a chart from a different chart instance +// might be useful in some BI analysis scenario, where the entire state needs to be +// retrieved from the current chart instance. So we'd better manage all of the // state universally. // (4) Internal component always merged in "replaceMerge" approach, that is, if the existing // internal components does not matched by a new option with the same id, it will be diff --git a/src/model/mixin/dataFormat.ts b/src/model/mixin/dataFormat.ts index 76a8fff1c1..2c39816235 100644 --- a/src/model/mixin/dataFormat.ts +++ b/src/model/mixin/dataFormat.ts @@ -211,8 +211,8 @@ type TooltipFormatResult = // compat it? // type TooltipFormatResultLegacyObject = { // // `html` means the markup language text, either in 'html' or 'richText'. -// // The name `html` is not appropriate becuase in 'richText' it is not a HTML -// // string. But still support it for backward compat. +// // The name `html` is not appropriate because in 'richText' it is not a HTML +// // string. But still support it for backward compatibility. // html: string; // markers: Dictionary; // }; diff --git a/src/processor/dataStack.ts b/src/processor/dataStack.ts index 824e630594..fb08154262 100644 --- a/src/processor/dataStack.ts +++ b/src/processor/dataStack.ts @@ -131,8 +131,8 @@ function calculateStack(stackInfoList: StackInfo[]) { stackStrategy === 'all' // single stack group || (stackStrategy === 'positive' && val > 0) || (stackStrategy === 'negative' && val < 0) - || (stackStrategy === 'samesign' && sum >= 0 && val > 0) // All positive stack - || (stackStrategy === 'samesign' && sum <= 0 && val < 0) // All negative stack + || (stackStrategy === 'samesign' && sum > 0 && val > 0) // All positive stack + || (stackStrategy === 'samesign' && sum < 0 && val < 0) // All negative stack ) { // The sum has to be very small to be affected by the // floating arithmetic problem. An incorrect result will probably diff --git a/src/scale/Interval.ts b/src/scale/Interval.ts index 866051dcf2..3fc00cf142 100644 --- a/src/scale/Interval.ts +++ b/src/scale/Interval.ts @@ -79,8 +79,8 @@ class IntervalScale = Dictionary> e setInterval(interval: number): void { this._interval = interval; - // Dropped auto calculated niceExtent and use user setted extent - // We assume user wan't to set both interval, min, max to get a better result + // Dropped auto calculated niceExtent and use user-set extent. + // We assume user wants to set both interval, min, max to get a better result. this._niceExtent = this._extent.slice() as [number, number]; this._intervalPrecision = helper.getIntervalPrecision(interval); diff --git a/src/scale/Time.ts b/src/scale/Time.ts index 5b097953e3..2458490b2e 100644 --- a/src/scale/Time.ts +++ b/src/scale/Time.ts @@ -18,7 +18,7 @@ */ /* -* A third-party license is embeded for some of the code in this file: +* A third-party license is embedded for some of the code in this file: * The "scaleLevels" was originally copied from "d3.js" with some * modifications made for this project. * (See more details in the comment on the definition of "scaleLevels" below.) @@ -31,9 +31,9 @@ // [About UTC and local time zone]: // In most cases, `number.parseDate` will treat input data string as local time // (except time zone is specified in time string). And `format.formateTime` returns -// local time by default. option.useUTC is false by default. This design have -// concidered these common case: -// (1) Time that is persistent in server is in UTC, but it is needed to be diplayed +// local time by default. option.useUTC is false by default. This design has +// considered these common cases: +// (1) Time that is persistent in server is in UTC, but it is needed to be displayed // in local time by default. // (2) By default, the input data string (e.g., '2011-01-02') should be displayed // as its original time, without any time difference. @@ -371,7 +371,7 @@ function isUnitValueSame( function getDateInterval(approxInterval: number, daysInMonth: number) { approxInterval /= ONE_DAY; return approxInterval > 16 ? 16 - // Math.floor(daysInMonth / 2) + 1 // In this case we only want one tick betwen two month. + // Math.floor(daysInMonth / 2) + 1 // In this case we only want one tick between two months. : approxInterval > 7.5 ? 7 // TODO week 7 or day 8? : approxInterval > 3.5 ? 4 : approxInterval > 1.5 ? 2 : 1; diff --git a/src/util/ECEventProcessor.ts b/src/util/ECEventProcessor.ts index 3b1e20e088..a0d8e91a20 100644 --- a/src/util/ECEventProcessor.ts +++ b/src/util/ECEventProcessor.ts @@ -145,7 +145,7 @@ export class ECEventProcessor implements EventProcessor { } afterTrigger() { - // Make sure the eventInfo wont be used in next trigger. + // Make sure the eventInfo won't be used in next trigger. this.eventInfo = null; } }; diff --git a/src/util/KDTree.ts b/src/util/KDTree.ts index e769acbf0a..0f521b04a8 100644 --- a/src/util/KDTree.ts +++ b/src/util/KDTree.ts @@ -42,10 +42,10 @@ class KDTreeNode { * @constructor * @alias module:echarts/data/KDTree * @param {Array} points List of points. - * each point needs an array property to repesent the actual data + * each point needs an array property to represent the actual data * @param {Number} [dimension] * Point dimension. - * Default will use the first point's length as dimensiont + * Default will use the first point's length as dimension. */ class KDTree { @@ -76,7 +76,7 @@ class KDTree { } /** - * Resursively build the tree + * Recursively build the tree. */ private _buildTree(points: T[], left: number, right: number, axis: number): KDTreeNode { if (right < left) { @@ -284,4 +284,4 @@ class KDTree { } -export default KDTree; \ No newline at end of file +export default KDTree; diff --git a/src/util/clazz.ts b/src/util/clazz.ts index b340fdb624..06249ab0b5 100644 --- a/src/util/clazz.ts +++ b/src/util/clazz.ts @@ -185,12 +185,12 @@ export function enableClassCheck(target: CheckableConstructor): void { }; } -// superCall should have class info, which can not be fetch from 'this'. +// superCall should have class info, which can not be fetched from 'this'. // Consider this case: // class A has method f, // class B inherits class A, overrides method f, f call superApply('f'), -// class C inherits class B, do not overrides method f, -// then when method of class C is called, dead loop occured. +// class C inherits class B, does not override method f, +// then when method of class C is called, dead loop occurred. function superCall(this: any, context: any, methodName: string, ...args: any): any { return this.superClass.prototype[methodName].apply(context, args); } @@ -242,11 +242,11 @@ export function enableClassManagement( clz: Constructor ): Constructor { - // `type` should not be a "instance memeber". + // `type` should not be a "instance member". // If using TS class, should better declared as `static type = 'series.pie'`. // otherwise users have to mount `type` on prototype manually. // For backward compat and enable instance visit type via `this.type`, - // we stil support fetch `type` from prototype. + // we still support fetch `type` from prototype. const componentFullType = (clz as any).type || clz.prototype.type; if (componentFullType) { diff --git a/src/util/conditionalExpression.ts b/src/util/conditionalExpression.ts index 9cbb36863f..9f7a613578 100644 --- a/src/util/conditionalExpression.ts +++ b/src/util/conditionalExpression.ts @@ -30,17 +30,17 @@ import { // PENDING: // (1) Support more parser like: `parser: 'trim'`, `parser: 'lowerCase'`, `parser: 'year'`, `parser: 'dayOfWeek'`? -// (2) Support piped parser ? +// (2) Support piped parser? // (3) Support callback parser or callback condition? -// (4) At present do not support string expression yet but only stuctured expression. +// (4) At present do not support string expression yet but only structured expression. /** * The structured expression considered: * (1) Literal simplicity - * (2) Sementic displayed clearly + * (2) Semantic displayed clearly * - * Sementic supports: + * Semantic supports: * (1) relational expression * (2) logical expression * @@ -148,8 +148,8 @@ const RELATIONAL_EXPRESSION_OP_ALIAS_MAP = { '!=': 'ne', '<>': 'ne' - // Might mileading for sake of the different between '==' and '===', - // So dont support them. + // Might be misleading for sake of the difference between '==' and '===', + // so don't support them. // '==': 'eq', // '===': 'seq', // '!==': 'sne' diff --git a/src/util/decal.ts b/src/util/decal.ts index 83d6772b15..8304762389 100644 --- a/src/util/decal.ts +++ b/src/util/decal.ts @@ -155,7 +155,7 @@ export function createOrUpdatePatternFromDecal( (pattern as SVGPatternObject).svgHeight = pSize.height; /** - * Get minumum length that can make a repeatable pattern. + * Get minimum length that can make a repeatable pattern. * * @return {Object} pattern width and height */ @@ -169,7 +169,7 @@ export function createOrUpdatePatternFromDecal( * |-- -- -- -- -- -- -- -- ... * |--- --- --- --- --- ... * |-- -- -- -- -- -- -- -- ... - * So the minumum length of X is 15, + * So the minimum length of X is 15, * which is the least common multiple of `3 + 2` and `2 + 1` * |--- --- --- |--- --- ... * |-- -- -- -- -- |-- -- -- ... @@ -417,7 +417,7 @@ function normalizeDashArrayY(dash: DecalDashArrayY): number[] { * For example, a line with [4, 1] has a dash line of 4 and a space of 1 after * that, so the block length of this line is 5. * - * @param {number[][]} dash dash arrary of X or Y + * @param {number[][]} dash dash array of X or Y * @return {number[]} block length of each line */ function getLineBlockLengthX(dash: number[][]): number[] { diff --git a/src/util/format.ts b/src/util/format.ts index 8aa00685ad..afe9625b42 100644 --- a/src/util/format.ts +++ b/src/util/format.ts @@ -212,7 +212,7 @@ export function getTooltipMarker(inOpt: ColorString | GetTooltipMarkerOpt, extra else { // Should better not to auto generate style name by auto-increment number here. // Because this util is usually called in tooltip formatter, which is probably - // called repeatly when mouse move and the auto-increment number increases fast. + // called repeatedly when mouse move and the auto-increment number increases fast. // Users can make their own style name by theirselves, make it unique and readable. const markerId = opt.markerId || 'markerX'; return { diff --git a/src/util/graphic.ts b/src/util/graphic.ts index 0c09c04fae..70ad6d8b83 100644 --- a/src/util/graphic.ts +++ b/src/util/graphic.ts @@ -142,10 +142,10 @@ export function registerShape(name: string, ShapeClass: {new(): Path}) { * (2) In the features like `custom series`, `graphic component`, the user input * `{tpye: 'xxx'}` does not only specify shapes but also specify other graphic * elements like `'group'`, `'text'`, `'image'` or event `'path'`. Those names - * are reserved names, that is, if some user register a shape named `'image'`, + * are reserved names, that is, if some user registers a shape named `'image'`, * the shape will not be used. If we intending to add some more reserved names * in feature, that might bring break changes (disable some existing user shape - * names). But that case probably rearly happen. So we dont make more mechanism + * names). But that case probably rarely happens. So we don't make more mechanism * to resolve this issue here. * * @param name @@ -430,8 +430,8 @@ export function groupTransition( } export function clipPointsByRect(points: vector.VectorArray[], rect: ZRRectLike): number[][] { - // FIXME: this way migth be incorrect when grpahic clipped by a corner. - // and when element have border. + // FIXME: This way might be incorrect when graphic clipped by a corner + // and when element has a border. return map(points, function (point) { let x = point[0]; x = mathMax(x, rect.x); @@ -527,7 +527,7 @@ export function lineLineIntersect( const ny = b2y - b1y; // `vec_m` and `vec_n` are parallel iff - // exising `k` such that `vec_m = k · vec_n`, equivalent to `vec_m X vec_n = 0`. + // existing `k` such that `vec_m = k · vec_n`, equivalent to `vec_m X vec_n = 0`. const nmCrossProduct = crossProduct2d(nx, ny, mx, my); if (nearZero(nmCrossProduct)) { return false; @@ -634,7 +634,7 @@ export function traverseElements(els: Element | Element[] | undefined | null, cb } } -// Register built-in shapes. These shapes might be overwirtten +// Register built-in shapes. These shapes might be overwritten // by users, although we do not recommend that. registerShape('circle', Circle); registerShape('ellipse', Ellipse); @@ -669,4 +669,4 @@ export { OrientedBoundingRect, Point, Path -}; \ No newline at end of file +}; diff --git a/src/util/layout.ts b/src/util/layout.ts index 1c30e72948..31445d83e0 100644 --- a/src/util/layout.ts +++ b/src/util/layout.ts @@ -302,13 +302,13 @@ export function getLayoutRect( * Logic: * 1. Scale (against origin point in parent coord) * 2. Rotate (against origin point in parent coord) - * 3. Traslate (with el.position by this method) - * So this method only fixes the last step 'Traslate', which does not affect + * 3. Translate (with el.position by this method) + * So this method only fixes the last step 'Translate', which does not affect * scaling and rotating. * - * If be called repeatly with the same input el, the same result will be gotten. + * If be called repeatedly with the same input el, the same result will be gotten. * - * Return true if the layout happend. + * Return true if the layout happened. * * @param el Should have `getBoundingRect` method. * @param positionInfo diff --git a/src/util/model.ts b/src/util/model.ts index 3fa332a02b..7b6ca499dd 100644 --- a/src/util/model.ts +++ b/src/util/model.ts @@ -132,9 +132,9 @@ export const TEXT_STYLE_OPTIONS = [ // ]); /** - * The method do not ensure performance. + * The method does not ensure performance. * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] - * This helper method retieves value from data. + * This helper method retrieves value from data. */ export function getDataItemValue( dataItem: OptionDataItem @@ -154,8 +154,8 @@ export function isDataItemOption(dataItem: OptionDataItem): boolean { // && !(dataItem[0] && isObject(dataItem[0]) && !(dataItem[0] instanceof Array)); } -// Compatible with previous definition: id could be number (but not recommanded). -// number and string are trade the same when compare. +// Compatible with previous definition: id could be number (but not recommended). +// number and string are treated the same when compared. // number id will not be converted to string in option. // number id will be converted to string in component instance id. export interface MappingExistingItem { @@ -201,17 +201,17 @@ type MappingToExistsMode = 'normalMerge' | 'replaceMerge' | 'replaceAll'; * * Mode "replaceMege": * (1) Only the id mapped components will be merged. - * (2) Other existing components (except internal compoonets) will be removed. + * (2) Other existing components (except internal components) will be removed. * (3) Other new options will be used to create new component. - * (4) The index of the existing compoents will not be modified. + * (4) The index of the existing components will not be modified. * That means their might be "hole" after the removal. * The new components are created first at those available index. * * Mode "replaceAll": * This mode try to support that reproduce an echarts instance from another * echarts instance (via `getOption`) in some simple cases. - * In this senario, the `result` index are exactly the consistent with the `newCmptOptions`, - * which ensures the compoennt index referring (like `xAxisIndex: ?`) corrent. That is, + * In this scenario, the `result` index are exactly the consistent with the `newCmptOptions`, + * which ensures the component index referring (like `xAxisIndex: ?`) corrent. That is, * the "hole" in `newCmptOptions` will also be kept. * On the contrary, other modes try best to eliminate holes. * PENDING: This is an experimental mode yet. @@ -270,7 +270,7 @@ export function mappingToExists( makeIdAndName(result); // The array `result` MUST NOT contain elided items, otherwise the - // forEach will ommit those items and result in incorrect result. + // forEach will omit those items and result in incorrect result. return result; } @@ -286,7 +286,7 @@ function prepareResult( } // Do not use native `map` to in case that the array `existings` - // contains elided items, which will be ommited. + // contains elided items, which will be omitted. for (let index = 0; index < existings.length; index++) { const existing = existings[index]; // Because of replaceMerge, `existing` may be null/undefined. @@ -423,7 +423,7 @@ function mappingInReplaceAllMode( ): void { each(newCmptOptions, function (cmptOption) { // The feature "reproduce" requires "hole" will also reproduced - // in case that compoennt index referring are broken. + // in case that component index referring are broken. result.push({ newOption: cmptOption, brandNew: true, @@ -482,7 +482,7 @@ function makeIdAndName( return; } - // name can be overwitten. Consider case: axis.name = '20km'. + // Name can be overwritten. Consider case: axis.name = '20km'. // But id generated by name will not be changed, which affect // only in that case: setOption with 'not merge mode' and view // instance will be recreated, which can be accepted. @@ -490,7 +490,7 @@ function makeIdAndName( ? makeComparableKey(opt.name) : existing ? existing.name - // Avoid diffferent series has the same name, + // Avoid that different series has the same name, // because name may be used like in color pallet. : DUMMY_COMPONENT_NAME_PREFIX + index; @@ -912,7 +912,7 @@ export const SINGLE_REFERRING: QueryReferringOpt = { useDefault: true, enableAll export const MULTIPLE_REFERRING: QueryReferringOpt = { useDefault: false, enableAll: true, enableNone: true }; export type QueryReferringOpt = { - // Whether to use the first componet as the default if none of index/id/name are specified. + // Whether to use the first component as the default if none of index/id/name are specified. useDefault?: boolean; // Whether to enable `'all'` on index option. enableAll?: boolean; @@ -1093,4 +1093,4 @@ export function interpolateRawValues( } return interpolated; } -} \ No newline at end of file +} diff --git a/src/util/number.ts b/src/util/number.ts index bf5b2562f0..cd6f42994b 100644 --- a/src/util/number.ts +++ b/src/util/number.ts @@ -18,7 +18,7 @@ */ /* -* A third-party license is embeded for some of the code in this file: +* A third-party license is embedded for some of the code in this file: * The method "quantile" was copied from "d3.js". * (See more details in the comment of the method below.) * The use of the source code of this file is also subject to the terms @@ -220,7 +220,7 @@ export function getPixelPrecision(dataExtent: [number, number], pixelExtent: [nu /** * Get a data of given precision, assuring the sum of percentages * in valueList is 1. - * The largest remainer method is used. + * The largest remainder method is used. * https://en.wikipedia.org/wiki/Largest_remainder_method * * @param valueList a list of all data @@ -241,7 +241,7 @@ export function getPercentWithPrecision(valueList: number[], idx: number, precis /** * Get a data of given precision, assuring the sum of percentages * in valueList is 1. - * The largest remainer method is used. + * The largest remainder method is used. * https://en.wikipedia.org/wiki/Largest_remainder_method * * @param valueList a list of all data @@ -342,7 +342,7 @@ const TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})( * + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00', * all of which will be treated as local time if time zone is not specified * (see ). - * + Or other string format, including (all of which will be treated as loacal time): + * + Or other string format, including (all of which will be treated as local time): * '2012', '2012-3-1', '2012/3/1', '2012/03/01', * '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123' * + a timestamp, which represent a time in UTC. @@ -365,7 +365,7 @@ export function parseDate(value: unknown): Date { return new Date(NaN); } - // Use local time when no timezone offset specifed. + // Use local time when no timezone offset is specified. if (!match[8]) { // match[n] can only be string or undefined. // But take care of '12' + 1 => '121'. @@ -583,7 +583,7 @@ export function reformIntervals(list: IntervalItem[]): IntervalItem[] { } /** - * [Numberic is defined as]: + * [Numeric is defined as]: * `parseFloat(val) == val` * For example: * numeric: @@ -623,7 +623,7 @@ export function getRandomIdBase(): number { } /** - * Get the greatest common dividor + * Get the greatest common divisor. * * @param {number} a one number * @param {number} b the other number @@ -636,7 +636,7 @@ export function getGreatestCommonDividor(a: number, b: number): number { } /** - * Get the least common multiple + * Get the least common multiple. * * @param {number} a one number * @param {number} b the other number diff --git a/src/util/states.ts b/src/util/states.ts index f3886cd78a..1748ef6f72 100644 --- a/src/util/states.ts +++ b/src/util/states.ts @@ -209,7 +209,7 @@ export function setStatesFlag(el: ECElement, stateName: DisplayState) { /** * If we reuse elements when rerender. - * DONT forget to clearStates before we update the style and shape. + * DON'T forget to clearStates before we update the style and shape. * Or we may update on the wrong state instead of normal state. */ export function clearStates(el: Element) { @@ -239,7 +239,7 @@ function getFromStateStyle( for (let i = 0; i < el.animators.length; i++) { const animator = el.animators[i]; if (animator.__fromStateTransition - // Dont consider the animation to emphasis state. + // Don't consider the animation to emphasis state. && animator.__fromStateTransition.indexOf(toStateName) < 0 && animator.targetName === 'style') { animator.saveTo(fromState, props); @@ -365,7 +365,8 @@ function elementStateProxy(this: Displayable, stateName: string, targetStates?: } return state; } -/**FI + +/** * Set hover style (namely "emphasis style") of element. * @param el Should not be `zrender/graphic/Group`. * @param focus 'self' | 'selfInSeries' | 'series' @@ -842,7 +843,7 @@ export function setStatesStylesFromModel( /** * * Set element as highlight / downplay dispatcher. - * It will be checked when element recieved mouseover event or from highlight action. + * It will be checked when element received mouseover event or from highlight action. * It's in change of all highlight/downplay behavior of it's children. * * @param el @@ -898,9 +899,9 @@ export function enableComponentHighDownFeatures( } /** - * Support hightlight/downplay record on each elements. + * Support highlight/downplay record on each elements. * For the case: hover highlight/downplay (legend, visualMap, ...) and - * user triggerred hightlight/downplay should not conflict. + * user triggered highlight/downplay should not conflict. * Only all of the highlightDigit cleared, return to normal. * @param {string} highlightKey * @return {number} highlightDigit diff --git a/src/util/styleCompat.ts b/src/util/styleCompat.ts index d70a6017c9..32bf54bdcd 100644 --- a/src/util/styleCompat.ts +++ b/src/util/styleCompat.ts @@ -43,7 +43,7 @@ export function isEC4CompatibleStyle( // So we provide: // `legacy: true` force make compat. // `legacy: false`, force do not compat. - // `legacy` not set: auto detect wheter legacy. + // `legacy` not set: auto detect whether legacy. // But in this case we do not compat (difficult to detect and rare case): // Becuse custom series and graphic component support "merge", users may firstly // only set `textStrokeWidth` style or secondly only set `text`. @@ -63,7 +63,7 @@ export function isEC4CompatibleStyle( /** * `EC4CompatibleStyle` is style that might be in echarts4 format or echarts5 format. * @param hostStyle The properties might be modified. - * @return If be text el, `textContentStyle` and `textConfig` will not be retured. + * @return If be text el, `textContentStyle` and `textConfig` will not be returned. * Otherwise a `textContentStyle` and `textConfig` will be created, whose props area * retried from the `hostStyle`. */ @@ -93,11 +93,11 @@ export function convertFromEC4CompatibleStyle(hostStyle: ZRStyleProps, elType: s textContent = { type: 'text', style: textContentStyle, - // ec4 do not support rectText trigger. - // And when text postion is different in normal and emphasis + // ec4 does not support rectText trigger. + // And when text position is different in normal and emphasis // => hover text trigger emphasis; // => text position changed, leave mouse pointer immediately; - // That might cause state incorrect. + // That might cause incorrect state. silent: true }; textConfig = {}; @@ -138,7 +138,7 @@ function convertEC4CompatibleRichItem(out: TextStylePropsPart, richItem: Diction // on a rect means `borderColor: 4` on the rect and `borderColor: 10` on an attached // richText in ec5. // (2) `out === richItem` if and only if `out` is text el or rich item. - // So we can overwite existing props in `out` since textXXX has higher priority. + // So we can overwrite existing props in `out` since textXXX has higher priority. richItem.font = richItem.textFont || richItem.font; hasOwn(richItem, 'textStrokeWidth') && (out.lineWidth = richItem.textStrokeWidth); hasOwn(richItem, 'textAlign') && (out.align = richItem.textAlign); diff --git a/src/util/symbol.ts b/src/util/symbol.ts index 602ea48e5c..fed92641e5 100644 --- a/src/util/symbol.ts +++ b/src/util/symbol.ts @@ -171,7 +171,7 @@ const Arrow = graphic.Path.extend({ }); /** - * Map of path contructors + * Map of path constructors */ // TODO Use function to build symbol path. const symbolCtors: Dictionary = { diff --git a/src/util/types.ts b/src/util/types.ts index 3e9eb31cf5..56c7b6983b 100644 --- a/src/util/types.ts +++ b/src/util/types.ts @@ -357,7 +357,7 @@ export type OrdinalNumber = number; // The number mapped from each OrdinalRawVal * ```js * { ordinalNumbers: [2, 5, 3, 4] } * ``` - * means that ordinal 2 should be diplayed on tick 0, + * means that ordinal 2 should be displayed on tick 0, * ordinal 5 should be displayed on tick 1, ... */ export type OrdinalSortInfo = { @@ -411,7 +411,7 @@ export interface OrdinalScaleTick extends ScaleTick { * const coord = dataToCoord(ordinalScale.getRawOrdinalNumber(tick.value)). * ``` * Why place the tick value here rather than the raw ordinal value (like LogScale did)? - * Becuase ordinal scale sort is the different case from LogScale, where + * Because ordinal scale sort is the different case from LogScale, where * axis tick, splitArea should better not to be sorted, especially in * anid(animation id) when `boundaryGap: true`. * Only axis label are sorted. @@ -517,7 +517,7 @@ export type SeriesDataType = 'main' | 'node' | 'edge'; * ``` */ export type ECUnitOption = { - // Exclude these reserverd word for `ECOption` to avoid to infer to "any". + // Exclude these reserved word for `ECOption` to avoid to infer to "any". baseOption?: unknown options?: unknown media?: unknown @@ -758,7 +758,8 @@ export type ComponentLayoutMode = { type?: 'box', ignoreSize?: boolean | boolean[] }; -/******************* Mixins for Common Option Properties ********************** */ + +// ------------------ Mixins for Common Option Properties ------------------ export type PaletteOptionMixin = ColorPaletteOptionMixin; export interface ColorPaletteOptionMixin { @@ -1113,12 +1114,12 @@ export interface SeriesLineLabelOption extends LineLabelOption { export interface LabelLayoutOptionCallbackParams { /** * Index of data which the label represents. - * It can be null if label does't represent any data. + * It can be null if label doesn't represent any data. */ dataIndex?: number, /** * Type of data which the label represents. - * It can be null if label does't represent any data. + * It can be null if label doesn't represent any data. */ dataType?: SeriesDataType, seriesIndex: number, @@ -1332,7 +1333,7 @@ export type ComponentItemTooltipOption = CommonTooltipOption & { export type ComponentItemTooltipLabelFormatterParams = { componentType: string name: string - // properies key array like ['name'] + // properties key array like ['name'] $vars: string[] } & { // Other properties @@ -1374,7 +1375,7 @@ export interface CommonAxisPointerOption { triggerTooltip?: boolean /** - * current value. When using axisPointer.handle, value can be set to define the initail position of axisPointer. + * current value. When using axisPointer.handle, value can be set to define the initial position of axisPointer. */ value?: ScaleDataValue diff --git a/src/view/Chart.ts b/src/view/Chart.ts index bb4639915d..734dece866 100644 --- a/src/view/Chart.ts +++ b/src/view/Chart.ts @@ -97,7 +97,7 @@ interface ChartView { } class ChartView { - // [Caution]: Becuase this class or desecendants can be used as `XXX.extend(subProto)`, + // [Caution]: Because this class or desecendants can be used as `XXX.extend(subProto)`, // the class members must not be initialized in constructor or declaration place. // Otherwise there is bad case: // class A {xxx = 1;} diff --git a/src/view/Component.ts b/src/view/Component.ts index ed7fa8ef37..9b1309fb57 100644 --- a/src/view/Component.ts +++ b/src/view/Component.ts @@ -62,7 +62,7 @@ interface ComponentView { class ComponentView { - // [Caution]: Becuase this class or desecendants can be used as `XXX.extend(subProto)`, + // [Caution]: Because this class or desecendants can be used as `XXX.extend(subProto)`, // the class members must not be initialized in constructor or declaration place. // Otherwise there is bad case: // class A {xxx = 1;} diff --git a/src/visual/VisualMapping.ts b/src/visual/VisualMapping.ts index f964e3fb0a..7610bd235a 100644 --- a/src/visual/VisualMapping.ts +++ b/src/visual/VisualMapping.ts @@ -44,7 +44,7 @@ type NormalizedValue = number; type MappingMethod = 'linear' | 'piecewise' | 'category' | 'fixed'; -// May include liftZ. wich is not provided to developers. +// May include liftZ. which is not provided to developers. interface Normalizer { (this: VisualMapping, value?: RawValue): NormalizedValue @@ -361,7 +361,7 @@ class VisualMapping { } /** - * Convinent method. + * Convenient method. * Visual can be Object or Array or primary type. */ static eachVisual( diff --git a/src/visual/aria.ts b/src/visual/aria.ts index 4c1b823f55..7237c36cdd 100644 --- a/src/visual/aria.ts +++ b/src/visual/aria.ts @@ -64,7 +64,7 @@ export default function ariaVisual(ecModel: GlobalModel, api: ExtensionAPI) { const useDecal = decalModel.get('show'); if (useDecal) { // Each type of series use one scope. - // Pie and funnel are using diferrent scopes + // Pie and funnel are using different scopes. const paletteScopeGroupByType = zrUtil.createHashMap(); ecModel.eachSeries((seriesModel: SeriesModel) => { if (seriesModel.isColorBySeries()) { diff --git a/src/visual/helper.ts b/src/visual/helper.ts index 5c60f6f99d..1ea371d9ff 100644 --- a/src/visual/helper.ts +++ b/src/visual/helper.ts @@ -18,7 +18,7 @@ */ /** - * A mapping of visual provided to deverloper and visual stored in the List module. + * A mapping of visual provided to developer and visual stored in the List module. * To developer: * 'color', 'opacity', 'symbol', 'symbolSize'... * In the List module storage: @@ -85,4 +85,4 @@ export function setItemVisualFromData(data: SeriesData, dataIndex: number, key: console.warn(`Unknown visual type ${key}`); } } -} \ No newline at end of file +} diff --git a/src/visual/style.ts b/src/visual/style.ts index 0a1888f99c..19ab5c6892 100644 --- a/src/visual/style.ts +++ b/src/visual/style.ts @@ -43,7 +43,7 @@ function getStyleMapper(seriesModel: SeriesModel, stylePath: string) { const styleMapper = seriesModel.visualStyleMapper || defaultStyleMappers[stylePath as 'itemStyle' | 'lineStyle']; if (!styleMapper) { - console.warn(`Unkown style type '${stylePath}'.`); + console.warn(`Unknown style type '${stylePath}'.`); return defaultStyleMappers.itemStyle; } return styleMapper; @@ -55,7 +55,7 @@ function getDefaultColorKey(seriesModel: SeriesModel, stylePath: string): 'strok || defaultColorKey[stylePath as 'itemStyle' | 'lineStyle']; if (!colorKey) { - console.warn(`Unkown style type '${stylePath}'.`); + console.warn(`Unknown style type '${stylePath}'.`); return 'fill'; } @@ -92,8 +92,8 @@ const seriesStyleTask: StageHandler = { const hasAutoColor = globalStyle.fill === 'auto' || globalStyle.stroke === 'auto'; // Get from color palette by default. if (!globalStyle[colorKey] || colorCallback || hasAutoColor) { - // Note: if some series has color specified (e.g., by itemStyle.color), we DO NOT - // make it effect palette. Bacause some scenarios users need to make some series + // Note: If some series has color specified (e.g., by itemStyle.color), we DO NOT + // make it effect palette. Because some scenarios users need to make some series // transparent or as background, which should better not effect the palette. const colorPalette = seriesModel.getColorFromPalette( // TODO series count changed. @@ -177,8 +177,8 @@ const dataStyleTask: StageHandler = { const dataColorPaletteTask: StageHandler = { performRawSeries: true, overallReset(ecModel) { - // Each type of series use one scope. - // Pie and funnel are using diferrent scopes + // Each type of series uses one scope. + // Pie and funnel are using different scopes. const paletteScopeGroupByType = createHashMap(); ecModel.eachSeries((seriesModel: SeriesModel) => { const colorBy = seriesModel.getColorBy(); diff --git a/test/axis-lastLabel.html b/test/axis-lastLabel.html index d34e5a39f2..5a8f9b6090 100644 --- a/test/axis-lastLabel.html +++ b/test/axis-lastLabel.html @@ -130,10 +130,6 @@ 'echarts' ], function (rainfallData, echarts) { - var chart = echarts.init(document.getElementById('chart0'), null, { - - }); - var option = { tooltip : { trigger: 'axis' @@ -204,10 +200,6 @@ 'echarts' ], function (rainfallData, echarts) { - var chart = echarts.init(document.getElementById('chart1'), null, { - - }); - var option = { tooltip : { trigger: 'axis' @@ -289,10 +281,6 @@ 'echarts' ], function (rainfallData, echarts) { - var chart = echarts.init(document.getElementById('chart1'), null, { - - }); - var option = { tooltip: { trigger: 'axis' @@ -300,8 +288,15 @@ dataZoom: { show: true, realtime: true, - startValue: '2009-09-20 12:00', - end: 100 + // The `startValue` does not exist in the categories as it's splitted by '-' rather than '/' + // It will fallback to the first category + // The same to `endValue` / `end` / `start` + startValue: '2009-07-20 12:00', + // the `endValue` should work + endValue: '2009/8/20 12:00', + // start: 50, + // end: 60, + // end: 'aaaa' }, xAxis: { axisTick: { @@ -372,10 +367,6 @@ 'echarts' ], function (rainfallData, echarts) { - var chart = echarts.init(document.getElementById('chart1'), null, { - - }); - var option = { tooltip : { trigger: 'axis', @@ -461,4 +452,4 @@ - \ No newline at end of file + diff --git a/test/bar-markArea.html b/test/bar-markArea.html new file mode 100644 index 0000000000..2f96ce9f7d --- /dev/null +++ b/test/bar-markArea.html @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + diff --git a/test/candlestick-doji.html b/test/candlestick-doji.html index d118c37a3f..05b9d0c425 100644 --- a/test/candlestick-doji.html +++ b/test/candlestick-doji.html @@ -1,4 +1,4 @@ - + + + + + + -
-
+ + + +
+
+
+ + + + + + - require([ - 'echarts', - 'data/security-sh-2013.json.js' - ], function (echarts, rawData) { - chart = echarts.init(document.getElementById('main'), null, { - }); - option = { - title: { - text: "十字星颜色测试,期望值:红、红、红、绿、红、红、红、绿" - }, + + + + + + + + - \ No newline at end of file + diff --git a/test/gauge-case.html b/test/gauge-case.html index cdbf852b32..2605fde022 100644 --- a/test/gauge-case.html +++ b/test/gauge-case.html @@ -22,14 +22,14 @@ - + - +
+
+ + - \ No newline at end of file + diff --git a/test/markArea.html b/test/markArea.html index 8ec2352e10..d19744c8e7 100644 --- a/test/markArea.html +++ b/test/markArea.html @@ -23,24 +23,19 @@ + + - -
-
+
+
+
@@ -146,7 +144,7 @@ 'echarts' ], function (echarts) { - let option = { + var option = { title: { text: 'Distribution of Electricity', subtext: 'Fake Data' @@ -220,13 +218,136 @@ ] }; - var chartDom = document.getElementById('main1'); - var myChart = echarts.init(chartDom); - - option && myChart.setOption(option); + var chart = testHelper.create(echarts, 'main1', { + option: option + }); }); + + - \ No newline at end of file + diff --git a/test/pie-coordinate-system.html b/test/pie-coordinate-system.html index ad0703eddf..969b7685d1 100644 --- a/test/pie-coordinate-system.html +++ b/test/pie-coordinate-system.html @@ -31,126 +31,15 @@ -
- - - - - - +
+
+
+ + + + + + + diff --git a/test/pie-label.html b/test/pie-label.html index 23cb8d39a7..4738d0e17e 100644 --- a/test/pie-label.html +++ b/test/pie-label.html @@ -52,6 +52,7 @@
+
+ + diff --git a/test/pie-percent.html b/test/pie-percent.html index 06372ba5ac..274a95face 100644 --- a/test/pie-percent.html +++ b/test/pie-percent.html @@ -38,8 +38,8 @@
- - +
+
@@ -85,6 +85,128 @@ }); + + + diff --git a/test/runTest/actions/__meta__.json b/test/runTest/actions/__meta__.json index 42f3d8e2ef..8a4a0c0b36 100644 --- a/test/runTest/actions/__meta__.json +++ b/test/runTest/actions/__meta__.json @@ -105,7 +105,7 @@ "graphic-cases": 2, "graphic-draggable": 1, "graphic-transition": 3, - "heatmap": 1, + "heatmap": 2, "heatmap-gap-bug": 1, "heatmap-map": 1, "homepage3": 1, @@ -153,6 +153,7 @@ "pie-cornerRadius": 1, "pie-label": 2, "pie-label-extreme": 2, + "pie-percent": 2, "polar-rounded": 3, "polarLine": 1, "polarScatter": 1, @@ -175,6 +176,7 @@ "symbol": 1, "symbol2": 1, "themeRiver": 1, + "timeline-case": 1, "timeScale": 1, "timeScale2": 1, "toolbox-textStyle": 1, @@ -186,6 +188,7 @@ "tooltip-axisPointer2": 2, "tooltip-cascade": 4, "tooltip-component": 6, + "tooltip-domnode": 1, "tooltip-event": 1, "tooltip-link": 2, "tooltip-rich": 1, diff --git a/test/runTest/actions/heatmap.json b/test/runTest/actions/heatmap.json index 671b155d21..d8b1813dd5 100644 --- a/test/runTest/actions/heatmap.json +++ b/test/runTest/actions/heatmap.json @@ -1 +1 @@ -[{"name":"Action 1","ops":[{"type":"mousedown","time":264,"x":12,"y":447},{"type":"mousemove","time":324,"x":12,"y":447},{"type":"mousemove","time":535,"x":13,"y":491},{"type":"mouseup","time":703,"x":13,"y":491},{"time":704,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":740,"x":13,"y":491},{"type":"mousemove","time":941,"x":12,"y":583},{"type":"mousemove","time":1142,"x":12,"y":584},{"type":"mousemove","time":1358,"x":13,"y":589},{"type":"mousedown","time":1366,"x":13,"y":589},{"type":"mousemove","time":1573,"x":14,"y":552},{"type":"mousemove","time":1773,"x":15,"y":546},{"type":"mouseup","time":1923,"x":15,"y":546},{"time":1924,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2087,"x":15,"y":546},{"type":"mousemove","time":2288,"x":14,"y":522},{"type":"mousemove","time":2488,"x":14,"y":519},{"type":"mousemove","time":2700,"x":14,"y":517},{"type":"mousemove","time":2874,"x":14,"y":518},{"type":"mousemove","time":3074,"x":14,"y":521},{"type":"mousemove","time":3336,"x":14,"y":522},{"type":"mousedown","time":3444,"x":14,"y":522},{"type":"mouseup","time":3551,"x":14,"y":522},{"time":3552,"delay":400,"type":"screenshot-auto"}],"scrollY":0,"scrollX":0,"timestamp":1603891145024}] \ No newline at end of file +[{"name":"Action 1","ops":[{"type":"mousedown","time":264,"x":12,"y":447},{"type":"mousemove","time":324,"x":12,"y":447},{"type":"mousemove","time":535,"x":13,"y":491},{"type":"mouseup","time":703,"x":13,"y":491},{"time":704,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":740,"x":13,"y":491},{"type":"mousemove","time":941,"x":12,"y":583},{"type":"mousemove","time":1142,"x":12,"y":584},{"type":"mousemove","time":1358,"x":13,"y":589},{"type":"mousedown","time":1366,"x":13,"y":589},{"type":"mousemove","time":1573,"x":14,"y":552},{"type":"mousemove","time":1773,"x":15,"y":546},{"type":"mouseup","time":1923,"x":15,"y":546},{"time":1924,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2087,"x":15,"y":546},{"type":"mousemove","time":2288,"x":14,"y":522},{"type":"mousemove","time":2488,"x":14,"y":519},{"type":"mousemove","time":2700,"x":14,"y":517},{"type":"mousemove","time":2874,"x":14,"y":518},{"type":"mousemove","time":3074,"x":14,"y":521},{"type":"mousemove","time":3336,"x":14,"y":522},{"type":"mousedown","time":3444,"x":14,"y":522},{"type":"mouseup","time":3551,"x":14,"y":522},{"time":3552,"delay":400,"type":"screenshot-auto"}],"scrollY":0,"scrollX":0,"timestamp":1603891145024},{"name":"Action 2","ops":[{"type":"mousemove","time":336,"x":711,"y":515},{"type":"mousemove","time":545,"x":750,"y":446},{"type":"mousemove","time":752,"x":751,"y":426},{"type":"mousemove","time":957,"x":756,"y":417},{"type":"mousemove","time":1169,"x":766,"y":421},{"type":"mousemove","time":1369,"x":769,"y":425},{"type":"mousemove","time":1574,"x":773,"y":425},{"type":"mousedown","time":1708,"x":776,"y":425},{"type":"mousemove","time":1790,"x":776,"y":425},{"type":"mousemove","time":1835,"x":778,"y":425},{"type":"mousemove","time":2042,"x":778,"y":395},{"type":"mousemove","time":2244,"x":778,"y":365},{"type":"mousemove","time":2452,"x":778,"y":345},{"type":"mousemove","time":2662,"x":778,"y":322},{"type":"mousemove","time":2868,"x":778,"y":290},{"type":"mousemove","time":3069,"x":778,"y":272},{"type":"mousemove","time":3282,"x":779,"y":261},{"type":"mousemove","time":3545,"x":782,"y":295},{"type":"mousemove","time":3890,"x":782,"y":403},{"type":"mousemove","time":4098,"x":780,"y":422},{"type":"mousemove","time":4308,"x":778,"y":438},{"type":"mouseup","time":4393,"x":776,"y":439},{"time":4394,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":4518,"x":768,"y":424},{"type":"mousemove","time":4723,"x":766,"y":414},{"type":"mousedown","time":4875,"x":763,"y":411},{"type":"mousemove","time":4953,"x":763,"y":410},{"type":"mousemove","time":5167,"x":770,"y":362},{"type":"mousemove","time":5368,"x":770,"y":294},{"type":"mousemove","time":5575,"x":766,"y":256},{"type":"mousemove","time":5779,"x":764,"y":237},{"type":"mousemove","time":5992,"x":764,"y":233},{"type":"mouseup","time":6129,"x":764,"y":232},{"time":6130,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":6202,"x":758,"y":247},{"type":"mousemove","time":6412,"x":513,"y":515},{"type":"mousemove","time":6618,"x":415,"y":562},{"type":"mousemove","time":6818,"x":402,"y":572},{"type":"mousedown","time":7015,"x":399,"y":575},{"type":"mousemove","time":7028,"x":399,"y":575},{"type":"mousemove","time":7240,"x":471,"y":566},{"type":"mousemove","time":7452,"x":570,"y":560},{"type":"mousemove","time":7654,"x":667,"y":560},{"type":"mousemove","time":7856,"x":722,"y":560},{"type":"mousemove","time":8060,"x":731,"y":560},{"type":"mousemove","time":8271,"x":536,"y":561},{"type":"mousemove","time":8479,"x":346,"y":565},{"type":"mousemove","time":8690,"x":271,"y":567},{"type":"mouseup","time":8876,"x":264,"y":567},{"time":8877,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":8895,"x":264,"y":567},{"type":"mousemove","time":9102,"x":211,"y":560},{"type":"mousedown","time":9226,"x":209,"y":560},{"type":"mousemove","time":9313,"x":225,"y":560},{"type":"mousemove","time":9518,"x":446,"y":556},{"type":"mousemove","time":9719,"x":553,"y":550},{"type":"mousemove","time":9931,"x":608,"y":548},{"type":"mousemove","time":10137,"x":685,"y":547},{"type":"mousemove","time":10345,"x":709,"y":543},{"type":"mousemove","time":10584,"x":710,"y":543},{"type":"mouseup","time":10611,"x":710,"y":543},{"time":10612,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":10620,"x":710,"y":543},{"type":"mousemove","time":10826,"x":534,"y":567},{"type":"mousemove","time":11034,"x":544,"y":571},{"type":"mousemove","time":11242,"x":550,"y":571},{"type":"mousedown","time":11277,"x":550,"y":571},{"type":"mousemove","time":11384,"x":542,"y":571},{"type":"mousemove","time":11591,"x":221,"y":574},{"type":"mousemove","time":11797,"x":48,"y":577},{"type":"mousemove","time":12013,"x":1,"y":577},{"type":"mousemove","time":12203,"x":17,"y":564},{"type":"mousemove","time":12409,"x":550,"y":527},{"type":"mousedown","time":12516,"x":573,"y":520},{"type":"mousemove","time":12626,"x":573,"y":520},{"type":"mouseup","time":12662,"x":576,"y":520},{"time":12663,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":12862,"x":576,"y":521}],"scrollY":1058,"scrollX":0,"timestamp":1667752510456}] \ No newline at end of file diff --git a/test/runTest/actions/pie-percent.json b/test/runTest/actions/pie-percent.json new file mode 100644 index 0000000000..3ab9358840 --- /dev/null +++ b/test/runTest/actions/pie-percent.json @@ -0,0 +1 @@ +[{"name":"Action 1","ops":[{"type":"mousemove","time":417,"x":193,"y":190},{"type":"mousemove","time":617,"x":238,"y":212},{"type":"mousedown","time":840,"x":238,"y":212},{"type":"mouseup","time":991,"x":238,"y":212},{"time":992,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1701,"x":241,"y":212},{"type":"mousemove","time":1906,"x":320,"y":214},{"type":"mousemove","time":2117,"x":289,"y":217},{"type":"mousedown","time":2330,"x":289,"y":217},{"type":"mouseup","time":2461,"x":289,"y":217},{"time":2462,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3233,"x":288,"y":217},{"type":"mousemove","time":3433,"x":350,"y":211},{"type":"mousedown","time":3596,"x":354,"y":210},{"type":"mousemove","time":3639,"x":354,"y":210},{"type":"mouseup","time":3699,"x":354,"y":210},{"time":3700,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3867,"x":356,"y":210},{"type":"mousemove","time":4073,"x":436,"y":211},{"type":"mousemove","time":4289,"x":437,"y":211},{"type":"mousedown","time":4310,"x":437,"y":211},{"type":"mouseup","time":4432,"x":437,"y":211},{"time":4433,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":4516,"x":447,"y":213},{"type":"mousemove","time":4716,"x":483,"y":217},{"type":"mousedown","time":4923,"x":498,"y":217},{"type":"mousemove","time":4928,"x":498,"y":217},{"type":"mouseup","time":5027,"x":498,"y":217},{"time":5028,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":5135,"x":517,"y":218},{"type":"mousemove","time":5341,"x":549,"y":214},{"type":"mousemove","time":5557,"x":560,"y":211},{"type":"mousedown","time":5690,"x":562,"y":210},{"type":"mousemove","time":5791,"x":563,"y":209},{"type":"mouseup","time":5807,"x":563,"y":209},{"time":5808,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":6000,"x":542,"y":209},{"type":"mousemove","time":6205,"x":364,"y":209},{"type":"mousemove","time":6417,"x":248,"y":212},{"type":"mousedown","time":6573,"x":216,"y":214},{"type":"mousemove","time":6623,"x":216,"y":214},{"type":"mouseup","time":6690,"x":215,"y":214},{"time":6691,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":6835,"x":214,"y":215},{"type":"mousemove","time":7043,"x":283,"y":215},{"type":"mousemove","time":7257,"x":308,"y":212},{"type":"mousedown","time":7281,"x":308,"y":212},{"type":"mouseup","time":7377,"x":308,"y":212},{"time":7378,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":7466,"x":326,"y":213},{"type":"mousemove","time":7666,"x":362,"y":211},{"type":"mousedown","time":7874,"x":369,"y":211},{"type":"mousemove","time":7890,"x":369,"y":211},{"type":"mouseup","time":7976,"x":369,"y":211},{"time":7977,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":7999,"x":370,"y":211},{"type":"mousemove","time":8199,"x":394,"y":210},{"type":"mousemove","time":8399,"x":376,"y":214},{"type":"mousemove","time":8599,"x":255,"y":217},{"type":"mousedown","time":8725,"x":249,"y":217},{"type":"mousemove","time":8808,"x":249,"y":217},{"type":"mouseup","time":8825,"x":249,"y":217},{"time":8826,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":8949,"x":255,"y":216},{"type":"mousemove","time":9149,"x":410,"y":209},{"type":"mousedown","time":9292,"x":424,"y":208},{"type":"mousemove","time":9358,"x":424,"y":208},{"type":"mouseup","time":9407,"x":424,"y":208},{"time":9408,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":9566,"x":475,"y":210},{"type":"mousemove","time":9766,"x":503,"y":210},{"type":"mousemove","time":9973,"x":510,"y":206},{"type":"mousedown","time":10139,"x":508,"y":211},{"type":"mousemove","time":10222,"x":508,"y":211},{"type":"mouseup","time":10247,"x":508,"y":211},{"time":10248,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":10549,"x":508,"y":212},{"type":"mousemove","time":10749,"x":549,"y":210},{"type":"mousedown","time":10914,"x":558,"y":210},{"type":"mousemove","time":10957,"x":558,"y":210},{"type":"mouseup","time":11032,"x":558,"y":210},{"time":11033,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":11134,"x":555,"y":211},{"type":"mousemove","time":11341,"x":490,"y":219},{"type":"mousemove","time":11545,"x":348,"y":215},{"type":"mousedown","time":11741,"x":308,"y":211},{"type":"mousemove","time":11748,"x":308,"y":211},{"type":"mouseup","time":11861,"x":308,"y":211},{"time":11862,"delay":400,"type":"screenshot-auto"},{"type":"mousedown","time":12424,"x":308,"y":211},{"type":"mousemove","time":12465,"x":308,"y":211},{"type":"mouseup","time":12562,"x":308,"y":211},{"time":12563,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":13499,"x":306,"y":211},{"type":"mousemove","time":13708,"x":240,"y":216},{"type":"mousedown","time":13912,"x":238,"y":216},{"type":"mousemove","time":13940,"x":238,"y":216},{"type":"mouseup","time":14022,"x":238,"y":216},{"time":14023,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":15266,"x":237,"y":216}],"scrollY":333.33331298828125,"scrollX":0,"timestamp":1665204547560},{"name":"Action 2","ops":[{"type":"mousemove","time":410,"x":204,"y":188},{"type":"mousemove","time":610,"x":222,"y":208},{"type":"mousedown","time":801,"x":223,"y":209},{"type":"mousemove","time":817,"x":223,"y":209},{"type":"mousemove","time":828,"x":224,"y":210},{"type":"mouseup","time":942,"x":224,"y":210},{"time":943,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":1035,"x":224,"y":210},{"type":"mousemove","time":1360,"x":226,"y":210},{"type":"mousemove","time":1567,"x":305,"y":210},{"type":"mousemove","time":1783,"x":316,"y":210},{"type":"mousedown","time":1866,"x":316,"y":210},{"type":"mouseup","time":2015,"x":316,"y":210},{"time":2016,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2743,"x":318,"y":210},{"type":"mousemove","time":2943,"x":350,"y":209},{"type":"mousemove","time":3149,"x":365,"y":209},{"type":"mousedown","time":3184,"x":365,"y":209},{"type":"mouseup","time":3382,"x":365,"y":209},{"time":3383,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3593,"x":366,"y":209},{"type":"mousemove","time":3799,"x":421,"y":210},{"type":"mousemove","time":4017,"x":428,"y":210},{"type":"mousedown","time":4350,"x":428,"y":210},{"type":"mouseup","time":4515,"x":428,"y":210},{"time":4516,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":4710,"x":432,"y":211},{"type":"mousemove","time":4910,"x":479,"y":210},{"type":"mousemove","time":5117,"x":488,"y":210},{"type":"mousedown","time":5464,"x":488,"y":210},{"type":"mouseup","time":5616,"x":488,"y":210},{"time":5617,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":5710,"x":489,"y":210},{"type":"mousemove","time":5918,"x":523,"y":219},{"type":"mousemove","time":6134,"x":556,"y":216},{"type":"mousemove","time":6393,"x":558,"y":214},{"type":"mousedown","time":6604,"x":558,"y":214},{"type":"mouseup","time":6749,"x":558,"y":214},{"time":6750,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":6909,"x":561,"y":213},{"type":"mousemove","time":7109,"x":623,"y":229},{"type":"mousemove","time":7316,"x":646,"y":223},{"type":"mousedown","time":7420,"x":646,"y":223},{"type":"mouseup","time":7550,"x":646,"y":223},{"time":7551,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":8093,"x":647,"y":222},{"type":"mousemove","time":8300,"x":647,"y":221}],"scrollY":792,"scrollX":0,"timestamp":1665204486524}] \ No newline at end of file diff --git a/test/runTest/actions/timeline-case.json b/test/runTest/actions/timeline-case.json new file mode 100644 index 0000000000..9b9518dfcb --- /dev/null +++ b/test/runTest/actions/timeline-case.json @@ -0,0 +1 @@ +[{"name":"Action 1","ops":[{"type":"mousemove","time":456,"x":236,"y":511},{"type":"mousemove","time":659,"x":232,"y":484},{"type":"mousemove","time":876,"x":235,"y":465},{"type":"mousedown","time":1031,"x":236,"y":463},{"type":"mousemove","time":1088,"x":238,"y":462},{"type":"mousemove","time":1288,"x":333,"y":463},{"type":"mousemove","time":1494,"x":464,"y":457},{"type":"mousemove","time":1711,"x":464,"y":457},{"type":"mousemove","time":1955,"x":465,"y":457},{"type":"mousemove","time":2155,"x":581,"y":446},{"type":"mousemove","time":2355,"x":596,"y":446},{"type":"mousemove","time":2561,"x":600,"y":446},{"type":"mouseup","time":2731,"x":600,"y":446},{"time":2732,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2744,"x":600,"y":446},{"type":"mousemove","time":2960,"x":598,"y":453},{"type":"mousemove","time":3122,"x":597,"y":454},{"type":"mousedown","time":3315,"x":598,"y":457},{"type":"mousemove","time":3328,"x":598,"y":457},{"type":"mousemove","time":3388,"x":597,"y":457},{"type":"mousemove","time":3588,"x":462,"y":469},{"type":"mousemove","time":3788,"x":414,"y":463},{"type":"mouseup","time":4033,"x":414,"y":463},{"time":4034,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":4053,"x":414,"y":463},{"type":"mousemove","time":4255,"x":417,"y":466},{"type":"mousedown","time":4419,"x":418,"y":467},{"type":"mousemove","time":4461,"x":418,"y":467},{"type":"mousemove","time":4472,"x":416,"y":468},{"type":"mousemove","time":4680,"x":272,"y":472},{"type":"mousemove","time":4894,"x":232,"y":468},{"type":"mouseup","time":4979,"x":232,"y":468},{"time":4980,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":5196,"x":232,"y":468},{"type":"mousemove","time":5238,"x":231,"y":468},{"type":"mousedown","time":5363,"x":232,"y":464},{"type":"mousemove","time":5438,"x":242,"y":464},{"type":"mousemove","time":5638,"x":390,"y":481},{"type":"mousemove","time":5846,"x":420,"y":484},{"type":"mouseup","time":5851,"x":420,"y":484},{"time":5852,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":6054,"x":418,"y":513},{"type":"mousemove","time":6255,"x":408,"y":531},{"type":"mousemove","time":6588,"x":406,"y":532},{"type":"mousemove","time":6794,"x":405,"y":532},{"type":"mousemove","time":7044,"x":397,"y":532},{"type":"mousemove","time":7171,"x":396,"y":533},{"type":"mousemove","time":7377,"x":382,"y":535},{"type":"mousemove","time":8588,"x":380,"y":534}],"scrollY":0,"scrollX":0,"timestamp":1663128694475}] \ No newline at end of file diff --git a/test/runTest/actions/tooltip-domnode.json b/test/runTest/actions/tooltip-domnode.json new file mode 100644 index 0000000000..af560a9435 --- /dev/null +++ b/test/runTest/actions/tooltip-domnode.json @@ -0,0 +1 @@ +[{"name":"Action 1","ops":[{"type":"mousemove","time":593,"x":436,"y":371},{"type":"mousemove","time":792,"x":433,"y":361},{"type":"screenshot","time":1688}],"scrollY":1726,"scrollX":0,"timestamp":1667738018652}] \ No newline at end of file diff --git a/test/sankey-depth.html b/test/sankey-depth.html index cf34ca6fd6..89a4d2d156 100644 --- a/test/sankey-depth.html +++ b/test/sankey-depth.html @@ -128,6 +128,11 @@ label: { position: 'left' }, + edgeLabel: { + show: true, + color: 'green', + fontSize: 20 + }, // Used to test when the data is null whether it is work well. // data: [], // links: [], diff --git a/test/timeline-case.html b/test/timeline-case.html new file mode 100644 index 0000000000..d6ba3cfba5 --- /dev/null +++ b/test/timeline-case.html @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + diff --git a/test/tooltip-domnode.html b/test/tooltip-domnode.html index dc53d02e69..d79c1f7f1e 100644 --- a/test/tooltip-domnode.html +++ b/test/tooltip-domnode.html @@ -36,6 +36,7 @@
+
+ + diff --git a/test/universalTransition2.html b/test/universalTransition2.html index ef3a998a13..33023a0e47 100644 --- a/test/universalTransition2.html +++ b/test/universalTransition2.html @@ -62,9 +62,9 @@ data: ['Animals', 'Fruits', 'Cars'] }, yAxis: {}, - dataGroupId: '', animationDurationUpdate: ANIMATION_DURATION_UPDATE, series: { + dataGroupId: '', type: 'bar', id: 'main', data: [{