From 636faf90982affdc84c9b0b06278157234e60f96 Mon Sep 17 00:00:00 2001 From: Vladimir Starkov Date: Mon, 6 Aug 2018 23:38:39 +0200 Subject: [PATCH] fix(cli-create): fix scoped creation This one works as it should: yarn create @scope/name => @scope/create-name There were problems when name was omitted: Before: yarn create @scope => create- yarn create @scope/ => @scope/create- After: yarn create @scope => @scope/create yarn create @scope/ => @scope/create Fixes #6233 --- src/cli/commands/create.js | 41 ++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/cli/commands/create.js b/src/cli/commands/create.js index 0f998965fa..deb1fd6f57 100644 --- a/src/cli/commands/create.js +++ b/src/cli/commands/create.js @@ -16,6 +16,42 @@ export function hasWrapper(commander: Object, args: Array): boolean { return true; } +const coerceName = (name = '') => (name === '' ? 'create' : `create-${name}`); +const coerceScope = (scope = '') => (scope === '@' ? undefined : scope); +const coerceFullName = (scope, name) => [coerceScope(scope), coerceName(name)].filter(Boolean).join('/'); + +/** + * # Tests + * + * ## basic + * parseBuilderName('name').packageName === 'create-name' + * parseBuilderName('@scope/name').packageName === '@scope/create-name' + * + * ## not adding "-" if name is empty + * parseBuilderName('@scope/').packageName === '@scope/create' + * parseBuilderName('@scope').packageName === '@scope/create' + * + * ## edge cases + * parseBuilderName('@/name').packageName === 'create-name' + * parseBuilderName('/name').packageName === 'create-name' + * parseBuilderName('@/').packageName === 'create' + */ +const parseBuilderName = str => { + const parts = str.split('/'); + if (parts.length === 1 && !str.includes('@')) { + return { + packageName: coerceName(str), + packageDir: '', + commandName: coerceName(str), + }; + } + return { + packageName: coerceFullName(parts[0], parts[1]), + packageDir: coerceScope(parts[0]), + commandName: coerceName(parts[1]), + }; +}; + export async function run(config: Config, reporter: Reporter, flags: Object, args: Array): Promise { const [builderName, ...rest] = args; @@ -23,10 +59,7 @@ export async function run(config: Config, reporter: Reporter, flags: Object, arg throw new MessageError(reporter.lang('invalidPackageName')); } - const packageName = builderName.replace(/^(@[^\/]+\/)?/, '$1create-'); - const packageDir = packageName.replace(/^(?:(@[^\/]+)\/)?.*/, '$1'); - const commandName = packageName.replace(/^@[^\/]+\//, ''); - + const {packageName, packageDir, commandName} = parseBuilderName(builderName); await runGlobal(config, reporter, {}, ['add', packageName]); const binFolder = await getBinFolder(config, {});