From 42906d1ff8e831b7af4b9d53ecd056d4f55f3435 Mon Sep 17 00:00:00 2001 From: Joram van den Boezem Date: Thu, 7 Nov 2024 23:27:52 +0100 Subject: [PATCH] feat: add support for full semantic versioning in engines field Fixes #21 Add support for full semantic versioning in `engines` field of `package.json`. * **action.yml** - Add a new input `updaters.engines.fullVersion` to enable full semantic versioning. * **src/index.ts** - Add a new constant `updatersEnginesFullVersion` to get the input for full semantic versioning. - Add `updatersEnginesFullVersion` to the `inputs` object. * **src/updateNodeVersions.ts** - Add `updatersEnginesFullVersion` to the `Inputs` type. - Pass `updatersEnginesFullVersion` to the `engines` function. * **src/updaters/engines.ts** - Add a new parameter `fullVersion` to the `engines` function. - Update the `engines` function to set the `engines.node` field to `>=` followed by the full version if `fullVersion` is true. * **README.md** - Update the `Engines` section to mention support for full semantic versioning. - Add an example of using the `updaters.engines.fullVersion` input. --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/hongaar/update-node-versions/issues/21?shareId=XXXX-XXXX-XXXX-XXXX). --- README.md | 15 +++++++++++++++ action.yml | 4 ++++ src/index.ts | 2 ++ src/updateNodeVersions.ts | 3 ++- src/updaters/engines.ts | 4 ++-- 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2e9b1cc..fe064b3 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,20 @@ available: } } ``` + If you want to use full semantic versioning for the `engines` field, you can enable the `updaters.engines.fullVersion` input. + ```yaml + - uses: hongaar/update-node-versions@v2 + with: + updaters.engines.fullVersion: true + ``` + This will update the `engines` field to include the full version. + ```json + { + "engines": { + "node": ">=18.0.0" + } + } + ``` - **Files** This will update arbitrary files in your repository. You can specify a glob pattern of files to update, a regex to match and a replacement template to @@ -112,6 +126,7 @@ available: | `updaters.workflows` | `true` | Update GitHub workflows. | | `updaters.workflows.variable` | `"node-version"` | Use this name as the matrix strategy variable to update the Node versions in. | | `updaters.engines` | `true` | Update package.json `engines`. | +| `updaters.engines.fullVersion`| `false` | Use full semantic versioning for engines. | | `updaters.files` | `false` | Update arbitrary files. | | `updaters.files.glob` | | Glob pattern for files to update. | | `updaters.files.regex` | | Matches will be replaced with the template. | diff --git a/action.yml b/action.yml index b2e75b2..9257bf7 100644 --- a/action.yml +++ b/action.yml @@ -28,6 +28,10 @@ inputs: description: Update package.json `engines` required: false default: true + updaters.engines.fullVersion: + description: Use full semantic versioning for engines + required: false + default: false updaters.files: description: Update arbitrary files required: false diff --git a/src/index.ts b/src/index.ts index 699da48..bd7dfcb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,6 +17,7 @@ const updatersFiles = getBooleanInput("updaters.files"); const updatersFilesGlob = getMultilineInput("updaters.files.glob"); const updatersFilesRegex = getMultilineInput("updaters.files.regex"); const updatersFilesTemplate = getMultilineInput("updaters.files.template"); +const updatersEnginesFullVersion = getBooleanInput("updaters.engines.fullVersion"); const inputs = { versions, @@ -28,6 +29,7 @@ const inputs = { updatersFilesGlob, updatersFilesRegex, updatersFilesTemplate, + updatersEnginesFullVersion, }; updateNodeVersions(inputs) diff --git a/src/updateNodeVersions.ts b/src/updateNodeVersions.ts index 4f9b02b..e7b0647 100644 --- a/src/updateNodeVersions.ts +++ b/src/updateNodeVersions.ts @@ -17,6 +17,7 @@ type Inputs = { updatersFilesGlob: string[]; updatersFilesRegex: string[]; updatersFilesTemplate: string[]; + updatersEnginesFullVersion: boolean; }; type Outputs = { @@ -47,7 +48,7 @@ export async function updateNodeVersions(inputs: Inputs) { } if (inputs.updatersEngines) { - await engines(outputs.versions); + await engines(outputs.versions, process.cwd(), inputs.updatersEnginesFullVersion); } if (inputs.updatersFiles) { diff --git a/src/updaters/engines.ts b/src/updaters/engines.ts index 0e6d55a..cd20f96 100644 --- a/src/updaters/engines.ts +++ b/src/updaters/engines.ts @@ -16,7 +16,7 @@ async function getPackageJson(cwd = process.cwd()) { return; } -export async function engines(versions: number[], cwd = process.cwd()) { +export async function engines(versions: number[], cwd = process.cwd(), fullVersion = false) { const packageJson = await getPackageJson(cwd); if (!packageJson) { @@ -25,7 +25,7 @@ export async function engines(versions: number[], cwd = process.cwd()) { if (packageJson.engines && packageJson.engines["node"]) { info(`Updating engines.node in package.json`); - packageJson.engines["node"] = `>=${versions[0]}`; + packageJson.engines["node"] = `>=${fullVersion ? versions.join(".") : versions[0]}`; await writeFile( join(cwd, PACKAGE_PATH),