From 45fb69790e3591ffd45072e02991750f8c984448 Mon Sep 17 00:00:00 2001 From: jeetiss Date: Tue, 26 Nov 2019 21:57:53 +0300 Subject: [PATCH 1/5] add support for scoped and private packages --- packages/shipjs/package.json | 3 +- packages/shipjs/src/flow/setup.js | 4 +++ .../shipjs/src/step/setup/addShipConfig.js | 17 +++++++++++ .../shipjs/src/step/setup/askQuestions.js | 28 +++++++++++++++++++ yarn.lock | 17 +++++++++++ 5 files changed, 68 insertions(+), 1 deletion(-) diff --git a/packages/shipjs/package.json b/packages/shipjs/package.json index 42d819fb..fffed1d6 100644 --- a/packages/shipjs/package.json +++ b/packages/shipjs/package.json @@ -44,6 +44,7 @@ "globby": "^10.0.1", "inquirer": "7.0.0", "mkdirp": "^0.5.1", + "npm-package-arg": "^7.0.0", "prettier": "^1.18.2", "shell-quote": "^1.7.2", "shipjs-lib": "0.10.0", @@ -65,4 +66,4 @@ "jest": "24.9.0", "jest-watch-typeahead": "0.4.2" } -} \ No newline at end of file +} diff --git a/packages/shipjs/src/flow/setup.js b/packages/shipjs/src/flow/setup.js index 297c3e09..26c2e3a8 100644 --- a/packages/shipjs/src/flow/setup.js +++ b/packages/shipjs/src/flow/setup.js @@ -22,11 +22,15 @@ async function setup({ help = false, dir = '.' }) { mainVersionFile, packagesToBump, packagesToPublish, + isScoped, + isPublic, } = await askQuestions({ dir }); const outputs = [ addDevDependencies({ dependencies: ['shipjs'], dir }), addScriptsToPackageJson({ dir }), await addShipConfig({ + isScoped, + isPublic, baseBranch, releaseBranch, useMonorepo, diff --git a/packages/shipjs/src/step/setup/addShipConfig.js b/packages/shipjs/src/step/setup/addShipConfig.js index 4c995ac7..8d99d3e0 100644 --- a/packages/shipjs/src/step/setup/addShipConfig.js +++ b/packages/shipjs/src/step/setup/addShipConfig.js @@ -6,6 +6,8 @@ import { info } from '../../color'; import { print } from '../../util'; export default async ({ + isScoped, + isPublic, baseBranch, releaseBranch, useMonorepo, @@ -17,6 +19,9 @@ export default async ({ await runStep({ title: 'Creating ship.config.js' }, async () => { const filePath = path.resolve(dir, 'ship.config.js'); const json = { + publishCommand: !xor(isPublic, isScoped) + ? createPublishCommand(isPublic) + : undefined, mergeStrategy: baseBranch === releaseBranch ? { @@ -47,3 +52,15 @@ export default async ({ print(' > https://github.com/algolia/shipjs/blob/master/GUIDE.md'); }; }); + +function createPublishCommand(isPublic) { + const command = isPublic + ? ({ defaultCommand }) => `${defaultCommand} --access public` + : ({ defaultCommand }) => `${defaultCommand} --access restricted`; + + return command.toString(); +} + +function xor(a, b) { + return (a && !b) || (!a && b); +} diff --git a/packages/shipjs/src/step/setup/askQuestions.js b/packages/shipjs/src/step/setup/askQuestions.js index f1f2f013..968ca289 100644 --- a/packages/shipjs/src/step/setup/askQuestions.js +++ b/packages/shipjs/src/step/setup/askQuestions.js @@ -2,6 +2,7 @@ import inquirer from 'inquirer'; import { getRemoteBranches } from 'shipjs-lib'; import fs from 'fs'; import path from 'path'; +import npa from 'npm-package-arg'; import runStep from '../runStep'; import { grey, reset } from '../../color'; @@ -27,6 +28,8 @@ export default async ({ dir }) => packagesToPublish, } = await askMonorepo(dir); + const { isScoped, isPublic } = await askPackageAccess(dir); + return { baseBranch, releaseBranch, @@ -37,6 +40,8 @@ export default async ({ dir }) => mainVersionFile, packagesToBump, packagesToPublish, + isScoped, + isPublic, }; }); @@ -195,6 +200,21 @@ async function askMonorepo(dir) { return { useMonorepo, mainVersionFile, packagesToBump, packagesToPublish }; } +async function askPackageAccess(dir) { + const isScoped = isScopedPackage(getJson(dir, 'package.json').name); + + const { isPublic } = await inquirer.prompt([ + { + type: 'confirm', + name: 'isPublic', + message: 'Publish public package?', + default: true, + }, + ]); + + return { isScoped, isPublic }; +} + function detectMonorepo(dir) { if (fs.existsSync(path.resolve(dir, 'lerna.json'))) { return true; @@ -258,3 +278,11 @@ function stringArrayValidator(answer) { return errorMessage; } } + +function isScopedPackage(name) { + try { + return npa(name).scope !== null; + } catch (err) { + return false; + } +} diff --git a/yarn.lock b/yarn.lock index 910d24bb..24e5eb98 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4391,6 +4391,13 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== +hosted-git-info@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.2.tgz#8b7e3bd114b59b51786f8bade0f39ddc80275a97" + integrity sha512-ezZMWtHXm7Eb7Rq4Mwnx2vs79WUx2QmRg3+ZqeGroKzfDO+EprOcgRPYghsOP9JuYBfK18VojmRTGCg8Ma+ktw== + dependencies: + lru-cache "^5.1.1" + html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -6290,6 +6297,16 @@ npm-lifecycle@^3.1.2: semver "^5.5.0" validate-npm-package-name "^3.0.0" +npm-package-arg@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-7.0.0.tgz#52cdf08b491c0c59df687c4c925a89102ef794a5" + integrity sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g== + dependencies: + hosted-git-info "^3.0.2" + osenv "^0.1.5" + semver "^5.6.0" + validate-npm-package-name "^3.0.0" + npm-packlist@^1.1.6, npm-packlist@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" From cb3bc28940fe8f0f657ad9e20c8bdf515a1bd0e0 Mon Sep 17 00:00:00 2001 From: jeetiss Date: Wed, 27 Nov 2019 09:02:34 +0300 Subject: [PATCH 2/5] simplify scoped package detection --- packages/shipjs/package.json | 1 - packages/shipjs/src/step/setup/askQuestions.js | 3 +-- yarn.lock | 17 ----------------- 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/packages/shipjs/package.json b/packages/shipjs/package.json index fffed1d6..3742947d 100644 --- a/packages/shipjs/package.json +++ b/packages/shipjs/package.json @@ -44,7 +44,6 @@ "globby": "^10.0.1", "inquirer": "7.0.0", "mkdirp": "^0.5.1", - "npm-package-arg": "^7.0.0", "prettier": "^1.18.2", "shell-quote": "^1.7.2", "shipjs-lib": "0.10.0", diff --git a/packages/shipjs/src/step/setup/askQuestions.js b/packages/shipjs/src/step/setup/askQuestions.js index 968ca289..a9893c29 100644 --- a/packages/shipjs/src/step/setup/askQuestions.js +++ b/packages/shipjs/src/step/setup/askQuestions.js @@ -2,7 +2,6 @@ import inquirer from 'inquirer'; import { getRemoteBranches } from 'shipjs-lib'; import fs from 'fs'; import path from 'path'; -import npa from 'npm-package-arg'; import runStep from '../runStep'; import { grey, reset } from '../../color'; @@ -281,7 +280,7 @@ function stringArrayValidator(answer) { function isScopedPackage(name) { try { - return npa(name).scope !== null; + return name[0] === '@' && name.indexOf('/') !== -1; } catch (err) { return false; } diff --git a/yarn.lock b/yarn.lock index 24e5eb98..910d24bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4391,13 +4391,6 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== -hosted-git-info@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.2.tgz#8b7e3bd114b59b51786f8bade0f39ddc80275a97" - integrity sha512-ezZMWtHXm7Eb7Rq4Mwnx2vs79WUx2QmRg3+ZqeGroKzfDO+EprOcgRPYghsOP9JuYBfK18VojmRTGCg8Ma+ktw== - dependencies: - lru-cache "^5.1.1" - html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -6297,16 +6290,6 @@ npm-lifecycle@^3.1.2: semver "^5.5.0" validate-npm-package-name "^3.0.0" -npm-package-arg@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-7.0.0.tgz#52cdf08b491c0c59df687c4c925a89102ef794a5" - integrity sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g== - dependencies: - hosted-git-info "^3.0.2" - osenv "^0.1.5" - semver "^5.6.0" - validate-npm-package-name "^3.0.0" - npm-packlist@^1.1.6, npm-packlist@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" From 63ef80fb27d3eedd580d39f24deec67ad8bfeb73 Mon Sep 17 00:00:00 2001 From: jeetiss Date: Wed, 27 Nov 2019 09:21:20 +0300 Subject: [PATCH 3/5] simplify custom publishComand condition --- packages/shipjs/src/step/setup/addShipConfig.js | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/packages/shipjs/src/step/setup/addShipConfig.js b/packages/shipjs/src/step/setup/addShipConfig.js index 8d99d3e0..475437e8 100644 --- a/packages/shipjs/src/step/setup/addShipConfig.js +++ b/packages/shipjs/src/step/setup/addShipConfig.js @@ -19,9 +19,7 @@ export default async ({ await runStep({ title: 'Creating ship.config.js' }, async () => { const filePath = path.resolve(dir, 'ship.config.js'); const json = { - publishCommand: !xor(isPublic, isScoped) - ? createPublishCommand(isPublic) - : undefined, + publishCommand: isScoped && isPublic ? createPublishCommand() : undefined, mergeStrategy: baseBranch === releaseBranch ? { @@ -53,14 +51,7 @@ export default async ({ }; }); -function createPublishCommand(isPublic) { - const command = isPublic - ? ({ defaultCommand }) => `${defaultCommand} --access public` - : ({ defaultCommand }) => `${defaultCommand} --access restricted`; - - return command.toString(); -} - -function xor(a, b) { - return (a && !b) || (!a && b); +function createPublishCommand() { + return (({ defaultCommand }) => + `${defaultCommand} --access public`).toString(); } From 981be33c04996577c2ee7719bfd3b464810114ea Mon Sep 17 00:00:00 2001 From: jeetiss Date: Wed, 27 Nov 2019 09:22:09 +0300 Subject: [PATCH 4/5] ask question about access only for scoped packages --- packages/shipjs/src/step/setup/askQuestions.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/shipjs/src/step/setup/askQuestions.js b/packages/shipjs/src/step/setup/askQuestions.js index a9893c29..e941962a 100644 --- a/packages/shipjs/src/step/setup/askQuestions.js +++ b/packages/shipjs/src/step/setup/askQuestions.js @@ -202,6 +202,10 @@ async function askMonorepo(dir) { async function askPackageAccess(dir) { const isScoped = isScopedPackage(getJson(dir, 'package.json').name); + if (!isScoped) { + return { isScoped }; + } + const { isPublic } = await inquirer.prompt([ { type: 'confirm', From 9215d4ad0a807345576e5a596e2cdba282f5654f Mon Sep 17 00:00:00 2001 From: jeetiss Date: Wed, 27 Nov 2019 19:09:43 +0300 Subject: [PATCH 5/5] use serialize-javascript instead of JSON.stringify --- packages/shipjs/package.json | 1 + .../shipjs/src/step/setup/addShipConfig.js | 19 ++++++++----------- yarn.lock | 5 +++++ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/shipjs/package.json b/packages/shipjs/package.json index 3742947d..cdeaf937 100644 --- a/packages/shipjs/package.json +++ b/packages/shipjs/package.json @@ -45,6 +45,7 @@ "inquirer": "7.0.0", "mkdirp": "^0.5.1", "prettier": "^1.18.2", + "serialize-javascript": "^2.1.0", "shell-quote": "^1.7.2", "shipjs-lib": "0.10.0", "temp-write": "4.0.0" diff --git a/packages/shipjs/src/step/setup/addShipConfig.js b/packages/shipjs/src/step/setup/addShipConfig.js index 475437e8..fc2a6ce8 100644 --- a/packages/shipjs/src/step/setup/addShipConfig.js +++ b/packages/shipjs/src/step/setup/addShipConfig.js @@ -1,6 +1,7 @@ -import runStep from '../runStep'; import fs from 'fs'; import path from 'path'; +import serialize from 'serialize-javascript'; +import runStep from '../runStep'; import { runPrettier } from '../../helper'; import { info } from '../../color'; import { print } from '../../util'; @@ -19,7 +20,10 @@ export default async ({ await runStep({ title: 'Creating ship.config.js' }, async () => { const filePath = path.resolve(dir, 'ship.config.js'); const json = { - publishCommand: isScoped && isPublic ? createPublishCommand() : undefined, + publishCommand: + isScoped && isPublic + ? ({ defaultCommand }) => `${defaultCommand} --access public` + : undefined, mergeStrategy: baseBranch === releaseBranch ? { @@ -38,10 +42,8 @@ export default async ({ } : undefined, }; - fs.writeFileSync( - filePath, - `module.exports = ${JSON.stringify(json, null, 2)};` - ); + + fs.writeFileSync(filePath, `module.exports = ${serialize(json)};`); await runPrettier({ filePath, dir }); return () => { @@ -50,8 +52,3 @@ export default async ({ print(' > https://github.com/algolia/shipjs/blob/master/GUIDE.md'); }; }); - -function createPublishCommand() { - return (({ defaultCommand }) => - `${defaultCommand} --access public`).toString(); -} diff --git a/yarn.lock b/yarn.lock index 910d24bb..a7cb0559 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7465,6 +7465,11 @@ sentence-case@^2.1.0: no-case "^2.2.0" upper-case-first "^1.1.2" +serialize-javascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.0.tgz#9310276819efd0eb128258bb341957f6eb2fc570" + integrity sha512-a/mxFfU00QT88umAJQsNWOnUKckhNCqOl028N48e7wFmo2/EHpTo9Wso+iJJCMrQnmFvcjto5RJdAHEvVhcyUQ== + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"