From d4cb59fe82d05546c1fb42212419018f8653d807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Sat, 5 Nov 2022 20:06:47 +0100 Subject: [PATCH 1/4] Defer from "init" to index.ts to handle errors --- packages/cli/src/commands/init/init.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/cli/src/commands/init/init.ts b/packages/cli/src/commands/init/init.ts index 620525d13..aa03d58e4 100644 --- a/packages/cli/src/commands/init/init.ts +++ b/packages/cli/src/commands/init/init.ts @@ -207,12 +207,8 @@ export default (async function initialize( const version = options.version || DEFAULT_VERSION; const directoryName = path.relative(root, options.directory || projectName); - try { - await createProject(projectName, directoryName, version, options); + await createProject(projectName, directoryName, version, options); - const projectFolder = path.join(root, directoryName); - printRunInstructions(projectFolder, projectName); - } catch (e) { - logger.error(e.message); - } + const projectFolder = path.join(root, directoryName); + printRunInstructions(projectFolder, projectName); }); From 476bc723512f295523d8b6416bc69a0ce0d4d2c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Sat, 5 Nov 2022 20:07:21 +0100 Subject: [PATCH 2/4] Extend a CLIError to avoid printing stack --- .../src/commands/init/errors/DirectoryAlreadyExistsError.ts | 4 +++- packages/cli/src/commands/init/errors/HelloWorldError.ts | 4 +++- packages/cli/src/commands/init/errors/InvalidNameError.ts | 4 +++- packages/cli/src/commands/init/errors/ReservedNameError.ts | 4 +++- .../cli/src/commands/init/errors/TemplateAndVersionError.ts | 4 +++- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/commands/init/errors/DirectoryAlreadyExistsError.ts b/packages/cli/src/commands/init/errors/DirectoryAlreadyExistsError.ts index 5bdb5deb9..3c7d614b5 100644 --- a/packages/cli/src/commands/init/errors/DirectoryAlreadyExistsError.ts +++ b/packages/cli/src/commands/init/errors/DirectoryAlreadyExistsError.ts @@ -1,4 +1,6 @@ -export default class DirectoryAlreadyExistsError extends Error { +import {CLIError} from '@react-native-community/cli-tools'; + +export default class DirectoryAlreadyExistsError extends CLIError { constructor(directory: string) { super( `Cannot initialize new project because directory "${directory}" already exists.`, diff --git a/packages/cli/src/commands/init/errors/HelloWorldError.ts b/packages/cli/src/commands/init/errors/HelloWorldError.ts index 18f2eb389..38be0e28d 100644 --- a/packages/cli/src/commands/init/errors/HelloWorldError.ts +++ b/packages/cli/src/commands/init/errors/HelloWorldError.ts @@ -1,4 +1,6 @@ -export default class HelloWorldError extends Error { +import {CLIError} from '@react-native-community/cli-tools'; + +export default class HelloWorldError extends CLIError { constructor() { super( 'Project name shouldn\'t contain "HelloWorld" name in it, because it is CLI\'s default placeholder name.', diff --git a/packages/cli/src/commands/init/errors/InvalidNameError.ts b/packages/cli/src/commands/init/errors/InvalidNameError.ts index 08de3b6cb..a9747bffa 100644 --- a/packages/cli/src/commands/init/errors/InvalidNameError.ts +++ b/packages/cli/src/commands/init/errors/InvalidNameError.ts @@ -1,4 +1,6 @@ -export default class InvalidNameError extends Error { +import {CLIError} from '@react-native-community/cli-tools'; + +export default class InvalidNameError extends CLIError { constructor(name: string) { super( `"${name}" is not a valid name for a project. Please use a valid identifier name (alphanumeric).`, diff --git a/packages/cli/src/commands/init/errors/ReservedNameError.ts b/packages/cli/src/commands/init/errors/ReservedNameError.ts index f4e83a4c6..c0f3f634f 100644 --- a/packages/cli/src/commands/init/errors/ReservedNameError.ts +++ b/packages/cli/src/commands/init/errors/ReservedNameError.ts @@ -1,4 +1,6 @@ -export default class ReservedNameError extends Error { +import {CLIError} from '@react-native-community/cli-tools'; + +export default class ReservedNameError extends CLIError { constructor(name: string) { super( `Not a valid name for a project. Please do not use the reserved word "${name}".`, diff --git a/packages/cli/src/commands/init/errors/TemplateAndVersionError.ts b/packages/cli/src/commands/init/errors/TemplateAndVersionError.ts index 0f7179bf7..b89bf0370 100644 --- a/packages/cli/src/commands/init/errors/TemplateAndVersionError.ts +++ b/packages/cli/src/commands/init/errors/TemplateAndVersionError.ts @@ -1,4 +1,6 @@ -export default class TemplateAndVersionError extends Error { +import {CLIError} from '@react-native-community/cli-tools'; + +export default class TemplateAndVersionError extends CLIError { constructor(template: string) { super( `Passing both "version" and "template" is not supported. The template you select determines the version of react-native used. Please use only one of these options, for example: From 16f866e42baccc167da148614b0c5e68d1deeb08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Sat, 5 Nov 2022 21:03:59 +0100 Subject: [PATCH 3/4] Fixing tests by relaxing the stderr match --- __e2e__/init.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__e2e__/init.test.ts b/__e2e__/init.test.ts index d2324d918..fec60dbce 100644 --- a/__e2e__/init.test.ts +++ b/__e2e__/init.test.ts @@ -43,7 +43,7 @@ test('init fails if the directory already exists', () => { fs.mkdirSync(path.join(DIR, 'TestInit')); const {stderr} = runCLI(DIR, ['init', 'TestInit'], {expectedFailure: true}); - expect(stderr).toBe( + expect(stderr).toContain( 'error Cannot initialize new project because directory "TestInit" already exists.', ); }); From a6d175de9da7dba9f47d3058ac9baed5b7b8f3de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Sat, 5 Nov 2022 21:06:29 +0100 Subject: [PATCH 4/4] Assert non-zero exit code if failure is expected --- jest/helpers.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jest/helpers.ts b/jest/helpers.ts index 3b46ef565..6f9ce945a 100644 --- a/jest/helpers.ts +++ b/jest/helpers.ts @@ -204,6 +204,8 @@ ${chalk.bold('args:')} ${(args || []).join(' ')} ${chalk.bold('stderr:')} ${result.stderr} ${chalk.bold('stdout:')} ${result.stdout} ${chalk.bold('code:')} ${result.code}`); + } else if (options.expectedFailure && result.code === 0) { + throw new Error("Expected command to fail, but it didn't"); } }