From 8755615f4a3121ae21d96f650562a7e3540caffd Mon Sep 17 00:00:00 2001 From: sobolk <5849952+sobolk@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:32:05 -0700 Subject: [PATCH] Revert "fix: Handle uncaught exception in create-amplify (#2828)" This reverts commit 995b335027489a10bcef0136e8cc7ed29e5cebaa. --- .changeset/eighty-spoons-tickle.md | 7 --- packages/cli-core/API.md | 23 +++------- packages/cli-core/package.json | 3 +- packages/cli-core/src/index.ts | 2 - packages/cli/src/ampx.ts | 13 +++--- .../src/error_handler.test.ts | 4 +- .../{cli-core => cli}/src/error_handler.ts | 44 +++++++------------ .../src/extract_sub_commands.ts | 0 packages/cli/src/test-utils/command_runner.ts | 6 +-- packages/create-amplify/src/create_amplify.ts | 43 ++++++++---------- 10 files changed, 50 insertions(+), 95 deletions(-) delete mode 100644 .changeset/eighty-spoons-tickle.md rename packages/{cli-core => cli}/src/error_handler.test.ts (98%) rename packages/{cli-core => cli}/src/error_handler.ts (85%) rename packages/{cli-core => cli}/src/extract_sub_commands.ts (100%) diff --git a/.changeset/eighty-spoons-tickle.md b/.changeset/eighty-spoons-tickle.md deleted file mode 100644 index 4c24197ac7c..00000000000 --- a/.changeset/eighty-spoons-tickle.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'create-amplify': patch -'@aws-amplify/cli-core': minor -'@aws-amplify/backend-cli': patch ---- - -Handle uncaught exception in create-amplify and refactor the error handler to cli-core diff --git a/packages/cli-core/API.md b/packages/cli-core/API.md index 9fa030c14fd..975ae9cdee7 100644 --- a/packages/cli-core/API.md +++ b/packages/cli-core/API.md @@ -5,9 +5,7 @@ ```ts import { AmplifyIOHost } from '@aws-amplify/plugin-types'; -import { Argv } from 'yargs'; import { PackageManagerController } from '@aws-amplify/plugin-types'; -import { UsageDataEmitter } from '@aws-amplify/platform-core'; import { WriteStream } from 'node:tty'; import z from 'zod'; @@ -35,18 +33,12 @@ export class AmplifyPrompter { }) => Promise; } -// @public -export const attachUnhandledExceptionListeners: (usageDataEmitter?: UsageDataEmitter) => void; - // @public (undocumented) export type ColorName = (typeof colorNames)[number]; // @public (undocumented) export const colorNames: readonly ["Green", "Yellow", "Blue", "Magenta", "Cyan", "Red"]; -// @public -export const extractSubCommands: (yargs: Argv) => string | undefined; - // @public export class Format { constructor(packageManagerRunnerName?: string); @@ -83,9 +75,6 @@ export class Format { // @public (undocumented) export const format: Format; -// @public -export const generateCommandFailureHandler: (parser?: Argv, usageDataEmitter?: UsageDataEmitter) => ((message: string, error: Error) => Promise); - // @public (undocumented) export enum LogLevel { // (undocumented) @@ -196,7 +185,7 @@ export const noticeSchema: z.ZodObject<{ errorMessage: string; })[]; link?: string | undefined; - frequency?: "command" | "once" | "deployment" | "daily" | undefined; + frequency?: "once" | "command" | "deployment" | "daily" | undefined; validFrom?: number | undefined; validTo?: number | undefined; }, { @@ -224,7 +213,7 @@ export const noticeSchema: z.ZodObject<{ errorMessage: string; })[]; link?: string | undefined; - frequency?: "command" | "once" | "deployment" | "daily" | undefined; + frequency?: "once" | "command" | "deployment" | "daily" | undefined; validFrom?: number | undefined; validTo?: number | undefined; }>; @@ -325,7 +314,7 @@ export const noticesManifestSchema: z.ZodObject<{ errorMessage: string; })[]; link?: string | undefined; - frequency?: "command" | "once" | "deployment" | "daily" | undefined; + frequency?: "once" | "command" | "deployment" | "daily" | undefined; validFrom?: number | undefined; validTo?: number | undefined; }, { @@ -353,7 +342,7 @@ export const noticesManifestSchema: z.ZodObject<{ errorMessage: string; })[]; link?: string | undefined; - frequency?: "command" | "once" | "deployment" | "daily" | undefined; + frequency?: "once" | "command" | "deployment" | "daily" | undefined; validFrom?: number | undefined; validTo?: number | undefined; }>, "many">; @@ -383,7 +372,7 @@ export const noticesManifestSchema: z.ZodObject<{ errorMessage: string; })[]; link?: string | undefined; - frequency?: "command" | "once" | "deployment" | "daily" | undefined; + frequency?: "once" | "command" | "deployment" | "daily" | undefined; validFrom?: number | undefined; validTo?: number | undefined; }[]; @@ -413,7 +402,7 @@ export const noticesManifestSchema: z.ZodObject<{ errorMessage: string; })[]; link?: string | undefined; - frequency?: "command" | "once" | "deployment" | "daily" | undefined; + frequency?: "once" | "command" | "deployment" | "daily" | undefined; validFrom?: number | undefined; validTo?: number | undefined; }[]; diff --git a/packages/cli-core/package.json b/packages/cli-core/package.json index 6740bde565b..cc3ed9a3ca4 100644 --- a/packages/cli-core/package.json +++ b/packages/cli-core/package.json @@ -29,7 +29,6 @@ "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0", "semver": "^7.6.3", - "zod": "3.25.17", - "yargs": "^17.7.2" + "zod": "3.25.17" } } diff --git a/packages/cli-core/src/index.ts b/packages/cli-core/src/index.ts index d9652c7178e..366f908e1f8 100644 --- a/packages/cli-core/src/index.ts +++ b/packages/cli-core/src/index.ts @@ -6,5 +6,3 @@ export * from './package-manager-controller/package_manager_controller_factory.j export * from './loggers/amplify_io_events_bridge_singleton_factory.js'; export * from './notices/notices.js'; export * from './notices/notices_manifest_validator.js'; -export * from './error_handler.js'; -export * from './extract_sub_commands.js'; diff --git a/packages/cli/src/ampx.ts b/packages/cli/src/ampx.ts index 37542220bc8..441f12025c1 100755 --- a/packages/cli/src/ampx.ts +++ b/packages/cli/src/ampx.ts @@ -7,6 +7,11 @@ import { import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks'; import { BasicTracerProvider } from '@opentelemetry/sdk-trace-base'; import { createMainParser } from './main_parser_factory.js'; +import { + attachUnhandledExceptionListeners, + generateCommandFailureHandler, +} from './error_handler.js'; +import { extractSubCommands } from './extract_sub_commands.js'; import { AmplifyFault, PackageJsonReader, @@ -20,13 +25,7 @@ import { import { fileURLToPath } from 'node:url'; import { verifyCommandName } from './verify_command_name.js'; import { hideBin } from 'yargs/helpers'; -import { - PackageManagerControllerFactory, - attachUnhandledExceptionListeners, - extractSubCommands, - format, - generateCommandFailureHandler, -} from '@aws-amplify/cli-core'; +import { PackageManagerControllerFactory, format } from '@aws-amplify/cli-core'; import { NoticesRenderer } from './notices/notices_renderer.js'; import { extractCommandInfo } from './extract_command_info.js'; import { DeepPartial } from '@aws-amplify/plugin-types'; diff --git a/packages/cli-core/src/error_handler.test.ts b/packages/cli/src/error_handler.test.ts similarity index 98% rename from packages/cli-core/src/error_handler.test.ts rename to packages/cli/src/error_handler.test.ts index 66d1ddf1525..1e1dfeb5858 100644 --- a/packages/cli-core/src/error_handler.test.ts +++ b/packages/cli/src/error_handler.test.ts @@ -4,9 +4,7 @@ import { generateCommandFailureHandler, } from './error_handler.js'; import { Argv } from 'yargs'; -import { format } from './format/format.js'; -import { LogLevel } from './printer/printer.js'; -import { printer } from './printer.js'; +import { LogLevel, format, printer } from '@aws-amplify/cli-core'; import assert from 'node:assert'; import { AmplifyUserError, UsageDataEmitter } from '@aws-amplify/platform-core'; diff --git a/packages/cli-core/src/error_handler.ts b/packages/cli/src/error_handler.ts similarity index 85% rename from packages/cli-core/src/error_handler.ts rename to packages/cli/src/error_handler.ts index 2350fc8a097..655762e85b1 100644 --- a/packages/cli-core/src/error_handler.ts +++ b/packages/cli/src/error_handler.ts @@ -1,6 +1,4 @@ -import { format } from './format/format.js'; -import { LogLevel } from './printer/printer.js'; -import { printer } from './printer.js'; +import { LogLevel, format, printer } from '@aws-amplify/cli-core'; import { Argv } from 'yargs'; import { AmplifyError, UsageDataEmitter } from '@aws-amplify/platform-core'; import { extractSubCommands } from './extract_sub_commands.js'; @@ -19,7 +17,7 @@ type HandleErrorProps = { * Attaches process listeners to handle unhandled exceptions and rejections */ export const attachUnhandledExceptionListeners = ( - usageDataEmitter?: UsageDataEmitter, + usageDataEmitter: UsageDataEmitter, ): void => { if (hasAttachUnhandledExceptionListenersBeenCalled) { return; @@ -56,7 +54,7 @@ export const attachUnhandledExceptionListeners = ( * This prevents our top-level error handler from being invoked after the yargs error handler has already been invoked */ export const generateCommandFailureHandler = ( - parser?: Argv, + parser: Argv, usageDataEmitter?: UsageDataEmitter, ): ((message: string, error: Error) => Promise) => { /** @@ -65,29 +63,19 @@ export const generateCommandFailureHandler = ( * @param error error thrown by yargs handler */ const handleCommandFailure = async (message: string, error?: Error) => { - if (!parser) { - await handleErrorSafe({ - error, - message, - }); - } - - // for ampx commands - if (parser) { - const printHelp = () => { - printer.printNewLine(); - parser.showHelp(); - printer.printNewLine(); - }; - await handleErrorSafe({ - command: extractSubCommands(parser), - printMessagePreamble: printHelp, - error, - message, - usageDataEmitter, - }); - parser.exit(1, error || new Error(message)); - } + const printHelp = () => { + printer.printNewLine(); + parser.showHelp(); + printer.printNewLine(); + }; + await handleErrorSafe({ + command: extractSubCommands(parser), + printMessagePreamble: printHelp, + error, + message, + usageDataEmitter, + }); + parser.exit(1, error || new Error(message)); }; return handleCommandFailure; }; diff --git a/packages/cli-core/src/extract_sub_commands.ts b/packages/cli/src/extract_sub_commands.ts similarity index 100% rename from packages/cli-core/src/extract_sub_commands.ts rename to packages/cli/src/extract_sub_commands.ts diff --git a/packages/cli/src/test-utils/command_runner.ts b/packages/cli/src/test-utils/command_runner.ts index 2f3e6a442b3..c65bae12c67 100644 --- a/packages/cli/src/test-utils/command_runner.ts +++ b/packages/cli/src/test-utils/command_runner.ts @@ -1,10 +1,8 @@ import { Argv } from 'yargs'; import { AsyncLocalStorage } from 'node:async_hooks'; import { UsageDataEmitter } from '@aws-amplify/platform-core'; -import { - extractSubCommands, - generateCommandFailureHandler, -} from '@aws-amplify/cli-core'; +import { generateCommandFailureHandler } from '../error_handler.js'; +import { extractSubCommands } from '../extract_sub_commands.js'; class OutputInterceptor { private output = ''; diff --git a/packages/create-amplify/src/create_amplify.ts b/packages/create-amplify/src/create_amplify.ts index bb2d8d756f6..aecd7f2f0c6 100644 --- a/packages/create-amplify/src/create_amplify.ts +++ b/packages/create-amplify/src/create_amplify.ts @@ -8,10 +8,10 @@ */ import { + LogLevel, PackageManagerControllerFactory, - attachUnhandledExceptionListeners, format, - generateCommandFailureHandler, + printer, } from '@aws-amplify/cli-core'; import { ProjectRootValidator } from './project_root_validator.js'; import { AmplifyProjectCreator } from './amplify_project_creator.js'; @@ -19,33 +19,26 @@ import { getProjectRoot } from './get_project_root.js'; import { GitIgnoreInitializer } from './gitignore_initializer.js'; import { InitialProjectFileGenerator } from './initial_project_file_generator.js'; -attachUnhandledExceptionListeners(); -const errorHandler = generateCommandFailureHandler(); +const projectRoot = await getProjectRoot(); -try { - const projectRoot = await getProjectRoot(); - - const packageManagerControllerFactory = new PackageManagerControllerFactory( - projectRoot, - ); +const packageManagerControllerFactory = new PackageManagerControllerFactory( + projectRoot, +); - const packageManagerController = - packageManagerControllerFactory.getPackageManagerController(); +const packageManagerController = + packageManagerControllerFactory.getPackageManagerController(); - const amplifyProjectCreator = new AmplifyProjectCreator( - projectRoot, - packageManagerController, - new ProjectRootValidator(projectRoot), - new GitIgnoreInitializer(projectRoot), - new InitialProjectFileGenerator(projectRoot, packageManagerController), - ); +const amplifyProjectCreator = new AmplifyProjectCreator( + projectRoot, + packageManagerController, + new ProjectRootValidator(projectRoot), + new GitIgnoreInitializer(projectRoot), + new InitialProjectFileGenerator(projectRoot, packageManagerController), +); +try { await amplifyProjectCreator.create(); } catch (err) { - if (err instanceof Error) { - await errorHandler(format.error(err), err); - } else { - // eslint-disable-next-line @aws-amplify/amplify-backend-rules/prefer-amplify-errors - await errorHandler(format.error(err), new Error(JSON.stringify(err))); - } + printer.log(format.error(err), LogLevel.ERROR); + process.exitCode = 1; }