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..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: [ '20.14.0', '22.2.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 d67e22aa447..6f49c0f0489 100644 --- a/.github/workflows/tests-manual.yml +++ b/.github/workflows/tests-manual.yml @@ -11,12 +11,12 @@ on: node-version: description: 'Node version' required: true - default: '24.1.0' + default: '26.1.0' type: choice options: - - 20.14.0 - - 22.2.0 + - 22.12.0 - 24.1.0 + - 26.1.0 os: description: 'Operating system' required: true @@ -41,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 67eed3eb0a3..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,38 +156,38 @@ 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', '26.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' + node: '22.12.0' shard: '2/2' - os: windows-latest - node: '22.2.0' + node: '24.1.0' shard: '1/2' - os: windows-latest - node: '22.2.0' + node: '24.1.0' shard: '2/2' - os: windows-latest - node: '24.1.0' + node: '26.1.0' shard: '1/2' - os: windows-latest - node: '24.1.0' + node: '26.1.0' shard: '2/2' exclude: # Exclude the non-sharded Windows entries (replaced by sharded ones above) - os: windows-latest - node: '20.14.0' + node: '22.12.0' shard: '' - os: windows-latest - node: '22.2.0' + node: '24.1.0' shard: '' - os: windows-latest - node: '24.1.0' + node: '26.1.0' shard: '' steps: - uses: actions/checkout@v3 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 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", 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