Skip to content

Commit 877fc40

Browse files
committed
Add script to prepare cli version
1 parent db2c90c commit 877fc40

6 files changed

Lines changed: 36 additions & 2 deletions

File tree

.github/workflows/main.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ jobs:
7979
run: |
8080
pnpm run dev-test:generate:${{matrix.method}}
8181
git diff --exit-code -- dev-test/
82+
- name: Test CLI version ${{matrix.method}}
83+
run: pnpm run dev-test:test-cli-version:${{matrix.method}}
8284

8385
examples-tests:
8486
name: Examples - Normal

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,6 @@ website/public/_redirects
2121

2222
**/cypress/screenshots
2323
**/cypress/videos
24+
25+
# Generated file for `graphql-codegen --version` to work. See `pnpm prepare-cli-version`.
26+
packages/graphql-codegen-cli/src/_version.ts

dev-test/general/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
"generate": "pnpm generate:esm",
88
"generate:cjs": "node ../../packages/graphql-codegen-cli/dist/cjs/bin.js --require dotenv/config --config codegen.ts dotenv_config_path=.env",
99
"generate:esm": "node ../../packages/graphql-codegen-cli/dist/esm/bin.js --require dotenv/config --config codegen.ts dotenv_config_path=.env",
10+
"test-cli-version:cjs": "node ../../packages/graphql-codegen-cli/dist/cjs/bin.js --version",
11+
"test-cli-version:esm": "node ../../packages/graphql-codegen-cli/dist/esm/bin.js --version",
1012
"watch": "pnpm watch:esm",
1113
"watch:cjs": "pnpm generate:cjs --watch",
1214
"watch:esm": "pnpm generate:esm --watch"

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77
"node": ">= 16.0.0"
88
},
99
"scripts": {
10-
"prebuild": "rimraf dist/ .bob/ tsconfig.tsbuildinfo",
10+
"prebuild": "rimraf dist/ .bob/ tsconfig.tsbuildinfo && pnpm prepare-cli-version",
1111
"build": "bob build",
1212
"postbuild": "pnpm fix-bins",
1313
"clean": "rimraf node_modules/",
1414
"dev-test:generate": "pnpm --filter=\"dev-test*\" generate",
1515
"dev-test:generate:cjs": "pnpm --filter=\"dev-test*\" generate:cjs",
1616
"dev-test:generate:esm": "pnpm --filter=\"dev-test*\" generate:esm",
17+
"dev-test:test-cli-version:cjs": "pnpm prepare-cli-version && pnpm --filter=\"dev-test-general\" test-cli-version:cjs",
18+
"dev-test:test-cli-version:esm": "pnpm prepare-cli-version && pnpm --filter=\"dev-test-general\" test-cli-version:esm",
1719
"dev-test:watch": "pnpm --filter=\"dev-test*\" watch",
1820
"dev-test:watch:cjs": "pnpm --filter=\"dev-test*\" watch:cjs",
1921
"dev-test:watch:esm": "pnpm --filter=\"dev-test*\" watch:esm",
@@ -24,6 +26,7 @@
2426
"postinstall": "husky install",
2527
"lint": "eslint --cache .",
2628
"lint:ci": "eslint --cache --output-file eslint_report.json --format json .",
29+
"prepare-cli-version": "node ./scripts/prepare-cli-version.mjs",
2730
"prettier": "prettier --cache --write --list-different .",
2831
"prettier:check": "prettier --cache --check .",
2932
"rebuild": "bob build --incremental",

packages/graphql-codegen-cli/src/config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
Types,
1818
} from '@graphql-codegen/plugin-helpers';
1919
import type { UnnormalizedTypeDefPointer } from '@graphql-tools/load';
20+
import { version } from './_version.js'; // Run `pnpm prepare-cli-version` to initialize this value
2021
import { findAndLoadGraphQLConfig } from './graphql-config.js';
2122
import {
2223
defaultDocumentsLoadOptions,
@@ -283,7 +284,7 @@ export function buildOptions() {
283284
}
284285

285286
export function parseArgv(argv = process.argv): YamlCliFlags {
286-
return yargs(argv).options(buildOptions()).parse(argv) as any;
287+
return yargs(argv).version(version).options(buildOptions()).parse(argv) as any;
287288
}
288289

289290
export async function createContext(

scripts/prepare-cli-version.mjs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import * as fs from 'fs';
2+
import packageJson from '../packages/graphql-codegen-cli/package.json' with { type: 'json' };
3+
4+
/**
5+
* This script extracts the `@graphql-codegen/cli` version ahead of build and publish time,
6+
* so at runtime, we don't have to import `package.json` file for the package version.
7+
*
8+
* Importing a `.json` file is surprisingly hard for a dual ESM/CJS package.
9+
* The current approach is the simplest.
10+
*
11+
* Many alternatives considered:
12+
* 1. `import {} from '../package.json'` does not work in ESM without import attributes i.e. `with { type: 'json' }`.
13+
* 2. `createRequire` from `node:module` needs `import.meta.url` which works for ESM, but doesn't work for CJS because it is a syntax error at parse-time.
14+
* 3. `fs.readFile` reads from `cwd`, which means we need to use `__dirname` or `import.meta.url` as the starting point. `import.meta.url` is a syntax error at parse-time for CJS.
15+
* 4. Create a shim `.mts` file and dynamically import it at runtime for ESM
16+
* 5. Use `nodenext` instead of `esnext` for `module` and `moduleResolution`. Maybe a big change?
17+
* 6. Ship ESM-only. This is a big change.
18+
*/
19+
fs.writeFileSync(
20+
'./packages/graphql-codegen-cli/src/_version.ts',
21+
`export const version = '${packageJson.version}';`,
22+
'utf8',
23+
);

0 commit comments

Comments
 (0)