From 7a3ce8362699742a34a1590e93c9b75e4d0d6dff Mon Sep 17 00:00:00 2001 From: "David J. Felix" Date: Tue, 3 Sep 2019 10:57:45 -0400 Subject: [PATCH] Add setting for always-auth (#48) * Add setting for always-auth - https://docs.npmjs.com/misc/config#always-auth - Allow private repos for stuff like artifactory to work * Fix tests for always-auth --- __tests__/__snapshots__/authutil.test.ts.snap | 18 ++++++++++++++---- __tests__/authutil.test.ts | 14 ++++++++++---- action.yml | 3 +++ lib/authutil.js | 9 +++++---- lib/setup-node.js | 3 ++- src/authutil.ts | 13 +++++++++---- src/setup-node.ts | 3 ++- 7 files changed, 45 insertions(+), 18 deletions(-) diff --git a/__tests__/__snapshots__/authutil.test.ts.snap b/__tests__/__snapshots__/authutil.test.ts.snap index 3059617b..c142cf4a 100644 --- a/__tests__/__snapshots__/authutil.test.ts.snap +++ b/__tests__/__snapshots__/authutil.test.ts.snap @@ -2,20 +2,30 @@ exports[`installer tests Appends trailing slash to registry 1`] = ` "//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN} -registry=https://registry.npmjs.org/" +registry=https://registry.npmjs.org/ +always-auth=false" `; exports[`installer tests Automatically configures GPR scope 1`] = ` "npm.pkg.github.com/:_authToken=\${NODE_AUTH_TOKEN} -@ownername:registry=npm.pkg.github.com/" +@ownername:registry=npm.pkg.github.com/ +always-auth=false" `; exports[`installer tests Configures scoped npm registries 1`] = ` "//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN} -@myscope:registry=https://registry.npmjs.org/" +@myscope:registry=https://registry.npmjs.org/ +always-auth=false" +`; + +exports[`installer tests Sets up npmrc for always-auth true 1`] = ` +"//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN} +registry=https://registry.npmjs.org/ +always-auth=true" `; exports[`installer tests Sets up npmrc for npmjs 1`] = ` "//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN} -registry=https://registry.npmjs.org/" +registry=https://registry.npmjs.org/ +always-auth=false" `; diff --git a/__tests__/authutil.test.ts b/__tests__/authutil.test.ts index 2e88011e..c75d5b65 100644 --- a/__tests__/authutil.test.ts +++ b/__tests__/authutil.test.ts @@ -33,13 +33,13 @@ describe('installer tests', () => { }); it('Sets up npmrc for npmjs', async () => { - await auth.configAuthentication('https://registry.npmjs.org/'); + await auth.configAuthentication('https://registry.npmjs.org/', 'false'); expect(fs.existsSync(rcFile)).toBe(true); expect(fs.readFileSync(rcFile, {encoding: 'utf8'})).toMatchSnapshot(); }); it('Appends trailing slash to registry', async () => { - await auth.configAuthentication('https://registry.npmjs.org'); + await auth.configAuthentication('https://registry.npmjs.org', 'false'); expect(fs.existsSync(rcFile)).toBe(true); expect(fs.readFileSync(rcFile, {encoding: 'utf8'})).toMatchSnapshot(); @@ -47,16 +47,22 @@ describe('installer tests', () => { it('Configures scoped npm registries', async () => { process.env['INPUT_SCOPE'] = 'myScope'; - await auth.configAuthentication('https://registry.npmjs.org'); + await auth.configAuthentication('https://registry.npmjs.org', 'false'); expect(fs.existsSync(rcFile)).toBe(true); expect(fs.readFileSync(rcFile, {encoding: 'utf8'})).toMatchSnapshot(); }); it('Automatically configures GPR scope', async () => { - await auth.configAuthentication('npm.pkg.github.com'); + await auth.configAuthentication('npm.pkg.github.com', 'false'); expect(fs.existsSync(rcFile)).toBe(true); expect(fs.readFileSync(rcFile, {encoding: 'utf8'})).toMatchSnapshot(); }); + + it('Sets up npmrc for always-auth true', async () => { + await auth.configAuthentication('https://registry.npmjs.org/', 'true'); + expect(fs.existsSync(rcFile)).toBe(true); + expect(fs.readFileSync(rcFile, {encoding: 'utf8'})).toMatchSnapshot(); + }); }); diff --git a/action.yml b/action.yml index 49c9efe6..d6feb020 100644 --- a/action.yml +++ b/action.yml @@ -2,6 +2,9 @@ name: 'Setup Node.js environment' description: 'Setup a Node.js environment and add it to the PATH, additionally providing proxy support' author: 'GitHub' inputs: + always-auth: + description: 'Set always-auth in npmrc' + default: 'false' node-version: description: 'Version Spec of the version to use. Examples: 10.x, 10.15.1, >=10.15.0' default: '10.x' diff --git a/lib/authutil.js b/lib/authutil.js index bb85fff3..6da4630b 100644 --- a/lib/authutil.js +++ b/lib/authutil.js @@ -12,15 +12,15 @@ const os = __importStar(require("os")); const path = __importStar(require("path")); const core = __importStar(require("@actions/core")); const github = __importStar(require("@actions/github")); -function configAuthentication(registryUrl) { +function configAuthentication(registryUrl, alwaysAuth) { const npmrc = path.resolve(process.env['RUNNER_TEMP'] || process.cwd(), '.npmrc'); if (!registryUrl.endsWith('/')) { registryUrl += '/'; } - writeRegistryToFile(registryUrl, npmrc); + writeRegistryToFile(registryUrl, npmrc, alwaysAuth); } exports.configAuthentication = configAuthentication; -function writeRegistryToFile(registryUrl, fileLocation) { +function writeRegistryToFile(registryUrl, fileLocation, alwaysAuth) { let scope = core.getInput('scope'); if (!scope && registryUrl.indexOf('npm.pkg.github.com') > -1) { scope = github.context.repo.owner; @@ -47,7 +47,8 @@ function writeRegistryToFile(registryUrl, fileLocation) { const registryString = scope ? `${scope}:registry=${registryUrl}` : `registry=${registryUrl}`; - newContents += `${authString}${os.EOL}${registryString}`; + const alwaysAuthString = `always-auth=${alwaysAuth}`; + newContents += `${authString}${os.EOL}${registryString}${os.EOL}${alwaysAuthString}`; fs.writeFileSync(fileLocation, newContents); core.exportVariable('NPM_CONFIG_USERCONFIG', fileLocation); // Export empty node_auth_token so npm doesn't complain about not being able to find it diff --git a/lib/setup-node.js b/lib/setup-node.js index dc65699b..d7b35185 100644 --- a/lib/setup-node.js +++ b/lib/setup-node.js @@ -35,8 +35,9 @@ function run() { yield installer.getNode(version); } const registryUrl = core.getInput('registry-url'); + const alwaysAuth = core.getInput('always-auth'); if (registryUrl) { - auth.configAuthentication(registryUrl); + auth.configAuthentication(registryUrl, alwaysAuth); } // TODO: setup proxy from runner proxy config const matchersPath = path.join(__dirname, '..', '.github'); diff --git a/src/authutil.ts b/src/authutil.ts index 99f78efe..07e0b24c 100644 --- a/src/authutil.ts +++ b/src/authutil.ts @@ -4,7 +4,7 @@ import * as path from 'path'; import * as core from '@actions/core'; import * as github from '@actions/github'; -export function configAuthentication(registryUrl: string) { +export function configAuthentication(registryUrl: string, alwaysAuth: string) { const npmrc: string = path.resolve( process.env['RUNNER_TEMP'] || process.cwd(), '.npmrc' @@ -13,10 +13,14 @@ export function configAuthentication(registryUrl: string) { registryUrl += '/'; } - writeRegistryToFile(registryUrl, npmrc); + writeRegistryToFile(registryUrl, npmrc, alwaysAuth); } -function writeRegistryToFile(registryUrl: string, fileLocation: string) { +function writeRegistryToFile( + registryUrl: string, + fileLocation: string, + alwaysAuth: string +) { let scope: string = core.getInput('scope'); if (!scope && registryUrl.indexOf('npm.pkg.github.com') > -1) { scope = github.context.repo.owner; @@ -45,7 +49,8 @@ function writeRegistryToFile(registryUrl: string, fileLocation: string) { const registryString: string = scope ? `${scope}:registry=${registryUrl}` : `registry=${registryUrl}`; - newContents += `${authString}${os.EOL}${registryString}`; + const alwaysAuthString: string = `always-auth=${alwaysAuth}`; + newContents += `${authString}${os.EOL}${registryString}${os.EOL}${alwaysAuthString}`; fs.writeFileSync(fileLocation, newContents); core.exportVariable('NPM_CONFIG_USERCONFIG', fileLocation); // Export empty node_auth_token so npm doesn't complain about not being able to find it diff --git a/src/setup-node.ts b/src/setup-node.ts index f82413a0..51deccbe 100644 --- a/src/setup-node.ts +++ b/src/setup-node.ts @@ -19,8 +19,9 @@ async function run() { } const registryUrl: string = core.getInput('registry-url'); + const alwaysAuth: string = core.getInput('always-auth'); if (registryUrl) { - auth.configAuthentication(registryUrl); + auth.configAuthentication(registryUrl, alwaysAuth); } // TODO: setup proxy from runner proxy config