-
Notifications
You must be signed in to change notification settings - Fork 1.4k
feat(node-version-file): support parsing devEngines
field
#1283
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,11 @@ | ||||||
{ | ||||||
"engines": { | ||||||
"node": "^20 || ^22" | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this would make the test more reliable and easier to understand
Suggested change
|
||||||
}, | ||||||
"devEngines": { | ||||||
"runtime": { | ||||||
"name": "node", | ||||||
"version": "^20" | ||||||
} | ||||||
} | ||||||
} |
Original file line number | Diff line number | Diff line change | ||||||
---|---|---|---|---|---|---|---|---|
|
@@ -91,22 +91,23 @@ describe('main tests', () => { | |||||||
|
||||||||
describe('getNodeVersionFromFile', () => { | ||||||||
each` | ||||||||
contents | expected | ||||||||
${'12'} | ${'12'} | ||||||||
${'12.3'} | ${'12.3'} | ||||||||
${'12.3.4'} | ${'12.3.4'} | ||||||||
${'v12.3.4'} | ${'12.3.4'} | ||||||||
${'lts/erbium'} | ${'lts/erbium'} | ||||||||
${'lts/*'} | ${'lts/*'} | ||||||||
${'nodejs 12.3.4'} | ${'12.3.4'} | ||||||||
${'ruby 2.3.4\nnodejs 12.3.4\npython 3.4.5'} | ${'12.3.4'} | ||||||||
${''} | ${''} | ||||||||
${'unknown format'} | ${'unknown format'} | ||||||||
${' 14.1.0 '} | ${'14.1.0'} | ||||||||
${'{"volta": {"node": ">=14.0.0 <=17.0.0"}}'}| ${'>=14.0.0 <=17.0.0'} | ||||||||
${'{"volta": {"extends": "./package.json"}}'}| ${'18.0.0'} | ||||||||
${'{"engines": {"node": "17.0.0"}}'} | ${'17.0.0'} | ||||||||
${'{}'} | ${null} | ||||||||
contents | expected | ||||||||
${'12'} | ${'12'} | ||||||||
${'12.3'} | ${'12.3'} | ||||||||
${'12.3.4'} | ${'12.3.4'} | ||||||||
${'v12.3.4'} | ${'12.3.4'} | ||||||||
${'lts/erbium'} | ${'lts/erbium'} | ||||||||
${'lts/*'} | ${'lts/*'} | ||||||||
${'nodejs 12.3.4'} | ${'12.3.4'} | ||||||||
${'ruby 2.3.4\nnodejs 12.3.4\npython 3.4.5'} | ${'12.3.4'} | ||||||||
${''} | ${''} | ||||||||
${'unknown format'} | ${'unknown format'} | ||||||||
${' 14.1.0 '} | ${'14.1.0'} | ||||||||
${'{"volta": {"node": ">=14.0.0 <=17.0.0"}}'} | ${'>=14.0.0 <=17.0.0'} | ||||||||
${'{"volta": {"extends": "./package.json"}}'} | ${'18.0.0'} | ||||||||
${'{"engines": {"node": "17.0.0"}}'} | ${'17.0.0'} | ||||||||
${'{"devEngines": {"runtime": {"name": "node", "version": "22.0.0"}}}'} | ${'22.0.0'} | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||
${'{}'} | ${null} | ||||||||
`.it('parses "$contents"', ({contents, expected}) => { | ||||||||
const existsSpy = jest.spyOn(fs, 'existsSync'); | ||||||||
existsSpy.mockImplementation(() => true); | ||||||||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -71,7 +71,35 @@ steps: | |||||
- run: npm test | ||||||
``` | ||||||
|
||||||
When using the `package.json` input, the action will look for `volta.node` first. If `volta.node` isn't defined, then it will look for `engines.node`. | ||||||
When using the `package.json` input, the action will look in following field for a specified Node version: | ||||||
1. It checks `volta.node` first. | ||||||
2. Then it checks `devEngines.runtime`. | ||||||
3. Then it will look for `engines.node`. | ||||||
4. Otherwise it tries to resolve the file defined by [`volta.extends`](https://docs.volta.sh/advanced/workspaces) | ||||||
and look for `volta.node` or `engines.node` recursively. | ||||||
|
||||||
### Example with `devEngines` | ||||||
|
||||||
When a runtime engine (`engines.node`) is defined but also a development engine (`devEngines.runtime`) then the `devEngine` runtime version is used. | ||||||
This example will install a Node version based on the `^20.10` pattern. | ||||||
|
||||||
```json | ||||||
{ | ||||||
"engines": { | ||||||
"node": "^20 || ^22" | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
}, | ||||||
"devEngines": { | ||||||
"runtime": { | ||||||
"name": "node", | ||||||
"version": "^20.10" | ||||||
} | ||||||
} | ||||||
} | ||||||
``` | ||||||
|
||||||
### Example with volta pinned Node version | ||||||
|
||||||
When both `engines.node` and `volta.node` is defined the value in `volta.node` is used. | ||||||
|
||||||
```json | ||||||
{ | ||||||
|
@@ -84,8 +112,6 @@ When using the `package.json` input, the action will look for `volta.node` first | |||||
} | ||||||
``` | ||||||
|
||||||
Otherwise, when [`volta.extends`](https://docs.volta.sh/advanced/workspaces) is defined, then it will resolve the corresponding file and look for `volta.node` or `engines.node` recursively. | ||||||
|
||||||
## Architecture | ||||||
|
||||||
You can use any of the [supported operating systems](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners), and the compatible `architecture` can be selected using `architecture`. Values are `x86`, `x64`, `arm64`, `armv6l`, `armv7l`, `ppc64le`, `s390x` (not all of the architectures are available on all platforms). | ||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -26,6 +26,14 @@ export function getNodeVersionFromFile(versionFilePath: string): string | null { | |||||||||||||||||||||||||||||||||
return manifest.volta.node; | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
// support devEngines from npm 11 | ||||||||||||||||||||||||||||||||||
if ( | ||||||||||||||||||||||||||||||||||
manifest.devEngines?.runtime?.name === 'node' && | ||||||||||||||||||||||||||||||||||
manifest.devEngines.runtime.version | ||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||
return manifest.devEngines.runtime.version; | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
Comment on lines
+29
to
+36
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||
if (manifest.engines?.node) { | ||||||||||||||||||||||||||||||||||
return manifest.engines.node; | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggested file content: