From 11b9f9a7f066f10609835c533362e49fd22a5f33 Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Fri, 9 Oct 2026 00:14:33 +0530 Subject: [PATCH] Migrate the action and tests to ES modules --- __tests__/config.test.ts | 2 +- __tests__/core.test.ts | 3 +- __tests__/coverage.test.ts | 2 +- __tests__/extensions.test.ts | 2 +- __tests__/fetch.test.ts | 2 +- __tests__/install.test.ts | 12 +++--- __tests__/packagist.test.ts | 2 +- __tests__/tools.test.ts | 73 ++++++++++++------------------------ __tests__/utils.test.ts | 21 +++++++---- dist/index.js | 2 +- dist/package.json | 3 ++ jest.config.js | 8 +++- package.json | 1 + src/config.ts | 2 +- src/coverage.ts | 6 +-- src/extensions.ts | 2 +- src/install.ts | 19 ++++++---- src/packagist.ts | 2 +- src/tools.ts | 13 ++++--- src/utils.ts | 9 +++-- tsconfig.json | 6 +-- 21 files changed, 95 insertions(+), 97 deletions(-) create mode 100644 dist/package.json diff --git a/__tests__/config.test.ts b/__tests__/config.test.ts index 80edb3bb..40fe1a78 100644 --- a/__tests__/config.test.ts +++ b/__tests__/config.test.ts @@ -1,4 +1,4 @@ -import * as config from '../src/config'; +import * as config from '../src/config.js'; describe('Config tests', () => { it.each` diff --git a/__tests__/core.test.ts b/__tests__/core.test.ts index b9bb1a1c..1e70048a 100644 --- a/__tests__/core.test.ts +++ b/__tests__/core.test.ts @@ -1,4 +1,5 @@ -import * as core from '../src/core'; +import {jest} from '@jest/globals'; +import * as core from '../src/core.js'; describe('Core tests', () => { const originalEnv = process.env; diff --git a/__tests__/coverage.test.ts b/__tests__/coverage.test.ts index fc20ca77..71d78e7d 100644 --- a/__tests__/coverage.test.ts +++ b/__tests__/coverage.test.ts @@ -1,4 +1,4 @@ -import * as coverage from '../src/coverage'; +import * as coverage from '../src/coverage.js'; describe('Config tests', () => { it.each` diff --git a/__tests__/extensions.test.ts b/__tests__/extensions.test.ts index 18f0b30e..e4f42229 100644 --- a/__tests__/extensions.test.ts +++ b/__tests__/extensions.test.ts @@ -1,5 +1,5 @@ import * as fs from 'fs'; -import * as extensions from '../src/extensions'; +import * as extensions from '../src/extensions.js'; describe('Extension tests', () => { it.each` diff --git a/__tests__/fetch.test.ts b/__tests__/fetch.test.ts index b96f8477..a7aa7f89 100644 --- a/__tests__/fetch.test.ts +++ b/__tests__/fetch.test.ts @@ -1,4 +1,4 @@ -import * as fetch from '../src/fetch'; +import * as fetch from '../src/fetch.js'; import nock from 'nock'; beforeAll(() => nock.disableNetConnect()); diff --git a/__tests__/install.test.ts b/__tests__/install.test.ts index de2b9f4d..7eb5a9bc 100644 --- a/__tests__/install.test.ts +++ b/__tests__/install.test.ts @@ -1,12 +1,11 @@ -import * as install from '../src/install'; -import * as utils from '../src/utils'; +import {jest} from '@jest/globals'; /** * Mock install.ts */ -jest.mock('../src/install', () => ({ +jest.unstable_mockModule('../src/install.js', () => ({ getScript: jest - .fn() + .fn() .mockImplementation(async (os: string): Promise => { const filename = os + (await utils.scriptExtension(os)); const version: string = await utils.parseVersion( @@ -36,7 +35,7 @@ jest.mock('../src/install', () => ({ /** * Mock fetch.ts */ -jest.mock('../src/fetch', () => ({ +jest.unstable_mockModule('../src/fetch.js', () => ({ fetch: jest.fn().mockImplementation(() => { return { data: '{ "latest": "8.3", "lowest": "8.1", "highest": "8.3", "nightly": "8.4", "5.x": "5.6" }' @@ -44,6 +43,9 @@ jest.mock('../src/fetch', () => ({ }) })); +const utils = await import('../src/utils.js'); +const install = await import('../src/install.js'); + describe('Install', () => { it.each` version | os | extension_csv | ini_file | ini_values_csv | coverage_driver | tools | output diff --git a/__tests__/packagist.test.ts b/__tests__/packagist.test.ts index 24b825ac..2760d754 100644 --- a/__tests__/packagist.test.ts +++ b/__tests__/packagist.test.ts @@ -1,4 +1,4 @@ -import * as packagist from '../src/packagist'; +import * as packagist from '../src/packagist.js'; import nock from 'nock'; beforeAll(() => nock.disableNetConnect()); diff --git a/__tests__/tools.test.ts b/__tests__/tools.test.ts index e06bdd35..55cfc406 100644 --- a/__tests__/tools.test.ts +++ b/__tests__/tools.test.ts @@ -1,6 +1,6 @@ -import * as fs from 'fs'; -import * as tools from '../src/tools'; -import {ToolData, ToolInput} from '../src/tools'; +import {jest} from '@jest/globals'; +import fs from 'fs'; +import type {ToolData, ToolInput} from '../src/tools.js'; function getData(data: Partial): ToolData { const tool = data.tool || 'tool'; @@ -40,9 +40,9 @@ function unsetComposerAuthEnv(): void { /** * Mock fetch.ts */ -jest.mock('../src/fetch', () => ({ +jest.unstable_mockModule('../src/fetch.js', () => ({ fetch: jest - .fn() + .fn() .mockImplementation( async (url: string, token?: string): Promise> => { if (url.includes('deployer')) { @@ -86,9 +86,9 @@ jest.mock('../src/fetch', () => ({ ) })); -jest.mock('../src/packagist', () => ({ +jest.unstable_mockModule('../src/packagist.js', () => ({ search: jest - .fn() + .fn() .mockImplementation( async ( package_name: string, @@ -102,6 +102,10 @@ jest.mock('../src/packagist', () => ({ ) })); +const tools = await import('../src/tools.js'); + +afterEach(() => jest.restoreAllMocks()); + describe('Tools tests', () => { it.each` token | version @@ -527,30 +531,11 @@ describe('Tools tests', () => { }); it('checking affected composer version with CRLF ranges', async () => { - let affected = false; - let fixed = true; - await jest.isolateModulesAsync(async () => { - jest.doMock('fs', () => ({ - ...jest.requireActual('fs'), - readFileSync: ( - filePath: fs.PathOrFileDescriptor, - options?: unknown - ) => { - if (String(filePath).includes('composer-gh-auth-no-op')) { - return '1.0.0-0 1.10.28\r\n2.0.0-0 2.2.28\r\n2.3.0-0 2.9.8'; - } - return (jest.requireActual('fs') as typeof fs).readFileSync( - filePath, - options as fs.ObjectEncodingOptions & {flag?: string} - ); - } - })); - const isolatedTools = jest.requireActual('../src/tools'); - affected = isolatedTools.skipGitHubAuthForComposerVersion('2.9.7'); - fixed = isolatedTools.skipGitHubAuthForComposerVersion('2.9.8'); - }); - expect(affected).toBe(true); - expect(fixed).toBe(false); + jest + .spyOn(fs, 'readFileSync') + .mockReturnValue('1.0.0-0 1.10.28\r\n2.0.0-0 2.2.28\r\n2.3.0-0 2.9.8'); + expect(tools.skipGitHubAuthForComposerVersion('2.9.7')).toBe(true); + expect(tools.skipGitHubAuthForComposerVersion('2.9.8')).toBe(false); }); it.each` @@ -948,26 +933,14 @@ describe('Tools tests', () => { } }); - let result: string = ''; - await jest.isolateModulesAsync(async () => { - jest.doMock('fs', () => ({ - ...jest.requireActual('fs'), - readFileSync: ( - filePath: fs.PathOrFileDescriptor, - options?: unknown - ) => { - if (String(filePath).includes('tools.json')) { - return brokenToolsJson; - } - return (jest.requireActual('fs') as typeof fs).readFileSync( - filePath, - options as fs.ObjectEncodingOptions & {flag?: string} - ); - } - })); - const isolatedTools = jest.requireActual('../src/tools'); - result = await isolatedTools.addTools('broken-tool', '7.4', 'linux'); + const readFileSync = fs.readFileSync; + jest.spyOn(fs, 'readFileSync').mockImplementation((filePath, options) => { + if (String(filePath).includes('tools.json')) { + return brokenToolsJson; + } + return readFileSync(filePath, options); }); + const result = await tools.addTools('broken-tool', '7.4', 'linux'); expect(result).toContain( 'add_log "$cross" "broken-tool" "broken-tool has no function defined. Please report this issue."' diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts index 0e224865..4f1d4f41 100644 --- a/__tests__/utils.test.ts +++ b/__tests__/utils.test.ts @@ -1,8 +1,13 @@ +import {fileURLToPath} from 'url'; +import {jest} from '@jest/globals'; import fs from 'fs'; import os from 'os'; import * as path from 'path'; -import * as utils from '../src/utils'; -import * as fetchModule from '../src/fetch'; +const fetchMock = jest.fn(); +jest.unstable_mockModule('../src/fetch.js', () => ({fetch: fetchMock})); +const utils = await import('../src/utils.js'); + +const dirname = path.dirname(fileURLToPath(import.meta.url)); describe('Utils tests', () => { it('checking readEnv', async () => { @@ -40,9 +45,9 @@ describe('Utils tests', () => { }); it('checking parseVersion', async () => { - const fetchSpy = jest.spyOn(fetchModule, 'fetch').mockResolvedValue({ + const fetchSpy = fetchMock.mockResolvedValue({ data: fs.readFileSync( - path.join(__dirname, '../src/configs/php-versions.json'), + path.join(dirname, '../src/configs/php-versions.json'), 'utf8' ) }); @@ -324,8 +329,8 @@ describe('Utils tests', () => { "Could not find '.phpenv-version' file." ); - const existsSync = jest.spyOn(fs, 'existsSync').mockImplementation(); - const readFileSync = jest.spyOn(fs, 'readFileSync').mockImplementation(); + const existsSync = jest.spyOn(fs, 'existsSync').mockReturnValue(false); + const readFileSync = jest.spyOn(fs, 'readFileSync').mockReturnValue(''); existsSync.mockReturnValue(true); readFileSync.mockReturnValue('8.1'); @@ -391,8 +396,8 @@ describe('Utils tests', () => { }); it('readPHPVersion rejects unsupported values from each source', async () => { - const existsSync = jest.spyOn(fs, 'existsSync').mockImplementation(); - const readFileSync = jest.spyOn(fs, 'readFileSync').mockImplementation(); + const existsSync = jest.spyOn(fs, 'existsSync').mockReturnValue(false); + const readFileSync = jest.spyOn(fs, 'readFileSync').mockReturnValue(''); process.env['php-version'] = '$0'; await expect(utils.readPHPVersion()).rejects.toThrow('php-version input'); diff --git a/dist/index.js b/dist/index.js index b8a16780..b5f30410 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1 +1 @@ -(()=>{var e={472:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;var s=Object.getOwnPropertyDescriptor(t,r);if(!s||("get"in s?!t.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return t[r]}}}Object.defineProperty(e,n,s)}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var i=this&&this.__importStar||function(){var ownKeys=function(e){ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r))t[t.length]=r;return t};return ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r=ownKeys(e),i=0;io.escapeForShell(e,"linux")).join("\n")+'" | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null 2>&1'+r}async function addINIValuesWindows(e){const t=await o.CSVArray(e);let r="\n";await o.asyncForEach(t,async function(e){r+=await o.addLog("$tick",e,"Added to php.ini","win32")+"\n"});return'Add-Content "$php_dir\\php.ini" "'+t.map(e=>o.escapeForShell(e,"win32")).join("\n")+'"'+r}async function addINIValues(e,t,r=false){let n="\n";switch(r){case true:n+=await o.stepLog("Add php.ini values",t)+await o.suppressOutput(t)+"\n";break;case false:default:n+=await o.stepLog("Add php.ini values",t)+"\n";break}switch(t){case"win32":return n+await addINIValuesWindows(e);case"darwin":case"linux":return n+await addINIValuesUnix(e);default:return await o.log("Platform "+t+" is not supported",t,"error")}}},469:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.issueCommand=issueCommand;t.error=error;t.setFailed=setFailed;t.getInput=getInput;const n=r(857);function toCommandValue(e){if(e instanceof Error){return e.toString()}return e}function escapeData(e){return toCommandValue(e).replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A")}function escapeProperty(e){return e.replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A").replace(/:/g,"%3A").replace(/,/g,"%2C")}function issueCommand(e,t,r){let s=`::${e}`;if(t&&Object.keys(t).length>0){s+=" ";const e=Object.entries(t).filter(([,e])=>e).map(([e,t])=>`${e}=${escapeProperty(t)}`).join(",");s+=e}s+=`::${escapeData(r)}`;process.stdout.write(s+n.EOL)}function error(e){issueCommand("error",{},e)}function setFailed(e){process.exitCode=1;error(e)}function getInput(e,t=false){const r=process.env[`INPUT_${e.replace(/ /g,"_").toUpperCase()}`]||"";if(t&&!r){throw new Error(`Input required and not supplied: ${e}`)}return r.trim()}},524:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;var s=Object.getOwnPropertyDescriptor(t,r);if(!s||("get"in s?!t.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return t[r]}}}Object.defineProperty(e,n,s)}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var i=this&&this.__importStar||function(){var ownKeys=function(e){ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r))t[t.length]=r;return t};return ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r=ownKeys(e),i=0;i{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.fetch=fetch;const r=new Set([301,302,303,307,308]);async function fetch(e,t,n=5){const s={"User-Agent":`Mozilla/5.0 (${process.platform} ${process.arch}) setup-php`};if(t){s["Authorization"]="Bearer "+t}try{const t=await globalThis.fetch(e,{headers:s,redirect:n>0?"follow":"manual"});if(t.ok){const e=await t.text();return{data:e}}else if(r.has(t.status)&&n<=0){return{error:`${t.status}: Redirect error`}}else{return{error:`${t.status}: ${t.statusText}`}}}catch(e){return{error:`Fetch error: ${e.message}`}}}},755:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;var s=Object.getOwnPropertyDescriptor(t,r);if(!s||("get"in s?!t.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return t[r]}}}Object.defineProperty(e,n,s)}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var i=this&&this.__importStar||function(){var ownKeys=function(e){ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r))t[t.length]=r;return t};return ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r=ownKeys(e),i=0;i{await run()})().catch(e=>{d.setFailed(e.message)})},75:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;var s=Object.getOwnPropertyDescriptor(t,r);if(!s||("get"in s?!t.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return t[r]}}}Object.defineProperty(e,n,s)}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var i=this&&this.__importStar||function(){var ownKeys=function(e){ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r))t[t.length]=r;return t};return ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r=ownKeys(e),i=0;io.compareVersions(t.version,e.version));const s=r.find(e=>{if(e?.require?.php){return e?.require?.php.split("|").some(e=>e&&o.satisfies(t+".0",e))}return false});return s?s.version:null}return null}},159:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;var s=Object.getOwnPropertyDescriptor(t,r);if(!s||("get"in s?!t.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return t[r]}}}Object.defineProperty(e,n,s)}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var i=this&&this.__importStar||function(){var ownKeys=function(e){ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r))t[t.length]=r;return t};return ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r=ownKeys(e),i=0;i or @sha512:"}}return{release:e}}e=e.slice(0,-t[0].length);const r=t[1].toLowerCase();if(!["sha256","sha512"].includes(r)){return{release:e,error:`Unsupported checksum algorithm ${r}, expected sha256 or sha512`}}const n=t[2].toLowerCase();const s=r==="sha256"?64:128;if(!new RegExp(`^[a-f0-9]{${s}}$`).test(n)){return{release:e,error:`Invalid ${r} checksum, expected ${s} hexadecimal characters`}}if(!/^[^:]+:v?\d+\.\d+\.\d+(?:-[\w.-]+)?(?:\+[\w.-]+)?$/.test(e)){return{release:e,error:"Checksum pinning requires a full version, for example tool:1.2.3"}}return{release:e,checksum:`${r}:${n}`}}function skipGitHubAuthForComposerVersion(e){if(!/^\d+\.\d+\.\d+(?:-[\w-]+)?$/.test(e)){return false}return c.default.readFileSync(a.default.join(__dirname,"../src/configs/composer-gh-auth-no-op"),"utf8").trim().split(/\r?\n/).some(t=>{const[r,n]=t.trim().split(/\s+/);return u.compareVersions(e,r)>=0&&u.compareVersions(e,n)<0})}function cleanComposerAuthJson(){try{const e=process.env["COMPOSER_AUTH_JSON"]||"";if(!e.includes("github-oauth"))return;const t=JSON.parse(e);delete t["github-oauth"];if(!Object.keys(t).length){delete process.env["COMPOSER_AUTH_JSON"]}else{process.env["COMPOSER_AUTH_JSON"]=JSON.stringify(t)}}catch{return}}async function getSemverVersion(e){const fixSemver=e=>{if(/^\d+\.\d+\.\d+(-|$)/.test(e))return e;const t=e.match(/^(\d+\.\d+\.\d+)([A-Za-z]+[0-9A-Za-z.]+)$/);return t?`${t[1]}-${t[2]}`:e};const t=e["version_prefix"]+e["version"];const r=`https://api.github.com/repos/${e["repository"]}/git/matching-refs/tags%2F${t}.`;const n=await p.readEnv("GITHUB_TOKEN")||await p.readEnv("COMPOSER_TOKEN");const s=await d.fetch(r,n);if(s.error||s.data==="[]"){e.error=s.error??`No version found with prefix ${t}.`;return e.version}else{const e=JSON.parse(s.data);const t=e.map(e=>(e.ref?.split("/").pop()??"").replace(/^v(?=\d)/,"")).filter(e=>e.length>0);const r=new Map;const n=t.map(e=>{const t=fixSemver(e);r.set(t,e);return t});const i=n.toSorted((e,t)=>{try{return u.compareVersions(t,e)}catch{return t.localeCompare(e,"en",{numeric:true,sensitivity:"base"})}});return r.get(i[0])??i[0]}}async function getLatestVersion(e){if(!e.version&&e.fetch_latest==="false"){return"latest"}if(e.fetch_latest==="true"&&!e.repository){return"latest"}const t=await d.fetch(`${e.github}/${e.repository}/releases.atom`);if(t.data){const e=[...t.data.matchAll(/releases\/tag\/([a-zA-Z]*)?(\d+\.\d+\.\d+)"/g)].map(e=>e[2]);const r=e.toSorted((e,t)=>e.localeCompare(t,undefined,{numeric:true}));return r.at(-1)||"latest"}return"latest"}async function getVersion(e,t){const r=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;const n=/^composer:(stable|preview|snapshot|[12])$/;const s=/[><=^~]+.*/;const i=/^\d+(\.\d+)?$/;t.version=e.replace(/v?(\d)/,"$1").replace(/\.x/,"");switch(true){case n.test(t.release):case r.test(t.version):case s.test(t.version)&&t.type==="composer":return t.version;case i.test(t.version)&&t.type==="composer":t.release=`${t.tool}:${t.version}.*`;return`${t.version}.*`;case!!t.repository&&i.test(t.version):return await getSemverVersion(t);default:return t.version.replace(/[^a-zA-Z0-9_.:@+,/-]/g,"")}}async function getRelease(e,t){e=e.includes("/")?e.split("/")[1]:e;return e.includes(":")?[t.tool,e.split(":")[1]].join(":"):t.tool}async function filterList(e){const t=/^composer($|:.*)/;const r=/^composer:?($|preview$|snapshot$|v?\d+(\.\d+)?$|v?\d+\.\d+\.\d+[\w-]*$)/;const n=e.filter(e=>{const n=extractChecksum(e);return r.test(n.release)||t.test(n.release)&&(n.checksum!==undefined||n.error!==undefined)});let s="composer";e=e.filter(e=>!t.test(extractChecksum(e).release));switch(true){case n[0]==undefined:break;default:s=n.at(-1).replace(/v(\d\S*)/,"$1");break}e.unshift(s);return e}async function getUrl(e){const t=e.version??"latest";if(t==="latest"||t===""){return[e.domain,e.repository,e.prefix,"latest",e.verb,e.tool+e.extension].filter(Boolean).join("/")}else{return[e.domain,e.repository,e.prefix,e.verb,e.version_prefix+e.version,e.tool+e.extension].filter(Boolean).join("/")}}async function getPharUrl(e){if(e.version==="latest"){return e.domain+"/"+e.tool+".phar"}else{return e.domain+"/"+e.tool+"-"+e.version_prefix+e.version+".phar"}}async function addArchive(e){return await p.getCommand(e.os,"tool")+await p.joins(e.url,e.tool,e.version_parameter)+(e.checksum?" "+e.checksum:"")}async function addPackage(e){const t=await p.getCommand(e.os,"composer_tool");const r=e.repository.split("/");const n=[r[1],e.release,r[0]+"/",e.scope].map(t=>p.safeArg(t,e.os)).join(" ");return t+n}async function addBlackfirePlayer(e){switch(e.os){case"win32":return await p.addLog("$cross",e.tool,e.tool+" is not a windows tool","win32");default:if(e.version=="latest"){if(/5\.[5-6]|7\.0/.test(e.php_version)){e.version="1.9.3"}else if(/7\.[1-4]|8\.0/.test(e.php_version)){e.version="1.22.0"}}e.url=await getPharUrl(e);return addArchive(e)}}async function addCastor(e){e.tool="castor."+e.os.replace("win32","windows")+"-amd64";e.url=await getUrl(e);e.tool="castor";e.version_parameter=c.default.existsSync("castor.php")?e.version_parameter:"";return await addArchive(e)}async function addComposer(e){const t=e.version.replace("latest","stable");const r=e.github;const n=e.domain;const s="https://dl.cloudsmith.io";const i="https://artifacts.setup-php.com";const o=`composer-${e.php_version}-${t}.phar`;const a=`${r}/shivammathur/composer-cache/releases/latest/download/${o}`;const c=`${s}/public/shivammathur/composer-cache/raw/files/${o}`;const u=`${i}/composer/${o}`;const d=`${n}/download/latest-2.2.x/composer.phar`;const l=/^5\.[3-6]$|^7\.[0-1]$/.test(e.php_version);const f=`${n}/composer-${t}.phar`;const h=`${n}/download/${t}/composer.phar`;let w=`${a},${u},${c}`;let g=`${n}/composer.phar`;let m="";switch(true){case/^snapshot$/.test(t):g=l?d:g;break;case/^preview$|^2$/.test(t):g=l?d:f;break;case/^1$/.test(t):g=f;break;case/^\d+\.\d+\.\d+(?:-[\w.-]+)?(?:\+[\w.-]+)?$/.test(e.version):if(skipGitHubAuthForComposerVersion(e.version)){cleanComposerAuthJson();m=" true"}w=`${r}/${e.repository}/releases/download/${e.version}/composer.phar`;g=h;break;default:g=l?d:f}const v=await p.readEnv("NO_TOOLS_CACHE")!=="true";e.url=v?`${w},${g}`:g;e.version_parameter=e.version+m;return await addArchive(e)}async function addDeployer(e){if(e.version==="latest"){e.url=e.domain+"/deployer.phar"}else{const t=await d.fetch("https://deployer.org/manifest.json");const r=JSON.parse(t.data);const n=Object.keys(r).find(t=>r[t].version===e.version);if(n){e.url=r[n].url}else{return await p.addLog("$cross","deployer","Version missing in deployer manifest",e.os)}}return await addArchive(e)}async function addDevTools(e){switch(e.os){case"linux":case"darwin":return"add_devtools "+e.tool;case"win32":return await p.addLog("$tick",e.tool,e.tool+" is not a windows tool","win32");default:return await p.log("Platform "+e.os+" is not supported",e.os,"error")}}async function addPECL(e){return await p.getCommand(e.os,"pecl")}async function addPhing(e){e.url=e.domain+"/get/phing-"+e.version+e.extension;if(e.version!="latest"){[e.prefix,e.verb]=["releases","download"];e.domain=e.github;e.extension="-"+e.version+e.extension;e.url+=","+await getUrl(e)}return await addArchive(e)}async function addPhive(e){switch(true){case/5\.[3-5]/.test(e.php_version):return await p.addLog("$cross","phive","Phive is not supported on PHP "+e.php_version,e.os);case/5\.6|7\.0/.test(e.php_version):e.version="0.12.1";break;case/7\.1/.test(e.php_version):e.version="0.13.5";break;case/7\.2/.test(e.php_version):e.version="0.14.5";break;case/7\.3|7\.4/.test(e.php_version):e.version="0.15.3";break;case/^latest$/.test(e.version):e.version=await getLatestVersion(e);break}e.extension="-"+e.version+e.extension;e.url=await getUrl(e);return await addArchive(e)}async function addPHPUnitTools(e){if(e.version==="latest"){e.version=await l.search(e.packagist,e.php_version)??"latest"}e.url=await getPharUrl(e);if(e.url.match(/-\d+/)){e.url+=","+e.url.replace(/-(\d+)\.\d+\.\d+/,"-$1")}return await addArchive(e)}async function addWPCLI(e){if(e.version==="latest"){e.uri="wp-cli/builds/blob/gh-pages/phar/wp-cli.phar?raw=true";e.url=[e.domain,e.uri].join("/")}else{e.extension="-"+e.version+e.extension;e.url=await getUrl(e)}return await addArchive(e)}async function getData(e,t,r){const n=a.default.join(__dirname,"../src/configs/tools.json");const s=c.default.readFileSync(n,"utf8");const i=JSON.parse(s);e=e.replace(/\s+/g,"");const o=extractChecksum(e);e=o.release;const u=e.split(":");const d=u[0];const l=u[1];let p;if(Object.hasOwn(i,d)){p={...i[d],tool:d}}else{const e=Object.keys(i).find(e=>i[e].alias==d);if(e){p={...i[e],tool:e}}else if(d.includes("/")){p={tool:d.split("/")[1],repository:d,type:"composer"}}else{p={tool:d}}}const f="https://github.com";const h=p.domain??f;const w={tool:p.tool,version:"",url:"",os:r,php_version:t,github:f,domain:h,extension:p.extension??".phar",repository:p.repository??"",prefix:h===f?"releases":"",verb:h===f?"download":"",fetch_latest:p.fetch_latest??"false",scope:p.scope??"global",version_parameter:p.version_parameter!=null?JSON.stringify(p.version_parameter):"",version_prefix:p.version_prefix??"",release:"",packagist:p.packagist??p.repository??"",type:p.type,function:p.function,alias:p.alias};w.checksum=o.checksum;w.error=o.error;w.release=await getRelease(e,w);if(w.error!==undefined)return w;w.version=l?await getVersion(l,w):await getLatestVersion(w);w.url=await getUrl(w);return w}t.functionRecord={castor:addCastor,composer:addComposer,deployer:addDeployer,dev_tools:addDevTools,phive:addPhive,blackfire_player:addBlackfirePlayer,pecl:addPECL,phing:addPhing,phpunit:addPHPUnitTools,phpcpd:addPHPUnitTools,wp_cli:addWPCLI};async function supportsChecksum(e){switch(e.type){case"phar":return true;case"custom-function":return!["pecl","dev_tools"].includes(e.function??"");default:return false}}async function addTools(e,r,n){let s="\n";if(e==="none"){return""}else{s+=await p.stepLog("Setup Tools",n)}const i=await filterList(await p.CSVArray(e));await p.asyncForEach(i,async function(e){const i=await getData(e,r,n);s+="\n";switch(true){case i.error!==undefined:s+=await p.addLog("$cross",i.tool,i.error,i.os);break;case i.checksum!==undefined&&!await supportsChecksum(i):s+=await p.addLog("$cross",i.tool,"Checksum verification is not supported for "+i.tool,i.os);break;case"phar"===i.type:s+=await addArchive(i);break;case"composer"===i.type:s+=await addPackage(i);break;case"custom-package"===i.type:s+=await p.customPackage(i.tool.split("-")[0],"tools",i.version,i.os);break;case"custom-function"===i.type:if(!i.function){s+=await p.addLog("$cross",i.tool,i.tool+" has no function defined. Please report this issue.",i.os)}else{s+=await t.functionRecord[i.function](i)}break;case/^none$/.test(i.tool):break;default:s+=await p.addLog("$cross",i.tool,"Tool "+i.tool+" is not supported",i.os);break}});return s}},277:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;var s=Object.getOwnPropertyDescriptor(t,r);if(!s||("get"in s?!t.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return t[r]}}}Object.defineProperty(e,n,s)}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var i=this&&this.__importStar||function(){var ownKeys=function(e){ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r))t[t.length]=r;return t};return ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r=ownKeys(e),i=0;ir.indexOf(e)===t);return n.map(e=>process.env[e]||"").find(Boolean)||""}async function getInput(e,t){const r=u.getInput(e);const n=await readEnv(e);switch(true){case r!="":return r;case r==""&&n!="":return n;case r==""&&n==""&&t:throw new Error(`Input required and not supplied: ${e}`);default:return""}}async function getManifestURLS(){return["https://raw.githubusercontent.com/shivammathur/setup-php/develop/src/configs/php-versions.json","https://setup-php.com/php-versions.json"]}async function parseVersion(e){switch(true){case/^pre(-installed)?$/.test(e):return"pre";case/^(latest|lowest|highest|nightly|master|\d+\.x)$/.test(e):for(const t of await getManifestURLS()){const r=await d.fetch(t);if(r["data"]??false){const t=JSON.parse(r["data"])[e];if(t===undefined){throw new Error(`Invalid PHP version: ${e.slice(0,20)}`)}if(typeof t!=="string"||!/^\d+\.\d+$/.test(t)){throw new Error(`Invalid PHP version in manifest: ${typeof t==="string"?t.slice(0,10):typeof t}`)}return t}}throw new Error(`Could not fetch the PHP version manifest.`);default:if(!/^\d+(\.\d+){0,2}$/.test(e)){throw new Error(`Invalid PHP version: ${e.slice(0,20)}`)}switch(true){case e.length>1:return e.slice(0,3);default:return e+".0"}}}async function parseIniFile(e){if(/^(production|development|none)$/.test(e)){return e}const t=e.match(/php\.ini-(production|development)$/);return t?t[1]:"production"}async function asyncForEach(e,t){for(const[r,n]of e.entries()){await t(n,r,e)}}async function color(e){switch(e){case"error":return"31";default:case"success":return"32";case"warning":return"33"}}async function log(e,t,r){switch(t){case"win32":return'printf "\\033['+await color(r)+";1m"+e+' \\033[0m"';case"linux":case"darwin":default:return'echo "\\033['+await color(r)+";1m"+e+'\\033[0m"'}}async function stepLog(e,t){switch(t){case"win32":return'Step-Log "'+escapeForShell(e,t)+'"';case"linux":case"darwin":return'step_log "'+escapeForShell(e,t)+'"';default:return await log("Platform "+t+" is not supported",t,"error")}}async function addLog(e,t,r,n){const s=escapeForShell(t,n);const i=escapeForShell(r,n);switch(n){case"win32":return`Add-Log "${e}" "${s}" "${i}"`;case"linux":case"darwin":return`add_log "${e}" "${s}" "${i}"`;default:return await log("Platform "+n+" is not supported",n,"error")}}function escapeForShell(e,t){if(t==="win32"){return e.replace(/[`$"]/g,"`$&")}return e.replace(/[\\`$"]/g,"\\$&")}function safeArg(e,t){if(!/^[a-zA-Z0-9_./:@+,~^-]*$/.test(e)){return'"'+escapeForShell(e,t)+'"'}return e}function sanitizeShellInput(e,t=false){const r=t?/[$`"';|&(){}[\]\\<>*?\n\r\t]/g:/[$`"';|&(){}[\]\\\n\r\t]/g;return e.replace(r,"")}async function extensionArray(e){switch(e){case"":case" ":return[];default:return[e.match(/(^|,\s?)none(\s?,|$)/)?"none":"",...e.split(",").map(function(e){e=e.trim().replace(/^\\\s*/,"");if(/.+-.+\/.+@.+/.test(e)){return e}return e.toLowerCase().replace(/^(:)?(php[-_]|none|zend )|(-[^-]*)-/,"$1$3")})].filter(Boolean)}}async function CSVArray(e){switch(e){case"":case" ":return[];default:return e.split(/,(?=(?:(?:[^"']*["']){2})*[^"']*$)/).map(function(e){return e.trim().replace(/^["']|["']$|(?<==)["']/g,"").replace(/=(((?!E_).)*[?{}|&~![()^]+((?!E_).)+)/,"='$1'").replace(/=(.*?)(=.*)/,"='$1$2'").replace(/:\s*["'](.*?)/g,":$1")}).filter(Boolean)}}async function getExtensionPrefix(e){switch(true){default:return"extension";case/xdebug([2-3])?$|opcache|ioncube|eaccelerator/.test(e):return"zend_extension"}}async function suppressOutput(e){switch(e){case"win32":return" >$null 2>&1";case"linux":case"darwin":return" >/dev/null 2>&1";default:return await log("Platform "+e+" is not supported",e,"error")}}async function addVerbose(e,t){const r=await readEnv("verbose");process.env["SETUP_PHP_TRACE"]=/^v{2,3}$/.test(r)?String(r.length-1):"0";if(!/^(true|v{1,3})$/.test(r)&&process.env["RUNNER_DEBUG"]!=="1"){return e}const n=await scriptExtension(t);const s=c.dirname(c.dirname(e));const i=a.default.mkdtempSync(s+"-verbose-");await a.default.promises.cp(s,i,{recursive:true,dereference:true});const o=c.join(i,"scripts");const u=c.join(o,c.basename(e));const d=/>[ \t]*(?:\/dev\/null|\$null)[ \t]+2>&1/g;for(const e of a.default.readdirSync(o,{recursive:true,encoding:"utf8"})){if(!e.endsWith(n))continue;const r=c.join(o,e);const l=a.default.readFileSync(r,"utf8");let p=l.replace(d,t==="win32"?"2>&1 | Out-Host":"");if(r===u){p=p.replaceAll(s,i)}if(p!==l)a.default.writeFileSync(r,p)}return u}async function getUnsupportedLog(e,t,r){return"\n"+await addLog("$cross",e,[e,"is not supported on PHP",t].join(" "),r)+"\n"}async function getCommand(e,t){switch(e){case"linux":case"darwin":return"add_"+t+" ";case"win32":return"Add-"+t.split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join("")+" ";default:return await log("Platform "+e+" is not supported",e,"error")}}async function joins(...e){return[...e].join(" ")}async function scriptExtension(e){switch(e){case"win32":return".ps1";case"linux":case"darwin":return".sh";default:return await log("Platform "+e+" is not supported",e,"error")}}async function scriptTool(e){switch(e){case"win32":return"pwsh ";case"linux":case"darwin":return"bash ";default:return await log("Platform "+e+" is not supported",e,"error")}}async function customPackage(e,t,r,n){const s=e.replace(/\d+|(pdo|pecl)[_-]|[_-]db2/,"");const i=await scriptExtension(n);const o=c.join(__dirname,"../src/scripts/"+t+"/"+s+i);const a=await getCommand(n,s);return"\n. "+o+"\n"+a+r}async function parseExtensionSource(e,t){const r=/(\w+)-(\w+:\/\/.{1,253}(?:[.:][^:/\s]{2,63})+\/)?([\w.-]+)\/([\w.-]+)@(.+)/;const n=r.exec(e);n[2]=n[2]?n[2].slice(0,-1):"https://github.com";return await joins("\nadd_extension_from_source",...n.splice(1,n.length),t)}const l=/^(latest|lowest|highest|nightly|master|pre|pre-installed|\d+\.x|\d+(\.\d+){0,2})$/;function validatePHPVersionInput(e,t){if(typeof e!=="string"||!l.test(e)){throw new Error(`Invalid PHP version in ${t}: ${typeof e==="string"?e.slice(0,20):typeof e}`)}return e}async function readPHPVersion(){const e=await getInput("php-version",false);if(e){return validatePHPVersionInput(e,"php-version input")}const t=await getInput("php-version-file",false)||".php-version";if(a.default.existsSync(t)){const e=a.default.readFileSync(t,"utf8");const r=e.match(/^[ \t]*(?:php[ \t]+)?([^\s#]+)[ \t]*(?:#.*)?$/m);return validatePHPVersionInput(r?r[1]:e.trim(),t)}else if(t!==".php-version"){throw new Error(`Could not find '${t}' file.`)}const r=await readEnv("COMPOSER_PROJECT_DIR");const n=c.join(r,"composer.lock");if(a.default.existsSync(n)){const e=JSON.parse(a.default.readFileSync(n,"utf8"));if(e["platform-overrides"]?.["php"]){return validatePHPVersionInput(e["platform-overrides"]["php"],"composer.lock platform-overrides.php")}}const s=c.join(r,"composer.json");if(a.default.existsSync(s)){const e=JSON.parse(a.default.readFileSync(s,"utf8"));if(e["config"]?.["platform"]?.["php"]){return validatePHPVersionInput(e["config"]["platform"]["php"],"composer.json config.platform.php")}}return"latest"}async function setVariable(e,t,r){switch(r){case"win32":return"\n$"+e+" = "+t+"\n";case"linux":case"darwin":default:return"\n"+e+'="$('+t+')"\n'}}},26:function(e,t){(function(e,r){true?r(t):0})(this,function(e){"use strict";const t=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i;const validateAndParse=e=>{if(typeof e!=="string"){throw new TypeError("Invalid argument expected string")}const r=e.match(t);if(!r){throw new Error(`Invalid argument not valid semver ('${e}' received)`)}r.shift();return r};const isWildcard=e=>e==="*"||e==="x"||e==="X";const tryParse=e=>{const t=parseInt(e,10);return isNaN(t)?e:t};const forceType=(e,t)=>typeof e!==typeof t?[String(e),String(t)]:[e,t];const compareStrings=(e,t)=>{if(isWildcard(e)||isWildcard(t))return 0;const[r,n]=forceType(tryParse(e),tryParse(t));if(r>n)return 1;if(r{for(let r=0;r{const r=validateAndParse(e);const n=validateAndParse(t);const s=r.pop();const i=n.pop();const o=compareSegments(r,n);if(o!==0)return o;if(s&&i){return compareSegments(s.split("."),i.split("."))}else if(s||i){return s?-1:1}return 0};const compare=(e,t,n)=>{assertValidOperator(n);const s=compareVersions(e,t);return r[n].includes(s)};const r={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1],"!=":[-1,1]};const n=Object.keys(r);const assertValidOperator=e=>{if(typeof e!=="string"){throw new TypeError(`Invalid operator type, expected string but got ${typeof e}`)}if(n.indexOf(e)===-1){throw new Error(`Invalid operator, expected one of ${n.join("|")}`)}};const satisfies=(e,t)=>{t=t.replace(/([><=]+)\s+/g,"$1");if(t.includes("||")){return t.split("||").some(t=>satisfies(e,t))}else if(t.includes(" - ")){const[r,n]=t.split(" - ",2);return satisfies(e,`>=${r} <=${n}`)}else if(t.includes(" ")){return t.trim().replace(/\s{2,}/g," ").split(" ").every(t=>satisfies(e,t))}const r=t.match(/^([<>=~^]+)/);const n=r?r[1]:"=";if(n!=="^"&&n!=="~")return compare(e,t,n);const[s,i,o,,a]=validateAndParse(e);const[c,u,d,,l]=validateAndParse(t);const p=[s,i,o];const f=[c,u!==null&&u!==void 0?u:"x",d!==null&&d!==void 0?d:"x"];if(l){if(!a)return false;if(compareSegments(p,f)!==0)return false;if(compareSegments(a.split("."),l.split("."))===-1)return false}const h=f.findIndex(e=>e!=="0")+1;const w=n==="~"?2:h>1?h:1;if(compareSegments(p.slice(0,w),f.slice(0,w))!==0)return false;if(compareSegments(p.slice(w),f.slice(w))===-1)return false;return true};const validate=e=>typeof e==="string"&&/^[v\d]/.test(e)&&t.test(e);const validateStrict=e=>typeof e==="string"&&/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/.test(e);e.compare=compare;e.compareVersions=compareVersions;e.satisfies=satisfies;e.validate=validate;e.validateStrict=validateStrict})},896:e=>{"use strict";e.exports=require("fs")},857:e=>{"use strict";e.exports=require("os")},928:e=>{"use strict";e.exports=require("path")},574:(e,t,r)=>{"use strict";r.d(t,{exec:()=>exec});const n=require("string_decoder");var s=r(857);const i=require("events");const o=require("child_process");var a=r(928);const c=require("assert");var u=r(896);var d=undefined&&undefined.__awaiter||function(e,t,r,n){function adopt(e){return e instanceof r?e:new r(function(t){t(e)})}return new(r||(r=Promise))(function(r,s){function fulfilled(e){try{step(n.next(e))}catch(e){s(e)}}function rejected(e){try{step(n["throw"](e))}catch(e){s(e)}}function step(e){e.done?r(e.value):adopt(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())})};const{chmod:l,copyFile:p,lstat:f,mkdir:h,open:w,readdir:g,rename:m,rm:v,rmdir:y,stat:_,symlink:b,unlink:x}=u.promises;const $=process.platform==="win32";function readlink(e){return d(this,void 0,void 0,function*(){const t=yield fs.promises.readlink(e);if($&&!t.endsWith("\\")){return`${t}\\`}return t})}const P=268435456;const E=u.constants.O_RDONLY;function exists(e){return d(this,void 0,void 0,function*(){try{yield _(e)}catch(e){if(e.code==="ENOENT"){return false}throw e}return true})}function isDirectory(e){return d(this,arguments,void 0,function*(e,t=false){const r=t?yield _(e):yield f(e);return r.isDirectory()})}function isRooted(e){e=normalizeSeparators(e);if(!e){throw new Error('isRooted() parameter "p" cannot be empty')}if($){return e.startsWith("\\")||/^[A-Z]:/i.test(e)}return e.startsWith("/")}function tryGetExecutablePath(e,t){return d(this,void 0,void 0,function*(){let r=undefined;try{r=yield _(e)}catch(t){if(t.code!=="ENOENT"){console.log(`Unexpected error attempting to determine if executable file exists '${e}': ${t}`)}}if(r&&r.isFile()){if($){const r=a.extname(e).toUpperCase();if(t.some(e=>e.toUpperCase()===r)){return e}}else{if(isUnixExecutable(r)){return e}}}const n=e;for(const s of t){e=n+s;r=undefined;try{r=yield _(e)}catch(t){if(t.code!=="ENOENT"){console.log(`Unexpected error attempting to determine if executable file exists '${e}': ${t}`)}}if(r&&r.isFile()){if($){try{const t=a.dirname(e);const r=a.basename(e).toUpperCase();for(const n of yield g(t)){if(r===n.toUpperCase()){e=a.join(t,n);break}}}catch(t){console.log(`Unexpected error attempting to determine the actual case of the file '${e}': ${t}`)}return e}else{if(isUnixExecutable(r)){return e}}}}return""})}function normalizeSeparators(e){e=e||"";if($){e=e.replace(/\//g,"\\");return e.replace(/\\\\+/g,"\\")}return e.replace(/\/\/+/g,"/")}function isUnixExecutable(e){return(e.mode&1)>0||(e.mode&8)>0&&process.getgid!==undefined&&e.gid===process.getgid()||(e.mode&64)>0&&process.getuid!==undefined&&e.uid===process.getuid()}function getCmdPath(){var e;return(e=process.env["COMSPEC"])!==null&&e!==void 0?e:`cmd.exe`}var O=undefined&&undefined.__awaiter||function(e,t,r,n){function adopt(e){return e instanceof r?e:new r(function(t){t(e)})}return new(r||(r=Promise))(function(r,s){function fulfilled(e){try{step(n.next(e))}catch(e){s(e)}}function rejected(e){try{step(n["throw"](e))}catch(e){s(e)}}function step(e){e.done?r(e.value):adopt(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())})};function cp(e,t){return O(this,arguments,void 0,function*(e,t,r={}){const{force:n,recursive:s,copySourceDirectory:i}=readCopyOptions(r);const o=(yield ioUtil.exists(t))?yield ioUtil.stat(t):null;if(o&&o.isFile()&&!n){return}const a=o&&o.isDirectory()&&i?path.join(t,path.basename(e)):t;if(!(yield ioUtil.exists(e))){throw new Error(`no such file or directory: ${e}`)}const c=yield ioUtil.stat(e);if(c.isDirectory()){if(!s){throw new Error(`Failed to copy. ${e} is a directory, but tried to copy without recursive flag.`)}else{yield cpDirRecursive(e,a,0,n)}}else{if(path.relative(e,a)===""){throw new Error(`'${a}' and '${e}' are the same file`)}yield io_copyFile(e,a,n)}})}function mv(e,t){return O(this,arguments,void 0,function*(e,t,r={}){if(yield ioUtil.exists(t)){let n=true;if(yield ioUtil.isDirectory(t)){t=path.join(t,path.basename(e));n=yield ioUtil.exists(t)}if(n){if(r.force==null||r.force){yield rmRF(t)}else{throw new Error("Destination already exists")}}}yield mkdirP(path.dirname(t));yield ioUtil.rename(e,t)})}function rmRF(e){return O(this,void 0,void 0,function*(){if(ioUtil.IS_WINDOWS){if(/[*"<>|]/.test(e)){throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows')}}try{yield ioUtil.rm(e,{force:true,maxRetries:3,recursive:true,retryDelay:300})}catch(e){throw new Error(`File was unable to be removed ${e}`)}})}function mkdirP(e){return O(this,void 0,void 0,function*(){ok(e,"a path argument must be provided");yield ioUtil.mkdir(e,{recursive:true})})}function which(e,t){return O(this,void 0,void 0,function*(){if(!e){throw new Error("parameter 'tool' is required")}if(t){const t=yield which(e,false);if(!t){if($){throw new Error(`Unable to locate executable file: ${e}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`)}else{throw new Error(`Unable to locate executable file: ${e}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`)}}return t}const r=yield findInPath(e);if(r&&r.length>0){return r[0]}return""})}function findInPath(e){return O(this,void 0,void 0,function*(){if(!e){throw new Error("parameter 'tool' is required")}const t=[];if($&&process.env["PATHEXT"]){for(const e of process.env["PATHEXT"].split(a.delimiter)){if(e){t.push(e)}}}if(isRooted(e)){const r=yield tryGetExecutablePath(e,t);if(r){return[r]}return[]}if(e.includes(a.sep)){return[]}const r=[];if(process.env.PATH){for(const e of process.env.PATH.split(a.delimiter)){if(e){r.push(e)}}}const n=[];for(const s of r){const r=yield tryGetExecutablePath(a.join(s,e),t);if(r){n.push(r)}}return n})}function readCopyOptions(e){const t=e.force==null?true:e.force;const r=Boolean(e.recursive);const n=e.copySourceDirectory==null?true:Boolean(e.copySourceDirectory);return{force:t,recursive:r,copySourceDirectory:n}}function cpDirRecursive(e,t,r,n){return O(this,void 0,void 0,function*(){if(r>=255)return;r++;yield mkdirP(t);const s=yield ioUtil.readdir(e);for(const i of s){const s=`${e}/${i}`;const o=`${t}/${i}`;const a=yield ioUtil.lstat(s);if(a.isDirectory()){yield cpDirRecursive(s,o,r,n)}else{yield io_copyFile(s,o,n)}}yield ioUtil.chmod(t,(yield ioUtil.stat(e)).mode)})}function io_copyFile(e,t,r){return O(this,void 0,void 0,function*(){if((yield ioUtil.lstat(e)).isSymbolicLink()){try{yield ioUtil.lstat(t);yield ioUtil.unlink(t)}catch(e){if(e.code==="EPERM"){yield ioUtil.chmod(t,"0666");yield ioUtil.unlink(t)}}const r=yield ioUtil.readlink(e);yield ioUtil.symlink(r,t,ioUtil.IS_WINDOWS?"junction":null)}else if(!(yield ioUtil.exists(t))||r){yield ioUtil.copyFile(e,t)}})}const C=require("timers");var k=undefined&&undefined.__awaiter||function(e,t,r,n){function adopt(e){return e instanceof r?e:new r(function(t){t(e)})}return new(r||(r=Promise))(function(r,s){function fulfilled(e){try{step(n.next(e))}catch(e){s(e)}}function rejected(e){try{step(n["throw"](e))}catch(e){s(e)}}function step(e){e.done?r(e.value):adopt(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())})};const S=process.platform==="win32";class ToolRunner extends i.EventEmitter{constructor(e,t,r){super();if(!e){throw new Error("Parameter 'toolPath' cannot be null or empty.")}this.toolPath=e;this.args=t||[];this.options=r||{}}_debug(e){if(this.options.listeners&&this.options.listeners.debug){this.options.listeners.debug(e)}}_getCommandString(e,t){const r=this._getSpawnFileName();const n=this._getSpawnArgs(e);let s=t?"":"[command]";if(S){if(this._isCmdFile()){s+=r;for(const e of n){s+=` ${e}`}}else if(e.windowsVerbatimArguments){s+=`"${r}"`;for(const e of n){s+=` ${e}`}}else{s+=this._windowsQuoteCmdArg(r);for(const e of n){s+=` ${this._windowsQuoteCmdArg(e)}`}}}else{s+=r;for(const e of n){s+=` ${e}`}}return s}_processLineBuffer(e,t,r){try{let n=t+e.toString();let i=n.indexOf(s.EOL);while(i>-1){const e=n.substring(0,i);r(e);n=n.substring(i+s.EOL.length);i=n.indexOf(s.EOL)}return n}catch(e){this._debug(`error processing line. Failed with error ${e}`);return""}}_getSpawnFileName(){if(S){if(this._isCmdFile()){return process.env["COMSPEC"]||"cmd.exe"}}return this.toolPath}_getSpawnArgs(e){if(S){if(this._isCmdFile()){let t=`/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`;for(const r of this.args){t+=" ";t+=e.windowsVerbatimArguments?r:this._windowsQuoteCmdArg(r)}t+='"';return[t]}}return this.args}_endsWith(e,t){return e.endsWith(t)}_isCmdFile(){const e=this.toolPath.toUpperCase();return this._endsWith(e,".CMD")||this._endsWith(e,".BAT")}_windowsQuoteCmdArg(e){if(!this._isCmdFile()){return this._uvQuoteCmdArg(e)}if(!e){return'""'}const t=[" ","\t","&","(",")","[","]","{","}","^","=",";","!","'","+",",","`","~","|","<",">",'"'];let r=false;for(const n of e){if(t.some(e=>e===n)){r=true;break}}if(!r){return e}let n='"';let s=true;for(let t=e.length;t>0;t--){n+=e[t-1];if(s&&e[t-1]==="\\"){n+="\\"}else if(e[t-1]==='"'){s=true;n+='"'}else{s=false}}n+='"';return n.split("").reverse().join("")}_uvQuoteCmdArg(e){if(!e){return'""'}if(!e.includes(" ")&&!e.includes("\t")&&!e.includes('"')){return e}if(!e.includes('"')&&!e.includes("\\")){return`"${e}"`}let t='"';let r=true;for(let n=e.length;n>0;n--){t+=e[n-1];if(r&&e[n-1]==="\\"){t+="\\"}else if(e[n-1]==='"'){r=true;t+="\\"}else{r=false}}t+='"';return t.split("").reverse().join("")}_cloneExecOptions(e){e=e||{};const t={cwd:e.cwd||process.cwd(),env:e.env||process.env,silent:e.silent||false,windowsVerbatimArguments:e.windowsVerbatimArguments||false,failOnStdErr:e.failOnStdErr||false,ignoreReturnCode:e.ignoreReturnCode||false,delay:e.delay||1e4};t.outStream=e.outStream||process.stdout;t.errStream=e.errStream||process.stderr;return t}_getSpawnOptions(e,t){e=e||{};const r={};r.cwd=e.cwd;r.env=e.env;r["windowsVerbatimArguments"]=e.windowsVerbatimArguments||this._isCmdFile();if(e.windowsVerbatimArguments){r.argv0=`"${t}"`}return r}exec(){return k(this,void 0,void 0,function*(){if(!isRooted(this.toolPath)&&(this.toolPath.includes("/")||S&&this.toolPath.includes("\\"))){this.toolPath=a.resolve(process.cwd(),this.options.cwd||process.cwd(),this.toolPath)}this.toolPath=yield which(this.toolPath,true);return new Promise((e,t)=>k(this,void 0,void 0,function*(){this._debug(`exec tool: ${this.toolPath}`);this._debug("arguments:");for(const e of this.args){this._debug(` ${e}`)}const r=this._cloneExecOptions(this.options);if(!r.silent&&r.outStream){r.outStream.write(this._getCommandString(r)+s.EOL)}const n=new ExecState(r,this.toolPath);n.on("debug",e=>{this._debug(e)});if(this.options.cwd&&!(yield exists(this.options.cwd))){return t(new Error(`The cwd: ${this.options.cwd} does not exist!`))}const i=this._getSpawnFileName();const a=o.spawn(i,this._getSpawnArgs(r),this._getSpawnOptions(this.options,i));let c="";if(a.stdout){a.stdout.on("data",e=>{if(this.options.listeners&&this.options.listeners.stdout){this.options.listeners.stdout(e)}if(!r.silent&&r.outStream){r.outStream.write(e)}c=this._processLineBuffer(e,c,e=>{if(this.options.listeners&&this.options.listeners.stdline){this.options.listeners.stdline(e)}})})}let u="";if(a.stderr){a.stderr.on("data",e=>{n.processStderr=true;if(this.options.listeners&&this.options.listeners.stderr){this.options.listeners.stderr(e)}if(!r.silent&&r.errStream&&r.outStream){const t=r.failOnStdErr?r.errStream:r.outStream;t.write(e)}u=this._processLineBuffer(e,u,e=>{if(this.options.listeners&&this.options.listeners.errline){this.options.listeners.errline(e)}})})}a.on("error",e=>{n.processError=e.message;n.processExited=true;n.processClosed=true;n.CheckComplete()});a.on("exit",e=>{n.processExitCode=e;n.processExited=true;this._debug(`Exit code ${e} received from tool '${this.toolPath}'`);n.CheckComplete()});a.on("close",e=>{n.processExitCode=e;n.processExited=true;n.processClosed=true;this._debug(`STDIO streams have closed for tool '${this.toolPath}'`);n.CheckComplete()});n.on("done",(r,n)=>{if(c.length>0){this.emit("stdline",c)}if(u.length>0){this.emit("errline",u)}a.removeAllListeners();if(r){t(r)}else{e(n)}});if(this.options.input){if(!a.stdin){throw new Error("child process missing stdin")}a.stdin.end(this.options.input)}}))})}}function argStringToArray(e){const t=[];let r=false;let n=false;let s="";function append(e){if(n&&e!=='"'){s+="\\"}s+=e;n=false}for(let i=0;i0){t.push(s);s=""}continue}append(o)}if(s.length>0){t.push(s.trim())}return t}class ExecState extends i.EventEmitter{constructor(e,t){super();this.processClosed=false;this.processError="";this.processExitCode=0;this.processExited=false;this.processStderr=false;this.delay=1e4;this.done=false;this.timeout=null;if(!t){throw new Error("toolPath must not be empty")}this.options=e;this.toolPath=t;if(e.delay){this.delay=e.delay}}CheckComplete(){if(this.done){return}if(this.processClosed){this._setResult()}else if(this.processExited){this.timeout=(0,C.setTimeout)(ExecState.HandleTimeout,this.delay,this)}}_debug(e){this.emit("debug",e)}_setResult(){let e;if(this.processExited){if(this.processError){e=new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`)}else if(this.processExitCode!==0&&!this.options.ignoreReturnCode){e=new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`)}else if(this.processStderr&&this.options.failOnStdErr){e=new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`)}}if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.done=true;this.emit("done",e,this.processExitCode)}static HandleTimeout(e){if(e.done){return}if(!e.processClosed&&e.processExited){const t=`The STDIO streams did not close within ${e.delay/1e3} seconds of the exit event from process '${e.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;e._debug(t)}e._setResult()}}var j=undefined&&undefined.__awaiter||function(e,t,r,n){function adopt(e){return e instanceof r?e:new r(function(t){t(e)})}return new(r||(r=Promise))(function(r,s){function fulfilled(e){try{step(n.next(e))}catch(e){s(e)}}function rejected(e){try{step(n["throw"](e))}catch(e){s(e)}}function step(e){e.done?r(e.value):adopt(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())})};function exec(e,t,r){return j(this,void 0,void 0,function*(){const n=argStringToArray(e);if(n.length===0){throw new Error(`Parameter 'commandLine' cannot be null or empty.`)}const s=n[0];t=n.slice(1).concat(t||[]);const i=new ToolRunner(s,t,r);return i.exec()})}function getExecOutput(e,t,r){return j(this,void 0,void 0,function*(){var n,s;let i="";let o="";const a=new StringDecoder("utf8");const c=new StringDecoder("utf8");const u=(n=r===null||r===void 0?void 0:r.listeners)===null||n===void 0?void 0:n.stdout;const d=(s=r===null||r===void 0?void 0:r.listeners)===null||s===void 0?void 0:s.stderr;const stdErrListener=e=>{o+=c.write(e);if(d){d(e)}};const stdOutListener=e=>{i+=a.write(e);if(u){u(e)}};const l=Object.assign(Object.assign({},r===null||r===void 0?void 0:r.listeners),{stdout:stdOutListener,stderr:stdErrListener});const p=yield exec(e,t,Object.assign(Object.assign({},r),{listeners:l}));i+=a.end();o+=c.end();return{exitCode:p,stdout:i,stderr:o}})}}};var t={};function __nccwpck_require__(r){var n=t[r];if(n!==undefined){return n.exports}var s=t[r]={exports:{}};var i=true;try{e[r].call(s.exports,s,s.exports,__nccwpck_require__);i=false}finally{if(i)delete t[r]}return s.exports}if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=__dirname+"/";(()=>{__nccwpck_require__.d=(e,t)=>{for(var r in t){if(__nccwpck_require__.o(t,r)&&!__nccwpck_require__.o(e,r)){Object.defineProperty(e,r,{enumerable:true,get:t[r]})}}}})();(()=>{__nccwpck_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})();var r=__nccwpck_require__(755);module.exports=r})(); \ No newline at end of file +import{createRequire as e}from"module";var t={26:function(e,t){(function(e,s){true?s(t):0})(this,function(e){"use strict";const t=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i;const validateAndParse=e=>{if(typeof e!=="string"){throw new TypeError("Invalid argument expected string")}const s=e.match(t);if(!s){throw new Error(`Invalid argument not valid semver ('${e}' received)`)}s.shift();return s};const isWildcard=e=>e==="*"||e==="x"||e==="X";const tryParse=e=>{const t=parseInt(e,10);return isNaN(t)?e:t};const forceType=(e,t)=>typeof e!==typeof t?[String(e),String(t)]:[e,t];const compareStrings=(e,t)=>{if(isWildcard(e)||isWildcard(t))return 0;const[s,r]=forceType(tryParse(e),tryParse(t));if(s>r)return 1;if(s{for(let s=0;s{const s=validateAndParse(e);const r=validateAndParse(t);const n=s.pop();const i=r.pop();const o=compareSegments(s,r);if(o!==0)return o;if(n&&i){return compareSegments(n.split("."),i.split("."))}else if(n||i){return n?-1:1}return 0};const compare=(e,t,r)=>{assertValidOperator(r);const n=compareVersions(e,t);return s[r].includes(n)};const s={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1],"!=":[-1,1]};const r=Object.keys(s);const assertValidOperator=e=>{if(typeof e!=="string"){throw new TypeError(`Invalid operator type, expected string but got ${typeof e}`)}if(r.indexOf(e)===-1){throw new Error(`Invalid operator, expected one of ${r.join("|")}`)}};const satisfies=(e,t)=>{t=t.replace(/([><=]+)\s+/g,"$1");if(t.includes("||")){return t.split("||").some(t=>satisfies(e,t))}else if(t.includes(" - ")){const[s,r]=t.split(" - ",2);return satisfies(e,`>=${s} <=${r}`)}else if(t.includes(" ")){return t.trim().replace(/\s{2,}/g," ").split(" ").every(t=>satisfies(e,t))}const s=t.match(/^([<>=~^]+)/);const r=s?s[1]:"=";if(r!=="^"&&r!=="~")return compare(e,t,r);const[n,i,o,,a]=validateAndParse(e);const[c,l,d,,u]=validateAndParse(t);const p=[n,i,o];const f=[c,l!==null&&l!==void 0?l:"x",d!==null&&d!==void 0?d:"x"];if(u){if(!a)return false;if(compareSegments(p,f)!==0)return false;if(compareSegments(a.split("."),u.split("."))===-1)return false}const h=f.findIndex(e=>e!=="0")+1;const w=r==="~"?2:h>1?h:1;if(compareSegments(p.slice(0,w),f.slice(0,w))!==0)return false;if(compareSegments(p.slice(w),f.slice(w))===-1)return false;return true};const validate=e=>typeof e==="string"&&/^[v\d]/.test(e)&&t.test(e);const validateStrict=e=>typeof e==="string"&&/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/.test(e);e.compare=compare;e.compareVersions=compareVersions;e.satisfies=satisfies;e.validate=validate;e.validateStrict=validateStrict})}};var s={};function __nccwpck_require__(e){var r=s[e];if(r!==undefined){return r.exports}var n=s[e]={exports:{}};var i=true;try{t[e].call(n.exports,n,n.exports,__nccwpck_require__);i=false}finally{if(i)delete s[e]}return n.exports}if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=decodeURIComponent(new URL(".",import.meta.url).pathname).slice(import.meta.url.match(/^file:\/\/\/\w:/)?1:0,-1)+"/";(()=>{__nccwpck_require__.d=(e,t)=>{for(var s in t){if(__nccwpck_require__.o(t,s)&&!__nccwpck_require__.o(e,s)){Object.defineProperty(e,s,{enumerable:true,get:t[s]})}}}})();(()=>{__nccwpck_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})();var r={};__nccwpck_require__.d(r,{IT:()=>getScript,eF:()=>run,GJ:()=>setEnv});const n=e(import.meta.url)("url");const i=e(import.meta.url)("path");const o=e(import.meta.url)("string_decoder");const a=e(import.meta.url)("os");const c=e(import.meta.url)("events");const l=e(import.meta.url)("child_process");const d=e(import.meta.url)("assert");const u=e(import.meta.url)("fs");var p=undefined&&undefined.__awaiter||function(e,t,s,r){function adopt(e){return e instanceof s?e:new s(function(t){t(e)})}return new(s||(s=Promise))(function(s,n){function fulfilled(e){try{step(r.next(e))}catch(e){n(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){n(e)}}function step(e){e.done?s(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,t||[])).next())})};const{chmod:f,copyFile:h,lstat:w,mkdir:m,open:g,readdir:v,rename:y,rm:_,rmdir:x,stat:$,symlink:b,unlink:E}=u.promises;const P=process.platform==="win32";function readlink(e){return p(this,void 0,void 0,function*(){const t=yield fs.promises.readlink(e);if(P&&!t.endsWith("\\")){return`${t}\\`}return t})}const k=268435456;const S=u.constants.O_RDONLY;function exists(e){return p(this,void 0,void 0,function*(){try{yield $(e)}catch(e){if(e.code==="ENOENT"){return false}throw e}return true})}function isDirectory(e){return p(this,arguments,void 0,function*(e,t=false){const s=t?yield $(e):yield w(e);return s.isDirectory()})}function isRooted(e){e=normalizeSeparators(e);if(!e){throw new Error('isRooted() parameter "p" cannot be empty')}if(P){return e.startsWith("\\")||/^[A-Z]:/i.test(e)}return e.startsWith("/")}function tryGetExecutablePath(e,t){return p(this,void 0,void 0,function*(){let s=undefined;try{s=yield $(e)}catch(t){if(t.code!=="ENOENT"){console.log(`Unexpected error attempting to determine if executable file exists '${e}': ${t}`)}}if(s&&s.isFile()){if(P){const s=i.extname(e).toUpperCase();if(t.some(e=>e.toUpperCase()===s)){return e}}else{if(isUnixExecutable(s)){return e}}}const r=e;for(const n of t){e=r+n;s=undefined;try{s=yield $(e)}catch(t){if(t.code!=="ENOENT"){console.log(`Unexpected error attempting to determine if executable file exists '${e}': ${t}`)}}if(s&&s.isFile()){if(P){try{const t=i.dirname(e);const s=i.basename(e).toUpperCase();for(const r of yield v(t)){if(s===r.toUpperCase()){e=i.join(t,r);break}}}catch(t){console.log(`Unexpected error attempting to determine the actual case of the file '${e}': ${t}`)}return e}else{if(isUnixExecutable(s)){return e}}}}return""})}function normalizeSeparators(e){e=e||"";if(P){e=e.replace(/\//g,"\\");return e.replace(/\\\\+/g,"\\")}return e.replace(/\/\/+/g,"/")}function isUnixExecutable(e){return(e.mode&1)>0||(e.mode&8)>0&&process.getgid!==undefined&&e.gid===process.getgid()||(e.mode&64)>0&&process.getuid!==undefined&&e.uid===process.getuid()}function getCmdPath(){var e;return(e=process.env["COMSPEC"])!==null&&e!==void 0?e:`cmd.exe`}var C=undefined&&undefined.__awaiter||function(e,t,s,r){function adopt(e){return e instanceof s?e:new s(function(t){t(e)})}return new(s||(s=Promise))(function(s,n){function fulfilled(e){try{step(r.next(e))}catch(e){n(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){n(e)}}function step(e){e.done?s(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,t||[])).next())})};function cp(e,t){return C(this,arguments,void 0,function*(e,t,s={}){const{force:r,recursive:n,copySourceDirectory:i}=readCopyOptions(s);const o=(yield ioUtil.exists(t))?yield ioUtil.stat(t):null;if(o&&o.isFile()&&!r){return}const a=o&&o.isDirectory()&&i?path.join(t,path.basename(e)):t;if(!(yield ioUtil.exists(e))){throw new Error(`no such file or directory: ${e}`)}const c=yield ioUtil.stat(e);if(c.isDirectory()){if(!n){throw new Error(`Failed to copy. ${e} is a directory, but tried to copy without recursive flag.`)}else{yield cpDirRecursive(e,a,0,r)}}else{if(path.relative(e,a)===""){throw new Error(`'${a}' and '${e}' are the same file`)}yield io_copyFile(e,a,r)}})}function mv(e,t){return C(this,arguments,void 0,function*(e,t,s={}){if(yield ioUtil.exists(t)){let r=true;if(yield ioUtil.isDirectory(t)){t=path.join(t,path.basename(e));r=yield ioUtil.exists(t)}if(r){if(s.force==null||s.force){yield rmRF(t)}else{throw new Error("Destination already exists")}}}yield mkdirP(path.dirname(t));yield ioUtil.rename(e,t)})}function rmRF(e){return C(this,void 0,void 0,function*(){if(ioUtil.IS_WINDOWS){if(/[*"<>|]/.test(e)){throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows')}}try{yield ioUtil.rm(e,{force:true,maxRetries:3,recursive:true,retryDelay:300})}catch(e){throw new Error(`File was unable to be removed ${e}`)}})}function mkdirP(e){return C(this,void 0,void 0,function*(){ok(e,"a path argument must be provided");yield ioUtil.mkdir(e,{recursive:true})})}function which(e,t){return C(this,void 0,void 0,function*(){if(!e){throw new Error("parameter 'tool' is required")}if(t){const t=yield which(e,false);if(!t){if(P){throw new Error(`Unable to locate executable file: ${e}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`)}else{throw new Error(`Unable to locate executable file: ${e}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`)}}return t}const s=yield findInPath(e);if(s&&s.length>0){return s[0]}return""})}function findInPath(e){return C(this,void 0,void 0,function*(){if(!e){throw new Error("parameter 'tool' is required")}const t=[];if(P&&process.env["PATHEXT"]){for(const e of process.env["PATHEXT"].split(i.delimiter)){if(e){t.push(e)}}}if(isRooted(e)){const s=yield tryGetExecutablePath(e,t);if(s){return[s]}return[]}if(e.includes(i.sep)){return[]}const s=[];if(process.env.PATH){for(const e of process.env.PATH.split(i.delimiter)){if(e){s.push(e)}}}const r=[];for(const n of s){const s=yield tryGetExecutablePath(i.join(n,e),t);if(s){r.push(s)}}return r})}function readCopyOptions(e){const t=e.force==null?true:e.force;const s=Boolean(e.recursive);const r=e.copySourceDirectory==null?true:Boolean(e.copySourceDirectory);return{force:t,recursive:s,copySourceDirectory:r}}function cpDirRecursive(e,t,s,r){return C(this,void 0,void 0,function*(){if(s>=255)return;s++;yield mkdirP(t);const n=yield ioUtil.readdir(e);for(const i of n){const n=`${e}/${i}`;const o=`${t}/${i}`;const a=yield ioUtil.lstat(n);if(a.isDirectory()){yield cpDirRecursive(n,o,s,r)}else{yield io_copyFile(n,o,r)}}yield ioUtil.chmod(t,(yield ioUtil.stat(e)).mode)})}function io_copyFile(e,t,s){return C(this,void 0,void 0,function*(){if((yield ioUtil.lstat(e)).isSymbolicLink()){try{yield ioUtil.lstat(t);yield ioUtil.unlink(t)}catch(e){if(e.code==="EPERM"){yield ioUtil.chmod(t,"0666");yield ioUtil.unlink(t)}}const s=yield ioUtil.readlink(e);yield ioUtil.symlink(s,t,ioUtil.IS_WINDOWS?"junction":null)}else if(!(yield ioUtil.exists(t))||s){yield ioUtil.copyFile(e,t)}})}const A=e(import.meta.url)("timers");var O=undefined&&undefined.__awaiter||function(e,t,s,r){function adopt(e){return e instanceof s?e:new s(function(t){t(e)})}return new(s||(s=Promise))(function(s,n){function fulfilled(e){try{step(r.next(e))}catch(e){n(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){n(e)}}function step(e){e.done?s(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,t||[])).next())})};const U=process.platform==="win32";class ToolRunner extends c.EventEmitter{constructor(e,t,s){super();if(!e){throw new Error("Parameter 'toolPath' cannot be null or empty.")}this.toolPath=e;this.args=t||[];this.options=s||{}}_debug(e){if(this.options.listeners&&this.options.listeners.debug){this.options.listeners.debug(e)}}_getCommandString(e,t){const s=this._getSpawnFileName();const r=this._getSpawnArgs(e);let n=t?"":"[command]";if(U){if(this._isCmdFile()){n+=s;for(const e of r){n+=` ${e}`}}else if(e.windowsVerbatimArguments){n+=`"${s}"`;for(const e of r){n+=` ${e}`}}else{n+=this._windowsQuoteCmdArg(s);for(const e of r){n+=` ${this._windowsQuoteCmdArg(e)}`}}}else{n+=s;for(const e of r){n+=` ${e}`}}return n}_processLineBuffer(e,t,s){try{let r=t+e.toString();let n=r.indexOf(a.EOL);while(n>-1){const e=r.substring(0,n);s(e);r=r.substring(n+a.EOL.length);n=r.indexOf(a.EOL)}return r}catch(e){this._debug(`error processing line. Failed with error ${e}`);return""}}_getSpawnFileName(){if(U){if(this._isCmdFile()){return process.env["COMSPEC"]||"cmd.exe"}}return this.toolPath}_getSpawnArgs(e){if(U){if(this._isCmdFile()){let t=`/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`;for(const s of this.args){t+=" ";t+=e.windowsVerbatimArguments?s:this._windowsQuoteCmdArg(s)}t+='"';return[t]}}return this.args}_endsWith(e,t){return e.endsWith(t)}_isCmdFile(){const e=this.toolPath.toUpperCase();return this._endsWith(e,".CMD")||this._endsWith(e,".BAT")}_windowsQuoteCmdArg(e){if(!this._isCmdFile()){return this._uvQuoteCmdArg(e)}if(!e){return'""'}const t=[" ","\t","&","(",")","[","]","{","}","^","=",";","!","'","+",",","`","~","|","<",">",'"'];let s=false;for(const r of e){if(t.some(e=>e===r)){s=true;break}}if(!s){return e}let r='"';let n=true;for(let t=e.length;t>0;t--){r+=e[t-1];if(n&&e[t-1]==="\\"){r+="\\"}else if(e[t-1]==='"'){n=true;r+='"'}else{n=false}}r+='"';return r.split("").reverse().join("")}_uvQuoteCmdArg(e){if(!e){return'""'}if(!e.includes(" ")&&!e.includes("\t")&&!e.includes('"')){return e}if(!e.includes('"')&&!e.includes("\\")){return`"${e}"`}let t='"';let s=true;for(let r=e.length;r>0;r--){t+=e[r-1];if(s&&e[r-1]==="\\"){t+="\\"}else if(e[r-1]==='"'){s=true;t+="\\"}else{s=false}}t+='"';return t.split("").reverse().join("")}_cloneExecOptions(e){e=e||{};const t={cwd:e.cwd||process.cwd(),env:e.env||process.env,silent:e.silent||false,windowsVerbatimArguments:e.windowsVerbatimArguments||false,failOnStdErr:e.failOnStdErr||false,ignoreReturnCode:e.ignoreReturnCode||false,delay:e.delay||1e4};t.outStream=e.outStream||process.stdout;t.errStream=e.errStream||process.stderr;return t}_getSpawnOptions(e,t){e=e||{};const s={};s.cwd=e.cwd;s.env=e.env;s["windowsVerbatimArguments"]=e.windowsVerbatimArguments||this._isCmdFile();if(e.windowsVerbatimArguments){s.argv0=`"${t}"`}return s}exec(){return O(this,void 0,void 0,function*(){if(!isRooted(this.toolPath)&&(this.toolPath.includes("/")||U&&this.toolPath.includes("\\"))){this.toolPath=i.resolve(process.cwd(),this.options.cwd||process.cwd(),this.toolPath)}this.toolPath=yield which(this.toolPath,true);return new Promise((e,t)=>O(this,void 0,void 0,function*(){this._debug(`exec tool: ${this.toolPath}`);this._debug("arguments:");for(const e of this.args){this._debug(` ${e}`)}const s=this._cloneExecOptions(this.options);if(!s.silent&&s.outStream){s.outStream.write(this._getCommandString(s)+a.EOL)}const r=new ExecState(s,this.toolPath);r.on("debug",e=>{this._debug(e)});if(this.options.cwd&&!(yield exists(this.options.cwd))){return t(new Error(`The cwd: ${this.options.cwd} does not exist!`))}const n=this._getSpawnFileName();const i=l.spawn(n,this._getSpawnArgs(s),this._getSpawnOptions(this.options,n));let o="";if(i.stdout){i.stdout.on("data",e=>{if(this.options.listeners&&this.options.listeners.stdout){this.options.listeners.stdout(e)}if(!s.silent&&s.outStream){s.outStream.write(e)}o=this._processLineBuffer(e,o,e=>{if(this.options.listeners&&this.options.listeners.stdline){this.options.listeners.stdline(e)}})})}let c="";if(i.stderr){i.stderr.on("data",e=>{r.processStderr=true;if(this.options.listeners&&this.options.listeners.stderr){this.options.listeners.stderr(e)}if(!s.silent&&s.errStream&&s.outStream){const t=s.failOnStdErr?s.errStream:s.outStream;t.write(e)}c=this._processLineBuffer(e,c,e=>{if(this.options.listeners&&this.options.listeners.errline){this.options.listeners.errline(e)}})})}i.on("error",e=>{r.processError=e.message;r.processExited=true;r.processClosed=true;r.CheckComplete()});i.on("exit",e=>{r.processExitCode=e;r.processExited=true;this._debug(`Exit code ${e} received from tool '${this.toolPath}'`);r.CheckComplete()});i.on("close",e=>{r.processExitCode=e;r.processExited=true;r.processClosed=true;this._debug(`STDIO streams have closed for tool '${this.toolPath}'`);r.CheckComplete()});r.on("done",(s,r)=>{if(o.length>0){this.emit("stdline",o)}if(c.length>0){this.emit("errline",c)}i.removeAllListeners();if(s){t(s)}else{e(r)}});if(this.options.input){if(!i.stdin){throw new Error("child process missing stdin")}i.stdin.end(this.options.input)}}))})}}function argStringToArray(e){const t=[];let s=false;let r=false;let n="";function append(e){if(r&&e!=='"'){n+="\\"}n+=e;r=false}for(let i=0;i0){t.push(n);n=""}continue}append(o)}if(n.length>0){t.push(n.trim())}return t}class ExecState extends c.EventEmitter{constructor(e,t){super();this.processClosed=false;this.processError="";this.processExitCode=0;this.processExited=false;this.processStderr=false;this.delay=1e4;this.done=false;this.timeout=null;if(!t){throw new Error("toolPath must not be empty")}this.options=e;this.toolPath=t;if(e.delay){this.delay=e.delay}}CheckComplete(){if(this.done){return}if(this.processClosed){this._setResult()}else if(this.processExited){this.timeout=(0,A.setTimeout)(ExecState.HandleTimeout,this.delay,this)}}_debug(e){this.emit("debug",e)}_setResult(){let e;if(this.processExited){if(this.processError){e=new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`)}else if(this.processExitCode!==0&&!this.options.ignoreReturnCode){e=new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`)}else if(this.processStderr&&this.options.failOnStdErr){e=new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`)}}if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.done=true;this.emit("done",e,this.processExitCode)}static HandleTimeout(e){if(e.done){return}if(!e.processClosed&&e.processExited){const t=`The STDIO streams did not close within ${e.delay/1e3} seconds of the exit event from process '${e.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;e._debug(t)}e._setResult()}}var j=undefined&&undefined.__awaiter||function(e,t,s,r){function adopt(e){return e instanceof s?e:new s(function(t){t(e)})}return new(s||(s=Promise))(function(s,n){function fulfilled(e){try{step(r.next(e))}catch(e){n(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){n(e)}}function step(e){e.done?s(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,t||[])).next())})};function exec(e,t,s){return j(this,void 0,void 0,function*(){const r=argStringToArray(e);if(r.length===0){throw new Error(`Parameter 'commandLine' cannot be null or empty.`)}const n=r[0];t=r.slice(1).concat(t||[]);const i=new ToolRunner(n,t,s);return i.exec()})}function getExecOutput(e,t,s){return j(this,void 0,void 0,function*(){var r,n;let i="";let o="";const a=new StringDecoder("utf8");const c=new StringDecoder("utf8");const l=(r=s===null||s===void 0?void 0:s.listeners)===null||r===void 0?void 0:r.stdout;const d=(n=s===null||s===void 0?void 0:s.listeners)===null||n===void 0?void 0:n.stderr;const stdErrListener=e=>{o+=c.write(e);if(d){d(e)}};const stdOutListener=e=>{i+=a.write(e);if(l){l(e)}};const u=Object.assign(Object.assign({},s===null||s===void 0?void 0:s.listeners),{stdout:stdOutListener,stderr:stdErrListener});const p=yield exec(e,t,Object.assign(Object.assign({},s),{listeners:u}));i+=a.end();o+=c.end();return{exitCode:p,stdout:i,stderr:o}})}function toCommandValue(e){if(e instanceof Error){return e.toString()}return e}function escapeData(e){return toCommandValue(e).replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A")}function escapeProperty(e){return e.replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A").replace(/:/g,"%3A").replace(/,/g,"%2C")}function issueCommand(e,t,s){let r=`::${e}`;if(t&&Object.keys(t).length>0){r+=" ";const e=Object.entries(t).filter(([,e])=>e).map(([e,t])=>`${e}=${escapeProperty(t)}`).join(",");r+=e}r+=`::${escapeData(s)}`;process.stdout.write(r+a.EOL)}function error(e){issueCommand("error",{},e)}function setFailed(e){process.exitCode=1;error(e)}function getInput(e,t=false){const s=process.env[`INPUT_${e.replace(/ /g,"_").toUpperCase()}`]||"";if(t&&!s){throw new Error(`Input required and not supplied: ${e}`)}return s.trim()}const I=new Set([301,302,303,307,308]);async function fetch(e,t,s=5){const r={"User-Agent":`Mozilla/5.0 (${process.platform} ${process.arch}) setup-php`};if(t){r["Authorization"]="Bearer "+t}try{const t=await globalThis.fetch(e,{headers:r,redirect:s>0?"follow":"manual"});if(t.ok){const e=await t.text();return{data:e}}else if(I.has(t.status)&&s<=0){return{error:`${t.status}: Redirect error`}}else{return{error:`${t.status}: ${t.statusText}`}}}catch(e){return{error:`Fetch error: ${e.message}`}}}const L=i.dirname((0,n.fileURLToPath)(import.meta.url));async function readEnv(e){if(!/^[A-Za-z0-9_-]+$/.test(e)){return""}const t=e.toLowerCase();const s=e.toUpperCase();const r=[e,t,s,t.replace("_","-"),s.replace("_","-")].filter((e,t,s)=>s.indexOf(e)===t);return r.map(e=>process.env[e]||"").find(Boolean)||""}async function utils_getInput(e,t){const s=getInput(e);const r=await readEnv(e);switch(true){case s!="":return s;case s==""&&r!="":return r;case s==""&&r==""&&t:throw new Error(`Input required and not supplied: ${e}`);default:return""}}async function getManifestURLS(){return["https://raw.githubusercontent.com/shivammathur/setup-php/develop/src/configs/php-versions.json","https://setup-php.com/php-versions.json"]}async function parseVersion(e){switch(true){case/^pre(-installed)?$/.test(e):return"pre";case/^(latest|lowest|highest|nightly|master|\d+\.x)$/.test(e):for(const t of await getManifestURLS()){const s=await fetch(t);if(s["data"]??false){const t=JSON.parse(s["data"])[e];if(t===undefined){throw new Error(`Invalid PHP version: ${e.slice(0,20)}`)}if(typeof t!=="string"||!/^\d+\.\d+$/.test(t)){throw new Error(`Invalid PHP version in manifest: ${typeof t==="string"?t.slice(0,10):typeof t}`)}return t}}throw new Error(`Could not fetch the PHP version manifest.`);default:if(!/^\d+(\.\d+){0,2}$/.test(e)){throw new Error(`Invalid PHP version: ${e.slice(0,20)}`)}switch(true){case e.length>1:return e.slice(0,3);default:return e+".0"}}}async function parseIniFile(e){if(/^(production|development|none)$/.test(e)){return e}const t=e.match(/php\.ini-(production|development)$/);return t?t[1]:"production"}async function asyncForEach(e,t){for(const[s,r]of e.entries()){await t(r,s,e)}}async function color(e){switch(e){case"error":return"31";default:case"success":return"32";case"warning":return"33"}}async function utils_log(e,t,s){switch(t){case"win32":return'printf "\\033['+await color(s)+";1m"+e+' \\033[0m"';case"linux":case"darwin":default:return'echo "\\033['+await color(s)+";1m"+e+'\\033[0m"'}}async function stepLog(e,t){switch(t){case"win32":return'Step-Log "'+escapeForShell(e,t)+'"';case"linux":case"darwin":return'step_log "'+escapeForShell(e,t)+'"';default:return await utils_log("Platform "+t+" is not supported",t,"error")}}async function addLog(e,t,s,r){const n=escapeForShell(t,r);const i=escapeForShell(s,r);switch(r){case"win32":return`Add-Log "${e}" "${n}" "${i}"`;case"linux":case"darwin":return`add_log "${e}" "${n}" "${i}"`;default:return await utils_log("Platform "+r+" is not supported",r,"error")}}function escapeForShell(e,t){if(t==="win32"){return e.replace(/[`$"]/g,"`$&")}return e.replace(/[\\`$"]/g,"\\$&")}function safeArg(e,t){if(!/^[a-zA-Z0-9_./:@+,~^-]*$/.test(e)){return'"'+escapeForShell(e,t)+'"'}return e}function sanitizeShellInput(e,t=false){const s=t?/[$`"';|&(){}[\]\\<>*?\n\r\t]/g:/[$`"';|&(){}[\]\\\n\r\t]/g;return e.replace(s,"")}async function extensionArray(e){switch(e){case"":case" ":return[];default:return[e.match(/(^|,\s?)none(\s?,|$)/)?"none":"",...e.split(",").map(function(e){e=e.trim().replace(/^\\\s*/,"");if(/.+-.+\/.+@.+/.test(e)){return e}return e.toLowerCase().replace(/^(:)?(php[-_]|none|zend )|(-[^-]*)-/,"$1$3")})].filter(Boolean)}}async function CSVArray(e){switch(e){case"":case" ":return[];default:return e.split(/,(?=(?:(?:[^"']*["']){2})*[^"']*$)/).map(function(e){return e.trim().replace(/^["']|["']$|(?<==)["']/g,"").replace(/=(((?!E_).)*[?{}|&~![()^]+((?!E_).)+)/,"='$1'").replace(/=(.*?)(=.*)/,"='$1$2'").replace(/:\s*["'](.*?)/g,":$1")}).filter(Boolean)}}async function getExtensionPrefix(e){switch(true){default:return"extension";case/xdebug([2-3])?$|opcache|ioncube|eaccelerator/.test(e):return"zend_extension"}}async function suppressOutput(e){switch(e){case"win32":return" >$null 2>&1";case"linux":case"darwin":return" >/dev/null 2>&1";default:return await utils_log("Platform "+e+" is not supported",e,"error")}}async function addVerbose(e,t){const s=await readEnv("verbose");process.env["SETUP_PHP_TRACE"]=/^v{2,3}$/.test(s)?String(s.length-1):"0";if(!/^(true|v{1,3})$/.test(s)&&process.env["RUNNER_DEBUG"]!=="1"){return e}const r=await scriptExtension(t);const n=i.dirname(i.dirname(e));const o=u.mkdtempSync(n+"-verbose-");await u.promises.cp(n,o,{recursive:true,dereference:true});const a=i.join(o,"scripts");const c=i.join(a,i.basename(e));const l=/>[ \t]*(?:\/dev\/null|\$null)[ \t]+2>&1/g;for(const e of u.readdirSync(a,{recursive:true,encoding:"utf8"})){if(!e.endsWith(r))continue;const s=i.join(a,e);const d=u.readFileSync(s,"utf8");let p=d.replace(l,t==="win32"?"2>&1 | Out-Host":"");if(s===c){p=p.replaceAll(n,o)}if(p!==d)u.writeFileSync(s,p)}return c}async function getUnsupportedLog(e,t,s){return"\n"+await addLog("$cross",e,[e,"is not supported on PHP",t].join(" "),s)+"\n"}async function getCommand(e,t){switch(e){case"linux":case"darwin":return"add_"+t+" ";case"win32":return"Add-"+t.split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join("")+" ";default:return await utils_log("Platform "+e+" is not supported",e,"error")}}async function joins(...e){return[...e].join(" ")}async function scriptExtension(e){switch(e){case"win32":return".ps1";case"linux":case"darwin":return".sh";default:return await utils_log("Platform "+e+" is not supported",e,"error")}}async function scriptTool(e){switch(e){case"win32":return"pwsh ";case"linux":case"darwin":return"bash ";default:return await utils_log("Platform "+e+" is not supported",e,"error")}}async function customPackage(e,t,s,r){const n=e.replace(/\d+|(pdo|pecl)[_-]|[_-]db2/,"");const o=await scriptExtension(r);const a=i.join(L,"../src/scripts/"+t+"/"+n+o);const c=await getCommand(r,n);return"\n. "+a+"\n"+c+s}async function parseExtensionSource(e,t){const s=/(\w+)-(\w+:\/\/.{1,253}(?:[.:][^:/\s]{2,63})+\/)?([\w.-]+)\/([\w.-]+)@(.+)/;const r=s.exec(e);r[2]=r[2]?r[2].slice(0,-1):"https://github.com";return await joins("\nadd_extension_from_source",...r.splice(1,r.length),t)}const T=/^(latest|lowest|highest|nightly|master|pre|pre-installed|\d+\.x|\d+(\.\d+){0,2})$/;function validatePHPVersionInput(e,t){if(typeof e!=="string"||!T.test(e)){throw new Error(`Invalid PHP version in ${t}: ${typeof e==="string"?e.slice(0,20):typeof e}`)}return e}async function readPHPVersion(){const e=await utils_getInput("php-version",false);if(e){return validatePHPVersionInput(e,"php-version input")}const t=await utils_getInput("php-version-file",false)||".php-version";if(u.existsSync(t)){const e=u.readFileSync(t,"utf8");const s=e.match(/^[ \t]*(?:php[ \t]+)?([^\s#]+)[ \t]*(?:#.*)?$/m);return validatePHPVersionInput(s?s[1]:e.trim(),t)}else if(t!==".php-version"){throw new Error(`Could not find '${t}' file.`)}const s=await readEnv("COMPOSER_PROJECT_DIR");const r=i.join(s,"composer.lock");if(u.existsSync(r)){const e=JSON.parse(u.readFileSync(r,"utf8"));if(e["platform-overrides"]?.["php"]){return validatePHPVersionInput(e["platform-overrides"]["php"],"composer.lock platform-overrides.php")}}const n=i.join(s,"composer.json");if(u.existsSync(n)){const e=JSON.parse(u.readFileSync(n,"utf8"));if(e["config"]?.["platform"]?.["php"]){return validatePHPVersionInput(e["config"]["platform"]["php"],"composer.json config.platform.php")}}return"latest"}async function setVariable(e,t,s){switch(s){case"win32":return"\n$"+e+" = "+t+"\n";case"linux":case"darwin":default:return"\n"+e+'="$('+t+')"\n'}}async function addINIValuesUnix(e){const t=await CSVArray(e);let s="";await asyncForEach(t,async function(e){s+="\n"+await addLog("$tick",e,"Added to php.ini","linux")});return'echo "'+t.map(e=>escapeForShell(e,"linux")).join("\n")+'" | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null 2>&1'+s}async function addINIValuesWindows(e){const t=await CSVArray(e);let s="\n";await asyncForEach(t,async function(e){s+=await addLog("$tick",e,"Added to php.ini","win32")+"\n"});return'Add-Content "$php_dir\\php.ini" "'+t.map(e=>escapeForShell(e,"win32")).join("\n")+'"'+s}async function addINIValues(e,t,s=false){let r="\n";switch(s){case true:r+=await stepLog("Add php.ini values",t)+await suppressOutput(t)+"\n";break;case false:default:r+=await stepLog("Add php.ini values",t)+"\n";break}switch(t){case"win32":return r+await addINIValuesWindows(e);case"darwin":case"linux":return r+await addINIValuesUnix(e);default:return await utils_log("Platform "+t+" is not supported",t,"error")}}async function addExtensionDarwin(e,t){const s=await extensionArray(e);let r="\n";let n="";await asyncForEach(s,async function(e){const s=t+e;const[i,o]=e.split("-");const a=await getExtensionPrefix(i);switch(true){case/^:/.test(i):n+="\ndisable_extension"+i.replace(/:/g," ");return;case/^none$/.test(i):r+="\ndisable_all_shared";return;case/.+-.+\/.+@.+/.test(e):r+=await parseExtensionSource(e,a);return;case/^(7\.4|8\.[0-5])relay(-v?\d+\.\d+\.\d+|-nightly)?$/.test(s):case/^(5\.[3-6]|7\.[0-4]|8\.[0-5])blackfire(-\d+\.\d+\.\d+)?$/.test(s):case/^couchbase|^event|^gearman$|^geos$|^ibm_db2$|^pdo_ibm$|^pdo_oci$|^oci8$|^(pecl_)?http|^pdo_firebird$/.test(e):case/^(5\.[3-6]|7\.[0-4]|8\.[0-5])ioncube$/.test(s):case/(5\.6|7\.[0-3])phalcon3|7\.[2-4]phalcon4|(7\.4|8\.[0-4])phalcon5?/.test(s):case/(?F.compareVersions(t.version,e.version));const n=s.find(e=>{if(e?.require?.php){return e?.require?.php.split("|").some(e=>e&&F.satisfies(t+".0",e))}return false});return n?n.version:null}return null}const V=i.dirname((0,n.fileURLToPath)(import.meta.url));const R=/@([a-z][a-z0-9-]*):([^@]*)$/i;const D=/@sha[^@]*$/i;function extractChecksum(e){const t=e.match(R);if(!t){const t=e.match(D);if(t){return{release:e.slice(0,-t[0].length),error:"Invalid checksum syntax, expected @sha256: or @sha512:"}}return{release:e}}e=e.slice(0,-t[0].length);const s=t[1].toLowerCase();if(!["sha256","sha512"].includes(s)){return{release:e,error:`Unsupported checksum algorithm ${s}, expected sha256 or sha512`}}const r=t[2].toLowerCase();const n=s==="sha256"?64:128;if(!new RegExp(`^[a-f0-9]{${n}}$`).test(r)){return{release:e,error:`Invalid ${s} checksum, expected ${n} hexadecimal characters`}}if(!/^[^:]+:v?\d+\.\d+\.\d+(?:-[\w.-]+)?(?:\+[\w.-]+)?$/.test(e)){return{release:e,error:"Checksum pinning requires a full version, for example tool:1.2.3"}}return{release:e,checksum:`${s}:${r}`}}function skipGitHubAuthForComposerVersion(e){if(!/^\d+\.\d+\.\d+(?:-[\w-]+)?$/.test(e)){return false}return u.readFileSync(i.join(V,"../src/configs/composer-gh-auth-no-op"),"utf8").trim().split(/\r?\n/).some(t=>{const[s,r]=t.trim().split(/\s+/);return F.compareVersions(e,s)>=0&&F.compareVersions(e,r)<0})}function cleanComposerAuthJson(){try{const e=process.env["COMPOSER_AUTH_JSON"]||"";if(!e.includes("github-oauth"))return;const t=JSON.parse(e);delete t["github-oauth"];if(!Object.keys(t).length){delete process.env["COMPOSER_AUTH_JSON"]}else{process.env["COMPOSER_AUTH_JSON"]=JSON.stringify(t)}}catch{return}}async function getSemverVersion(e){const fixSemver=e=>{if(/^\d+\.\d+\.\d+(-|$)/.test(e))return e;const t=e.match(/^(\d+\.\d+\.\d+)([A-Za-z]+[0-9A-Za-z.]+)$/);return t?`${t[1]}-${t[2]}`:e};const t=e["version_prefix"]+e["version"];const s=`https://api.github.com/repos/${e["repository"]}/git/matching-refs/tags%2F${t}.`;const r=await readEnv("GITHUB_TOKEN")||await readEnv("COMPOSER_TOKEN");const n=await fetch(s,r);if(n.error||n.data==="[]"){e.error=n.error??`No version found with prefix ${t}.`;return e.version}else{const e=JSON.parse(n.data);const t=e.map(e=>(e.ref?.split("/").pop()??"").replace(/^v(?=\d)/,"")).filter(e=>e.length>0);const s=new Map;const r=t.map(e=>{const t=fixSemver(e);s.set(t,e);return t});const i=r.toSorted((e,t)=>{try{return F.compareVersions(t,e)}catch{return t.localeCompare(e,"en",{numeric:true,sensitivity:"base"})}});return s.get(i[0])??i[0]}}async function getLatestVersion(e){if(!e.version&&e.fetch_latest==="false"){return"latest"}if(e.fetch_latest==="true"&&!e.repository){return"latest"}const t=await fetch(`${e.github}/${e.repository}/releases.atom`);if(t.data){const e=[...t.data.matchAll(/releases\/tag\/([a-zA-Z]*)?(\d+\.\d+\.\d+)"/g)].map(e=>e[2]);const s=e.toSorted((e,t)=>e.localeCompare(t,undefined,{numeric:true}));return s.at(-1)||"latest"}return"latest"}async function getVersion(e,t){const s=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;const r=/^composer:(stable|preview|snapshot|[12])$/;const n=/[><=^~]+.*/;const i=/^\d+(\.\d+)?$/;t.version=e.replace(/v?(\d)/,"$1").replace(/\.x/,"");switch(true){case r.test(t.release):case s.test(t.version):case n.test(t.version)&&t.type==="composer":return t.version;case i.test(t.version)&&t.type==="composer":t.release=`${t.tool}:${t.version}.*`;return`${t.version}.*`;case!!t.repository&&i.test(t.version):return await getSemverVersion(t);default:return t.version.replace(/[^a-zA-Z0-9_.:@+,/-]/g,"")}}async function getRelease(e,t){e=e.includes("/")?e.split("/")[1]:e;return e.includes(":")?[t.tool,e.split(":")[1]].join(":"):t.tool}async function filterList(e){const t=/^composer($|:.*)/;const s=/^composer:?($|preview$|snapshot$|v?\d+(\.\d+)?$|v?\d+\.\d+\.\d+[\w-]*$)/;const r=e.filter(e=>{const r=extractChecksum(e);return s.test(r.release)||t.test(r.release)&&(r.checksum!==undefined||r.error!==undefined)});let n="composer";e=e.filter(e=>!t.test(extractChecksum(e).release));switch(true){case r[0]==undefined:break;default:n=r.at(-1).replace(/v(\d\S*)/,"$1");break}e.unshift(n);return e}async function getUrl(e){const t=e.version??"latest";if(t==="latest"||t===""){return[e.domain,e.repository,e.prefix,"latest",e.verb,e.tool+e.extension].filter(Boolean).join("/")}else{return[e.domain,e.repository,e.prefix,e.verb,e.version_prefix+e.version,e.tool+e.extension].filter(Boolean).join("/")}}async function getPharUrl(e){if(e.version==="latest"){return e.domain+"/"+e.tool+".phar"}else{return e.domain+"/"+e.tool+"-"+e.version_prefix+e.version+".phar"}}async function addArchive(e){return await getCommand(e.os,"tool")+await joins(e.url,e.tool,e.version_parameter)+(e.checksum?" "+e.checksum:"")}async function addPackage(e){const t=await getCommand(e.os,"composer_tool");const s=e.repository.split("/");const r=[s[1],e.release,s[0]+"/",e.scope].map(t=>safeArg(t,e.os)).join(" ");return t+r}async function addBlackfirePlayer(e){switch(e.os){case"win32":return await addLog("$cross",e.tool,e.tool+" is not a windows tool","win32");default:if(e.version=="latest"){if(/5\.[5-6]|7\.0/.test(e.php_version)){e.version="1.9.3"}else if(/7\.[1-4]|8\.0/.test(e.php_version)){e.version="1.22.0"}}e.url=await getPharUrl(e);return addArchive(e)}}async function addCastor(e){e.tool="castor."+e.os.replace("win32","windows")+"-amd64";e.url=await getUrl(e);e.tool="castor";e.version_parameter=u.existsSync("castor.php")?e.version_parameter:"";return await addArchive(e)}async function addComposer(e){const t=e.version.replace("latest","stable");const s=e.github;const r=e.domain;const n="https://dl.cloudsmith.io";const i="https://artifacts.setup-php.com";const o=`composer-${e.php_version}-${t}.phar`;const a=`${s}/shivammathur/composer-cache/releases/latest/download/${o}`;const c=`${n}/public/shivammathur/composer-cache/raw/files/${o}`;const l=`${i}/composer/${o}`;const d=`${r}/download/latest-2.2.x/composer.phar`;const u=/^5\.[3-6]$|^7\.[0-1]$/.test(e.php_version);const p=`${r}/composer-${t}.phar`;const f=`${r}/download/${t}/composer.phar`;let h=`${a},${l},${c}`;let w=`${r}/composer.phar`;let m="";switch(true){case/^snapshot$/.test(t):w=u?d:w;break;case/^preview$|^2$/.test(t):w=u?d:p;break;case/^1$/.test(t):w=p;break;case/^\d+\.\d+\.\d+(?:-[\w.-]+)?(?:\+[\w.-]+)?$/.test(e.version):if(skipGitHubAuthForComposerVersion(e.version)){cleanComposerAuthJson();m=" true"}h=`${s}/${e.repository}/releases/download/${e.version}/composer.phar`;w=f;break;default:w=u?d:p}const g=await readEnv("NO_TOOLS_CACHE")!=="true";e.url=g?`${h},${w}`:w;e.version_parameter=e.version+m;return await addArchive(e)}async function addDeployer(e){if(e.version==="latest"){e.url=e.domain+"/deployer.phar"}else{const t=await fetch("https://deployer.org/manifest.json");const s=JSON.parse(t.data);const r=Object.keys(s).find(t=>s[t].version===e.version);if(r){e.url=s[r].url}else{return await addLog("$cross","deployer","Version missing in deployer manifest",e.os)}}return await addArchive(e)}async function addDevTools(e){switch(e.os){case"linux":case"darwin":return"add_devtools "+e.tool;case"win32":return await addLog("$tick",e.tool,e.tool+" is not a windows tool","win32");default:return await utils_log("Platform "+e.os+" is not supported",e.os,"error")}}async function addPECL(e){return await getCommand(e.os,"pecl")}async function addPhing(e){e.url=e.domain+"/get/phing-"+e.version+e.extension;if(e.version!="latest"){[e.prefix,e.verb]=["releases","download"];e.domain=e.github;e.extension="-"+e.version+e.extension;e.url+=","+await getUrl(e)}return await addArchive(e)}async function addPhive(e){switch(true){case/5\.[3-5]/.test(e.php_version):return await addLog("$cross","phive","Phive is not supported on PHP "+e.php_version,e.os);case/5\.6|7\.0/.test(e.php_version):e.version="0.12.1";break;case/7\.1/.test(e.php_version):e.version="0.13.5";break;case/7\.2/.test(e.php_version):e.version="0.14.5";break;case/7\.3|7\.4/.test(e.php_version):e.version="0.15.3";break;case/^latest$/.test(e.version):e.version=await getLatestVersion(e);break}e.extension="-"+e.version+e.extension;e.url=await getUrl(e);return await addArchive(e)}async function addPHPUnitTools(e){if(e.version==="latest"){e.version=await search(e.packagist,e.php_version)??"latest"}e.url=await getPharUrl(e);if(e.url.match(/-\d+/)){e.url+=","+e.url.replace(/-(\d+)\.\d+\.\d+/,"-$1")}return await addArchive(e)}async function addWPCLI(e){if(e.version==="latest"){e.uri="wp-cli/builds/blob/gh-pages/phar/wp-cli.phar?raw=true";e.url=[e.domain,e.uri].join("/")}else{e.extension="-"+e.version+e.extension;e.url=await getUrl(e)}return await addArchive(e)}async function getData(e,t,s){const r=i.join(V,"../src/configs/tools.json");const n=u.readFileSync(r,"utf8");const o=JSON.parse(n);e=e.replace(/\s+/g,"");const a=extractChecksum(e);e=a.release;const c=e.split(":");const l=c[0];const d=c[1];let p;if(Object.hasOwn(o,l)){p={...o[l],tool:l}}else{const e=Object.keys(o).find(e=>o[e].alias==l);if(e){p={...o[e],tool:e}}else if(l.includes("/")){p={tool:l.split("/")[1],repository:l,type:"composer"}}else{p={tool:l}}}const f="https://github.com";const h=p.domain??f;const w={tool:p.tool,version:"",url:"",os:s,php_version:t,github:f,domain:h,extension:p.extension??".phar",repository:p.repository??"",prefix:h===f?"releases":"",verb:h===f?"download":"",fetch_latest:p.fetch_latest??"false",scope:p.scope??"global",version_parameter:p.version_parameter!=null?JSON.stringify(p.version_parameter):"",version_prefix:p.version_prefix??"",release:"",packagist:p.packagist??p.repository??"",type:p.type,function:p.function,alias:p.alias};w.checksum=a.checksum;w.error=a.error;w.release=await getRelease(e,w);if(w.error!==undefined)return w;w.version=d?await getVersion(d,w):await getLatestVersion(w);w.url=await getUrl(w);return w}const N={castor:addCastor,composer:addComposer,deployer:addDeployer,dev_tools:addDevTools,phive:addPhive,blackfire_player:addBlackfirePlayer,pecl:addPECL,phing:addPhing,phpunit:addPHPUnitTools,phpcpd:addPHPUnitTools,wp_cli:addWPCLI};async function supportsChecksum(e){switch(e.type){case"phar":return true;case"custom-function":return!["pecl","dev_tools"].includes(e.function??"");default:return false}}async function addTools(e,t,s){let r="\n";if(e==="none"){return""}else{r+=await stepLog("Setup Tools",s)}const n=await filterList(await CSVArray(e));await asyncForEach(n,async function(e){const n=await getData(e,t,s);r+="\n";switch(true){case n.error!==undefined:r+=await addLog("$cross",n.tool,n.error,n.os);break;case n.checksum!==undefined&&!await supportsChecksum(n):r+=await addLog("$cross",n.tool,"Checksum verification is not supported for "+n.tool,n.os);break;case"phar"===n.type:r+=await addArchive(n);break;case"composer"===n.type:r+=await addPackage(n);break;case"custom-package"===n.type:r+=await customPackage(n.tool.split("-")[0],"tools",n.version,n.os);break;case"custom-function"===n.type:if(!n.function){r+=await addLog("$cross",n.tool,n.tool+" has no function defined. Please report this issue.",n.os)}else{r+=await N[n.function](n)}break;case/^none$/.test(n.tool):break;default:r+=await addLog("$cross",n.tool,"Tool "+n.tool+" is not supported",n.os);break}});return r}const q=i.dirname((0,n.fileURLToPath)(import.meta.url));async function getScript(e){const t="https://setup-php.com/sponsor";const s=e+await scriptExtension(e);const r=i.join(q,"../src/scripts",s);const n=r.replace(e,"run");const o=sanitizeShellInput(await utils_getInput("extensions",false),true);const a=await utils_getInput("ini-values",false);const c=await utils_getInput("coverage",false);const l=await utils_getInput("tools",false);const d=await parseVersion(await readPHPVersion());const p=await parseIniFile(await utils_getInput("ini-file",false));let f=await joins(".",r,`'${d}'`,p);if(o){f+=await addExtension(o,d,e)}f+=await addTools(l,d,e);if(c){f+=await addCoverage(c,d,e)}if(a){f+=await addINIValues(a,e)}f+="\n"+await stepLog(`Sponsor setup-php`,e);f+="\n"+await addLog("$tick","setup-php",t,e);u.writeFileSync(n,f,{mode:493});return await addVerbose(n,e)}async function setEnv(){process.env["fail_fast"]=await utils_getInput("fail-fast",false);process.env["GITHUB_TOKEN"]??=await utils_getInput("github-token",false)}async function run(){await setEnv();const e=process.platform;const t=await scriptTool(e);const s=await getScript(e);await exec(t+s)}(async()=>{await run()})().catch(e=>{setFailed(e.message)});var z=r.IT;var H=r.eF;var Z=r.GJ;export{z as getScript,H as run,Z as setEnv}; \ No newline at end of file diff --git a/dist/package.json b/dist/package.json new file mode 100644 index 00000000..3dbc1ca5 --- /dev/null +++ b/dist/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/jest.config.js b/jest.config.js index 313638e6..ab6898fd 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,11 +1,15 @@ -module.exports = { +export default { clearMocks: true, moduleFileExtensions: ['js', 'ts'], + extensionsToTreatAsEsm: ['.ts'], + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1' + }, testEnvironment: 'node', testMatch: ['**/*.test.ts'], testRunner: 'jest-circus/runner', transform: { - '^.+\\.ts$': ['ts-jest', {tsconfig: 'tsconfig.test.json'}] + '^.+\\.ts$': ['ts-jest', {tsconfig: 'tsconfig.test.json', useESM: true}] }, verbose: true, collectCoverage: true diff --git a/package.json b/package.json index 20bb1aef..ae9c7242 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "2.40.0", "private": false, "description": "Setup PHP for use with GitHub Actions", + "type": "module", "main": "lib/install.js", "types": "lib/install.d.ts", "directories": { diff --git a/src/config.ts b/src/config.ts index 60a83e61..c312f6ee 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,4 +1,4 @@ -import * as utils from './utils'; +import * as utils from './utils.js'; /** * Add script to set custom ini values for unix diff --git a/src/coverage.ts b/src/coverage.ts index 0b92b86f..46e139ce 100644 --- a/src/coverage.ts +++ b/src/coverage.ts @@ -1,6 +1,6 @@ -import * as utils from './utils'; -import * as extensions from './extensions'; -import * as config from './config'; +import * as utils from './utils.js'; +import * as extensions from './extensions.js'; +import * as config from './config.js'; export async function checkXdebugError( extension: string, diff --git a/src/extensions.ts b/src/extensions.ts index 5bf0fcc1..c33330b2 100644 --- a/src/extensions.ts +++ b/src/extensions.ts @@ -1,4 +1,4 @@ -import * as utils from './utils'; +import * as utils from './utils.js'; /** * Install and enable extensions for darwin diff --git a/src/install.ts b/src/install.ts index f9e05aa4..148f68b6 100644 --- a/src/install.ts +++ b/src/install.ts @@ -1,11 +1,15 @@ +import {fileURLToPath} from 'url'; import path from 'path'; +import {exec} from '@actions/exec'; import fs from 'fs'; -import * as config from './config'; -import * as core from './core'; -import * as coverage from './coverage'; -import * as extensions from './extensions'; -import * as tools from './tools'; -import * as utils from './utils'; +import * as config from './config.js'; +import * as core from './core.js'; +import * as coverage from './coverage.js'; +import * as extensions from './extensions.js'; +import * as tools from './tools.js'; +import * as utils from './utils.js'; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); /** * Build the script @@ -15,7 +19,7 @@ import * as utils from './utils'; export async function getScript(os: string): Promise { const url = 'https://setup-php.com/sponsor'; const filename = os + (await utils.scriptExtension(os)); - const script_path = path.join(__dirname, '../src/scripts', filename); + const script_path = path.join(dirname, '../src/scripts', filename); const run_path = script_path.replace(os, 'run'); const extension_csv: string = utils.sanitizeShellInput( await utils.getInput('extensions', false), @@ -65,7 +69,6 @@ export async function run(): Promise { const os: string = process.platform; const tool = await utils.scriptTool(os); const run_path = await getScript(os); - const {exec} = await import(/* webpackMode: "eager" */ '@actions/exec'); await exec(tool + run_path); } diff --git a/src/packagist.ts b/src/packagist.ts index 46d6a3d1..3e1e1b00 100644 --- a/src/packagist.ts +++ b/src/packagist.ts @@ -1,5 +1,5 @@ import * as cv from 'compare-versions'; -import * as fetch from './fetch'; +import * as fetch from './fetch.js'; type RS = Record; type RSRS = Record; diff --git a/src/tools.ts b/src/tools.ts index 5d250090..367dad73 100644 --- a/src/tools.ts +++ b/src/tools.ts @@ -1,9 +1,12 @@ +import {fileURLToPath} from 'url'; import path from 'path'; import fs from 'fs'; import * as cv from 'compare-versions'; -import * as fetch from './fetch'; -import * as packagist from './packagist'; -import * as utils from './utils'; +import * as fetch from './fetch.js'; +import * as packagist from './packagist.js'; +import * as utils from './utils.js'; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); /** * Valid function names for custom tool handlers @@ -155,7 +158,7 @@ export function skipGitHubAuthForComposerVersion(version: string): boolean { } return fs .readFileSync( - path.join(__dirname, '../src/configs/composer-gh-auth-no-op'), + path.join(dirname, '../src/configs/composer-gh-auth-no-op'), 'utf8' ) .trim() @@ -672,7 +675,7 @@ export async function getData( php_version: string, os: string ): Promise { - const json_file_path = path.join(__dirname, '../src/configs/tools.json'); + const json_file_path = path.join(dirname, '../src/configs/tools.json'); const json_file: string = fs.readFileSync(json_file_path, 'utf8'); const json_objects: Record = JSON.parse(json_file); release = release.replace(/\s+/g, ''); diff --git a/src/utils.ts b/src/utils.ts index b55e7140..407927cd 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,7 +1,10 @@ +import {fileURLToPath} from 'url'; import fs from 'fs'; import * as path from 'path'; -import * as core from './core'; -import * as fetch from './fetch'; +import * as core from './core.js'; +import * as fetch from './fetch.js'; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); /** * Function to read environment variable and return a string value. @@ -480,7 +483,7 @@ export async function customPackage( const pkg_name: string = pkg.replace(/\d+|(pdo|pecl)[_-]|[_-]db2/, ''); const script_extension: string = await scriptExtension(os); const script: string = path.join( - __dirname, + dirname, '../src/scripts/' + type + '/' + pkg_name + script_extension ); const command: string = await getCommand(os, pkg_name); diff --git a/tsconfig.json b/tsconfig.json index 8ae41b38..f15fe523 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,11 +5,11 @@ "lib": [ "ES2025" ], - "module": "Node20", - "moduleResolution": "Node16", + "module": "NodeNext", + "moduleResolution": "NodeNext", "noImplicitAny": true, "outDir": "./lib", - "removeComments": false, + "removeComments": true, "rootDir": "./src", "sourceMap": true, "strict": true,