Skip to content

Commit

Permalink
fix(cli-create): fix scoped creation
Browse files Browse the repository at this point in the history
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
  • Loading branch information
iamstarkov committed Aug 6, 2018
1 parent 003b6b7 commit 636faf9
Showing 1 changed file with 37 additions and 4 deletions.
41 changes: 37 additions & 4 deletions src/cli/commands/create.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,50 @@ export function hasWrapper(commander: Object, args: Array<string>): 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<string>): Promise<void> {
const [builderName, ...rest] = args;

if (!builderName) {
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, {});
Expand Down

0 comments on commit 636faf9

Please sign in to comment.