From 86cf5547d21ae703d173d1db4f74cc839f5e6412 Mon Sep 17 00:00:00 2001 From: Donald Merand Date: Fri, 5 Jun 2026 11:00:08 -0400 Subject: [PATCH 1/2] Single-source codegen freshness checks via pnpm codegen scripts --- .github/workflows/tests-pr.yml | 28 +++----------------- bin/check-codegen-clean.js | 47 ++++++++++++++++++++++++++++++++++ package.json | 4 +++ 3 files changed, 55 insertions(+), 24 deletions(-) create mode 100755 bin/check-codegen-clean.js diff --git a/.github/workflows/tests-pr.yml b/.github/workflows/tests-pr.yml index 88d1e4f2ae..5e35457511 100644 --- a/.github/workflows/tests-pr.yml +++ b/.github/workflows/tests-pr.yml @@ -108,14 +108,8 @@ jobs: uses: ./.github/actions/setup-cli-deps with: node-version: ${{ env.DEFAULT_NODE_VERSION }} - - name: Get schemas for codegen - run: pnpm graphql-codegen:get-graphql-schemas - - name: Run graphql-codegen - run: pnpm graphql-codegen - - name: Run git diff - run: git diff - - name: Fail if any changes were made - run: 'test -z "$(git status --porcelain)" || { echo -e "Run pnpm graphql-codegen when queries are changed, committing any fixes and generated files" ; exit 1; }' + - name: Check graphql-codegen is up to date + run: pnpm codegen:check:graphql oclif-checks: name: 'Check OCLIF manifests & readme & docs' @@ -133,22 +127,8 @@ jobs: node-version: ${{ env.DEFAULT_NODE_VERSION }} - name: Build run: pnpm build --output-style=stream - - name: Refresh manifests - run: pnpm refresh-manifests - - name: Check if there are changes - run: 'test -z "$(git status --porcelain "**/oclif.manifest.json" )" || { echo -e "Run pnpm refresh-manifests before pushing new commands or flags. Diff here:\n\n$(git diff)" ; exit 1; }' - - name: Refresh readme - run: pnpm refresh-readme - - name: Check if there are changes - run: 'test -z "$(git status --porcelain "packages/cli/README.md" )" || { echo -e "Run pnpm refresh-readme before pushing new commands or flags. Diff here:\n\n$(git diff)" ; exit 1; }' - - name: Refresh code documentation - run: pnpm refresh-code-documentation - - name: Check if there are changes - run: 'test -z "$(git status --porcelain)" || { echo -e "Run pnpm refresh-code-documentation when you update functions with autogenerated examples. Diff here:\n\n$(git diff)" ; exit 1; }' - - name: Build shopify.dev docs - run: pnpm build-dev-docs - - name: Check if there are changes - run: 'test -z "$(git status --porcelain "docs-shopify.dev/generated/*.json" )" || { echo -e "Run (pnpm build-dev-docs) before pushing new commands or flags." ; exit 1; }' + - name: Check OCLIF manifests, readme & docs are up to date + run: pnpm codegen:check:oclif unit-tests: name: "Unit tests with Node ${{ matrix.node }} in ${{ matrix.os }}${{ matrix.shard != '' && format(' (shard {0})', matrix.shard) || '' }}" diff --git a/bin/check-codegen-clean.js b/bin/check-codegen-clean.js new file mode 100755 index 0000000000..ad07aac2ea --- /dev/null +++ b/bin/check-codegen-clean.js @@ -0,0 +1,47 @@ +#!/usr/bin/env node +// Asserts that a codegen step left the working tree clean for its owned paths. +// Single source of truth for the codegen freshness checks run both locally +// (via `pnpm codegen:check*`) and in CI (tests-pr.yml). Each key mirrors one +// regenerate-then-verify step; the message tells the developer how to fix it. +import {execFileSync} from 'node:child_process' + +const CHECKS = { + graphql: { + pathspec: [], + message: 'Run pnpm graphql-codegen when queries are changed, committing any fixes and generated files', + }, + 'oclif:manifests': { + pathspec: ['**/oclif.manifest.json'], + message: 'Run pnpm refresh-manifests before pushing new commands or flags.', + }, + 'oclif:readme': { + pathspec: ['packages/cli/README.md'], + message: 'Run pnpm refresh-readme before pushing new commands or flags.', + }, + 'oclif:code-docs': { + pathspec: [], + message: 'Run pnpm refresh-code-documentation when you update functions with autogenerated examples.', + }, + 'oclif:dev-docs': { + pathspec: ['docs-shopify.dev/generated/*.json'], + message: 'Run pnpm build-dev-docs before pushing new commands or flags.', + }, +} + +const key = process.argv[2] +const check = CHECKS[key] +if (!check) { + console.error(`Unknown codegen check "${key}". Known checks: ${Object.keys(CHECKS).join(', ')}`) + process.exit(2) +} + +const porcelain = execFileSync('git', ['status', '--porcelain', ...check.pathspec], {encoding: 'utf8'}) +if (porcelain.trim() === '') { + process.exit(0) +} + +const diff = execFileSync('git', ['diff', ...check.pathspec], {encoding: 'utf8'}) +console.error(check.message) +console.error('\nDiff here:\n') +console.error(diff) +process.exit(1) diff --git a/package.json b/package.json index 20bed9b068..bf5bc9c12d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,10 @@ "bundle-for-release": "nx run-many --target=bundle --all --skip-nx-cache", "changeset-manifests": "changeset version && pnpm install --no-frozen-lockfile && pnpm refresh-manifests && pnpm refresh-readme && pnpm refresh-code-documentation && bin/update-cli-kit-version.js", "clean": "nx run-many --target=clean --all --skip-nx-cache && nx reset", + "codegen": "pnpm graphql-codegen:get-graphql-schemas && pnpm graphql-codegen && pnpm refresh-manifests && pnpm refresh-code-documentation && pnpm build-dev-docs", + "codegen:check": "pnpm codegen:check:graphql && pnpm codegen:check:oclif", + "codegen:check:graphql": "pnpm graphql-codegen:get-graphql-schemas && pnpm graphql-codegen && node ./bin/check-codegen-clean.js graphql", + "codegen:check:oclif": "pnpm refresh-manifests && node ./bin/check-codegen-clean.js oclif:manifests && pnpm refresh-readme && node ./bin/check-codegen-clean.js oclif:readme && pnpm refresh-code-documentation && node ./bin/check-codegen-clean.js oclif:code-docs && pnpm build-dev-docs && node ./bin/check-codegen-clean.js oclif:dev-docs", "create-app": "nx build create-app && node packages/create-app/bin/dev.js --package-manager pnpm", "deploy-experimental": "node bin/deploy-experimental.js", "graph": "nx graph", From 199434e218df6f261e1c09ed774c196aa88df4e6 Mon Sep 17 00:00:00 2001 From: Donald Merand Date: Fri, 5 Jun 2026 11:18:00 -0400 Subject: [PATCH 2/2] Drop local codegen:check umbrella; invoke bin helper via node --- bin/check-codegen-clean.js | 1 - package.json | 1 - 2 files changed, 2 deletions(-) mode change 100755 => 100644 bin/check-codegen-clean.js diff --git a/bin/check-codegen-clean.js b/bin/check-codegen-clean.js old mode 100755 new mode 100644 index ad07aac2ea..5737fbb380 --- a/bin/check-codegen-clean.js +++ b/bin/check-codegen-clean.js @@ -1,4 +1,3 @@ -#!/usr/bin/env node // Asserts that a codegen step left the working tree clean for its owned paths. // Single source of truth for the codegen freshness checks run both locally // (via `pnpm codegen:check*`) and in CI (tests-pr.yml). Each key mirrors one diff --git a/package.json b/package.json index bf5bc9c12d..a28dce780f 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "changeset-manifests": "changeset version && pnpm install --no-frozen-lockfile && pnpm refresh-manifests && pnpm refresh-readme && pnpm refresh-code-documentation && bin/update-cli-kit-version.js", "clean": "nx run-many --target=clean --all --skip-nx-cache && nx reset", "codegen": "pnpm graphql-codegen:get-graphql-schemas && pnpm graphql-codegen && pnpm refresh-manifests && pnpm refresh-code-documentation && pnpm build-dev-docs", - "codegen:check": "pnpm codegen:check:graphql && pnpm codegen:check:oclif", "codegen:check:graphql": "pnpm graphql-codegen:get-graphql-schemas && pnpm graphql-codegen && node ./bin/check-codegen-clean.js graphql", "codegen:check:oclif": "pnpm refresh-manifests && node ./bin/check-codegen-clean.js oclif:manifests && pnpm refresh-readme && node ./bin/check-codegen-clean.js oclif:readme && pnpm refresh-code-documentation && node ./bin/check-codegen-clean.js oclif:code-docs && pnpm build-dev-docs && node ./bin/check-codegen-clean.js oclif:dev-docs", "create-app": "nx build create-app && node packages/create-app/bin/dev.js --package-manager pnpm",