From a69d45adcd128d92db46d8cc7245c2237b41520b Mon Sep 17 00:00:00 2001 From: Sergey Dolin Date: Mon, 5 Dec 2022 13:32:26 +0100 Subject: [PATCH 1/3] Add modification of scoped registry --- src/authutil.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/authutil.ts b/src/authutil.ts index aaebdfd2..d1885482 100644 --- a/src/authutil.ts +++ b/src/authutil.ts @@ -29,7 +29,7 @@ function writeRegistryToFile( scope = '@' + scope; } if (scope) { - scope = scope.toLowerCase(); + scope = scope.toLowerCase() + ':'; } core.debug(`Setting auth in ${fileLocation}`); @@ -38,7 +38,7 @@ function writeRegistryToFile( const curContents: string = fs.readFileSync(fileLocation, 'utf8'); curContents.split(os.EOL).forEach((line: string) => { // Add current contents unless they are setting the registry - if (!line.toLowerCase().startsWith('registry')) { + if (!line.toLowerCase().startsWith(`${scope}registry`)) { newContents += line + os.EOL; } }); @@ -46,9 +46,7 @@ function writeRegistryToFile( // Remove http: or https: from front of registry. const authString: string = registryUrl.replace(/(^\w+:|^)/, '') + ':_authToken=${NODE_AUTH_TOKEN}'; - const registryString: string = scope - ? `${scope}:registry=${registryUrl}` - : `registry=${registryUrl}`; + const registryString: string = `${scope}registry=${registryUrl}`; const alwaysAuthString: string = `always-auth=${alwaysAuth}`; newContents += `${authString}${os.EOL}${registryString}${os.EOL}${alwaysAuthString}`; fs.writeFileSync(fileLocation, newContents); From e77eaaccd3948bf790da061e9f0fe5c9cb8297a2 Mon Sep 17 00:00:00 2001 From: Sergey Dolin Date: Mon, 5 Dec 2022 13:36:23 +0100 Subject: [PATCH 2/3] Add unit tests --- __tests__/authutil.test.ts | 81 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/__tests__/authutil.test.ts b/__tests__/authutil.test.ts index 594c6a13..458ceb12 100644 --- a/__tests__/authutil.test.ts +++ b/__tests__/authutil.test.ts @@ -123,6 +123,7 @@ describe('authutil tests', () => { expect(rc['registry']).toBe('https://registry.npmjs.org/'); expect(rc['always-auth']).toBe('true'); }); + it('It is already set the NODE_AUTH_TOKEN export it ', async () => { process.env.NODE_AUTH_TOKEN = 'foobar'; await auth.configAuthentication('npm.pkg.github.com', 'false'); @@ -132,4 +133,84 @@ describe('authutil tests', () => { expect(rc['always-auth']).toBe('false'); expect(process.env.NODE_AUTH_TOKEN).toEqual('foobar'); }); + + it('configAuthentication should overwrite non-scoped with non-scoped', async () => { + fs.writeFileSync(rcFile, 'registry=NNN'); + await auth.configAuthentication('https://registry.npmjs.org/', 'true'); + let contents = fs.readFileSync(rcFile, {encoding: 'utf8'}); + expect(contents).toBe( + `//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN}${os.EOL}registry=https://registry.npmjs.org/${os.EOL}always-auth=true` + ); + }); + + it('configAuthentication should overwrite only non-scoped', async () => { + fs.writeFileSync(rcFile, `registry=NNN${os.EOL}@myscope:registry=MMM`); + await auth.configAuthentication('https://registry.npmjs.org/', 'true'); + let contents = fs.readFileSync(rcFile, {encoding: 'utf8'}); + expect(contents).toBe( + `@myscope:registry=MMM${os.EOL}//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN}${os.EOL}registry=https://registry.npmjs.org/${os.EOL}always-auth=true` + ); + }); + + it('configAuthentication should add non-scoped to scoped', async () => { + fs.writeFileSync(rcFile, '@myscope:registry=NNN'); + await auth.configAuthentication('https://registry.npmjs.org/', 'true'); + let contents = fs.readFileSync(rcFile, {encoding: 'utf8'}); + expect(contents).toBe( + `@myscope:registry=NNN${os.EOL}//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN}${os.EOL}registry=https://registry.npmjs.org/${os.EOL}always-auth=true` + ); + }); + + it('configAuthentication should overwrite scoped with scoped', async () => { + process.env['INPUT_SCOPE'] = 'myscope'; + fs.writeFileSync(rcFile, `@myscope:registry=NNN`); + await auth.configAuthentication('https://registry.npmjs.org/', 'true'); + let contents = fs.readFileSync(rcFile, {encoding: 'utf8'}); + expect(contents).toBe( + `//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN}${os.EOL}@myscope:registry=https://registry.npmjs.org/${os.EOL}always-auth=true` + ); + }); + + it('configAuthentication should overwrite only scoped', async () => { + process.env['INPUT_SCOPE'] = 'myscope'; + fs.writeFileSync(rcFile, `registry=NNN${os.EOL}@myscope:registry=MMM`); + await auth.configAuthentication('https://registry.npmjs.org/', 'true'); + let contents = fs.readFileSync(rcFile, {encoding: 'utf8'}); + expect(contents).toBe( + `registry=NNN${os.EOL}//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN}${os.EOL}@myscope:registry=https://registry.npmjs.org/${os.EOL}always-auth=true` + ); + }); + + it('configAuthentication should add scoped to non-scoped', async () => { + process.env['INPUT_SCOPE'] = 'myscope'; + fs.writeFileSync(rcFile, `registry=MMM`); + await auth.configAuthentication('https://registry.npmjs.org/', 'true'); + let contents = fs.readFileSync(rcFile, {encoding: 'utf8'}); + expect(contents).toBe( + `registry=MMM${os.EOL}//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN}${os.EOL}@myscope:registry=https://registry.npmjs.org/${os.EOL}always-auth=true` + ); + }); + + it('configAuthentication should overwrite only one scoped', async () => { + process.env['INPUT_SCOPE'] = 'myscope'; + fs.writeFileSync( + rcFile, + `@otherscope:registry=NNN${os.EOL}@myscope:registry=MMM` + ); + await auth.configAuthentication('https://registry.npmjs.org/', 'true'); + let contents = fs.readFileSync(rcFile, {encoding: 'utf8'}); + expect(contents).toBe( + `@otherscope:registry=NNN${os.EOL}//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN}${os.EOL}@myscope:registry=https://registry.npmjs.org/${os.EOL}always-auth=true` + ); + }); + + it('configAuthentication should add scoped to another scoped', async () => { + process.env['INPUT_SCOPE'] = 'myscope'; + fs.writeFileSync(rcFile, `@otherscope:registry=MMM`); + await auth.configAuthentication('https://registry.npmjs.org/', 'true'); + let contents = fs.readFileSync(rcFile, {encoding: 'utf8'}); + expect(contents).toBe( + `@otherscope:registry=MMM${os.EOL}//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN}${os.EOL}@myscope:registry=https://registry.npmjs.org/${os.EOL}always-auth=true` + ); + }); }); From 069a4f8926c4ea0bfca73c3d3ffa0a5d0c7bdce2 Mon Sep 17 00:00:00 2001 From: Sergey Dolin Date: Mon, 5 Dec 2022 13:37:05 +0100 Subject: [PATCH 3/3] Add dist --- dist/setup/index.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/dist/setup/index.js b/dist/setup/index.js index aa4f708a..b6c3e23f 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -72945,7 +72945,7 @@ function writeRegistryToFile(registryUrl, fileLocation, alwaysAuth) { scope = '@' + scope; } if (scope) { - scope = scope.toLowerCase(); + scope = scope.toLowerCase() + ':'; } core.debug(`Setting auth in ${fileLocation}`); let newContents = ''; @@ -72953,16 +72953,14 @@ function writeRegistryToFile(registryUrl, fileLocation, alwaysAuth) { const curContents = fs.readFileSync(fileLocation, 'utf8'); curContents.split(os.EOL).forEach((line) => { // Add current contents unless they are setting the registry - if (!line.toLowerCase().startsWith('registry')) { + if (!line.toLowerCase().startsWith(`${scope}registry`)) { newContents += line + os.EOL; } }); } // Remove http: or https: from front of registry. const authString = registryUrl.replace(/(^\w+:|^)/, '') + ':_authToken=${NODE_AUTH_TOKEN}'; - const registryString = scope - ? `${scope}:registry=${registryUrl}` - : `registry=${registryUrl}`; + const registryString = `${scope}registry=${registryUrl}`; const alwaysAuthString = `always-auth=${alwaysAuth}`; newContents += `${authString}${os.EOL}${registryString}${os.EOL}${alwaysAuthString}`; fs.writeFileSync(fileLocation, newContents);