From 1ab5597af64d650fe047a6fc7f1384ee6039f764 Mon Sep 17 00:00:00 2001 From: Ovilia Date: Fri, 20 Oct 2023 15:26:37 +0800 Subject: [PATCH 01/12] feat(label): support align for min/max labels --- src/component/axis/AxisBuilder.ts | 36 +++++-- src/coord/axisCommonTypes.ts | 9 ++ test/axis-align-lastLabel.html | 150 ++++++++++++++++++++++++++++++ 3 files changed, 189 insertions(+), 6 deletions(-) create mode 100644 test/axis-align-lastLabel.html diff --git a/src/component/axis/AxisBuilder.ts b/src/component/axis/AxisBuilder.ts index c7b48dcafd..f9837df4eb 100644 --- a/src/component/axis/AxisBuilder.ts +++ b/src/component/axis/AxisBuilder.ts @@ -17,7 +17,7 @@ * under the License. */ -import {retrieve, defaults, extend, each, isObject, map, isString, isNumber, isFunction} from 'zrender/src/core/util'; +import {retrieve, defaults, extend, each, isObject, map, isString, isNumber, isFunction, retrieve2} from 'zrender/src/core/util'; import * as graphic from '../../util/graphic'; import {getECData} from '../../util/innerStore'; import {createTextStyle} from '../../label/labelStyle'; @@ -776,6 +776,29 @@ function buildAxisLabel( const tickCoord = axis.dataToCoord(tickValue); + const align = itemLabelModel.getShallow('align', true) + || labelLayout.textAlign; + const alignMin = retrieve2( + itemLabelModel.getShallow('alignMinLabel', true), + align + ); + const alignMax = retrieve2( + itemLabelModel.getShallow('alignMaxLabel', true), + align + ); + + const verticalAlign = itemLabelModel.getShallow('verticalAlign', true) + || itemLabelModel.getShallow('baseline', true) + || labelLayout.textVerticalAlign; + const verticalAlignMin = retrieve2( + itemLabelModel.getShallow('verticalAlignMinLabel', true), + verticalAlign + ); + const verticalAlignMax = retrieve2( + itemLabelModel.getShallow('verticalAlignMaxLabel', true), + verticalAlign + ); + const textEl = new graphic.Text({ x: tickCoord, y: opt.labelOffset + opt.labelDirection * labelMargin, @@ -784,11 +807,12 @@ function buildAxisLabel( z2: 10 + (labelItem.level || 0), style: createTextStyle(itemLabelModel, { text: formattedLabel, - align: itemLabelModel.getShallow('align', true) - || labelLayout.textAlign, - verticalAlign: itemLabelModel.getShallow('verticalAlign', true) - || itemLabelModel.getShallow('baseline', true) - || labelLayout.textVerticalAlign, + align: index === 0 + ? alignMin + : index === labels.length - 1 ? alignMax : align, + verticalAlign: index === 0 + ? verticalAlignMin + : index === labels.length - 1 ? verticalAlignMax : verticalAlign, fill: isFunction(textColor) ? textColor( // (1) In category axis with data zoom, tick is not the original diff --git a/src/coord/axisCommonTypes.ts b/src/coord/axisCommonTypes.ts index bb4d1b7bf1..aa92868e3e 100644 --- a/src/coord/axisCommonTypes.ts +++ b/src/coord/axisCommonTypes.ts @@ -17,6 +17,7 @@ * under the License. */ +import { TextAlign, TextVerticalAlign } from 'zrender/src/core/types'; import { TextCommonOption, LineStyleOption, OrdinalRawValue, ZRColor, AreaStyleOption, ComponentOption, ColorString, @@ -223,6 +224,14 @@ interface AxisLabelBaseOption extends Omit { showMinLabel?: boolean, // true | false | null/undefined (auto) showMaxLabel?: boolean, + // 'left' | 'center' | 'right' | null/undefined (auto) + alignMinLabel?: TextAlign, + // 'left' | 'center' | 'right' | null/undefined (auto) + alignMaxLabel?: TextAlign, + // 'top' | 'middle' | 'bottom' | null/undefined (auto) + verticalAlignMinLabel?: TextVerticalAlign, + // 'top' | 'middle' | 'bottom' | null/undefined (auto) + verticalAlignMaxLabel?: TextVerticalAlign, margin?: number, rich?: Dictionary /** diff --git a/test/axis-align-lastLabel.html b/test/axis-align-lastLabel.html new file mode 100644 index 0000000000..559f3b8365 --- /dev/null +++ b/test/axis-align-lastLabel.html @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + From 3ea19707cab43fb006dab8c5a5ad926dd58c6438 Mon Sep 17 00:00:00 2001 From: Ovilia Date: Fri, 20 Oct 2023 15:36:40 +0800 Subject: [PATCH 02/12] feat(label): fix lint problems --- src/component/axis/AxisBuilder.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/component/axis/AxisBuilder.ts b/src/component/axis/AxisBuilder.ts index f9837df4eb..a3773a823c 100644 --- a/src/component/axis/AxisBuilder.ts +++ b/src/component/axis/AxisBuilder.ts @@ -17,7 +17,9 @@ * under the License. */ -import {retrieve, defaults, extend, each, isObject, map, isString, isNumber, isFunction, retrieve2} from 'zrender/src/core/util'; +import { + retrieve, defaults, extend, each, isObject, map, isString, isNumber, isFunction, retrieve2 +} from 'zrender/src/core/util'; import * as graphic from '../../util/graphic'; import {getECData} from '../../util/innerStore'; import {createTextStyle} from '../../label/labelStyle'; From d047d716460ad2c9d1e78af334a31e20b81514d1 Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Thu, 28 Dec 2023 13:18:00 +0100 Subject: [PATCH 03/12] fix: Fix typo s/Usefull/Useful/ --- src/component/axis/AxisBuilder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/component/axis/AxisBuilder.ts b/src/component/axis/AxisBuilder.ts index a3773a823c..1644d50246 100644 --- a/src/component/axis/AxisBuilder.ts +++ b/src/component/axis/AxisBuilder.ts @@ -70,7 +70,7 @@ export interface AxisBuilderCfg { tickDirection?: number labelDirection?: number /** - * Usefull when onZero. + * Useful when onZero. */ labelOffset?: number /** From f3010506d229478423492fd30ba92eb37c9dcf3f Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Fri, 29 Dec 2023 13:16:49 +0100 Subject: [PATCH 04/12] fix: Fix typo s/buidling/building/ --- build/pre-publish.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/pre-publish.js b/build/pre-publish.js index 6975c2744b..f590d1e798 100644 --- a/build/pre-publish.js +++ b/build/pre-publish.js @@ -87,7 +87,7 @@ const compileWorkList = [ module: 'ES2015', rootDir: ecDir, outDir: tmpDir, - // Generate types when buidling esm + // Generate types when building esm declaration: true, declarationDir: typesDir }, From c422a5d266bc576a7b64c1ee4c9f0e3c235a0fe1 Mon Sep 17 00:00:00 2001 From: plainheart Date: Sun, 31 Dec 2023 19:07:16 +0800 Subject: [PATCH 05/12] chore(workflow): add a scheduled workflow to update the NOTICE year automatically --- .../workflows/.scripts/update-notice-year.js | 90 +++++++++++++++++++ .github/workflows/update-notice-year.yml | 28 ++++++ 2 files changed, 118 insertions(+) create mode 100644 .github/workflows/.scripts/update-notice-year.js create mode 100644 .github/workflows/update-notice-year.yml diff --git a/.github/workflows/.scripts/update-notice-year.js b/.github/workflows/.scripts/update-notice-year.js new file mode 100644 index 0000000000..61505ff5a4 --- /dev/null +++ b/.github/workflows/.scripts/update-notice-year.js @@ -0,0 +1,90 @@ +/** + * @typedef {import('@octokit/rest').Octokit} Octokit + * @typedef {import('@actions/github')['context']} Context + */ + +module.exports = async function updateNoticeYear( + /** @type {{ octokit: Octokit, context: Context }} */ + { octokit, context } +) { + const newYear = new Date().getFullYear() + console.log('Prepare to update notice year to', newYear) + + const noticeContent = `Apache ECharts +Copyright 2017-${newYear} The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (https://www.apache.org/).` + + const repoCtx = context.repo + + const repoInfo = (await octokit.rest.repos.get(repoCtx)).data + const defaultBranchName = repoInfo.default_branch + const remoteNoticeFile = (await octokit.rest.repos.getContent({ + ...repoCtx, + path: 'NOTICE', + ref: defaultBranchName + })).data + const remoteNoticeContent = base64ToUtf8(remoteNoticeFile.content) + if (remoteNoticeContent === noticeContent) { + console.log('NOTICE year is already updated.') + return + } + + console.log('Ready to update the NOTICE file:\n' + noticeContent) + + const defaultBranch = (await octokit.rest.repos.getBranch({ + ...repoCtx, + branch: defaultBranchName + })).data + + const newBranchName = `bot/update-notice-year/${newYear}` + await octokit.rest.git.createRef({ + ...repoCtx, + ref: `refs/heads/${newBranchName}`, + sha: defaultBranch.commit.sha + }) + console.log('Created a new branch:', newBranchName) + + await octokit.rest.repos.createOrUpdateFileContents({ + ...repoCtx, + path: 'NOTICE', + message: `chore: update NOTICE year to ${newYear}`, + content: utf8ToBase64(noticeContent), + sha: remoteNoticeFile.sha, + branch: newBranchName + }) + + console.log('Updated the NOTICE file on the new branch') + + const pr = (await octokit.rest.pulls.create({ + ...repoCtx, + head: newBranchName, + base: defaultBranchName, + maintainer_can_modify: true, + title: `chore: update NOTICE year to ${newYear}`, + body: `## Brief Information + +This pull request is in the type of: + +- [ ] bug fixing +- [ ] new feature +- [x] others + +### What does this PR do? + +Update notice year to ${newYear}. 💖 + +Happy new year! 祝大家新年快乐!🎇` + })).data + + console.log(`Opened PR #${pr.number} for updating the NOTICE file`) +} + +function utf8ToBase64(data) { + return Buffer.from(data, 'utf-8').toString('base64') +} + +function base64ToUtf8(data) { + return Buffer.from(data, 'base64').toString('utf-8') +} diff --git a/.github/workflows/update-notice-year.yml b/.github/workflows/update-notice-year.yml new file mode 100644 index 0000000000..3489e2f638 --- /dev/null +++ b/.github/workflows/update-notice-year.yml @@ -0,0 +1,28 @@ +name: Update NOTICE year + +on: + schedule: + # 1/1 00:00 UTC+8 + - cron: '0 16 31 12 *' + workflow_dispatch: + +jobs: + update-notice-year: + if: ${{ github.repository_owner == 'apache' }} + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + .github/workflows/.scripts + + - uses: actions/github-script@v7 + with: + script: | + const updateNoticeYear = require('.github/workflows/.scripts/update-notice-year.js') + await updateNoticeYear({ octokit: github, context }) + + + + From 642f37766b4337efaf86a95564913960d6fb0eb6 Mon Sep 17 00:00:00 2001 From: plainheart Date: Sun, 31 Dec 2023 19:12:24 +0800 Subject: [PATCH 06/12] style: remove redundant empty lines --- .github/workflows/update-notice-year.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/update-notice-year.yml b/.github/workflows/update-notice-year.yml index 3489e2f638..8aa325327b 100644 --- a/.github/workflows/update-notice-year.yml +++ b/.github/workflows/update-notice-year.yml @@ -22,7 +22,3 @@ jobs: script: | const updateNoticeYear = require('.github/workflows/.scripts/update-notice-year.js') await updateNoticeYear({ octokit: github, context }) - - - - From 60cbc9fe3c34cfc23de82a587032a820968bfa9c Mon Sep 17 00:00:00 2001 From: plainheart Date: Mon, 1 Jan 2024 00:20:14 +0800 Subject: [PATCH 07/12] chore(workflow): fix timezone error when getting new year by `new Date` --- .github/workflows/.scripts/update-notice-year.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/.scripts/update-notice-year.js b/.github/workflows/.scripts/update-notice-year.js index 61505ff5a4..2fbb6b7b82 100644 --- a/.github/workflows/.scripts/update-notice-year.js +++ b/.github/workflows/.scripts/update-notice-year.js @@ -7,7 +7,10 @@ module.exports = async function updateNoticeYear( /** @type {{ octokit: Octokit, context: Context }} */ { octokit, context } ) { - const newYear = new Date().getFullYear() + const now = new Date() + // Change to UTC+8 + now.setHours(now.getHours() + 8) + const newYear = now.getFullYear() console.log('Prepare to update notice year to', newYear) const noticeContent = `Apache ECharts From 57be34334b4097a4498657f5284ec4f49abbeaa1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 05:44:57 +0000 Subject: [PATCH 08/12] chore: update NOTICE year to 2024 --- NOTICE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NOTICE b/NOTICE index 0877faab81..6f7322151d 100644 --- a/NOTICE +++ b/NOTICE @@ -1,5 +1,5 @@ Apache ECharts -Copyright 2017-2023 The Apache Software Foundation +Copyright 2017-2024 The Apache Software Foundation This product includes software developed at -The Apache Software Foundation (https://www.apache.org/). +The Apache Software Foundation (https://www.apache.org/). \ No newline at end of file From 7a26ce56f2df781935b81f127b6377a45ddb39bf Mon Sep 17 00:00:00 2001 From: plainheart Date: Wed, 3 Jan 2024 00:57:29 +0800 Subject: [PATCH 09/12] fix(ssr): remove redundant SVG attributes with `undefined` value. --- src/core/echarts.ts | 8 ++++++-- src/util/innerStore.ts | 2 +- test/svg-ssr.html | 38 +++++++++++++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/core/echarts.ts b/src/core/echarts.ts index aaf538c72e..69978fd34b 100644 --- a/src/core/echarts.ts +++ b/src/core/echarts.ts @@ -429,10 +429,14 @@ class ECharts extends Eventful { zrender.registerSSRDataGetter(el => { const ecData = getECData(el); + const dataIndex = ecData.dataIndex; + if (dataIndex == null) { + return; + } const hashMap = createHashMap(); hashMap.set('series_index', ecData.seriesIndex); - hashMap.set('data_index', ecData.dataIndex); - hashMap.set('ssr_type', ecData.ssrType); + hashMap.set('data_index', dataIndex); + ecData.ssrType && hashMap.set('ssr_type', ecData.ssrType); return hashMap; }); diff --git a/src/util/innerStore.ts b/src/util/innerStore.ts index a1ecb2a78c..cf9ede71a6 100644 --- a/src/util/innerStore.ts +++ b/src/util/innerStore.ts @@ -75,7 +75,7 @@ export const setCommonECData = (seriesIndex: number, dataType: SeriesDataType, d childECData.seriesIndex = seriesIndex; childECData.dataIndex = dataIdx; childECData.dataType = dataType; - childECData.ssrType === 'chart'; + childECData.ssrType = 'chart'; }); } } diff --git a/test/svg-ssr.html b/test/svg-ssr.html index af9a4dab77..c08e02fa7d 100644 --- a/test/svg-ssr.html +++ b/test/svg-ssr.html @@ -41,7 +41,6 @@ - + From 0df7c0dc9a9f56487ef4a66fbd459709e9d682c0 Mon Sep 17 00:00:00 2001 From: Dirk Stolle Date: Sun, 7 Jan 2024 00:47:43 +0100 Subject: [PATCH 10/12] chore: fix some typos --- build/config.js | 2 +- build/pre-publish.js | 4 ++-- src/data/helper/sourceHelper.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/config.js b/build/config.js index 092f7b23a5..9d639e476d 100644 --- a/build/config.js +++ b/build/config.js @@ -108,7 +108,7 @@ exports.createECharts = function (opt = {}) { opt, { name: 'echarts', - // Ignore default exports, which is only for compitable code like: + // Ignore default exports, which is only for compatible code like: // import echarts from 'echarts/lib/echarts'; exports: 'named', format: format diff --git a/build/pre-publish.js b/build/pre-publish.js index f590d1e798..cd99e65793 100644 --- a/build/pre-publish.js +++ b/build/pre-publish.js @@ -19,7 +19,7 @@ /** * [Create CommonJS files]: - * Compatible with prevoius folder structure: `echarts/lib` exists in `node_modules` + * Compatible with previous folder structure: `echarts/lib` exists in `node_modules` * (1) Build all files to CommonJS to `echarts/lib`. * (2) Remove __DEV__. * (3) Mount `echarts/src/export.js` to `echarts/lib/echarts.js`. @@ -206,7 +206,7 @@ module.exports = async function () { }; async function runTsCompile(localTs, compilerOptions, srcPathList) { - // Must do it. becuase the value in tsconfig.json might be different from the inner representation. + // Must do it, because the value in tsconfig.json might be different from the inner representation. // For example: moduleResolution: "NODE" => moduleResolution: 2 const {options, errors} = localTs.convertCompilerOptionsFromJson(compilerOptions, ecDir); diff --git a/src/data/helper/sourceHelper.ts b/src/data/helper/sourceHelper.ts index f0277d3a1d..d1aa89d5ef 100644 --- a/src/data/helper/sourceHelper.ts +++ b/src/data/helper/sourceHelper.ts @@ -314,7 +314,7 @@ export function querySeriesUpstreamDatasetModel( export function queryDatasetUpstreamDatasetModels( datasetModel: DatasetModel ): DatasetModel[] { - // Only these attributes declared, we by defualt reference to `datasetIndex: 0`. + // Only these attributes declared, we by default reference to `datasetIndex: 0`. // Otherwise, no reference. if (!datasetModel.get('transform', true) && !datasetModel.get('fromTransformResult', true) From b29904f6062f3e7cb2a570dcb93c30bd8e653a62 Mon Sep 17 00:00:00 2001 From: Dirk Stolle Date: Sun, 7 Jan 2024 00:54:39 +0100 Subject: [PATCH 11/12] chore(workflow): update actions/checkout in workflows to v4 --- .github/workflows/ci.yml | 4 ++-- .github/workflows/nightly-next.yml | 2 +- .github/workflows/nightly.yml | 2 +- .github/workflows/source-release.yml | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d11e9faa6e..e88f2e97f2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: run: | echo "FETCH_DEPTH=$(($PR_COMMIT_COUNT + 1))" >> $GITHUB_ENV - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: ${{ env.FETCH_DEPTH }} @@ -67,7 +67,7 @@ jobs: node-version: [18.x] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 diff --git a/.github/workflows/nightly-next.yml b/.github/workflows/nightly-next.yml index bf40c6e71e..0abf26f502 100644 --- a/.github/workflows/nightly-next.yml +++ b/.github/workflows/nightly-next.yml @@ -18,7 +18,7 @@ jobs: node-version: [18.x] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: next diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 085b80d306..7cfea0b57c 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -18,7 +18,7 @@ jobs: node-version: [18.x] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 diff --git a/.github/workflows/source-release.yml b/.github/workflows/source-release.yml index eab4413df9..8b7163f000 100644 --- a/.github/workflows/source-release.yml +++ b/.github/workflows/source-release.yml @@ -14,7 +14,7 @@ jobs: node-version: [18.x] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 @@ -59,7 +59,7 @@ jobs: node-version: [18.x] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 From 67ac77c59069c8c1b91037d21c0b22943f097b8c Mon Sep 17 00:00:00 2001 From: Dirk Stolle Date: Mon, 8 Jan 2024 02:22:06 +0100 Subject: [PATCH 12/12] chore(workflow): update actions/setup-node in workflows to v4 --- .github/workflows/ci.yml | 4 ++-- .github/workflows/nightly-next.yml | 2 +- .github/workflows/nightly.yml | 2 +- .github/workflows/source-release.yml | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e88f2e97f2..0a15bd6348 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,7 +30,7 @@ jobs: fetch-depth: ${{ env.FETCH_DEPTH }} - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} @@ -70,7 +70,7 @@ jobs: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/nightly-next.yml b/.github/workflows/nightly-next.yml index 0abf26f502..1de3715395 100644 --- a/.github/workflows/nightly-next.yml +++ b/.github/workflows/nightly-next.yml @@ -23,7 +23,7 @@ jobs: ref: next - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: registry-url: https://registry.npmjs.org/ node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 7cfea0b57c..cf65881730 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: registry-url: https://registry.npmjs.org/ node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/source-release.yml b/.github/workflows/source-release.yml index 8b7163f000..5719131170 100644 --- a/.github/workflows/source-release.yml +++ b/.github/workflows/source-release.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} @@ -62,7 +62,7 @@ jobs: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} @@ -114,7 +114,7 @@ jobs: steps: - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }}