feat(devkit): improve project name and root format prompt (#18591)

This commit is contained in:
Leosvel Pérez Espinosa 2023-08-11 21:25:21 +01:00 committed by GitHub
parent df7dc03eda
commit ccd6e04d3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 61 additions and 85 deletions

View File

@ -247,29 +247,22 @@ describe('determineProjectNameAndRootOptions', () => {
directory: 'shared', directory: 'shared',
}); });
expect(promptSpy).toHaveBeenCalledWith( expect(promptSpy).toHaveBeenCalled();
expect.objectContaining({ const promptCallOptions = promptSpy.mock.calls[0][0] as any;
type: 'select', expect(promptCallOptions.choices).toStrictEqual([
name: 'format', {
message: message: `As provided:
'What should be the project name and where should it be generated?',
choices: [
{
message: `Recommended:
Name: lib-name Name: lib-name
Root: shared`, Root: shared`,
name: 'as-provided', name: 'lib-name @ shared',
}, },
{ {
message: `Legacy: message: `Derived:
Name: shared-lib-name Name: shared-lib-name
Root: shared/lib-name`, Root: shared/lib-name`,
name: 'derived', name: 'shared-lib-name @ shared/lib-name (This was derived from the folder structure. Please provide the exact name and directory in the future)',
}, },
], ]);
initial: 'as-provided',
})
);
// restore original interactive mode // restore original interactive mode
restoreOriginalInteractiveMode(); restoreOriginalInteractiveMode();
@ -523,29 +516,22 @@ describe('determineProjectNameAndRootOptions', () => {
directory: 'shared', directory: 'shared',
}); });
expect(promptSpy).toHaveBeenCalledWith( expect(promptSpy).toHaveBeenCalled();
expect.objectContaining({ const promptCallOptions = promptSpy.mock.calls[0][0] as any;
type: 'select', expect(promptCallOptions.choices).toStrictEqual([
name: 'format', {
message: message: `As provided:
'What should be the project name and where should it be generated?',
choices: [
{
message: `Recommended:
Name: lib-name Name: lib-name
Root: shared`, Root: shared`,
name: 'as-provided', name: 'lib-name @ shared',
}, },
{ {
message: `Legacy: message: `Derived:
Name: shared-lib-name Name: shared-lib-name
Root: libs/shared/lib-name`, Root: libs/shared/lib-name`,
name: 'derived', name: 'shared-lib-name @ libs/shared/lib-name (This was derived from the folder structure. Please provide the exact name and directory in the future)',
}, },
], ]);
initial: 'as-provided',
})
);
// restore original interactive mode // restore original interactive mode
restoreOriginalInteractiveMode(); restoreOriginalInteractiveMode();

View File

@ -50,14 +50,8 @@ export type ProjectNameAndRootOptions = {
}; };
type ProjectNameAndRootFormats = { type ProjectNameAndRootFormats = {
'as-provided': { 'as-provided': ProjectNameAndRootOptions;
description: string; derived?: ProjectNameAndRootOptions;
options: ProjectNameAndRootOptions;
};
derived?: {
description: string;
options: ProjectNameAndRootOptions;
};
}; };
export async function determineProjectNameAndRootOptions( export async function determineProjectNameAndRootOptions(
@ -69,7 +63,7 @@ export async function determineProjectNameAndRootOptions(
const format = const format =
options.projectNameAndRootFormat ?? (await determineFormat(formats)); options.projectNameAndRootFormat ?? (await determineFormat(formats));
return formats[format].options; return formats[format];
} }
function validateName( function validateName(
@ -113,6 +107,15 @@ async function determineFormat(
return 'derived'; return 'derived';
} }
const asProvidedDescription = `As provided:
Name: ${formats['as-provided'].projectName}
Root: ${formats['as-provided'].projectRoot}`;
const asProvidedSelectedValue = `${formats['as-provided'].projectName} @ ${formats['as-provided'].projectRoot}`;
const derivedDescription = `Derived:
Name: ${formats['derived'].projectName}
Root: ${formats['derived'].projectRoot}`;
const derivedSelectedValue = `${formats['derived'].projectName} @ ${formats['derived'].projectRoot} (This was derived from the folder structure. Please provide the exact name and directory in the future)`;
return await prompt<{ format: ProjectNameAndRootFormat }>({ return await prompt<{ format: ProjectNameAndRootFormat }>({
type: 'select', type: 'select',
name: 'format', name: 'format',
@ -120,16 +123,18 @@ async function determineFormat(
'What should be the project name and where should it be generated?', 'What should be the project name and where should it be generated?',
choices: [ choices: [
{ {
message: formats['as-provided'].description, message: asProvidedDescription,
name: 'as-provided', name: asProvidedSelectedValue,
}, },
{ {
message: formats['derived'].description, message: derivedDescription,
name: 'derived', name: derivedSelectedValue,
}, },
], ],
initial: 'as-provided' as any, initial: 'as-provided' as any,
}).then(({ format }) => format); }).then(({ format }) =>
format === asProvidedSelectedValue ? 'as-provided' : 'derived'
);
} }
function getProjectNameAndRootFormats( function getProjectNameAndRootFormats(
@ -150,18 +155,13 @@ function getProjectNameAndRootFormats(
const nameWithoutScope = asProvidedProjectName.split('/')[1]; const nameWithoutScope = asProvidedProjectName.split('/')[1];
return { return {
'as-provided': { 'as-provided': {
description: `Recommended: projectName: asProvidedProjectName,
Name: ${asProvidedProjectName} names: {
Root: ${asProvidedProjectDirectory}`, projectSimpleName: nameWithoutScope,
options: { projectFileName: nameWithoutScope,
projectName: asProvidedProjectName,
names: {
projectSimpleName: nameWithoutScope,
projectFileName: nameWithoutScope,
},
importPath: options.importPath ?? asProvidedProjectName,
projectRoot: asProvidedProjectDirectory,
}, },
importPath: options.importPath ?? asProvidedProjectName,
projectRoot: asProvidedProjectDirectory,
}, },
}; };
} }
@ -219,32 +219,22 @@ function getProjectNameAndRootFormats(
return { return {
'as-provided': { 'as-provided': {
description: `Recommended: projectName: asProvidedProjectName,
Name: ${asProvidedProjectName} names: {
Root: ${asProvidedProjectDirectory}`, projectSimpleName: asProvidedProjectName,
options: { projectFileName: asProvidedProjectName,
projectName: asProvidedProjectName,
names: {
projectSimpleName: asProvidedProjectName,
projectFileName: asProvidedProjectName,
},
importPath: asProvidedImportPath,
projectRoot: asProvidedProjectDirectory,
}, },
importPath: asProvidedImportPath,
projectRoot: asProvidedProjectDirectory,
}, },
derived: { derived: {
description: `Legacy: projectName: derivedProjectName,
Name: ${derivedProjectName} names: {
Root: ${derivedProjectDirectory}`, projectSimpleName: derivedSimpleProjectName,
options: { projectFileName: derivedProjectName,
projectName: derivedProjectName,
names: {
projectSimpleName: derivedSimpleProjectName,
projectFileName: derivedProjectName,
},
importPath: derivedImportPath,
projectRoot: derivedProjectDirectory,
}, },
importPath: derivedImportPath,
projectRoot: derivedProjectDirectory,
}, },
}; };
} }