From 0c35553f52b68771c1cf62e1f410abd7f55caa46 Mon Sep 17 00:00:00 2001 From: Gonzalo Riestra Date: Mon, 11 May 2026 10:01:39 +0200 Subject: [PATCH 1/3] Drop support for Node 20 --- .changeset/thin-webs-notice.md | 13 +++++++++++++ .github/workflows/tests-main.yml | 2 +- .github/workflows/tests-manual.yml | 3 +-- .github/workflows/tests-pr.yml | 17 ++++------------- .../generated/generated_static_pages.json | 4 ++-- docs-shopify.dev/static/cli.doc.ts | 2 +- packages/app/package.json | 2 +- packages/cli-kit/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-app/package.json | 2 +- packages/e2e/package.json | 2 +- packages/plugin-cloudflare/package.json | 2 +- packages/plugin-did-you-mean/package.json | 2 +- packages/store/package.json | 2 +- packages/theme/package.json | 2 +- 15 files changed, 31 insertions(+), 28 deletions(-) create mode 100644 .changeset/thin-webs-notice.md diff --git a/.changeset/thin-webs-notice.md b/.changeset/thin-webs-notice.md new file mode 100644 index 00000000000..dccdeeb6474 --- /dev/null +++ b/.changeset/thin-webs-notice.md @@ -0,0 +1,13 @@ +--- +'@shopify/plugin-did-you-mean': major +'@shopify/plugin-cloudflare': major +'@shopify/create-app': major +'@shopify/cli-kit': major +'@shopify/store': major +'@shopify/theme': major +'@shopify/app': major +'@shopify/cli': major +'@shopify/e2e': major +--- + +Drop support for Node 20 diff --git a/.github/workflows/tests-main.yml b/.github/workflows/tests-main.yml index 8323d59e8d7..5e892d5fdee 100644 --- a/.github/workflows/tests-main.yml +++ b/.github/workflows/tests-main.yml @@ -32,7 +32,7 @@ jobs: strategy: matrix: os: [ 'ubuntu-latest', 'windows-latest', 'macos-latest' ] - node: [ '20.14.0', '22.2.0', '24.1.0' ] + node: [ '22.12.0', '24.1.0' ] steps: - uses: actions/checkout@v3 name: Checkout [${{ github.ref_name }}] diff --git a/.github/workflows/tests-manual.yml b/.github/workflows/tests-manual.yml index d67e22aa447..f65f37e5063 100644 --- a/.github/workflows/tests-manual.yml +++ b/.github/workflows/tests-manual.yml @@ -14,8 +14,7 @@ on: default: '24.1.0' type: choice options: - - 20.14.0 - - 22.2.0 + - 22.12.0 - 24.1.0 os: description: 'Operating system' diff --git a/.github/workflows/tests-pr.yml b/.github/workflows/tests-pr.yml index 67eed3eb0a3..97493e13a0f 100644 --- a/.github/workflows/tests-pr.yml +++ b/.github/workflows/tests-pr.yml @@ -156,21 +156,15 @@ jobs: strategy: matrix: os: [ 'ubuntu-latest', 'windows-latest', 'macos-latest' ] - node: [ '20.14.0', '22.2.0', '24.1.0' ] + node: [ '22.12.0', '24.1.0' ] shard: [ '' ] include: # Add sharding for Windows jobs to reduce wall-clock time - os: windows-latest - node: '20.14.0' + node: '22.12.0' shard: '1/2' - os: windows-latest - node: '20.14.0' - shard: '2/2' - - os: windows-latest - node: '22.2.0' - shard: '1/2' - - os: windows-latest - node: '22.2.0' + node: '22.12.0' shard: '2/2' - os: windows-latest node: '24.1.0' @@ -181,10 +175,7 @@ jobs: exclude: # Exclude the non-sharded Windows entries (replaced by sharded ones above) - os: windows-latest - node: '20.14.0' - shard: '' - - os: windows-latest - node: '22.2.0' + node: '22.12.0' shard: '' - os: windows-latest node: '24.1.0' diff --git a/docs-shopify.dev/generated/generated_static_pages.json b/docs-shopify.dev/generated/generated_static_pages.json index 79a6d9141ba..0df9bcdf8df 100644 --- a/docs-shopify.dev/generated/generated_static_pages.json +++ b/docs-shopify.dev/generated/generated_static_pages.json @@ -10,7 +10,7 @@ "type": "Generic", "anchorLink": "requirements", "title": "Requirements", - "sectionContent": "\n- [Node.js](https://nodejs.org/en/download/): 20.10 or higher\n- A Node.js package manager: [npm](https://www.npmjs.com/get-npm), [Yarn 1.x](https://classic.yarnpkg.com/lang/en/docs/install), or [pnpm](https://pnpm.io/installation).\n- [Git](https://git-scm.com/downloads): 2.28.0 or higher\n" + "sectionContent": "\n- [Node.js](https://nodejs.org/en/download/): 22.12 or higher\n- A Node.js package manager: [npm](https://www.npmjs.com/get-npm), [Yarn 1.x](https://classic.yarnpkg.com/lang/en/docs/install), or [pnpm](https://pnpm.io/installation).\n- [Git](https://git-scm.com/downloads): 2.28.0 or higher\n" }, { "type": "Generic", @@ -118,4 +118,4 @@ } ] } -] \ No newline at end of file +] diff --git a/docs-shopify.dev/static/cli.doc.ts b/docs-shopify.dev/static/cli.doc.ts index 8449574b59c..8f738ef6091 100644 --- a/docs-shopify.dev/static/cli.doc.ts +++ b/docs-shopify.dev/static/cli.doc.ts @@ -13,7 +13,7 @@ const data: LandingTemplateSchema = { anchorLink: 'requirements', title: 'Requirements', sectionContent: ` -- [Node.js](https://nodejs.org/en/download/): 20.10 or higher +- [Node.js](https://nodejs.org/en/download/): 22.12 or higher - A Node.js package manager: [npm](https://www.npmjs.com/get-npm), [Yarn 1.x](https://classic.yarnpkg.com/lang/en/docs/install), or [pnpm](https://pnpm.io/installation). - [Git](https://git-scm.com/downloads): 2.28.0 or higher `, diff --git a/packages/app/package.json b/packages/app/package.json index 3e135b4d5a7..ec99d199662 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -93,7 +93,7 @@ "@vitest/coverage-istanbul": "^3.1.4" }, "engines": { - "node": ">=20.10.0" + "node": ">=22.12.0" }, "os": [ "darwin", diff --git a/packages/cli-kit/package.json b/packages/cli-kit/package.json index ad4ebd4e749..6bd5630a695 100644 --- a/packages/cli-kit/package.json +++ b/packages/cli-kit/package.json @@ -174,7 +174,7 @@ "typedoc": "^0.28.17" }, "engines": { - "node": ">=20.10.0" + "node": ">=22.12.0" }, "os": [ "darwin", diff --git a/packages/cli/package.json b/packages/cli/package.json index 42937445fdb..efc22b48ee5 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -72,7 +72,7 @@ "esbuild-plugin-copy": "^2.1.1" }, "engines": { - "node": ">=20.10.0" + "node": ">=22.12.0" }, "os": [ "darwin", diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 6e3476af1a6..d7965d739b2 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -64,7 +64,7 @@ "@vitest/coverage-istanbul": "^3.1.4" }, "engines": { - "node": ">=20.10.0" + "node": ">=22.12.0" }, "os": [ "darwin", diff --git a/packages/e2e/package.json b/packages/e2e/package.json index c817c1dd4b9..60c71f0a95a 100644 --- a/packages/e2e/package.json +++ b/packages/e2e/package.json @@ -40,6 +40,6 @@ "tsx": "^4.21.0" }, "engines": { - "node": ">=20.10.0" + "node": ">=22.12.0" } } diff --git a/packages/plugin-cloudflare/package.json b/packages/plugin-cloudflare/package.json index b959cf958af..29ece2ed6a2 100644 --- a/packages/plugin-cloudflare/package.json +++ b/packages/plugin-cloudflare/package.json @@ -52,7 +52,7 @@ "@vitest/coverage-istanbul": "^3.1.4" }, "engines": { - "node": ">=20.10.0" + "node": ">=22.12.0" }, "os": [ "darwin", diff --git a/packages/plugin-did-you-mean/package.json b/packages/plugin-did-you-mean/package.json index 203353baf9f..72d759455b6 100644 --- a/packages/plugin-did-you-mean/package.json +++ b/packages/plugin-did-you-mean/package.json @@ -48,7 +48,7 @@ "@vitest/coverage-istanbul": "^3.1.4" }, "engines": { - "node": ">=20.10.0" + "node": ">=22.12.0" }, "os": [ "darwin", diff --git a/packages/store/package.json b/packages/store/package.json index 80a9e770d50..df5de4e331e 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -46,7 +46,7 @@ "@vitest/coverage-istanbul": "^3.1.4" }, "engines": { - "node": ">=20.10.0" + "node": ">=22.12.0" }, "os": [ "darwin", diff --git a/packages/theme/package.json b/packages/theme/package.json index 27186759aca..faca48cdfb5 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -54,7 +54,7 @@ "node-stream-zip": "^1.15.0" }, "engines": { - "node": ">=20.10.0" + "node": ">=22.12.0" }, "os": [ "darwin", From 82cf498fda86a337541cea577e229dc8bd0684df Mon Sep 17 00:00:00 2001 From: Gonzalo Riestra Date: Mon, 11 May 2026 10:06:20 +0200 Subject: [PATCH 2/3] Use Node 26 by default --- .github/workflows/tests-main.yml | 12 ++++++------ .github/workflows/tests-manual.yml | 5 +++-- .github/workflows/tests-pr.yml | 13 +++++++++++-- .github/workflows/update-graphql-deps.yml | 2 +- dev.yml | 2 +- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/.github/workflows/tests-main.yml b/.github/workflows/tests-main.yml index 5e892d5fdee..ef01bfaaf65 100644 --- a/.github/workflows/tests-main.yml +++ b/.github/workflows/tests-main.yml @@ -22,7 +22,7 @@ env: BUNDLE_WITHOUT: 'test:development' GH_TOKEN: ${{ secrets.SHOPIFY_GH_READ_CONTENT_TOKEN }} GH_TOKEN_SHOP: ${{ secrets.SHOP_GH_READ_CONTENT_TOKEN }} - DEFAULT_NODE_VERSION: '24.1.0' + DEFAULT_NODE_VERSION: '26.1.0' jobs: main: @@ -32,7 +32,7 @@ jobs: strategy: matrix: os: [ 'ubuntu-latest', 'windows-latest', 'macos-latest' ] - node: [ '22.12.0', '24.1.0' ] + node: [ '22.12.0', '24.1.0', '26.1.0' ] steps: - uses: actions/checkout@v3 name: Checkout [${{ github.ref_name }}] @@ -44,16 +44,16 @@ jobs: node-version: ${{ matrix.node }} - name: Build run: pnpm nx run-many --all --skip-nx-cache --target=build --output-style=stream - if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '24.1.0' }} + if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '26.1.0' }} - name: Lint run: pnpm nx run-many --all --skip-nx-cache --target=lint --output-style=stream - if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '24.1.0' }} + if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '26.1.0' }} - name: Type-check run: pnpm nx run-many --all --skip-nx-cache --target=type-check --output-style=stream - if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '24.1.0' }} + if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '26.1.0' }} - name: Bundle run: pnpm nx run-many --all --skip-nx-cache --target=bundle --output-style=stream - if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '24.1.0' }} + if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '26.1.0' }} - name: Unit tests run: pnpm vitest run ${{ env.POOL_OPTIONS }} env: diff --git a/.github/workflows/tests-manual.yml b/.github/workflows/tests-manual.yml index f65f37e5063..6f49c0f0489 100644 --- a/.github/workflows/tests-manual.yml +++ b/.github/workflows/tests-manual.yml @@ -11,11 +11,12 @@ on: node-version: description: 'Node version' required: true - default: '24.1.0' + default: '26.1.0' type: choice options: - 22.12.0 - 24.1.0 + - 26.1.0 os: description: 'Operating system' required: true @@ -40,7 +41,7 @@ env: SHOPIFY_FLAG_CLIENT_ID: ${{ secrets.SHOPIFY_FLAG_CLIENT_ID }} GH_TOKEN: ${{ secrets.SHOPIFY_GH_READ_CONTENT_TOKEN }} GH_TOKEN_SHOP: ${{ secrets.SHOP_GH_READ_CONTENT_TOKEN }} - DEFAULT_NODE_VERSION: '24.1.0' + DEFAULT_NODE_VERSION: '26.1.0' DEFAULT_OS: 'ubuntu-latest' jobs: diff --git a/.github/workflows/tests-pr.yml b/.github/workflows/tests-pr.yml index 97493e13a0f..f390c744fd2 100644 --- a/.github/workflows/tests-pr.yml +++ b/.github/workflows/tests-pr.yml @@ -16,7 +16,7 @@ env: BUNDLE_WITHOUT: 'test:development' GH_TOKEN: ${{ secrets.SHOPIFY_GH_READ_CONTENT_TOKEN }} GH_TOKEN_SHOP: ${{ secrets.SHOP_GH_READ_CONTENT_TOKEN }} - DEFAULT_NODE_VERSION: '24.1.0' + DEFAULT_NODE_VERSION: '26.1.0' jobs: type-check: @@ -156,7 +156,7 @@ jobs: strategy: matrix: os: [ 'ubuntu-latest', 'windows-latest', 'macos-latest' ] - node: [ '22.12.0', '24.1.0' ] + node: [ '22.12.0', '24.1.0', '26.1.0' ] shard: [ '' ] include: # Add sharding for Windows jobs to reduce wall-clock time @@ -172,6 +172,12 @@ jobs: - os: windows-latest node: '24.1.0' shard: '2/2' + - os: windows-latest + node: '26.1.0' + shard: '1/2' + - os: windows-latest + node: '26.1.0' + shard: '2/2' exclude: # Exclude the non-sharded Windows entries (replaced by sharded ones above) - os: windows-latest @@ -180,6 +186,9 @@ jobs: - os: windows-latest node: '24.1.0' shard: '' + - os: windows-latest + node: '26.1.0' + shard: '' steps: - uses: actions/checkout@v3 with: diff --git a/.github/workflows/update-graphql-deps.yml b/.github/workflows/update-graphql-deps.yml index 08dcd661583..da072051e88 100644 --- a/.github/workflows/update-graphql-deps.yml +++ b/.github/workflows/update-graphql-deps.yml @@ -28,7 +28,7 @@ jobs: - name: Setup deps uses: ./.github/actions/setup-cli-deps with: - node-version: '24.1.0' + node-version: '26.1.0' - name: Get schemas for codegen env: GH_TOKEN: ${{ secrets.SHOPIFY_GH_READ_CONTENT_TOKEN }} diff --git a/dev.yml b/dev.yml index aabc7393898..6c6bffb6bfc 100644 --- a/dev.yml +++ b/dev.yml @@ -2,7 +2,7 @@ name: cli up: - node: - version: 24.1.0 + version: 26.1.0 package_manager: pnpm@10.11.1 - packages: - jq From 05792f05ad25a0e0d83f86d4ffaa30b989ba6d1d Mon Sep 17 00:00:00 2001 From: Gonzalo Riestra Date: Mon, 11 May 2026 10:53:15 +0200 Subject: [PATCH 3/3] Fix tests --- .../theme/src/cli/utilities/repl/repl.test.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/theme/src/cli/utilities/repl/repl.test.ts b/packages/theme/src/cli/utilities/repl/repl.test.ts index 8cc9aea5c76..8b749aeca87 100644 --- a/packages/theme/src/cli/utilities/repl/repl.test.ts +++ b/packages/theme/src/cli/utilities/repl/repl.test.ts @@ -5,7 +5,7 @@ import {DevServerSession} from '../theme-environment/types.js' import {describe, expect, test, vi} from 'vitest' import {outputInfo} from '@shopify/cli-kit/node/output' -import {createInterface} from 'readline' +import {Interface} from 'readline' vi.mock('@shopify/cli-kit/node/output') vi.mock('./evaluator.js') @@ -21,10 +21,15 @@ describe('handleInput', () => { } const themeId = '123' const url = '/' - const rl = createInterface({ - input: process.stdin, - output: process.stdout, - }) + // Use a stub Interface instead of a real readline created from process.stdin. + // In Node 26, readline.createInterface on a non-TTY stdin that is already + // at EOF (as in Vitest workers) immediately closes the Interface, and + // calling `prompt()` on a closed Interface throws `Error: readline was + // closed` (it was a silent no-op in Node 22/24). + const rl = { + prompt: vi.fn(), + close: vi.fn(), + } as unknown as Interface test('should call outputInfo if input has {{ delimiter', async () => { // Given